This commit is contained in:
@@ -66,6 +66,7 @@ logger.info(f"Режим работы бота: {BOT_MODE}")
|
||||
|
||||
def get_welcome_text():
|
||||
"""Возвращает приветственный текст в зависимости от режима"""
|
||||
logger.info(f"starting get_welcome_text")
|
||||
if BOT_MODE == 'VOLK':
|
||||
return (
|
||||
"🌟 <b>Привет!</b> 🌟\n\n"
|
||||
@@ -83,6 +84,7 @@ def get_welcome_text():
|
||||
|
||||
def get_help_text():
|
||||
"""Возвращает текст справки в зависимости от режима"""
|
||||
logger.info(f"starting get_help_text")
|
||||
if BOT_MODE == 'VOLK':
|
||||
return (
|
||||
"ℹ️ <b>Подсказка информ-бота ВОЛКа</b>\n\n"
|
||||
@@ -119,6 +121,7 @@ if WEBHOOK_URL:
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка парсинга WEBHOOK_URL: {e}")
|
||||
WEBHOOK_PATH = '/zil_bot'
|
||||
logger.info(f"Форсирован путь вебхука: {WEBHOOK_PATH}")
|
||||
else:
|
||||
WEBHOOK_PATH = '/zil_bot'
|
||||
logger.warning("WEBHOOK_URL не задан, используем путь по умолчанию")
|
||||
@@ -150,6 +153,7 @@ bot = telebot.TeleBot(RESPONDER_BOT_TOKEN)
|
||||
|
||||
def get_user_name(user):
|
||||
"""Форматирует имя пользователя для записи в БД"""
|
||||
# logger.info(f"starting get_user_name")
|
||||
if user.username:
|
||||
return f"@{user.username}"
|
||||
else:
|
||||
@@ -218,6 +222,7 @@ def log_event(event_type, user_info, post_id=None, message=None):
|
||||
|
||||
def create_db_connection():
|
||||
"""Создает подключение к базе данных MariaDB через pymysql"""
|
||||
logger.info(f"starting create_db_connection")
|
||||
try:
|
||||
conn = pymysql.connect(
|
||||
host=MDB_HOST,
|
||||
@@ -237,6 +242,7 @@ def create_db_connection():
|
||||
|
||||
def is_user_subscribed(post_id, user_id):
|
||||
"""Проверяет, подписан ли пользователь уже на это событие"""
|
||||
logger.info(f"starting is_user_subscribed")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return False
|
||||
@@ -261,6 +267,7 @@ def is_user_subscribed(post_id, user_id):
|
||||
|
||||
def is_user_subscribed_evt(event_id, user_id):
|
||||
"""Проверяет, подписан ли пользователь уже на это событие (таблица events)"""
|
||||
logger.info(f"starting is_user_subscribed_evt")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return False
|
||||
@@ -285,6 +292,7 @@ def is_user_subscribed_evt(event_id, user_id):
|
||||
|
||||
def get_user_subscriptions(user_id):
|
||||
"""Возвращает список событий, на которые подписан пользователь, с shortname"""
|
||||
logger.info(f"starting get_user_subscriptions")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return []
|
||||
@@ -312,6 +320,7 @@ def get_user_subscriptions(user_id):
|
||||
|
||||
def get_user_subscriptions_evt(user_id):
|
||||
"""Возвращает список событий, на которые подписан пользователь, с информацией о статусе"""
|
||||
logger.info(f"starting get_user_subscriptions_evt")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return []
|
||||
@@ -339,6 +348,7 @@ def get_user_subscriptions_evt(user_id):
|
||||
|
||||
def get_linked_events_for_post(post_id):
|
||||
"""Возвращает список опубликованных мероприятий, связанных с анонсом через таблицу interlinks"""
|
||||
logger.info(f"starting get_linked_events_for_post")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return []
|
||||
@@ -367,6 +377,7 @@ def get_linked_events_for_post(post_id):
|
||||
|
||||
def save_mark_to_db(post_id, user_id, user_name):
|
||||
"""Сохраняет отметку пользователя в базе данных"""
|
||||
logger.info(f"starting save_mark_to_db")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return False
|
||||
@@ -404,6 +415,7 @@ def save_mark_to_db(post_id, user_id, user_name):
|
||||
|
||||
def save_mark_to_db_evt(event_id, user_id, user_name):
|
||||
"""Сохраняет отметку пользователя в базе данных для событий (таблица marks_evt)"""
|
||||
logger.info(f"starting save_mark_to_db_evt")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return False
|
||||
@@ -439,6 +451,7 @@ def save_mark_to_db_evt(event_id, user_id, user_name):
|
||||
|
||||
def remove_mark_from_db(post_id, user_id, user_name):
|
||||
"""Удаляет отметку пользователя из базы данных"""
|
||||
logger.info(f"starting remove_mark_from_db")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return False
|
||||
@@ -475,6 +488,7 @@ def remove_mark_from_db(post_id, user_id, user_name):
|
||||
|
||||
def remove_mark_from_db_evt(event_id, user_id, user_name):
|
||||
"""Удаляет отметку пользователя из базы данных для событий (таблица marks_evt)"""
|
||||
logger.info(f"starting remove_mark_from_db_evt")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return False
|
||||
@@ -510,6 +524,7 @@ def remove_mark_from_db_evt(event_id, user_id, user_name):
|
||||
|
||||
def format_channel_link(post_id=None):
|
||||
"""Форматирует ссылку на событие в канале или на сам канал"""
|
||||
logger.info(f"starting format_channel_link")
|
||||
if not CHANNEL_ID:
|
||||
return ""
|
||||
|
||||
@@ -530,6 +545,7 @@ def format_channel_link(post_id=None):
|
||||
|
||||
def create_help_keyboard():
|
||||
"""Создает клавиатуру для справки"""
|
||||
logger.info(f"starting create_help_keyboard")
|
||||
keyboard = InlineKeyboardMarkup()
|
||||
keyboard.row(
|
||||
InlineKeyboardButton("📜 Подписки", callback_data="cmd_list"),
|
||||
@@ -539,6 +555,7 @@ def create_help_keyboard():
|
||||
|
||||
def create_main_keyboard():
|
||||
"""Создает основную клавиатуру для /start без параметров"""
|
||||
logger.info(f"starting create_main_keyboard")
|
||||
keyboard = InlineKeyboardMarkup()
|
||||
keyboard.row(
|
||||
InlineKeyboardButton("❓ Справка", callback_data="cmd_help"),
|
||||
@@ -548,6 +565,7 @@ def create_main_keyboard():
|
||||
|
||||
def create_manage_keyboard(post_id, is_subscribed):
|
||||
"""Создает клавиатуру для управления подпиской на посты"""
|
||||
logger.info(f"starting create_manage_keyboard")
|
||||
keyboard = InlineKeyboardMarkup()
|
||||
|
||||
channel_link = format_channel_link(post_id)
|
||||
@@ -567,6 +585,7 @@ def create_manage_keyboard(post_id, is_subscribed):
|
||||
|
||||
def create_manage_keyboard_evt(event_id, is_subscribed):
|
||||
"""Создает клавиатуру для управления подпиской на события"""
|
||||
logger.info(f"starting create_manage_keyboard_evt")
|
||||
keyboard = InlineKeyboardMarkup()
|
||||
|
||||
channel_link = format_channel_link(event_id)
|
||||
@@ -587,6 +606,7 @@ def create_manage_keyboard_evt(event_id, is_subscribed):
|
||||
|
||||
def get_post_data(tg_message_id):
|
||||
"""Получает данные о событии по его tg_message_id"""
|
||||
logger.info(f"starting get_post_data")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return None
|
||||
@@ -619,6 +639,7 @@ def get_post_data(tg_message_id):
|
||||
|
||||
def get_event_data(tg_message_id):
|
||||
"""Получает данные о событии из таблица events по его tg_message_id"""
|
||||
logger.info(f"starting get_event_data")
|
||||
conn = create_db_connection()
|
||||
if conn is None:
|
||||
return None
|
||||
@@ -645,6 +666,7 @@ def get_event_data(tg_message_id):
|
||||
|
||||
def format_post_message(tg_message_id):
|
||||
"""Форматирует сообщение о событии с помощью модуля formatter"""
|
||||
logger.info(f"starting format_post_message")
|
||||
post_data = get_post_data(tg_message_id)
|
||||
if not post_data:
|
||||
error_msg = f"Событие с tg_message_id={tg_message_id} не найдено в базе."
|
||||
@@ -710,6 +732,7 @@ def format_post_message(tg_message_id):
|
||||
|
||||
def format_event_message(tg_message_id):
|
||||
"""Форматирует сообщение о событии из таблицы events"""
|
||||
logger.info(f"starting format_event_message")
|
||||
event_data = get_event_data(tg_message_id)
|
||||
if not event_data:
|
||||
error_msg = f"Событие с tg_message_id={tg_message_id} не найдено в базе events."
|
||||
@@ -758,6 +781,7 @@ def format_event_message(tg_message_id):
|
||||
|
||||
def download_image(image_url):
|
||||
"""Загружает изображение по URL"""
|
||||
logger.info(f"starting download_image")
|
||||
try:
|
||||
response = requests.get(image_url, timeout=10)
|
||||
response.raise_for_status()
|
||||
@@ -768,6 +792,7 @@ def download_image(image_url):
|
||||
|
||||
def send_post_message(chat_id, text, image_url=None, reply_markup=None):
|
||||
"""Отправляет сообщение с изображением или текстом"""
|
||||
logger.info(f"starting send_post_message")
|
||||
try:
|
||||
# Дополнительная обрезка текста
|
||||
if len(text) > UNIFIED_MAX_LENGTH:
|
||||
@@ -803,6 +828,7 @@ def send_post_message(chat_id, text, image_url=None, reply_markup=None):
|
||||
|
||||
def send_direct_message(user_id, message_text):
|
||||
"""Отправляет сообщение пользователю по ID с обработкой ошибок"""
|
||||
logger.info(f"starting send_direct_message")
|
||||
try:
|
||||
# Проверяем, что сообщение не пустое
|
||||
if not message_text or not message_text.strip():
|
||||
@@ -848,6 +874,7 @@ def send_direct_message(user_id, message_text):
|
||||
|
||||
def send_management_message(chat_id, post_id, user_id, user_name):
|
||||
"""Отправляет сообщение для управления подпиской на посты"""
|
||||
logger.info(f"starting send_management_message")
|
||||
try:
|
||||
# Проверяем статус подписки
|
||||
is_subscribed = is_user_subscribed(post_id, user_id)
|
||||
@@ -873,6 +900,7 @@ def send_management_message(chat_id, post_id, user_id, user_name):
|
||||
|
||||
def send_management_message_evt(chat_id, event_id, user_id, user_name):
|
||||
"""Отправляет сообщение для управления подпиской на события"""
|
||||
logger.info(f"starting send_management_message_evt")
|
||||
try:
|
||||
# Проверяем статус подписки
|
||||
is_subscribed = is_user_subscribed_evt(event_id, user_id)
|
||||
@@ -899,6 +927,7 @@ def send_management_message_evt(chat_id, event_id, user_id, user_name):
|
||||
@bot.message_handler(commands=['start'])
|
||||
def handle_start(message):
|
||||
"""Обработчик команды /start с параметром"""
|
||||
logger.info(f"starting handle_start")
|
||||
try:
|
||||
# Извлекаем аргументы из команды /start
|
||||
args = message.text.split()
|
||||
@@ -938,6 +967,7 @@ def handle_start(message):
|
||||
@bot.message_handler(commands=['home'])
|
||||
def handle_home(message):
|
||||
"""Обработчик команды /home - переход в основной канал"""
|
||||
logger.info(f"starting handle_home")
|
||||
try:
|
||||
channel_link = format_channel_link()
|
||||
channel_name = "ВОЛКа" if BOT_MODE == 'VOLK' else "Зиланткона"
|
||||
@@ -958,6 +988,7 @@ def handle_home(message):
|
||||
@bot.message_handler(commands=['help'])
|
||||
def handle_help(message):
|
||||
"""Обработчик команды /help"""
|
||||
logger.info(f"starting handle_help")
|
||||
try:
|
||||
help_text = get_help_text()
|
||||
|
||||
@@ -976,6 +1007,7 @@ def handle_help(message):
|
||||
@bot.message_handler(commands=['list'])
|
||||
def handle_list(message):
|
||||
"""Обработчик команды /list"""
|
||||
logger.info(f"starting handle_list")
|
||||
try:
|
||||
user_id = message.from_user.id
|
||||
user_name = get_user_name(message.from_user)
|
||||
@@ -1062,6 +1094,7 @@ def handle_list(message):
|
||||
@bot.callback_query_handler(func=lambda call: True)
|
||||
def handle_callback(call):
|
||||
"""Обработчик нажатий на кнопки"""
|
||||
logger.info(f"starting handle_callback")
|
||||
try:
|
||||
# Обработка командных кнопок
|
||||
if call.data.startswith("cmd_"):
|
||||
@@ -1295,6 +1328,7 @@ def handle_callback(call):
|
||||
|
||||
def setup_webhook():
|
||||
"""Настройка вебхука"""
|
||||
logger.info(f"starting setup_webhook")
|
||||
try:
|
||||
# Удаляем предыдущий вебхук
|
||||
bot.remove_webhook()
|
||||
@@ -1322,6 +1356,7 @@ def setup_webhook():
|
||||
# Используем путь из WEBHOOK_URL
|
||||
@app.route(WEBHOOK_PATH, methods=['POST'])
|
||||
def webhook():
|
||||
logger.info(f"starting webhook")
|
||||
if request.headers.get('X-Telegram-Bot-Api-Secret-Token') != WEBHOOK_SECRET:
|
||||
logger.warning("Неверный секретный токен!")
|
||||
log_event("security", "system", message="Попытка доступа с неверным секретным токеном")
|
||||
@@ -1342,6 +1377,7 @@ def webhook():
|
||||
@app.route(f'{WEBHOOK_PATH}/send_message', methods=['POST'])
|
||||
def send_message_api():
|
||||
"""API endpoint для отправки сообщений через бота"""
|
||||
logger.info(f"starting send_message_api")
|
||||
# Проверяем секретный токен для защиты API
|
||||
api_token = request.headers.get('X-API-Secret-Token')
|
||||
if api_token != WEBHOOK_SECRET:
|
||||
@@ -1386,12 +1422,14 @@ def send_message_api():
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Логируем запуск бота
|
||||
logger.info(f"starting main")
|
||||
log_event("system", "system", message="Бот запущен")
|
||||
|
||||
# Настраиваем вебхук
|
||||
setup_webhook()
|
||||
|
||||
# Логируем запуск Flask
|
||||
logger.info(f"starting Flask")
|
||||
log_event("system", "system", message=f"Flask приложение запущено на порту {WEBHOOK_PORT}, путь: {WEBHOOK_PATH}")
|
||||
|
||||
# Запускаем Flask приложение
|
||||
|
||||
Reference in New Issue
Block a user