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())
-