Добавлена команда /delgamer для удаления игроков

- Добавлен метод remove_user_gamer в database.py
- Добавлена команда /delgamer с интерактивным списком игроков
- Добавлен callback handler для удаления игроков
- Если игрок удаляется у всех пользователей, он удаляется из gamers
- Игроки показываются с рейтингами и статусом
This commit is contained in:
vrubelroman 2025-10-28 21:59:16 +03:00
parent 539e0f3aa4
commit e59bbb7d0e
2 changed files with 123 additions and 0 deletions

View file

@ -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} <b>{username}</b> "
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 = "🗑️ <b>Выберите игрока для удаления:</b>\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"✅ Игрок <b>{username}</b> удален из списка отслеживаемых.",
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():

View file

@ -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: