diff --git a/src/common/sql_queries.py b/src/common/sql_queries.py new file mode 100644 index 0000000..4847261 --- /dev/null +++ b/src/common/sql_queries.py @@ -0,0 +1,18 @@ +class SQLQueries: + def __init__(self): + pass + + SELECT_USER_BY_TG_ID = "SELECT * FROM users WHERE telegram_id = %s" + + INSERT_USER = """ + INSERT INTO users + (phone, telegram_id, firstname, lastname, username, + profileoptions, options, accountstatus, updatetime, lastseen) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + """ + + INSERT_USER_DATA = """ + INSERT INTO user_data + (phone, chats, contacts, folders, user_config, chat_config) + VALUES (%s, %s, %s, %s, %s, %s) + """ \ No newline at end of file diff --git a/src/common/static.py b/src/common/static.py index 52e8304..f8f6c9d 100644 --- a/src/common/static.py +++ b/src/common/static.py @@ -1,3 +1,5 @@ +from textwrap import dedent + class Static: """Тут просто статические константы для их дальнейшего использования""" def __init__(self): @@ -16,6 +18,15 @@ class Static: class ChatTypes: DIALOG = "DIALOG" + class BotMessageTypes: + WELCOME_ALREADY_REGISTERED = "welcome_already_registered" + WELCOME_NEW_USER = "welcome_new_user" + REGISTRATION_SUCCESS = "registration_success" + ACCOUNT_ALREADY_EXISTS = "account_already_exists" + ID_NOT_WHITELISTED = "id_not_whitelisted" + INTERNAL_ERROR = "internal_error" + INCOMING_CODE = "incoming_code" + ERROR_TYPES = { "not_implemented": { "localizedMessage": "Не реализовано", @@ -67,6 +78,38 @@ class Static: } } + ### Сообщения бота + BOT_MESSAGES = { + "welcome_already_registered": dedent(""" + 👋 С возвращением в OpenMAX! + Ваш номер, если забыли: {phone} + """).strip(), + "welcome_new_user": dedent(""" + 👋 Добро пожаловать на этот инстанс OpenMAX! + У вас ещё нет аккаунта. Используйте /register для создания. + """).strip(), + "registration_success": dedent(""" + ✅ Регистрация завершена! + Ваш новый номер: {new_phone} + Все коды для авторизации будут приходить сюда. + """).strip(), + "account_already_exists": dedent(""" + ❌ У вас уже есть аккаунт. + """).strip(), + "id_not_whitelisted": dedent(""" + ❌ Ваш ID не находится в белом списке. + """).strip(), + "internal_error": dedent(""" + ❌ Ошибка при регистрации аккаунта. + """).strip(), + "incoming_code": dedent(""" + Новая попытка входа в OpenMAX с вашим номером {phone} + Код: {code} + ❗️ Никому не сообщайте его, иначе можете потерять свой аккаунт! + """).strip() + } + + ### Причины для жалоб COMPLAIN_REASONS = [ # TODO: Было бы очень замечательно заполнить этот лист причинами для жалоб ] @@ -81,4 +124,42 @@ class Static: "sourceId": 1 }] - ALL_CHAT_FOLDER_ORDER = ["all.chat.folder"] \ No newline at end of file + ALL_CHAT_FOLDER_ORDER = ["all.chat.folder"] + + ### Стандартные папки с настройками пользователя + USER_FOLDERS = { + "folders": [], + "foldersOrder": [], + "allFilterExcludeFolders": [] + } + + USER_SETTINGS = { + "CHATS_PUSH_NOTIFICATION": "ON", + "PUSH_DETAILS": True, + "PUSH_SOUND": "DEFAULT", + "INACTIVE_TTL": "6M", + "CHATS_QUICK_REPLY": False, + "SHOW_READ_MARK": True, + "AUDIO_TRANSCRIPTION_ENABLED": True, + "CHATS_LED": 65535, + "SEARCH_BY_PHONE": "ALL", + "INCOMING_CALL": "ALL", + "DOUBLE_TAP_REACTION_DISABLED": False, + "SAFE_MODE_NO_PIN": False, + "CHATS_PUSH_SOUND": "DEFAULT", + "DOUBLE_TAP_REACTION_VALUE": None, + "FAMILY_PROTECTION": "OFF", + "LED": 65535, + "HIDDEN": False, + "VIBR": True, + "CHATS_INVITE": "ALL", + "PUSH_NEW_CONTACTS": False, + "UNSAFE_FILES": True, + "DONT_DISTURB_UNTIL": 0, + "CHATS_VIBR": True, + "CONTENT_LEVEL_ACCESS": False, + "STICKERS_SUGGEST": "ON", + "SAFE_MODE": False, + "M_CALL_PUSH_NOTIFICATION": "ON", + "QUICK_REPLY": False + } \ No newline at end of file diff --git a/src/telegrambot/bot.py b/src/telegrambot/bot.py index e618501..c7cb2b0 100644 --- a/src/telegrambot/bot.py +++ b/src/telegrambot/bot.py @@ -3,6 +3,8 @@ import random import json import time from telebot.async_telebot import AsyncTeleBot +from common.static import Static +from common.sql_queries import SQLQueries class TelegramBot: def __init__(self, token, enabled, db_pool, whitelist_ids=None): @@ -12,6 +14,10 @@ class TelegramBot: self.whitelist_ids = whitelist_ids if whitelist_ids is not None else [] self.logger = logging.getLogger(__name__) + self.msg_types = Static().BotMessageTypes() + self.static = Static() + self.sql_queries = SQLQueries() + @self.bot.message_handler(commands=['start']) async def handle_start(message): tg_id = str(message.from_user.id) @@ -19,7 +25,7 @@ class TelegramBot: # Ищем привязанный аккаунт пользователя async with self.db_pool.acquire() as conn: async with conn.cursor() as cursor: - await cursor.execute("SELECT * FROM users WHERE telegram_id = %s", (tg_id,)) + await cursor.execute(self.sql_queries.SELECT_USER_BY_TG_ID, (tg_id,)) account = await cursor.fetchone() if account: @@ -28,13 +34,11 @@ class TelegramBot: await self.bot.send_message( message.chat.id, - f"👋 С возвращением в OpenMAX!\nВаш номер, если забыли: {phone}" + self.get_bot_message(self.msg_types.WELCOME_ALREADY_REGISTERED).format(phone=phone) ) - await self.send_auth_code(message.chat.id, phone) else: await self.bot.send_message( - message.chat.id, - "👋 Добро пожаловать на этот инстанс OpenMAX!\nУ вас ещё нет аккаунта. Используйте /register для создания." + message.chat.id, self.get_bot_message(self.msg_types.WELCOME_NEW_USER) ) @self.bot.message_handler(commands=['register']) @@ -42,16 +46,19 @@ class TelegramBot: tg_id = str(message.from_user.id) # Проверка ID на наличие в белом списке - if self.whitelist_ids and tg_id not in self.whitelist_ids: - await self.bot.send_message(message.chat.id, "❌ Ваш ID не находится в белом списке.") + if tg_id not in self.whitelist_ids: + await self.bot.send_message(message.chat.id, self.get_bot_message(self.msg_types.ID_NOT_WHITELISTED)) return async with self.db_pool.acquire() as conn: async with conn.cursor() as cursor: # Проверка на существование - await cursor.execute("SELECT id FROM users WHERE telegram_id = %s", (tg_id,)) + await cursor.execute(self.sql_queries.SELECT_USER_BY_TG_ID, (tg_id,)) if await cursor.fetchone(): - await self.bot.send_message(message.chat.id, "⚠️ У вас уже есть аккаунт! Существующий аккаунт можно удалить через клиент или обратившись к администратору инстанса.") + await self.bot.send_message( + message.chat.id, + self.get_bot_message(self.msg_types.ACCOUNT_ALREADY_EXISTS) + ) return # Подготовка данных согласно схеме @@ -59,52 +66,10 @@ class TelegramBot: updatetime = str(int(time.time() * 1000)) lastseen = str(int(time.time())) - folders = { - "folders": [], - "foldersOrder": [], - "allFilterExcludeFolders": [] - } - - user_settings = { - "CHATS_PUSH_NOTIFICATION": "ON", - "PUSH_DETAILS": True, - "PUSH_SOUND": "DEFAULT", - "INACTIVE_TTL": "6M", - "CHATS_QUICK_REPLY": False, - "SHOW_READ_MARK": True, - "AUDIO_TRANSCRIPTION_ENABLED": True, - "CHATS_LED": 65535, - "SEARCH_BY_PHONE": "ALL", - "INCOMING_CALL": "ALL", - "DOUBLE_TAP_REACTION_DISABLED": False, - "SAFE_MODE_NO_PIN": False, - "CHATS_PUSH_SOUND": "DEFAULT", - "DOUBLE_TAP_REACTION_VALUE": None, - "FAMILY_PROTECTION": "OFF", - "LED": 65535, - "HIDDEN": False, - "VIBR": True, - "CHATS_INVITE": "ALL", - "PUSH_NEW_CONTACTS": False, - "UNSAFE_FILES": True, - "DONT_DISTURB_UNTIL": 0, - "CHATS_VIBR": True, - "CONTENT_LEVEL_ACCESS": False, - "STICKERS_SUGGEST": "ON", - "SAFE_MODE": False, - "M_CALL_PUSH_NOTIFICATION": "ON", - "QUICK_REPLY": False - } - try: # Создаем юзера await cursor.execute( - """ - INSERT INTO users - (phone, telegram_id, firstname, lastname, username, - profileoptions, options, accountstatus, updatetime, lastseen) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) - """, + self.sql_queries.INSERT_USER, ( new_phone, # phone tg_id, # telegram_id @@ -121,29 +86,31 @@ class TelegramBot: # Добавляем данные о аккаунте await cursor.execute( - """ - INSERT INTO user_data - (phone, chats, contacts, folders, user_config, chat_config) - VALUES (%s, %s, %s, %s, %s, %s) - """, + self.sql_queries.INSERT_USER_DATA, ( new_phone, # phone json.dumps([]), # chats json.dumps([]), # contacts - json.dumps(folders), # folders - json.dumps(user_settings), # user_config + json.dumps(self.static.USER_FOLDERS), # folders + json.dumps(self.static.USER_SETTINGS), # user settings json.dumps({}), # chat_config ) ) await self.bot.send_message( message.chat.id, - f"✅ Регистрация завершена!\nВаш новый номер: {new_phone}\nВсе коды для авторизации будут приходить сюда." + self.get_bot_message(self.msg_types.REGISTRATION_SUCCESS).format(new_phone=new_phone) ) except Exception as e: self.logger.error(f"Ошибка при регистрации: {e}") - await self.bot.send_message(message.chat.id, "❌ Ошибка при регистрации аккаунта. Обратитесь к администратору инстанса за помощью.") + await self.bot.send_message( + message.chat.id, + self.get_bot_message(self.msg_types.INTERNAL_ERROR) + ) + def get_bot_message(self, msg_type): + return self.static.BOT_MESSAGES.get(msg_type) + async def start(self): if self.enabled == True: try: @@ -156,8 +123,7 @@ class TelegramBot: async def send_auth_code(self, chat_id, phone, code): try: await self.bot.send_message( - chat_id, - f"Новая попытка входа в OpenMAX с вашим номером {phone}\nКод: {code}\n❗️ Никому не сообщайте его, иначе можете потерять свой аккаунт!" + chat_id, self.get_bot_message(self.msg_types.INCOMING_CODE).format(phone=phone, code=code) ) except Exception as e: self.logger.error(f"Ошибка отправки кода в Telegram: {e}") \ No newline at end of file