diff --git a/LichessClientTG_bot/bot.py b/LichessClientTG_bot/bot.py index 92be2d5..0036c53 100644 --- a/LichessClientTG_bot/bot.py +++ b/LichessClientTG_bot/bot.py @@ -83,6 +83,7 @@ class LichessBot: "πŸ“‹ ДоступныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:\n" "/adduser - Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ° Lichess для отслСТивания\n" "/getgamers - Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° (для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ /today ΠΈ Ρ‚Π΄)\n" + "/delgamer - Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΈΠ· списка отслСТиваСмых\n" "/today - Бтатистика Π·Π° сСгодня\n" "/yesterday - Бтатистика Π·Π° Π²Ρ‡Π΅Ρ€Π°\n" "/week - Бтатистика Π·Π° нСдСлю\n" @@ -269,6 +270,100 @@ class LichessBot: else: await query.edit_message_text("❌ Π˜Π³Ρ€ΠΎΠΊ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½") + async def delgamer(self, update: Update, context: ContextTypes.DEFAULT_TYPE): + """Show gamers list for deletion""" + user_id = update.effective_user.id + gamers = self.db.get_user_gamers(user_id) + + if not gamers: + await update.message.reply_text("πŸ“­ Π£ вас Π½Π΅Ρ‚ отслСТиваСмых ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ².") + return + + # Show loading message + loading_msg = await update.message.reply_text("πŸ”„ Π—Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ список ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²...") + + # Create text message with stats + text_lines = [] + keyboard = [] + + for gamer in gamers: + status = "🟒" if gamer['is_active'] else "βšͺ" + username = gamer['username'] + + # Get user ratings from Lichess API + ratings_data = await self.lichess_api.get_user_ratings(username) + + if ratings_data and 'perfs' in ratings_data: + perfs = ratings_data['perfs'] + bullet_rating = perfs.get('bullet', {}).get('rating', 'N/A') + blitz_rating = perfs.get('blitz', {}).get('rating', 'N/A') + rapid_rating = perfs.get('rapid', {}).get('rating', 'N/A') + else: + bullet_rating = blitz_rating = rapid_rating = 'N/A' + + period_minutes = gamer.get('period_minutes', 0) + period_text = f" Β· {period_minutes}ΠΌ" if period_minutes > 0 else "" + + text_lines.append( + f"{status} {username} " + f"⚑ {bullet_rating} πŸ”₯ {blitz_rating} πŸ‡ {rapid_rating}{period_text}" + ) + + # Add delete button + keyboard.append([InlineKeyboardButton( + text=f"πŸ—‘οΈ {username}", + callback_data=f"delete_{gamer['id']}" + )]) + + gamers_text = "πŸ—‘οΈ Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ³Ρ€ΠΎΠΊΠ° для удалСния:\n\n" + "\n".join(text_lines) + + reply_markup = InlineKeyboardMarkup(keyboard) + + # Edit the loading message with the results + try: + await loading_msg.edit_text( + gamers_text, + parse_mode='HTML', + reply_markup=reply_markup + ) + except Exception as e: + logger.error(f"Error editing message: {e}") + try: + await loading_msg.delete() + except: + pass + await update.message.reply_text( + gamers_text, + parse_mode='HTML', + reply_markup=reply_markup + ) + + async def handle_delete_gamer(self, update: Update, context: ContextTypes.DEFAULT_TYPE): + """Handle gamer deletion""" + query = update.callback_query + await query.answer() + + user_id = query.from_user.id + gamer_id = int(query.data.split('_')[1]) + + # Get gamer info before deletion + gamers = self.db.get_user_gamers(user_id) + gamer_to_delete = next((g for g in gamers if g['id'] == gamer_id), None) + + if gamer_to_delete: + username = gamer_to_delete['username'] + deleted = self.db.remove_user_gamer(user_id, gamer_id) + + if deleted: + await query.edit_message_text( + f"βœ… Π˜Π³Ρ€ΠΎΠΊ {username} ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· списка отслСТиваСмых.", + parse_mode='HTML' + ) + else: + await query.edit_message_text("❌ НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ°") + else: + await query.edit_message_text("❌ Π˜Π³Ρ€ΠΎΠΊ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½") + async def get_stats(self, update: Update, context: ContextTypes.DEFAULT_TYPE, period: str): """Get statistics for a period""" user_id = update.effective_user.id @@ -509,6 +604,7 @@ class LichessBot: application.add_handler(CommandHandler("start", self.start)) application.add_handler(adduser_conv) application.add_handler(CommandHandler("getgamers", self.getgamers)) + application.add_handler(CommandHandler("delgamer", self.delgamer)) application.add_handler(CommandHandler("today", self.today)) application.add_handler(CommandHandler("yesterday", self.yesterday)) application.add_handler(CommandHandler("week", self.week)) @@ -516,6 +612,7 @@ class LichessBot: # Callback handlers application.add_handler(CallbackQueryHandler(self.select_gamer, pattern="^select_")) + application.add_handler(CallbackQueryHandler(self.handle_delete_gamer, pattern="^delete_")) application.add_handler(CallbackQueryHandler(self.select_period, pattern="^period_")) def main(): diff --git a/LichessClientTG_bot/database.py b/LichessClientTG_bot/database.py index d279ad8..595a839 100644 --- a/LichessClientTG_bot/database.py +++ b/LichessClientTG_bot/database.py @@ -239,6 +239,32 @@ class Database: ) conn.commit() + def remove_user_gamer(self, user_id: int, gamer_id: int) -> bool: + """Remove gamer from user's tracked list""" + with sqlite3.connect(self.db_path) as conn: + cursor = conn.cursor() + + # Delete the user-gamer relationship + cursor.execute( + "DELETE FROM user_gamers WHERE user_id = ? AND gamer_id = ?", + (user_id, gamer_id) + ) + deleted = cursor.rowcount > 0 + + # Check if this gamer is still tracked by any other user + cursor.execute( + "SELECT COUNT(*) FROM user_gamers WHERE gamer_id = ?", + (gamer_id,) + ) + other_users_count = cursor.fetchone()[0] + + # If no other users track this gamer, remove from gamers table + if other_users_count == 0: + cursor.execute("DELETE FROM gamers WHERE id = ?", (gamer_id,)) + + conn.commit() + return deleted + def get_user_gamers_with_periods(self, user_id: int) -> List[Dict[str, Any]]: """Get all gamers for a user that have periods set""" with sqlite3.connect(self.db_path) as conn: