From 6ed6ab866e37cecac45cf0cc4b70e2dbb3439808 Mon Sep 17 00:00:00 2001 From: vrubelroman Date: Wed, 3 Dec 2025 02:33:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=81=20=D0=BF=D0=BE=D0=B4=D1=81=D0=BA=D0=B0=D0=B7=D0=BA?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=BA=D0=B0=D0=BA=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D0=B8=D0=B3=D1=80=D0=BE=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LichessClientTG_bot/bot.py | 157 ++++++++++++++++++++++++++++---- LichessClientTG_bot/helpEN.jpeg | Bin 0 -> 19241 bytes LichessClientTG_bot/helpRU.jpeg | Bin 0 -> 17942 bytes LichessClientTG_bot/i18n.py | 22 +++++ 4 files changed, 163 insertions(+), 16 deletions(-) create mode 100644 LichessClientTG_bot/helpEN.jpeg create mode 100644 LichessClientTG_bot/helpRU.jpeg diff --git a/LichessClientTG_bot/bot.py b/LichessClientTG_bot/bot.py index 694c193..88d1b93 100644 --- a/LichessClientTG_bot/bot.py +++ b/LichessClientTG_bot/bot.py @@ -1,8 +1,10 @@ import asyncio import logging import sqlite3 +import os from datetime import datetime, timedelta from typing import Dict, Any, Optional +from pathlib import Path from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import ( @@ -286,32 +288,153 @@ class LichessBot: pass async def addgamer_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE): - """Start addgamer command - simple username only""" + """Start addgamer command - show menu with options""" user_id = update.effective_user.id logger.info(f"addgamer_start called for user {user_id}") - # Check if we're already awaiting a username (prevent duplicate messages) - if context and hasattr(context, "user_data") and context.user_data.get('awaiting_addgamer_username'): - logger.info(f"addgamer_start: Already awaiting username for user {user_id}, skipping duplicate call") - return - lang = self.get_user_language_from_update(update) try: - # Mark that we are awaiting a username reply - if context and hasattr(context, "user_data"): - context.user_data['awaiting_addgamer_username'] = True - await update.message.reply_text(t('addgamer_prompt', lang), parse_mode='HTML') - logger.info(f"Addgamer prompt sent to user {user_id}") - self.counters.increment('addgamer') + keyboard = [ + [ + InlineKeyboardButton( + text=t('addgamer_btn_add', lang), + callback_data="addgamer_add" + ) + ], + [ + InlineKeyboardButton( + text=t('addgamer_btn_how', lang), + callback_data="addgamer_how" + ) + ], + ] + reply_markup = InlineKeyboardMarkup(keyboard) + await update.message.reply_text( + t('addgamer_menu', lang), + reply_markup=reply_markup + ) + logger.info(f"Addgamer menu sent to user {user_id}") except Exception as e: - logger.error(f"Error sending addgamer prompt: {e}") + logger.error(f"Error sending addgamer menu: {e}") import traceback logger.error(traceback.format_exc()) - # Clear flag on error - if context and hasattr(context, "user_data"): - context.user_data['awaiting_addgamer_username'] = False # No conversation state returned; handler-based flow return + + async def addgamer_show_prompt(self, update: Update, context: ContextTypes.DEFAULT_TYPE): + """Callback: show username prompt after user presses 'Add player'""" + query = update.callback_query + await query.answer() + + user_id = query.from_user.id + logger.info(f"addgamer_show_prompt called for user {user_id}") + + # Clear previous state and mark that we're waiting for username + if context and hasattr(context, "user_data"): + context.user_data.clear() + context.user_data['awaiting_addgamer_username'] = True + + # Language from DB (for callbacks) + if update.effective_user: + self.db.add_or_get_telegram_user( + user_id=update.effective_user.id, + username=update.effective_user.username, + first_name=update.effective_user.first_name, + last_name=update.effective_user.last_name, + language_code=update.effective_user.language_code + ) + lang = self.db.get_user_language(user_id) + + await query.message.reply_text( + t('addgamer_prompt', lang), + parse_mode='HTML' + ) + logger.info(f"Addgamer prompt (from button) sent to user {user_id}") + # Count real start of username input flow + self.counters.increment('addgamer') + + async def addgamer_show_help(self, update: Update, context: ContextTypes.DEFAULT_TYPE): + """Callback: show how to find username on Lichess (with images)""" + query = update.callback_query + if not query or not query.message: + logger.error("addgamer_show_help: Invalid query or message") + return + + await query.answer() + + user_id = query.from_user.id + logger.info(f"addgamer_show_help called for user {user_id}") + + # Language from DB (for callbacks) + if update.effective_user: + self.db.add_or_get_telegram_user( + user_id=update.effective_user.id, + username=update.effective_user.username, + first_name=update.effective_user.first_name, + last_name=update.effective_user.last_name, + language_code=update.effective_user.language_code + ) + lang = self.db.get_user_language(user_id) + + # Определяем имя файла картинки в зависимости от языка + # Для русской локализации - helpRU.jpeg, для английской - helpEN.jpeg + image_filename = "helpRU.jpeg" if lang == 'ru' else "helpEN.jpeg" + + # Определяем путь к картинке (она находится в той же папке, что и bot.py) + bot_dir = Path(__file__).resolve().parent + image_path = bot_dir / image_filename + + # Пробуем альтернативные пути, если основной не найден + possible_paths = [ + image_path, # В папке бота + bot_dir.parent / image_filename, # В корне проекта + Path("/home/vrubel/PROJECTS/LichessStatTgWeb/LichessClientTG_bot") / image_filename, # Абсолютный путь + ] + + # Ищем существующий файл + found_path = None + for candidate in possible_paths: + if candidate and candidate.exists(): + found_path = candidate + logger.info(f"✅ Found {image_filename} at: {found_path}") + break + + if not found_path or not found_path.exists(): + error_msg = f"❌ Error: Could not find {image_filename}\n\nChecked paths:\n" + for path in possible_paths: + exists = path.exists() if path else False + error_msg += f" • {path} (exists: {exists})\n" + logger.error(error_msg) + await query.message.reply_text(f"❌ Error: Could not find image file. Please check bot logs.") + return + + try: + logger.info(f"Sending help image: {found_path} (language: {lang})") + with open(found_path, "rb") as img: + await query.message.reply_photo(photo=img) + + logger.info(f"Successfully sent help image to user {user_id}") + + # Устанавливаем флаг ожидания username, чтобы пользователь мог ввести его после просмотра картинки + if context and hasattr(context, "user_data"): + context.user_data['awaiting_addgamer_username'] = True + + # Отправляем текст с запросом username + await query.message.reply_text( + t('addgamer_prompt', lang), + parse_mode='HTML' + ) + + # Считаем это началом процесса добавления игрока + self.counters.increment('addgamer') + except Exception as e: + logger.error(f"Error sending lichess help images: {e}") + import traceback + logger.error(traceback.format_exc()) + try: + await query.message.reply_text(f"❌ Error sending images: {e}") + except Exception as e2: + logger.error(f"Failed to send error message: {e2}") async def addtoken_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE): """Start addtoken command - token required""" @@ -1561,6 +1684,8 @@ class LichessBot: application.add_handler(CommandHandler("test_admin_notify", self.test_admin_notify)) # Callback handlers (order matters - more specific patterns first) + application.add_handler(CallbackQueryHandler(self.addgamer_show_prompt, pattern="^addgamer_add$")) + application.add_handler(CallbackQueryHandler(self.addgamer_show_help, pattern="^addgamer_how$")) application.add_handler(CallbackQueryHandler(self.handle_language_selection, pattern="^lang_")) application.add_handler(CallbackQueryHandler(self.handle_profile_selection, pattern="^profile_")) application.add_handler(CallbackQueryHandler(self.select_gamer_for_period, pattern="^select_gamer_period_")) diff --git a/LichessClientTG_bot/helpEN.jpeg b/LichessClientTG_bot/helpEN.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5c440420fbeabef5a0ba3e8435eb13e21782de1b GIT binary patch literal 19241 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 C+ejt= literal 0 HcmV?d00001 diff --git a/LichessClientTG_bot/helpRU.jpeg b/LichessClientTG_bot/helpRU.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b6fe6fa05decc7aad15c7163e615c4cef2263675 GIT binary patch literal 17942 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 the Lichess username of the player to track:", + 'addgamer_after_help': ( + "Now send the Lichess username of the player you want to track.\n\n" + "Example: MagnusCarlsen\n\n" + "This is the name from the link: https://lichess.org/@/username" + ), 'addtoken_prompt': ( "🔑 Enter the Lichess API token to get puzzle data.\n" "The token is created in profile settings — give it only puzzle:read permission.\n" @@ -169,7 +180,18 @@ TRANSLATIONS = { ), # Add gamer commands + 'addgamer_menu': ( + "➕ Добавление игрока для отслеживания.\n\n" + "Выберите, что сделать:" + ), + 'addgamer_btn_add': "➕ Добавить игрока", + 'addgamer_btn_how': "❓ Как добавить игрока?", 'addgamer_prompt': "👤 Введите username игрока Lichess для отслеживания:", + 'addgamer_after_help': ( + "Теперь отправьте username игрока Lichess, которого хотите отслеживать.\n\n" + "Пример: MagnusCarlsen\n\n" + "Это имя из ссылки: https://lichess.org/@/username" + ), 'addtoken_prompt': ( "🔑 Введите токен API Lichess для получения данных по пазлам.\n" "Токен создается в настройках профиля — дайте ему только разрешение puzzle:read.\n"