From 965b8775b78933d5382abd6e3a13f7d0fe5e82bb Mon Sep 17 00:00:00 2001 From: vrubelroman Date: Fri, 21 Nov 2025 23:16:35 +0300 Subject: [PATCH] add command /profile --- LichessClientTG_bot/bot.py | 66 ++++++++++++++++++++++++++++++ LichessClientTG_bot/i18n.py | 20 +++++++--- test_kostik2811.py | 80 ------------------------------------- 3 files changed, 81 insertions(+), 85 deletions(-) delete mode 100755 test_kostik2811.py diff --git a/LichessClientTG_bot/bot.py b/LichessClientTG_bot/bot.py index ed8054a..7632812 100644 --- a/LichessClientTG_bot/bot.py +++ b/LichessClientTG_bot/bot.py @@ -1179,6 +1179,70 @@ class LichessBot: error_msg = "❌ Не удалось установить язык" if lang == 'ru' else "❌ Failed to set language" await query.edit_message_text(error_msg) + async def profile(self, update: Update, context: ContextTypes.DEFAULT_TYPE): + """Show list of players to view their profiles""" + user_id = update.effective_user.id + gamers = self.db.get_user_gamers(user_id) + + lang = self.get_user_language_from_update(update) + + if not gamers: + await update.message.reply_text(t('no_gamers', lang)) + return + + # Create keyboard with player buttons + keyboard = [] + for gamer in gamers: + username = gamer['username'] + keyboard.append([ + InlineKeyboardButton( + username, + callback_data=f"profile_{gamer['id']}" + ) + ]) + + reply_markup = InlineKeyboardMarkup(keyboard) + + await update.message.reply_text( + t('select_player_profile', lang), + reply_markup=reply_markup, + parse_mode='HTML' + ) + + async def handle_profile_selection(self, update: Update, context: ContextTypes.DEFAULT_TYPE): + """Handle profile selection callback - send profile link""" + query = update.callback_query + await query.answer() + + user_id = query.from_user.id + gamer_id = int(query.data.split('_')[1]) + + # Get gamer info + gamers = self.db.get_user_gamers(user_id) + selected_gamer = next((g for g in gamers if g['id'] == gamer_id), None) + + if not selected_gamer: + lang = self.db.get_user_language(user_id) + await query.edit_message_text(t('gamer_not_found', lang)) + return + + username = selected_gamer['username'] + profile_url = f"https://lichess.org/@/{username}" + + lang = self.db.get_user_language(user_id) + + # Send profile link + await query.message.reply_text( + f"🔗 {profile_url}", + parse_mode='HTML' + ) + + # Edit original message to show confirmation + await query.edit_message_text( + t('profile_link_sent', lang), + parse_mode='HTML' + ) + async def start_periodic_task(self, gamer: Dict[str, Any], user_id: int, period_minutes: int): """Start periodic task for a gamer""" task_key = f"{gamer['id']}_{user_id}" @@ -1414,10 +1478,12 @@ class LichessBot: application.add_handler(CommandHandler("support", self.support)) application.add_handler(CommandHandler("setperiod", self.setperiod)) application.add_handler(CommandHandler("set_lang", self.set_lang)) + application.add_handler(CommandHandler("profile", self.profile)) application.add_handler(CommandHandler("test_admin_notify", self.test_admin_notify)) # Callback handlers (order matters - more specific patterns first) 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_")) application.add_handler(CallbackQueryHandler(self.select_gamer, pattern="^select_")) application.add_handler(CallbackQueryHandler(self.handle_delete_gamer, pattern="^delete_")) diff --git a/LichessClientTG_bot/i18n.py b/LichessClientTG_bot/i18n.py index c7f2988..72e0b25 100644 --- a/LichessClientTG_bot/i18n.py +++ b/LichessClientTG_bot/i18n.py @@ -37,6 +37,7 @@ TRANSLATIONS = { "/lastYear_or_1000games - Statistics for the last year or last 1000 rated games (whichever comes first)\n" "/setperiod - Set up periodic notifications for the active player\n" "(active player changes in the /getgamers menu)\n" + "/profile - View Lichess profile links for tracked players\n" "/set_lang - Select bot language (English / Russian)\n" "/support - Contact the developer for support and feedback" ), @@ -123,6 +124,10 @@ TRANSLATIONS = { 'select_language': "🌐 Select language / Выберите язык:", 'language_set_en': "✅ Language set to English", 'language_set_ru': "✅ Язык установлен: Русский", + + # Profile command + 'select_player_profile': "👤 Select player:", + 'profile_link_sent': "✅ Profile link sent", }, 'ru': { # Start command @@ -151,11 +156,12 @@ TRANSLATIONS = { "/today - Статистика за сегодня\n" "/yesterday - Статистика за вчера\n" "/week - Статистика за неделю\n" - "/lastYear_or_1000games - Статистика за последний год или последние 1000 рейтинговых игр (что наступит раньше)\n" - "/setperiod - Настроить периодические уведомления для активного игрока\n" - "(активный игрок меняется в меню /getgamers)\n" - "/set_lang - Выбрать язык бота\n" - "/support - Связаться с разработчиком для поддержки и обратной связи" + "/lastYear_or_1000games - Статистика за последний год или последние 1000 рейтинговых игр (что наступит раньше)\n" + "/setperiod - Настроить периодические уведомления для активного игрока\n" + "(активный игрок меняется в меню /getgamers)\n" + "/profile - Просмотр ссылок на профили Lichess отслеживаемых игроков\n" + "/set_lang - Выбрать язык бота\n" + "/support - Связаться с разработчиком для поддержки и обратной связи" ), # Add gamer commands @@ -240,6 +246,10 @@ TRANSLATIONS = { 'select_language': "🌐 Выберите язык / Select language:", 'language_set_en': "✅ Language set to English", 'language_set_ru': "✅ Язык установлен: Русский", + + # Profile command + 'select_player_profile': "👤 Выберите игрока:", + 'profile_link_sent': "✅ Ссылка на профиль отправлена", } } diff --git a/test_kostik2811.py b/test_kostik2811.py deleted file mode 100755 index 4df3035..0000000 --- a/test_kostik2811.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python3 -""" -Скрипт для тестирования запросов к Lichess API для пользователя kostik2811 -""" -import asyncio -import sys -import os - -# Добавляем пути к модулям -sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'LichessWebServices')) - -from lichess_client import LichessClient -from stats_service import StatsService -import logging - -# Настройка логирования -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' -) - -logger = logging.getLogger(__name__) - -async def test_kostik2811(): - """Тестирование запросов для kostik2811""" - username = "kostik2811" - - logger.info(f"🔍 Тестирование запросов для пользователя: {username}") - - # Тест 1: Прямой запрос к Lichess API - logger.info("\n" + "="*50) - logger.info("ТЕСТ 1: Прямой запрос к Lichess API") - logger.info("="*50) - - lichess_client = LichessClient() - try: - activity_data = await lichess_client.get_user_activity(username) - if activity_data: - logger.info(f"✅ Получены данные активности: {len(activity_data)} записей") - for i, activity in enumerate(activity_data[:3]): # Показываем первые 3 - logger.info(f" Активность {i+1}: {activity.get('interval', 'N/A')}") - else: - logger.warning(f"⚠️ Данные активности не получены (None или пусто)") - except Exception as e: - logger.error(f"❌ Ошибка при запросе к Lichess API: {e}") - import traceback - logger.error(traceback.format_exc()) - finally: - await lichess_client.close() - - # Тест 2: Запрос через StatsService - logger.info("\n" + "="*50) - logger.info("ТЕСТ 2: Запрос через StatsService.get_today_stats") - logger.info("="*50) - - lichess_client2 = LichessClient() - stats_service = StatsService(lichess_client2) - try: - result = await stats_service.get_today_stats(username) - logger.info(f"✅ Результат StatsService: message={result.message}") - if result.data: - logger.info(f" Данные: username={result.data.username}") - logger.info(f" Задачи: {result.data.tasks}") - logger.info(f" Игры: {result.data.games}") - else: - logger.warning(f"⚠️ Нет данных в результате") - except Exception as e: - logger.error(f"❌ Ошибка в StatsService: {e}") - import traceback - logger.error(traceback.format_exc()) - finally: - await lichess_client2.close() - - logger.info("\n" + "="*50) - logger.info("Тестирование завершено") - logger.info("="*50) - -if __name__ == "__main__": - asyncio.run(test_kostik2811()) -