Попытался улучшить ситуацию с тг ботом
This commit is contained in:
parent
2bb9d7603c
commit
d7784b3f4d
|
|
@ -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:
|
class Static:
|
||||||
"""Тут просто статические константы для их дальнейшего использования"""
|
"""Тут просто статические константы для их дальнейшего использования"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
@ -16,6 +18,15 @@ class Static:
|
||||||
class ChatTypes:
|
class ChatTypes:
|
||||||
DIALOG = "DIALOG"
|
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 = {
|
ERROR_TYPES = {
|
||||||
"not_implemented": {
|
"not_implemented": {
|
||||||
"localizedMessage": "Не реализовано",
|
"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 = [
|
COMPLAIN_REASONS = [
|
||||||
# TODO: Было бы очень замечательно заполнить этот лист причинами для жалоб
|
# TODO: Было бы очень замечательно заполнить этот лист причинами для жалоб
|
||||||
]
|
]
|
||||||
|
|
@ -81,4 +124,42 @@ class Static:
|
||||||
"sourceId": 1
|
"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 json
|
||||||
import time
|
import time
|
||||||
from telebot.async_telebot import AsyncTeleBot
|
from telebot.async_telebot import AsyncTeleBot
|
||||||
|
from common.static import Static
|
||||||
|
from common.sql_queries import SQLQueries
|
||||||
|
|
||||||
class TelegramBot:
|
class TelegramBot:
|
||||||
def __init__(self, token, enabled, db_pool, whitelist_ids=None):
|
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.whitelist_ids = whitelist_ids if whitelist_ids is not None else []
|
||||||
self.logger = logging.getLogger(__name__)
|
self.logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
self.msg_types = Static().BotMessageTypes()
|
||||||
|
self.static = Static()
|
||||||
|
self.sql_queries = SQLQueries()
|
||||||
|
|
||||||
@self.bot.message_handler(commands=['start'])
|
@self.bot.message_handler(commands=['start'])
|
||||||
async def handle_start(message):
|
async def handle_start(message):
|
||||||
tg_id = str(message.from_user.id)
|
tg_id = str(message.from_user.id)
|
||||||
|
|
@ -19,7 +25,7 @@ class TelegramBot:
|
||||||
# Ищем привязанный аккаунт пользователя
|
# Ищем привязанный аккаунт пользователя
|
||||||
async with self.db_pool.acquire() as conn:
|
async with self.db_pool.acquire() as conn:
|
||||||
async with conn.cursor() as cursor:
|
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()
|
account = await cursor.fetchone()
|
||||||
|
|
||||||
if account:
|
if account:
|
||||||
|
|
@ -28,13 +34,11 @@ class TelegramBot:
|
||||||
|
|
||||||
await self.bot.send_message(
|
await self.bot.send_message(
|
||||||
message.chat.id,
|
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:
|
else:
|
||||||
await self.bot.send_message(
|
await self.bot.send_message(
|
||||||
message.chat.id,
|
message.chat.id, self.get_bot_message(self.msg_types.WELCOME_NEW_USER)
|
||||||
"👋 Добро пожаловать на этот инстанс OpenMAX!\nУ вас ещё нет аккаунта. Используйте /register для создания."
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@self.bot.message_handler(commands=['register'])
|
@self.bot.message_handler(commands=['register'])
|
||||||
|
|
@ -42,16 +46,19 @@ class TelegramBot:
|
||||||
tg_id = str(message.from_user.id)
|
tg_id = str(message.from_user.id)
|
||||||
|
|
||||||
# Проверка ID на наличие в белом списке
|
# Проверка ID на наличие в белом списке
|
||||||
if self.whitelist_ids and tg_id not in self.whitelist_ids:
|
if tg_id not in self.whitelist_ids:
|
||||||
await self.bot.send_message(message.chat.id, "❌ Ваш ID не находится в белом списке.")
|
await self.bot.send_message(message.chat.id, self.get_bot_message(self.msg_types.ID_NOT_WHITELISTED))
|
||||||
return
|
return
|
||||||
|
|
||||||
async with self.db_pool.acquire() as conn:
|
async with self.db_pool.acquire() as conn:
|
||||||
async with conn.cursor() as cursor:
|
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():
|
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
|
return
|
||||||
|
|
||||||
# Подготовка данных согласно схеме
|
# Подготовка данных согласно схеме
|
||||||
|
|
@ -59,52 +66,10 @@ class TelegramBot:
|
||||||
updatetime = str(int(time.time() * 1000))
|
updatetime = str(int(time.time() * 1000))
|
||||||
lastseen = str(int(time.time()))
|
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:
|
try:
|
||||||
# Создаем юзера
|
# Создаем юзера
|
||||||
await cursor.execute(
|
await cursor.execute(
|
||||||
"""
|
self.sql_queries.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)
|
|
||||||
""",
|
|
||||||
(
|
(
|
||||||
new_phone, # phone
|
new_phone, # phone
|
||||||
tg_id, # telegram_id
|
tg_id, # telegram_id
|
||||||
|
|
@ -121,29 +86,31 @@ class TelegramBot:
|
||||||
|
|
||||||
# Добавляем данные о аккаунте
|
# Добавляем данные о аккаунте
|
||||||
await cursor.execute(
|
await cursor.execute(
|
||||||
"""
|
self.sql_queries.INSERT_USER_DATA,
|
||||||
INSERT INTO user_data
|
|
||||||
(phone, chats, contacts, folders, user_config, chat_config)
|
|
||||||
VALUES (%s, %s, %s, %s, %s, %s)
|
|
||||||
""",
|
|
||||||
(
|
(
|
||||||
new_phone, # phone
|
new_phone, # phone
|
||||||
json.dumps([]), # chats
|
json.dumps([]), # chats
|
||||||
json.dumps([]), # contacts
|
json.dumps([]), # contacts
|
||||||
json.dumps(folders), # folders
|
json.dumps(self.static.USER_FOLDERS), # folders
|
||||||
json.dumps(user_settings), # user_config
|
json.dumps(self.static.USER_SETTINGS), # user settings
|
||||||
json.dumps({}), # chat_config
|
json.dumps({}), # chat_config
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
await self.bot.send_message(
|
await self.bot.send_message(
|
||||||
message.chat.id,
|
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:
|
except Exception as e:
|
||||||
self.logger.error(f"Ошибка при регистрации: {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):
|
async def start(self):
|
||||||
if self.enabled == True:
|
if self.enabled == True:
|
||||||
try:
|
try:
|
||||||
|
|
@ -156,8 +123,7 @@ class TelegramBot:
|
||||||
async def send_auth_code(self, chat_id, phone, code):
|
async def send_auth_code(self, chat_id, phone, code):
|
||||||
try:
|
try:
|
||||||
await self.bot.send_message(
|
await self.bot.send_message(
|
||||||
chat_id,
|
chat_id, self.get_bot_message(self.msg_types.INCOMING_CODE).format(phone=phone, code=code)
|
||||||
f"Новая попытка входа в OpenMAX с вашим номером {phone}\nКод: {code}\n❗️ Никому не сообщайте его, иначе можете потерять свой аккаунт!"
|
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.error(f"Ошибка отправки кода в Telegram: {e}")
|
self.logger.error(f"Ошибка отправки кода в Telegram: {e}")
|
||||||
Loading…
Reference in New Issue