Попытался улучшить ситуацию с тг ботом

This commit is contained in:
Alexey Polyakov
2026-03-09 15:28:22 +03:00
parent 2bb9d7603c
commit d7784b3f4d
3 changed files with 129 additions and 64 deletions

18
src/common/sql_queries.py Normal file
View File

@@ -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)
"""

View File

@@ -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"]
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
}

View File

@@ -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}")