From c28888c3751f0ec39ad1a1ef29d97a73469efbc1 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Sun, 15 Apr 2018 13:43:24 +0200 Subject: [PATCH] Immagino di aver fixato il bot veramente --- discordbot.py | 98 ++++++++++++++++++++++++++++++-------------------- telegrambot.py | 12 ++++--- 2 files changed, 68 insertions(+), 42 deletions(-) diff --git a/discordbot.py b/discordbot.py index 8d81a277..e0351d1f 100644 --- a/discordbot.py +++ b/discordbot.py @@ -133,7 +133,7 @@ async def on_error(event, *args, **kwargs): print("ERRORE CRITICO:\n" + repr(ei[1]) + "\n\n" + repr(ei)) try: await client.send_message(client.get_channel(config["Discord"]["main_channel"]), - f"☢️ ERRORE CRITICO NELL'EVENTO `{event}`\n" + f"☢️ **ERRORE CRITICO NELL'EVENTO** `{event}`\n" f"Il bot si è chiuso e si dovrebbe riavviare entro qualche minuto.\n" f"Una segnalazione di errore è stata automaticamente mandata a Steffo.\n\n" f"Dettagli dell'errore:\n" @@ -180,6 +180,7 @@ async def on_message(message: discord.Message): name=message.author.name, discriminator=message.author.discriminator, avatar_hex=message.author.avatar) + session.add(user) await loop.run_in_executor(executor, session.commit) else: sentry.user_context({ @@ -378,47 +379,68 @@ async def update_music_queue(): global voice_player global voice_queue while True: - if voice_client is None: - await asyncio.sleep(5) - continue - if voice_player is not None and not voice_player.is_done(): - await asyncio.sleep(1) - continue - if len(voice_queue) == 0: - await client.change_presence() - await asyncio.sleep(1) - continue - video = voice_queue.pop(0) - if video.ytdl_url: + try: + if voice_client is None: + await asyncio.sleep(5) + continue + if voice_player is not None and not voice_player.is_done(): + await asyncio.sleep(1) + continue + if len(voice_queue) == 0: + await client.change_presence() + await asyncio.sleep(1) + continue + video = voice_queue.pop(0) + if video.ytdl_url: + await client.send_message(client.get_channel(config["Discord"]["main_channel"]), + f"⬇️ E' iniziato il download di `{video.ytdl_url}`.") + try: + async with async_timeout.timeout(30): + await video.download() + except asyncio.TimeoutError: + await client.send_message(client.get_channel(config["Discord"]["main_channel"]), + f"⚠️ Il download della canzone ha richiesto più di 30 secondi ed è stato " + f"annullato. ") + continue + except DurationError: + await client.send_message(client.get_channel(config["Discord"]["main_channel"]), + f"⚠️ Il file supera il limite di durata impostato in config.ini " + f"(`{config['YouTube']['max_duration']}` secondi).") + continue + except Exception as e: + await client.send_message(client.get_channel(config["Discord"]["main_channel"]), + f"⚠️ C'è stato un errore durante il download di `{video.ytdl_url}`:\n" + f"```\n" + f"{e}\n" + f"```") + continue + voice_player = voice_client.create_ffmpeg_player(f"opusfiles/{video.filename}.opus") + voice_player.start() await client.send_message(client.get_channel(config["Discord"]["main_channel"]), - f"⬇️ E' iniziato il download di `{video.ytdl_url}`.") + f"▶ Ora in riproduzione in <#{voice_client.channel.id}>:\n" + f"`{video.filename}`") + await client.change_presence(game=discord.Game(name=video.filename, type=2)) + await video.add_to_db() + except Exception: + ei = sys.exc_info() try: - async with async_timeout.timeout(30): - await video.download() - except asyncio.TimeoutError: await client.send_message(client.get_channel(config["Discord"]["main_channel"]), - f"⚠️ Il download della canzone ha richiesto più di 30 secondi ed è stato " - f"annullato. ") - continue - except DurationError: - await client.send_message(client.get_channel(config["Discord"]["main_channel"]), - f"⚠️ Il file supera il limite di durata impostato in config.ini " - f"(`{config['YouTube']['max_duration']}` secondi).") - continue - except Exception as e: - await client.send_message(client.get_channel(config["Discord"]["main_channel"]), - f"⚠️ C'è stato un errore durante il download di `{video.ytdl_url}`:\n" - f"```\n" - f"{e}\n" + f"☢️ **ERRORE CRITICO NELL'AGGIORNAMENTO DELLA CODA DI VIDEO**\n" + f"Il bot si è disconnesso dalla chat vocale, e ha svuotato la coda.\n" + f"Una segnalazione di errore è stata automaticamente mandata a Steffo.\n\n" + f"Dettagli dell'errore:\n" + f"```python\n" + f"{repr(ei[1])}\n" f"```") - continue - voice_player = voice_client.create_ffmpeg_player(f"opusfiles/{video.filename}.opus") - voice_player.start() - await client.send_message(client.get_channel(config["Discord"]["main_channel"]), - f"▶ Ora in riproduzione in <#{voice_client.channel.id}>:\n" - f"`{video.filename}`") - await client.change_presence(game=discord.Game(name=video.filename, type=2)) - await video.add_to_db() + if voice_player is not None: + await voice_player.stop() + voice_player = None + await voice_client.disconnect() + voice_client = None + voice_queue = [] + except Exception as e: + print("ERRORE CRITICO PIU' CRITICO:\n" + repr(e) + "\n\n" + repr(sys.exc_info())) + sentry.captureException(exc_info=ei) def process(users_connection=None): diff --git a/telegrambot.py b/telegrambot.py index 55aab36d..4587b567 100644 --- a/telegrambot.py +++ b/telegrambot.py @@ -47,7 +47,9 @@ def cmd_register(bot: Bot, update: Update): royal_username=username, telegram_user=update.message.from_user) except errors.AlreadyExistingError: - bot.send_message(update.message.chat.id, "⚠ Il tuo account Telegram è già collegato a un account RYG o l'account RYG che hai specificato è già collegato a un account Telegram.") + bot.send_message(update.message.chat.id, "⚠ Il tuo account Telegram è già collegato a un account RYG o" + " l'account RYG che hai specificato è già collegato a un account" + " Telegram.") session.close() return session.add(t) @@ -290,7 +292,8 @@ def on_callback_query(bot: Bot, update: Update): user = session.query(db.Telegram).filter_by(telegram_id=update.callback_query.from_user.id).one_or_none() if user is None: bot.answer_callback_query(update.callback_query.id, show_alert=True, - text="⚠ Il tuo account Telegram non è registrato al RYGdb! Registrati con `/register@royalgamesbot `.") + text="⚠ Il tuo account Telegram non è registrato al RYGdb!" + " Registrati con `/register@royalgamesbot `.") return question = session.query(db.VoteQuestion).filter_by(message_id=update.callback_query.message.message_id).one() answer = session.query(db.VoteAnswer).filter_by(question=question, user=user).one_or_none() @@ -307,7 +310,7 @@ def on_callback_query(bot: Bot, update: Update): bot.edit_message_text(message_id=update.callback_query.message.message_id, chat_id=update.callback_query.message.chat.id, text=question.generate_text(session), reply_markup=inline_keyboard, parse_mode="HTML") - except Exception as e: + except Exception: raise finally: session.close() @@ -332,7 +335,8 @@ def cmd_ban(bot: Bot, update: Update): target_user = session.query(db.Telegram).filter_by(username=arg).one_or_none() if target_user is None: bot.send_message(update.message.chat.id, "⚠ Il bersaglio specificato non esiste nel RYGdb.\n" - "Le possibilità sono due: non è un membro RYG, oppure non si è ancora registrato e va bannato manualmente.") + "Le possibilità sono due: non è un membro RYG, " + "oppure non si è ancora registrato e va bannato manualmente.") return if int(target_user.telegram_id) == 25167391: bot.send_message(update.message.chat.id, "⚠ Il creatore della chat non può essere espulso.")