Добавлена команда /delgamer для удаления игроков
- Добавлен метод remove_user_gamer в database.py - Добавлена команда /delgamer с интерактивным списком игроков - Добавлен callback handler для удаления игроков - Если игрок удаляется у всех пользователей, он удаляется из gamers - Игроки показываются с рейтингами и статусом
This commit is contained in:
parent
539e0f3aa4
commit
e59bbb7d0e
2 changed files with 123 additions and 0 deletions
|
|
@ -83,6 +83,7 @@ class LichessBot:
|
||||||
"📋 Доступные команды:\n"
|
"📋 Доступные команды:\n"
|
||||||
"/adduser - Добавить игрока Lichess для отслеживания\n"
|
"/adduser - Добавить игрока Lichess для отслеживания\n"
|
||||||
"/getgamers - Выбрать активного игрока (для которого будут работать команды /today и тд)\n"
|
"/getgamers - Выбрать активного игрока (для которого будут работать команды /today и тд)\n"
|
||||||
|
"/delgamer - Удалить игрока из списка отслеживаемых\n"
|
||||||
"/today - Статистика за сегодня\n"
|
"/today - Статистика за сегодня\n"
|
||||||
"/yesterday - Статистика за вчера\n"
|
"/yesterday - Статистика за вчера\n"
|
||||||
"/week - Статистика за неделю\n"
|
"/week - Статистика за неделю\n"
|
||||||
|
|
@ -269,6 +270,100 @@ class LichessBot:
|
||||||
else:
|
else:
|
||||||
await query.edit_message_text("❌ Игрок не найден")
|
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):
|
async def get_stats(self, update: Update, context: ContextTypes.DEFAULT_TYPE, period: str):
|
||||||
"""Get statistics for a period"""
|
"""Get statistics for a period"""
|
||||||
user_id = update.effective_user.id
|
user_id = update.effective_user.id
|
||||||
|
|
@ -509,6 +604,7 @@ class LichessBot:
|
||||||
application.add_handler(CommandHandler("start", self.start))
|
application.add_handler(CommandHandler("start", self.start))
|
||||||
application.add_handler(adduser_conv)
|
application.add_handler(adduser_conv)
|
||||||
application.add_handler(CommandHandler("getgamers", self.getgamers))
|
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("today", self.today))
|
||||||
application.add_handler(CommandHandler("yesterday", self.yesterday))
|
application.add_handler(CommandHandler("yesterday", self.yesterday))
|
||||||
application.add_handler(CommandHandler("week", self.week))
|
application.add_handler(CommandHandler("week", self.week))
|
||||||
|
|
@ -516,6 +612,7 @@ class LichessBot:
|
||||||
|
|
||||||
# Callback handlers
|
# Callback handlers
|
||||||
application.add_handler(CallbackQueryHandler(self.select_gamer, pattern="^select_"))
|
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_"))
|
application.add_handler(CallbackQueryHandler(self.select_period, pattern="^period_"))
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
|
||||||
|
|
@ -239,6 +239,32 @@ class Database:
|
||||||
)
|
)
|
||||||
conn.commit()
|
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]]:
|
def get_user_gamers_with_periods(self, user_id: int) -> List[Dict[str, Any]]:
|
||||||
"""Get all gamers for a user that have periods set"""
|
"""Get all gamers for a user that have periods set"""
|
||||||
with sqlite3.connect(self.db_path) as conn:
|
with sqlite3.connect(self.db_path) as conn:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue