diff --git a/db.py b/db.py
index 3734e150..0106772c 100644
--- a/db.py
+++ b/db.py
@@ -611,13 +611,16 @@ class CVMusic(Base):
@staticmethod
def create_and_add(url: str, user: Royal, enqueued: datetime.datetime, started: datetime.datetime):
- session = Session()
- session.add(CVMusic(url=url,
- enqueued=enqueued,
- started=started,
- user_id=user.id))
- session.commit()
- session.close()
+ 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 __name__ == "__main__":
diff --git a/discordbot.py b/discordbot.py
index c2f04de5..5f7db28b 100644
--- a/discordbot.py
+++ b/discordbot.py
@@ -2,6 +2,9 @@ import datetime
import discord
import discord.opus
import functools
+
+import sys
+
import db
import errors
import youtube_dl
@@ -95,6 +98,14 @@ async def find_user(user: discord.User):
user = await loop.run_in_executor(None, session.query(db.Discord).filter_by(discord_id=user.id).join(db.Royal).first)
return user
+def on_error(event, *args, **kwargs):
+ print(f"ERRORE CRITICO NELL'EVENTO `{event}`\n"
+ f"Il bot si è chiuso per prevenire altri errori.\n"
+ f"Dettagli dell'errore:\n"
+ f"{sys.exc_info()}")
+ sys.exit(1)
+
+
@client.event
async def on_message(message: discord.Message):
global voice_queue
@@ -130,12 +141,13 @@ async def on_message(message: discord.Message):
else:
voice_client = await client.join_voice_channel(message.author.voice.voice_channel)
await client.send_message(message.channel, f"✅ Mi sono connesso in <#{message.author.voice.voice_channel.id}>.")
- elif message.content.startswith("!madd"):
+ elif message.content.startswith("!play"):
await client.send_typing(message.channel)
# The bot should be in voice chat
if voice_client is None:
await client.send_message(message.channel, "⚠️ Non sono connesso alla cv!\n"
"Fammi entrare scrivendo `!cv` mentre sei in chat vocale.")
+ return
# Find the sent url
try:
url = message.content.split(" ", 1)[1]
@@ -158,14 +170,14 @@ async def on_message(message: discord.Message):
return
if "_type" not in info:
# If target is a single video
- video = await Video.init(author=message.author, info=info, timestamp=datetime.datetime.now(), channel=message.channel)
+ video = await Video.init(author=message.author, info=info, enqueued=datetime.datetime.now(), channel=message.channel)
await client.send_message(message.channel, f"✅ Aggiunto alla coda:", embed=video.create_embed())
voice_queue.append(video)
elif info["_type"] == "playlist":
# If target is a playlist
if len(info["entries"]) < 20:
for single_info in info["entries"]:
- video = await Video.init(author=message.author, info=single_info, timestamp=datetime.datetime.now(), channel=message.channel)
+ video = await Video.init(author=message.author, info=single_info, enqueued=datetime.datetime.now(), channel=message.channel)
await client.send_message(message.channel, f"✅ Aggiunto alla coda:", embed=video.create_embed())
voice_queue.append(video)
else:
@@ -177,18 +189,19 @@ async def on_message(message: discord.Message):
if "sì" in answer.content.lower() or "si" in answer.content.lower():
for single_info in info["entries"]:
video = await Video.init(author=message.author, info=single_info,
- timestamp=datetime.datetime.now(), channel=message.channel)
+ enqueued=datetime.datetime.now(), channel=message.channel)
await client.send_message(message.channel, f"✅ Aggiunto alla coda:", embed=video.create_embed())
voice_queue.append(video)
elif "no" in answer.content.lower():
await client.send_message(message.channel, f"ℹ Operazione annullata.")
return
- elif message.content.startswith("!msearch"):
+ elif message.content.startswith("!search"):
await client.send_typing(message.channel)
# The bot should be in voice chat
if voice_client is None:
await client.send_message(message.channel, "⚠️ Non sono connesso alla cv!\n"
"Fammi entrare scrivendo `!cv` mentre sei in chat vocale.")
+ return
# Find the sent text
try:
text = message.content.split(" ", 1)[1]
@@ -208,32 +221,32 @@ async def on_message(message: discord.Message):
video = await Video.init(author=message.author, info=info["entries"][0], enqueued=datetime.datetime.now(), channel=message.channel)
await client.send_message(message.channel, f"✅ Aggiunto alla coda:", embed=video.create_embed())
voice_queue.append(video)
- elif message.content.startswith("!mskip"):
+ elif message.content.startswith("!skip"):
global voice_player
voice_player.stop()
voice_player = None
await client.send_message(message.channel, f"⏩ Video saltato.")
- elif message.content.startswith("!mpause"):
+ elif message.content.startswith("!pause"):
if voice_player is None or not voice_player.is_playing():
await client.send_message(message.channel, f"⚠️ Non è in corso la riproduzione di un video, pertanto non c'è niente da pausare.")
return
voice_player.pause()
await client.send_message(message.channel, f"⏸ Riproduzione messa in pausa.\n"
f"Riprendi con `!mresume`.")
- elif message.content.startswith("!mresume"):
+ elif message.content.startswith("!resume"):
if voice_player is None or voice_player.is_playing():
await client.send_message(message.channel, f"⚠️ Non c'è nulla in pausa da riprendere!")
return
voice_player.resume()
await client.send_message(message.channel, f"▶️ Riproduzione ripresa.")
- elif message.content.startswith("!mcancel"):
+ elif message.content.startswith("!cancel"):
try:
video = voice_queue.pop()
except IndexError:
await client.send_message(message.channel, f"⚠ La playlist è vuota.")
return
await client.send_message(message.channel, f"❌ Rimosso dalla playlist:", embed=video.create_embed())
- elif message.content.startswith("!mstop"):
+ elif message.content.startswith("!stop"):
if voice_player is None:
await client.send_message(message.channel, f"⚠ Non c'è nulla da interrompere!")
return
@@ -241,6 +254,28 @@ async def on_message(message: discord.Message):
voice_player.stop()
voice_player = None
await client.send_message(message.channel, f"⏹ Riproduzione interrotta e playlist svuotata.")
+ elif message.content.startswith("!np"):
+ if voice_player is None:
+ await client.send_message(message.channel, f"ℹ Non c'è nulla in riproduzione al momento.")
+ return
+ voice_queue = []
+ voice_player.stop()
+ voice_player = None
+ await client.send_message(message.channel, f"ℹ Ora in riproduzione in <#{voice_client.channel.id}>:", embed=voice_playing.create_embed())
+ elif message.content.startswith("!queue"):
+ if voice_player is None:
+ await client.send_message(message.channel, f"ℹ Non c'è nulla in riproduzione al momento.")
+ return
+ to_send = ""
+ to_send += f"0. {voice_playing.info['title'] if voice_playing.info['title'] is not None else '_Senza titolo_'} - <{voice_playing.info['webpage_url'] if voice_playing.info['webpage_url'] is not None else ''}>\n"
+ for n, video in enumerate(voice_queue):
+ to_send += f"{n+1}. {video.info['title'] if video.info['title'] is not None else '_Senza titolo_'} - <{video.info['webpage_url'] if video.info['webpage_url'] is not None else ''}>\n"
+ if len(to_send) >= 2000:
+ to_send = to_send[0:1997] + "..."
+ break
+ await client.send_message(message.channel, to_send)
+ elif __debug__ and message.content.startswith("!exception"):
+ raise Exception("sei un mostro")
async def update_users_pipe(users_connection):
@@ -256,17 +291,22 @@ async def update_music_queue():
await client.wait_until_ready()
while True:
global voice_player
+ global voice_playing
# Wait until there is nothing playing
if voice_client is not None and voice_player is not None and (voice_player.is_playing() and not voice_player.is_done()):
await asyncio.sleep(1)
continue
if len(voice_queue) == 0:
+ if voice_playing is not None:
+ # Set the playing status
+ voice_playing = None
+ await client.change_presence()
await asyncio.sleep(1)
continue
# Get the last video in the queue
video = voice_queue.pop(0)
# Notify the chat of the download
- await client.send_message(video.channel, f"ℹ E' iniziato il download di:", embed=video.create_embed())
+ await client.send_message(video.channel, f"ℹ E' iniziato il download della prossima canzone.")
# Download the video
await video.download()
# Play the video
@@ -274,15 +314,16 @@ async def update_music_queue():
voice_player.start()
# Notify the chat of the start
await client.send_message(video.channel, f"▶ Ora in riproduzione in <#{voice_client.channel.id}>:", embed=video.create_embed())
+ # Set the playing status
+ voice_playing = video
+ await client.change_presence(game=discord.Game(name=video.info.get("title"), type=2))
# Add the video to the db
- try:
- await loop.run_in_executor(None, functools.partial(video.add_to_db, started=datetime.datetime.now()))
- except sqlalchemy.exc.OperationalError:
- await client.send_message(video.channel, f"⚠ Ehi, <@77703771181817856>, il database si è rotto. Vallo a sistemare!")
+ await loop.run_in_executor(None, functools.partial(video.add_to_db, started=datetime.datetime.now()))
def process(users_connection):
print("Discordbot starting...")
loop.create_task(update_users_pipe(users_connection))
loop.create_task(update_music_queue())
+ client.on_error = on_error
client.run(config["Discord"]["bot_token"])
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 00000000..d575dfb7
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,6 @@
+discord.py
+python-telegram-bot
+flask
+sqlalchemy
+youtube-dl
+requests
\ No newline at end of file
diff --git a/static/royal.css b/static/royal.css
index 572d82a1..b3f03bd8 100644
--- a/static/royal.css
+++ b/static/royal.css
@@ -20,6 +20,17 @@ table.rl {
color: white !important;
}
+table.dota {
+ background-color: #2e2d45 !important;
+ border: none !important;
+ padding: 12px !important;
+ color: white !important;
+}
+
+th.dota {
+ border-bottom: 4px solid #6BF !important;
+}
+
.rl-rank-hidden {
display: none;
}
diff --git a/templates/leaderboards.html b/templates/leaderboards.html
index a9017a9a..d8a34bd2 100644
--- a/templates/leaderboards.html
+++ b/templates/leaderboards.html
@@ -13,7 +13,7 @@
Dota 2
-
+
Royal |
@@ -38,7 +38,7 @@
Rocket League
-
+
Royal |
@@ -121,7 +121,7 @@
Overwatch
-
+
Royal |
@@ -156,7 +156,7 @@
Osu!
-