From 1dce7becc670df10533ab6235b715166490e16a3 Mon Sep 17 00:00:00 2001 From: Javinator9889 Date: Sun, 1 Jul 2018 21:45:13 +0200 Subject: [PATCH] Updated handlers, messages and database for async working --- youtube_md_bot/.idea/workspace.xml | 305 ++++++++++++++---------- youtube_md_bot/__init__.py | 17 +- youtube_md_bot/database/__init__.py | 24 +- youtube_md_bot/handlers/HelpHandler.py | 28 ++- youtube_md_bot/handlers/StartHandler.py | 11 +- youtube_md_bot/handlers/__init__.py | 6 + youtube_md_bot/messages/messages.json | 11 +- 7 files changed, 249 insertions(+), 153 deletions(-) diff --git a/youtube_md_bot/.idea/workspace.xml b/youtube_md_bot/.idea/workspace.xml index 39a1312..1cdd8f4 100644 --- a/youtube_md_bot/.idea/workspace.xml +++ b/youtube_md_bot/.idea/workspace.xml @@ -2,11 +2,13 @@ - - - - - + + + + + + + - - + + - - + + - + - - + + - + - - + + - + @@ -126,7 +128,7 @@ - + @@ -137,41 +139,53 @@ - - + + - - + + + + + + + + + + + - + - + - - + + + + + - + - - + + - + - - + + @@ -192,7 +206,16 @@ duration + "app_data.dict" + "requirements.txt" + handlers + + Constants.A_ + Constants.A_APP_DATA_FILE + Constants.A_APP_REQ_FILE + .handlers + @@ -253,22 +283,37 @@ - - + + - - + + + + + + + - - + + - - + + + + + + + + + + + + @@ -412,7 +457,21 @@ @@ -460,7 +519,9 @@ - @@ -468,7 +529,7 @@ - + @@ -479,7 +540,7 @@ - + @@ -489,7 +550,7 @@ - + @@ -499,7 +560,7 @@ - + @@ -516,14 +577,14 @@ - + - + @@ -533,14 +594,14 @@ - + - + @@ -554,14 +615,14 @@ - + - + @@ -571,28 +632,28 @@ - + - + - + - + @@ -602,28 +663,28 @@ - + - + - + - + @@ -633,14 +694,14 @@ - + - + @@ -650,14 +711,14 @@ - + - + @@ -667,14 +728,14 @@ - + - + @@ -684,21 +745,21 @@ - + - + - + @@ -706,21 +767,21 @@ - + - + - + @@ -735,24 +796,14 @@ - + - - - - - - - - - - - + @@ -763,17 +814,17 @@ - + - - + + - + @@ -783,7 +834,7 @@ - + @@ -793,78 +844,88 @@ - + - + - + + + + - - - - - + + - + - - - - - + + - + - - + + - - + + + + + + - + - - + + - + - - + + - + - - + + + + + - + - - + + + + + - + - - + + + + + diff --git a/youtube_md_bot/__init__.py b/youtube_md_bot/__init__.py index 69a80a8..9933cc3 100644 --- a/youtube_md_bot/__init__.py +++ b/youtube_md_bot/__init__.py @@ -24,13 +24,13 @@ def handler_definer(): handlers = [] with open(Constants.A_APP_MESSAGES, 'r') as messages_file: messages: dict = messages_file.read() - start = StartHandler(messages["welcome"]) - help_handler = HelpHandler(messages["help"]) - dev = DeveloperHandler(messages["dev"]) - video = VideoIDHandler(messages["video_id"]) - url = URLHandler(messages["url_messages"]) - text = TextHandler(messages["text"]) - unexpected = UnexpectedHandler(messages["unexpected"]) + start = StartHandler(messages) + help_handler = HelpHandler(messages) + dev = DeveloperHandler(messages) + video = VideoIDHandler(messages) + url = URLHandler(messages) + text = TextHandler(messages) + unexpected = UnexpectedHandler(messages) handlers.append(CommandHandler("start", start.start)) handlers.append(CommandHandler("help", help_handler.help)) @@ -40,6 +40,7 @@ def handler_definer(): Filters.entity(MessageEntity.TEXT_LINK)), url.url_handler)) handlers.append(MessageHandler(Filters.text, text.message_handler)) handlers.append(MessageHandler(Filters.all, unexpected.unexpected)) + return handlers @@ -116,7 +117,7 @@ def main(arguments: Namespace): Constants.L_PRIMARY_LOGGER_MODE) logger.setup_logging(Constants.L_SECONDARY_LOGGER_NAME, Constants.L_SECONDARY_LOGGER_MODE) try: - updater.start_polling(poll_interval=5, timeout=60) + updater.start_polling(poll_interval=1, timeout=90) except KeyboardInterrupt: cPrint("Exiting program... Wait while closing threads and pending petitions...", Colors.FAIL) updater.idle() diff --git a/youtube_md_bot/database/__init__.py b/youtube_md_bot/database/__init__.py index c7c9b4f..b0c4148 100644 --- a/youtube_md_bot/database/__init__.py +++ b/youtube_md_bot/database/__init__.py @@ -54,11 +54,11 @@ def registerPreferences(self, user_id: int, audio_quality: str, audio_format: st """ self.__session.execute(query, (audio_quality, audio_format, os, should_ask_metadata, user_id)) - def registerStatistics(self, user_id: int, lang: str, downloads: int, last_time_active): + def registerStatistics(self, user_id: int, lang: str, downloads: int, last_time_active: datetime): query = """ INSERT INTO YouTubeMDApp.Statistics(lang, downloads, last_time_active, user_id) VALUES (%s, %s, %s, %s); """ - self.__session.execute(query, (lang, downloads, last_time_active, user_id)) + self.__session.execute_async(query, (lang, downloads, last_time_active, user_id)) def registerNewSong(self, file_id: str, video_id: str, audio_quality: int, audio_format: int, times_requested: int, is_metadata_by_user: bool): @@ -66,14 +66,14 @@ def registerNewSong(self, file_id: str, video_id: str, audio_quality: int, audio INSERT INTO YouTubeMDApp.music (file_id, video_id, audio_quality, audio_format, times_requested, is_metadata_by_user) VALUES (%s, %s, %s, %s, %s, %s) """ - self.__session.execute(query, (file_id, video_id, audio_quality, audio_format, times_requested, + self.__session.execute_async(query, (file_id, video_id, audio_quality, audio_format, times_requested, is_metadata_by_user)) def registerNewPlaylist(self, playlist_id: str, number_elements: int, times_requested: int): query = """ INSERT INTO YouTubeMDApp.playlist(playlist_id, number_elements, times_requested) VALUES (%s, %s, %s) """ - self.__session.execute(query, (playlist_id, number_elements, times_requested)) + self.__session.execute_async(query, (playlist_id, number_elements, times_requested)) def registerNewSongForPlaylist(self, playlist_id: str, file_id: str, playlist_quality: str, playlist_format: str): query = """ @@ -87,13 +87,13 @@ def registerNewSongMetadata(self, title: str, artist: str, cover: str, duration: INSERT INTO YouTubeMDApp.metadata(title, artist, cover, song_duration, music_file_id) VALUES (%s, %s, %s, %s, %s) """ - self.__session.execute(query, (title, artist, cover, duration, file_id)) + self.__session.execute_async(query, (title, artist, cover, duration, file_id)) def registerNewSongInHistory(self, user_id: int, file_id: str): query = """ INSERT INTO YouTubeMDApp.history(user_id, file_id) VALUES (%s, %s) """ - self.__session.execute(query, (user_id, file_id)) + self.__session.execute_async(query, (user_id, file_id)) class UpdateOperations(DatabaseOperationsBase): @@ -104,7 +104,7 @@ def updateUserUsername(self, new_username: str, user_id: int): query = """ UPDATE YouTubeMDApp.user SET username = %s WHERE user_id = %s """ - self.__session.execute(query, (new_username, user_id)) + self.__session.execute_async(query, (new_username, user_id)) def updateUserAudioQuality(self, user_id: int, audio_quality: str): query = """ @@ -134,31 +134,31 @@ def updateUserLang(self, user_id: int, lang: str): query = """ UPDATE YouTubeMDApp.statistics SET lang = %s WHERE user_id = %s """ - self.__session.execute(query, (lang, user_id)) + self.__session.execute_async(query, (lang, user_id)) def updateUserDownloads(self, user_id: int): query = """ UPDATE YouTubeMDApp.statistics SET downloads = downloads + 1 WHERE user_id = %s """ - self.__session.execute(query, (user_id, )) + self.__session.execute_async(query, (user_id, )) def updateUserLastTimeActive(self, user_id: int): query = """ UPDATE YouTubeMDApp.statistics SET last_time_active = %s WHERE user_id = %s """ - self.__session.execute(query, (datetime.now(), user_id)) + self.__session.execute_async(query, (datetime.now(), user_id)) def updatePlaylistNumberOfElements(self, playlist_id: str, number_of_elements: int): query = """ UPDATE YouTubeMDApp.playlist SET number_elements = %s WHERE playlist_id = %s """ - self.__session.execute(query, (number_of_elements, playlist_id)) + self.__session.execute_async(query, (number_of_elements, playlist_id)) def updatePlaylistTimesRequested(self, playlist_id: str): query = """ UPDATE YouTubeMDApp.playlist SET times_requested = times_requested + 1 WHERE playlist_id = %s """ - self.__session.execute(query, (playlist_id, )) + self.__session.execute_async(query, (playlist_id, )) class SelectOperations(DatabaseOperationsBase): diff --git a/youtube_md_bot/handlers/HelpHandler.py b/youtube_md_bot/handlers/HelpHandler.py index fb56218..b9dfee9 100644 --- a/youtube_md_bot/handlers/HelpHandler.py +++ b/youtube_md_bot/handlers/HelpHandler.py @@ -1,4 +1,4 @@ -from telegram import Bot, Update, ParseMode +from telegram import Bot, Update, ParseMode, InlineKeyboardMarkup, InlineKeyboardButton from telegram.ext import run_async from handlers import Handler @@ -7,8 +7,28 @@ class HelpHandler(Handler): @run_async def help(self, bot: Bot, update: Update, args: list): - chat_id = update.message.chat_id + effective_user = update.effective_user + user_id = effective_user.id + lang = effective_user.language_code + + self.__update_operations.updateUserLastTimeActive(user_id) + if len(args) == 0: - print("no args") + self.show_help_keyboard(bot=bot, user_id=user_id, lang=lang) + + def show_help_keyboard(self, bot: Bot, user_id: int, lang: str, message_id: int=None): + help_message = self.__messages[lang][0]["help"]["msg"] + tt_at_button = self.__messages[lang][0]["help"]["d_via_tt-at-but"] + url_button = self.__messages[lang][0]["help"]["d_via_url-but"] + history_button = self.__messages[lang][0]["help"]["d_via_history-but"] + support_button = self.__messages[lang][0]["help"]["support_but"] + + help_keyboard = InlineKeyboardMarkup([[InlineKeyboardButton(tt_at_button, callback_data="tt_at_button"), + InlineKeyboardButton(url_button, callback_data="url_button")], + [InlineKeyboardButton(history_button, callback_data="history_button"), + InlineKeyboardButton(support_button, callback_data="support_button")]]) + if not message_id: + bot.sendMessage(chat_id=user_id, text=help_message, reply_markup=help_keyboard, + parse_mode=ParseMode.MARKDOWN) else: - bot.sendMessage(chat_id, self.__messages["help"]) + bot.editMessageText(help_message, chat_id=user_id, message_id=message_id, parse_mode=ParseMode.MARKDOWN) diff --git a/youtube_md_bot/handlers/StartHandler.py b/youtube_md_bot/handlers/StartHandler.py index 9b991ce..f06e5ae 100644 --- a/youtube_md_bot/handlers/StartHandler.py +++ b/youtube_md_bot/handlers/StartHandler.py @@ -1,9 +1,10 @@ from telegram import Bot, Update, ParseMode from telegram.ext import run_async +from datetime import datetime + from handlers import Handler from utils import Constants -from database import InsertOperations class StartHandler(Handler): @@ -19,11 +20,15 @@ def start(self, bot: Bot, update: Update): user_id = effective_user.id username = effective_user.username name = effective_user.first_name + lang = effective_user.language_code + user_path = Constants.P_USERS_PATH + user_id + '/' - db_insert: InsertOperations = InsertOperations() + db_insert = self.__insert_operations if not os.path.exists(user_path): os.mkdir(user_path) with open(user_path + Constants.P_USERS_FILE, "wb") as user_info: pickle.dump(Constants.D_USER_DICT, user_info) db_insert.registerNewUser(user_id=user_id, username=username, name=name) - bot.sendMessage(chat_id=user_id, text=self.__messages["msg"], parse_mode=ParseMode.MARKDOWN) + db_insert.registerStatistics(user_id, lang, 0, datetime.now()) + message = self.__messages[lang][0]["welcome"][0]["msg"].format(username) + bot.sendMessage(chat_id=user_id, text=message, parse_mode=ParseMode.MARKDOWN) diff --git a/youtube_md_bot/handlers/__init__.py b/youtube_md_bot/handlers/__init__.py index 4947811..ba8141d 100644 --- a/youtube_md_bot/handlers/__init__.py +++ b/youtube_md_bot/handlers/__init__.py @@ -1,3 +1,9 @@ +from database import InsertOperations, SelectOperations, UpdateOperations + + class Handler: def __init__(self, handler_messages: dict): self.__messages = handler_messages + self.__insert_operations: InsertOperations = InsertOperations() + self.__update_operations: UpdateOperations = UpdateOperations() + self.__select_operations: SelectOperations = SelectOperations() diff --git a/youtube_md_bot/messages/messages.json b/youtube_md_bot/messages/messages.json index d31cd04..f7f657d 100644 --- a/youtube_md_bot/messages/messages.json +++ b/youtube_md_bot/messages/messages.json @@ -1,5 +1,5 @@ { - "es_ES": [ + "es": [ { "welcome": [ { @@ -8,8 +8,11 @@ ], "help": [ { - "msg": "Para descargar una canción puedes:\n ■ *Buscar* 🔎 la canción por _título y artista_, enviándoselo directamente al bot\n ■ *Enviar* directamente la _URL_ 🔗 del vídeo\n ■ Seleccionar una *canción ya descargada* desde el historial 🕒\n\n", - "more_help": "Para más ayuda, navega con los botones que aparecen debajo", + "msg": "Para descargar una canción puedes:\n ■ *Buscar* 🔎 la canción por _título y artista_, enviándoselo directamente al bot\n ■ *Enviar* directamente la _URL_ 🔗 del vídeo\n ■ Seleccionar una *canción ya descargada* desde el historial 🕒\n\nPara más ayuda, navega con los botones que aparecen debajo", + "d_via_tt-at-but": "Título y artista", + "d_via_url-but": "URL", + "d_via_history-but": "Historial", + "support_but": "Soporte", "d_via_tt-at": "*Descarga*[ ]({})canciones enviando directamente el _título_ 🎤 y _artista_ 🗣 de la canción al bot", "d_via_url": "Comienza[ ]({})directamente *con la descarga* enviando la URL del vídeo de YouTube\n\nPuedes usar un bot _inline_ como @vid para agilizar este proceso", "d_via_history": "Accede[ ]({})a tu *historial* mediante el comando /history, desde donde podrás _seleccionar directamente_ la canción que quieras descargar" @@ -17,7 +20,7 @@ ] } ], - "en_US": [ + "en": [ { }