diff --git a/LichessClientTG_bot/bot.py b/LichessClientTG_bot/bot.py index 0036c53..f0f910f 100644 --- a/LichessClientTG_bot/bot.py +++ b/LichessClientTG_bot/bot.py @@ -81,7 +81,8 @@ class LichessBot: "❌ Поражения: 4\n" "🤝 Ничьи: 7\n\n" "📋 Доступные команды:\n" - "/adduser - Добавить игрока Lichess для отслеживания\n" + "/addgamer - Добавить игрока Lichess для отслеживания (только username)\n" + "/addtoken - Добавить игрока с токеном для получения данных по задачам\n" "/getgamers - Выбрать активного игрока (для которого будут работать команды /today и тд)\n" "/delgamer - Удалить игрока из списка отслеживаемых\n" "/today - Статистика за сегодня\n" @@ -91,32 +92,43 @@ class LichessBot: "(активный игрок меняется в меню команды /getgamers)" ) - async def adduser_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE): - """Start adduser command""" + async def addgamer_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE): + """Start addgamer command - simple username only""" + await update.message.reply_text("👤 Введите Lichess username игрока для отслеживания:") + return WAITING_FOR_USERNAME + + async def addtoken_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE): + """Start addtoken command - token required""" await update.message.reply_text( "🔑 Введите Lichess API токен, чтобы получать данные по задачам.\n" "Токен создаётся в настройках профиля — дайте ему только право puzzle:read.\n" - "Если данные по задачам не нужны, то сейчас введите 0, затем укажите Lichess username." + "После этого будет добавлен игрок, соответствующий этому токену." ) return WAITING_FOR_TOKEN async def handle_token(self, update: Update, context: ContextTypes.DEFAULT_TYPE): - """Handle token input""" + """Handle token input for /addtoken""" token = update.message.text.strip() user_id = update.effective_user.id - if token == "0": - await update.message.reply_text("👤 Введите ваш Lichess username:") - return WAITING_FOR_USERNAME - else: - # Get username from token - profile = await self.lichess_api.get_user_profile(token) - if profile: - username = profile.get('username') - if username: - # Add gamer to database (without token) + # Get username from token + profile = await self.lichess_api.get_user_profile(token) + if profile: + username = profile.get('username') + if username: + # Check if this gamer is already tracked by this user + user_gamers = self.db.get_user_gamers(user_id) + existing_gamer = next((g for g in user_gamers if g['username'] == username), None) + + if existing_gamer: + # Update token for existing gamer + self.db.add_user_gamer(user_id, existing_gamer['id'], token) + await update.message.reply_text( + f"✅ Токен добавлен для игрока {username}!" + ) + else: + # Add new gamer and link with token gamer_id = self.db.add_gamer(username) - # Link user to gamer WITH token self.db.add_user_gamer(user_id, gamer_id, token) # If this is the first gamer for this user, make it active @@ -125,30 +137,30 @@ class LichessBot: self.db.set_user_active_gamer(user_id, gamer_id) await update.message.reply_text( - f"✅ Игрок {username} успешно добавлен!" + f"✅ Игрок {username} добавлен с токеном!" ) - return ConversationHandler.END - else: - await update.message.reply_text( - "❌ Не удалось получить username из токена. Попробуйте еще раз или введите 0 для ввода username вручную." - ) - return WAITING_FOR_TOKEN + return ConversationHandler.END else: await update.message.reply_text( - "❌ Неверный токен. Попробуйте еще раз или введите 0 для ввода username вручную." + "❌ Не удалось получить username из токена. Попробуйте еще раз." ) return WAITING_FOR_TOKEN + else: + await update.message.reply_text( + "❌ Неверный токен. Попробуйте еще раз." + ) + return WAITING_FOR_TOKEN async def handle_username(self, update: Update, context: ContextTypes.DEFAULT_TYPE): - """Handle username input""" + """Handle username input for /addgamer""" username = update.message.text.strip() user_id = update.effective_user.id if username: - # Add gamer to database + # Add gamer to database (without token) gamer_id = self.db.add_gamer(username) - # Link user to gamer - self.db.add_user_gamer(user_id, gamer_id) + # Link user to gamer (without token) + self.db.add_user_gamer(user_id, gamer_id, None) # If this is the first gamer for this user, make it active user_gamers = self.db.get_user_gamers(user_id) @@ -590,19 +602,29 @@ class LichessBot: def setup_handlers(self, application: Application): """Setup all handlers""" self.application = application # Store application reference - # Conversation handler for adduser - adduser_conv = ConversationHandler( - entry_points=[CommandHandler("adduser", self.adduser_start)], + + # Conversation handler for addgamer (simple username only) + addgamer_conv = ConversationHandler( + entry_points=[CommandHandler("addgamer", self.addgamer_start)], + states={ + WAITING_FOR_USERNAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, self.handle_username)], + }, + fallbacks=[CommandHandler("cancel", lambda u, c: ConversationHandler.END)] + ) + + # Conversation handler for addtoken (token required) + addtoken_conv = ConversationHandler( + entry_points=[CommandHandler("addtoken", self.addtoken_start)], states={ WAITING_FOR_TOKEN: [MessageHandler(filters.TEXT & ~filters.COMMAND, self.handle_token)], - WAITING_FOR_USERNAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, self.handle_username)], }, fallbacks=[CommandHandler("cancel", lambda u, c: ConversationHandler.END)] ) # Add all handlers application.add_handler(CommandHandler("start", self.start)) - application.add_handler(adduser_conv) + application.add_handler(addgamer_conv) + application.add_handler(addtoken_conv) application.add_handler(CommandHandler("getgamers", self.getgamers)) application.add_handler(CommandHandler("delgamer", self.delgamer)) application.add_handler(CommandHandler("today", self.today))