mirror of
https://github.com/openmax-server/server.git
synced 2026-03-15 00:07:39 +00:00
Попытался улучшить ситуацию с тг ботом
This commit is contained in:
18
src/common/sql_queries.py
Normal file
18
src/common/sql_queries.py
Normal 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)
|
||||
"""
|
||||
@@ -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
|
||||
}
|
||||
@@ -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}")
|
||||
Reference in New Issue
Block a user