mirror of
https://github.com/RYGhub/royalnet.git
synced 2024-11-27 21:44:21 +00:00
coseeeeeeeeeeeeeeeeeeeeee
This commit is contained in:
parent
7b1674b511
commit
dae3ee2649
6 changed files with 106 additions and 88 deletions
24
db.py
24
db.py
|
@ -598,30 +598,6 @@ class Diario(Base):
|
||||||
session.close()
|
session.close()
|
||||||
|
|
||||||
|
|
||||||
class CVMusic(Base):
|
|
||||||
__tablename__ = "cvmusic"
|
|
||||||
|
|
||||||
id = Column(BigInteger, primary_key=True)
|
|
||||||
url = Column(String, nullable=False)
|
|
||||||
enqueued = Column(DateTime, nullable=False)
|
|
||||||
started = Column(DateTime, nullable=False)
|
|
||||||
|
|
||||||
user_id = Column(Integer, ForeignKey("royals.id"))
|
|
||||||
user = relationship("Royal")
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def create_and_add(url: str, user: Royal, enqueued: datetime.datetime, started: datetime.datetime):
|
|
||||||
try:
|
|
||||||
session = Session()
|
|
||||||
session.add(CVMusic(url=url,
|
|
||||||
enqueued=enqueued,
|
|
||||||
started=started,
|
|
||||||
user_id=user.id))
|
|
||||||
session.commit()
|
|
||||||
session.close()
|
|
||||||
except Exception as e:
|
|
||||||
print(f"ERRORE CVMusic: {e}")
|
|
||||||
|
|
||||||
# If run as script, create all the tables in the db
|
# If run as script, create all the tables in the db
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
Base.metadata.create_all(bind=engine)
|
Base.metadata.create_all(bind=engine)
|
|
@ -1,4 +1,5 @@
|
||||||
import datetime
|
import datetime
|
||||||
|
import random
|
||||||
import discord
|
import discord
|
||||||
import discord.opus
|
import discord.opus
|
||||||
import functools
|
import functools
|
||||||
|
@ -6,7 +7,6 @@ import sys
|
||||||
import db
|
import db
|
||||||
import errors
|
import errors
|
||||||
import youtube_dl
|
import youtube_dl
|
||||||
import sqlalchemy.exc
|
|
||||||
|
|
||||||
# Init the event loop
|
# Init the event loop
|
||||||
import asyncio
|
import asyncio
|
||||||
|
@ -17,6 +17,18 @@ import configparser
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.read("config.ini")
|
config.read("config.ini")
|
||||||
|
|
||||||
|
# Find the latest git tag
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
old_wd = os.getcwd()
|
||||||
|
try:
|
||||||
|
os.chdir(os.path.dirname(__file__))
|
||||||
|
version = str(subprocess.check_output(["git", "describe", "--tags"]), encoding="utf8").strip()
|
||||||
|
except:
|
||||||
|
version = "v???"
|
||||||
|
finally:
|
||||||
|
os.chdir(old_wd)
|
||||||
|
|
||||||
# Init the discord bot
|
# Init the discord bot
|
||||||
client = discord.Client()
|
client = discord.Client()
|
||||||
discord.opus.load_opus("libopus-0.dll")
|
discord.opus.load_opus("libopus-0.dll")
|
||||||
|
@ -26,6 +38,7 @@ voice_queue = []
|
||||||
voice_playing = None
|
voice_playing = None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Video:
|
class Video:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.user = None
|
self.user = None
|
||||||
|
@ -51,13 +64,13 @@ class Video:
|
||||||
|
|
||||||
def create_embed(self):
|
def create_embed(self):
|
||||||
embed = discord.Embed(type="rich",
|
embed = discord.Embed(type="rich",
|
||||||
title=self.info['title'] if 'title' in self.info else None,
|
title=self.info.get("title"),
|
||||||
url=self.info['webpage_url'] if 'webpage_url' in self.info else None,
|
url=self.info.get("webpage_url"),
|
||||||
colour=discord.Colour(13375518))
|
colour=discord.Colour(13375518))
|
||||||
# Uploader
|
# Uploader
|
||||||
if "uploader" in self.info and self.info["uploader"] is not None:
|
if self.info.get("uploader"):
|
||||||
embed.set_author(name=self.info["uploader"],
|
embed.set_author(name=self.info["uploader"],
|
||||||
url=self.info["uploader_url"] if "uploader_url" in self.info else None)
|
url=self.info.get("uploader_url"))
|
||||||
# Thumbnail
|
# Thumbnail
|
||||||
if "thumbnail" in self.info:
|
if "thumbnail" in self.info:
|
||||||
embed.set_thumbnail(url=self.info["thumbnail"])
|
embed.set_thumbnail(url=self.info["thumbnail"])
|
||||||
|
@ -107,6 +120,7 @@ async def on_error(event, *args, **kwargs):
|
||||||
f"```python\n"
|
f"```python\n"
|
||||||
f"{repr(exception)}\n"
|
f"{repr(exception)}\n"
|
||||||
f"```")
|
f"```")
|
||||||
|
await voice_client.disconnect()
|
||||||
await client.change_presence(status=discord.Status.invisible)
|
await client.change_presence(status=discord.Status.invisible)
|
||||||
await client.close()
|
await client.close()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -117,7 +131,7 @@ async def on_error(event, *args, **kwargs):
|
||||||
|
|
||||||
@client.event
|
@client.event
|
||||||
async def on_ready():
|
async def on_ready():
|
||||||
await client.send_message(client.get_channel("368447084518572034"), f"ℹ Bot avviato e pronto a ricevere comandi!")
|
await client.send_message(client.get_channel("368447084518572034"), f"ℹ Royal Bot {version} avviato e pronto a ricevere comandi!")
|
||||||
await client.change_presence(game=None, status=discord.Status.online)
|
await client.change_presence(game=None, status=discord.Status.online)
|
||||||
|
|
||||||
|
|
||||||
|
@ -145,7 +159,7 @@ async def on_message(message: discord.Message):
|
||||||
session.commit()
|
session.commit()
|
||||||
session.close()
|
session.close()
|
||||||
await client.send_message(message.channel, "✅ Sincronizzazione completata!")
|
await client.send_message(message.channel, "✅ Sincronizzazione completata!")
|
||||||
elif message.content.startswith("!cv") and discord.opus.is_loaded():
|
elif message.content.startswith("!cv"):
|
||||||
await client.send_typing(message.channel)
|
await client.send_typing(message.channel)
|
||||||
if message.author.voice.voice_channel is None:
|
if message.author.voice.voice_channel is None:
|
||||||
await client.send_message(message.channel, "⚠ Non sei in nessun canale!")
|
await client.send_message(message.channel, "⚠ Non sei in nessun canale!")
|
||||||
|
@ -168,7 +182,7 @@ async def on_message(message: discord.Message):
|
||||||
url = message.content.split(" ", 1)[1]
|
url = message.content.split(" ", 1)[1]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
await client.send_message(message.channel, "⚠️ Non hai specificato un url!\n"
|
await client.send_message(message.channel, "⚠️ Non hai specificato un url!\n"
|
||||||
"Sintassi corretta: `!madd <video>`")
|
"Sintassi corretta: `!play <video>`")
|
||||||
return
|
return
|
||||||
# Se è una playlist, informa che potrebbe essere richiesto un po' di tempo
|
# Se è una playlist, informa che potrebbe essere richiesto un po' di tempo
|
||||||
if "playlist" in url:
|
if "playlist" in url:
|
||||||
|
@ -181,7 +195,12 @@ async def on_message(message: discord.Message):
|
||||||
except youtube_dl.utils.DownloadError as e:
|
except youtube_dl.utils.DownloadError as e:
|
||||||
if "is not a valid URL" in str(e) or "Unsupported URL" in str(e):
|
if "is not a valid URL" in str(e) or "Unsupported URL" in str(e):
|
||||||
await client.send_message(message.channel, f"⚠️ Il link inserito non è valido.\n"
|
await client.send_message(message.channel, f"⚠️ Il link inserito non è valido.\n"
|
||||||
f"Se vuoi cercare un video su YouTube, usa `!msearch <query>`")
|
f"Se vuoi cercare un video su YouTube, usa `!search <query>`")
|
||||||
|
else:
|
||||||
|
await client.send_message(message.channel, f"⚠ Errore:\n"
|
||||||
|
f"```\n"
|
||||||
|
f"{e}"
|
||||||
|
f"```")
|
||||||
return
|
return
|
||||||
if "_type" not in info:
|
if "_type" not in info:
|
||||||
# If target is a single video
|
# If target is a single video
|
||||||
|
@ -222,7 +241,7 @@ async def on_message(message: discord.Message):
|
||||||
text = message.content.split(" ", 1)[1]
|
text = message.content.split(" ", 1)[1]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
await client.send_message(message.channel, "⚠️ Non hai specificato il titolo!\n"
|
await client.send_message(message.channel, "⚠️ Non hai specificato il titolo!\n"
|
||||||
"Sintassi corretta: `!msearch <titolo>`")
|
"Sintassi corretta: `!search <titolo>`")
|
||||||
return
|
return
|
||||||
# Extract the info from the url
|
# Extract the info from the url
|
||||||
try:
|
try:
|
||||||
|
@ -247,7 +266,7 @@ async def on_message(message: discord.Message):
|
||||||
return
|
return
|
||||||
voice_player.pause()
|
voice_player.pause()
|
||||||
await client.send_message(message.channel, f"⏸ Riproduzione messa in pausa.\n"
|
await client.send_message(message.channel, f"⏸ Riproduzione messa in pausa.\n"
|
||||||
f"Riprendi con `!mresume`.")
|
f"Riprendi con `!resume`.")
|
||||||
elif message.content.startswith("!resume"):
|
elif message.content.startswith("!resume"):
|
||||||
if voice_player is None or voice_player.is_playing():
|
if voice_player is None or voice_player.is_playing():
|
||||||
await client.send_message(message.channel, f"⚠️ Non c'è nulla in pausa da riprendere!")
|
await client.send_message(message.channel, f"⚠️ Non c'è nulla in pausa da riprendere!")
|
||||||
|
@ -289,6 +308,27 @@ async def on_message(message: discord.Message):
|
||||||
to_send = to_send[0:1997] + "..."
|
to_send = to_send[0:1997] + "..."
|
||||||
break
|
break
|
||||||
await client.send_message(message.channel, to_send)
|
await client.send_message(message.channel, to_send)
|
||||||
|
elif message.content.startswith("!cast"):
|
||||||
|
try:
|
||||||
|
spell = message.content.split(" ", 1)[1]
|
||||||
|
except IndexError:
|
||||||
|
await client.send_message("⚠️ Non hai specificato nessun incantesimo!\n"
|
||||||
|
"Sintassi corretta: `!cast <nome_incantesimo>`")
|
||||||
|
return
|
||||||
|
target = random.sample(list(message.server.members), 1)[0]
|
||||||
|
# Seed the rng with the spell name
|
||||||
|
# so that spells always deal the same damage
|
||||||
|
random.seed(spell)
|
||||||
|
dmg_mod = random.randrange(-2, 3)
|
||||||
|
dmg_dice = random.randrange(1, 4)
|
||||||
|
dmg_max = random.sample([4, 6, 8, 10, 12, 20, 100], 1)[0]
|
||||||
|
# Reseed the rng with a random value
|
||||||
|
# so that the dice roll always deals a different damage
|
||||||
|
random.seed()
|
||||||
|
total = dmg_mod
|
||||||
|
for dice in range(0, dmg_dice):
|
||||||
|
total += random.randrange(1, dmg_max+1)
|
||||||
|
await client.send_message(message.channel, f"❇️ Ho lanciato **{spell}** su **{target.nick if target.nick is not None else target.name}** per {dmg_dice}d{dmg_max}{'+' if dmg_mod > 0 else ''}{str(dmg_mod) if dmg_mod != 0 else ''}=**{total if total > 0 else 0}** danni!")
|
||||||
elif __debug__ and message.content.startswith("!exception"):
|
elif __debug__ and message.content.startswith("!exception"):
|
||||||
raise Exception("!exception was called")
|
raise Exception("!exception was called")
|
||||||
|
|
||||||
|
@ -332,8 +372,6 @@ async def update_music_queue():
|
||||||
# Set the playing status
|
# Set the playing status
|
||||||
voice_playing = video
|
voice_playing = video
|
||||||
await client.change_presence(game=discord.Game(name=video.info.get("title"), type=2))
|
await client.change_presence(game=discord.Game(name=video.info.get("title"), type=2))
|
||||||
# Add the video to the db
|
|
||||||
await loop.run_in_executor(None, functools.partial(video.add_to_db, started=datetime.datetime.now()))
|
|
||||||
|
|
||||||
|
|
||||||
def process(users_connection):
|
def process(users_connection):
|
||||||
|
|
|
@ -27,8 +27,8 @@ table.dota {
|
||||||
color: white !important;
|
color: white !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
th.dota {
|
table.dota th {
|
||||||
border-bottom: 4px solid #6BF !important;
|
border-bottom: 1px solid #666 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rl-rank-hidden {
|
.rl-rank-hidden {
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
import random
|
||||||
|
|
||||||
|
import math
|
||||||
|
|
||||||
import db
|
import db
|
||||||
import errors
|
import errors
|
||||||
from telegram import Bot, Update, Message
|
from telegram import Bot, Update, Message
|
||||||
|
@ -9,7 +13,20 @@ import configparser
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.read("config.ini")
|
config.read("config.ini")
|
||||||
|
|
||||||
users_connection = None
|
discord_connection = None
|
||||||
|
|
||||||
|
# Find the latest git tag
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
old_wd = os.getcwd()
|
||||||
|
try:
|
||||||
|
os.chdir(os.path.dirname(__file__))
|
||||||
|
version = str(subprocess.check_output(["git", "describe", "--tags"]), encoding="utf8").strip()
|
||||||
|
except:
|
||||||
|
version = "v???"
|
||||||
|
finally:
|
||||||
|
os.chdir(old_wd)
|
||||||
|
|
||||||
|
|
||||||
def cmd_register(bot: Bot, update: Update):
|
def cmd_register(bot: Bot, update: Update):
|
||||||
session = db.Session()
|
session = db.Session()
|
||||||
|
@ -32,8 +49,8 @@ def cmd_register(bot: Bot, update: Update):
|
||||||
|
|
||||||
|
|
||||||
def cmd_discord(bot: Bot, update: Update):
|
def cmd_discord(bot: Bot, update: Update):
|
||||||
users_connection.send("/cv")
|
discord_connection.send("/cv")
|
||||||
server_members = users_connection.recv()
|
server_members = discord_connection.recv()
|
||||||
message = ""
|
message = ""
|
||||||
for member in server_members:
|
for member in server_members:
|
||||||
if member.status == DiscordStatus.offline and member.voice.voice_channel is None:
|
if member.status == DiscordStatus.offline and member.voice.voice_channel is None:
|
||||||
|
@ -73,12 +90,41 @@ def cmd_discord(bot: Bot, update: Update):
|
||||||
bot.send_message(update.message.chat.id, message, disable_web_page_preview=True, parse_mode="Markdown")
|
bot.send_message(update.message.chat.id, message, disable_web_page_preview=True, parse_mode="Markdown")
|
||||||
|
|
||||||
|
|
||||||
def process(discord_users_connection):
|
def cmd_cast(bot: Bot, update: Update):
|
||||||
|
try:
|
||||||
|
spell = update.message.text.split(" ", 1)[1]
|
||||||
|
except IndexError:
|
||||||
|
bot.send_message(update.message.chat.id, "⚠️ Non hai specificato nessun incantesimo!\n"
|
||||||
|
"Sintassi corretta: `/cast <nome_incantesimo>`")
|
||||||
|
return
|
||||||
|
# Open a new db session
|
||||||
|
session = db.Session()
|
||||||
|
# Find a target for the spell
|
||||||
|
target = random.sample(session.query(db.Telegram).all(), 1)[0]
|
||||||
|
# Close the session
|
||||||
|
session.close()
|
||||||
|
# Seed the rng with the spell name
|
||||||
|
# so that spells always deal the same damage
|
||||||
|
random.seed(spell)
|
||||||
|
dmg_dice = random.randrange(1, 11)
|
||||||
|
dmg_max = random.sample([4, 6, 8, 10, 12, 20, 100], 1)[0]
|
||||||
|
dmg_mod = random.randrange(math.floor(-dmg_max / 5), math.ceil(dmg_max / 5) + 1)
|
||||||
|
# Reseed the rng with a random value
|
||||||
|
# so that the dice roll always deals a different damage
|
||||||
|
random.seed()
|
||||||
|
total = dmg_mod
|
||||||
|
for dice in range(0, dmg_dice):
|
||||||
|
total += random.randrange(1, dmg_max + 1)
|
||||||
|
bot.send_message(update.message.chat.id, f"❇️ Ho lanciato {spell} su {target.username if target.username is not None else target.first_name} per {dmg_dice}d{dmg_max}{'+' if dmg_mod > 0 else ''}{str(dmg_mod) if dmg_mod != 0 else ''}={total if total > 0 else 0} danni!")
|
||||||
|
|
||||||
|
|
||||||
|
def process(arg_discord_connection):
|
||||||
print("Telegrambot starting...")
|
print("Telegrambot starting...")
|
||||||
global users_connection
|
global discord_connection
|
||||||
users_connection = discord_users_connection
|
discord_connection = arg_discord_connection
|
||||||
u = Updater(config["Telegram"]["bot_token"])
|
u = Updater(config["Telegram"]["bot_token"])
|
||||||
u.dispatcher.add_handler(CommandHandler("register", cmd_register))
|
u.dispatcher.add_handler(CommandHandler("register", cmd_register))
|
||||||
u.dispatcher.add_handler(CommandHandler("discord", cmd_discord))
|
u.dispatcher.add_handler(CommandHandler("discord", cmd_discord))
|
||||||
|
u.dispatcher.add_handler(CommandHandler("cast", cmd_cast))
|
||||||
u.start_polling()
|
u.start_polling()
|
||||||
u.idle()
|
u.idle()
|
|
@ -1,34 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Leaderboards - RYG</title>
|
|
||||||
<script src="{{ url_for('static', filename='sorttable.js') }}"></script>
|
|
||||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css"
|
|
||||||
integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
|
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='royal.css') }}">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container">
|
|
||||||
<h1>
|
|
||||||
Top Plays
|
|
||||||
</h1>
|
|
||||||
<table class="table table-hover sortable">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>URL</th>
|
|
||||||
<th>Plays</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for record in top_plays %}
|
|
||||||
<tr>
|
|
||||||
<td><a href="{{ record[0] }}">{{ record[0] }}</a></td>
|
|
||||||
<td>{{ record[1] }}</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
10
webserver.py
10
webserver.py
|
@ -1,5 +1,5 @@
|
||||||
from flask import Flask, render_template
|
from flask import Flask, render_template
|
||||||
from db import Session, Royal, Steam, RocketLeague, Dota, Osu, Overwatch, LeagueOfLegends, CVMusic
|
from db import Session, Royal, Steam, RocketLeague, Dota, Osu, Overwatch, LeagueOfLegends
|
||||||
from sqlalchemy.orm import joinedload
|
from sqlalchemy.orm import joinedload
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
|
|
||||||
|
@ -20,14 +20,6 @@ def page_leaderboards():
|
||||||
return render_template("leaderboards.html", dota_data=dota_data, rl_data=rl_data, ow_data=ow_data, osu_data=osu_data, lol_data=lol_data)
|
return render_template("leaderboards.html", dota_data=dota_data, rl_data=rl_data, ow_data=ow_data, osu_data=osu_data, lol_data=lol_data)
|
||||||
|
|
||||||
|
|
||||||
@app.route("/music")
|
|
||||||
def page_music():
|
|
||||||
session = Session()
|
|
||||||
top_plays = session.execute("SELECT cvmusic.url, COUNT(cvmusic.url) FROM cvmusic GROUP BY cvmusic.url ORDER BY COUNT(cvmusic.url);").fetchall()
|
|
||||||
session.close()
|
|
||||||
return render_template("music.html", top_plays=top_plays)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
try:
|
try:
|
||||||
app.run(host="0.0.0.0", port=1234, debug=True)
|
app.run(host="0.0.0.0", port=1234, debug=True)
|
||||||
|
|
Loading…
Reference in a new issue