добавлены картинки с подсказкой как добавить игрока

This commit is contained in:
vrubelroman 2025-12-03 02:33:38 +03:00
parent ce586dcddb
commit 6ed6ab866e
4 changed files with 163 additions and 16 deletions

View file

@ -1,8 +1,10 @@
import asyncio
import logging
import sqlite3
import os
from datetime import datetime, timedelta
from typing import Dict, Any, Optional
from pathlib import Path
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
@ -286,32 +288,153 @@ class LichessBot:
pass
async def addgamer_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Start addgamer command - simple username only"""
"""Start addgamer command - show menu with options"""
user_id = update.effective_user.id
logger.info(f"addgamer_start called for user {user_id}")
# Check if we're already awaiting a username (prevent duplicate messages)
if context and hasattr(context, "user_data") and context.user_data.get('awaiting_addgamer_username'):
logger.info(f"addgamer_start: Already awaiting username for user {user_id}, skipping duplicate call")
return
lang = self.get_user_language_from_update(update)
try:
# Mark that we are awaiting a username reply
if context and hasattr(context, "user_data"):
context.user_data['awaiting_addgamer_username'] = True
await update.message.reply_text(t('addgamer_prompt', lang), parse_mode='HTML')
logger.info(f"Addgamer prompt sent to user {user_id}")
self.counters.increment('addgamer')
keyboard = [
[
InlineKeyboardButton(
text=t('addgamer_btn_add', lang),
callback_data="addgamer_add"
)
],
[
InlineKeyboardButton(
text=t('addgamer_btn_how', lang),
callback_data="addgamer_how"
)
],
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text(
t('addgamer_menu', lang),
reply_markup=reply_markup
)
logger.info(f"Addgamer menu sent to user {user_id}")
except Exception as e:
logger.error(f"Error sending addgamer prompt: {e}")
logger.error(f"Error sending addgamer menu: {e}")
import traceback
logger.error(traceback.format_exc())
# Clear flag on error
if context and hasattr(context, "user_data"):
context.user_data['awaiting_addgamer_username'] = False
# No conversation state returned; handler-based flow
return
async def addgamer_show_prompt(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Callback: show username prompt after user presses 'Add player'"""
query = update.callback_query
await query.answer()
user_id = query.from_user.id
logger.info(f"addgamer_show_prompt called for user {user_id}")
# Clear previous state and mark that we're waiting for username
if context and hasattr(context, "user_data"):
context.user_data.clear()
context.user_data['awaiting_addgamer_username'] = True
# Language from DB (for callbacks)
if update.effective_user:
self.db.add_or_get_telegram_user(
user_id=update.effective_user.id,
username=update.effective_user.username,
first_name=update.effective_user.first_name,
last_name=update.effective_user.last_name,
language_code=update.effective_user.language_code
)
lang = self.db.get_user_language(user_id)
await query.message.reply_text(
t('addgamer_prompt', lang),
parse_mode='HTML'
)
logger.info(f"Addgamer prompt (from button) sent to user {user_id}")
# Count real start of username input flow
self.counters.increment('addgamer')
async def addgamer_show_help(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Callback: show how to find username on Lichess (with images)"""
query = update.callback_query
if not query or not query.message:
logger.error("addgamer_show_help: Invalid query or message")
return
await query.answer()
user_id = query.from_user.id
logger.info(f"addgamer_show_help called for user {user_id}")
# Language from DB (for callbacks)
if update.effective_user:
self.db.add_or_get_telegram_user(
user_id=update.effective_user.id,
username=update.effective_user.username,
first_name=update.effective_user.first_name,
last_name=update.effective_user.last_name,
language_code=update.effective_user.language_code
)
lang = self.db.get_user_language(user_id)
# Определяем имя файла картинки в зависимости от языка
# Для русской локализации - helpRU.jpeg, для английской - helpEN.jpeg
image_filename = "helpRU.jpeg" if lang == 'ru' else "helpEN.jpeg"
# Определяем путь к картинке (она находится в той же папке, что и bot.py)
bot_dir = Path(__file__).resolve().parent
image_path = bot_dir / image_filename
# Пробуем альтернативные пути, если основной не найден
possible_paths = [
image_path, # В папке бота
bot_dir.parent / image_filename, # В корне проекта
Path("/home/vrubel/PROJECTS/LichessStatTgWeb/LichessClientTG_bot") / image_filename, # Абсолютный путь
]
# Ищем существующий файл
found_path = None
for candidate in possible_paths:
if candidate and candidate.exists():
found_path = candidate
logger.info(f"✅ Found {image_filename} at: {found_path}")
break
if not found_path or not found_path.exists():
error_msg = f"❌ Error: Could not find {image_filename}\n\nChecked paths:\n"
for path in possible_paths:
exists = path.exists() if path else False
error_msg += f"{path} (exists: {exists})\n"
logger.error(error_msg)
await query.message.reply_text(f"❌ Error: Could not find image file. Please check bot logs.")
return
try:
logger.info(f"Sending help image: {found_path} (language: {lang})")
with open(found_path, "rb") as img:
await query.message.reply_photo(photo=img)
logger.info(f"Successfully sent help image to user {user_id}")
# Устанавливаем флаг ожидания username, чтобы пользователь мог ввести его после просмотра картинки
if context and hasattr(context, "user_data"):
context.user_data['awaiting_addgamer_username'] = True
# Отправляем текст с запросом username
await query.message.reply_text(
t('addgamer_prompt', lang),
parse_mode='HTML'
)
# Считаем это началом процесса добавления игрока
self.counters.increment('addgamer')
except Exception as e:
logger.error(f"Error sending lichess help images: {e}")
import traceback
logger.error(traceback.format_exc())
try:
await query.message.reply_text(f"❌ Error sending images: {e}")
except Exception as e2:
logger.error(f"Failed to send error message: {e2}")
async def addtoken_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Start addtoken command - token required"""
@ -1561,6 +1684,8 @@ class LichessBot:
application.add_handler(CommandHandler("test_admin_notify", self.test_admin_notify))
# Callback handlers (order matters - more specific patterns first)
application.add_handler(CallbackQueryHandler(self.addgamer_show_prompt, pattern="^addgamer_add$"))
application.add_handler(CallbackQueryHandler(self.addgamer_show_help, pattern="^addgamer_how$"))
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_"))

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View file

@ -45,7 +45,18 @@ TRANSLATIONS = {
),
# Add gamer commands
'addgamer_menu': (
" Add a player to track.\n\n"
"Choose an option:"
),
'addgamer_btn_add': " Add player",
'addgamer_btn_how': "❓ How to add a player?",
'addgamer_prompt': "👤 <b>Enter the Lichess username of the player to track:</b>",
'addgamer_after_help': (
"Now send the Lichess username of the player you want to track.\n\n"
"Example: <b>MagnusCarlsen</b>\n\n"
"This is the name from the link: https://lichess.org/@/username"
),
'addtoken_prompt': (
"🔑 Enter the Lichess API token to get puzzle data.\n"
"The token is created in profile settings — give it only puzzle:read permission.\n"
@ -169,7 +180,18 @@ TRANSLATIONS = {
),
# Add gamer commands
'addgamer_menu': (
" Добавление игрока для отслеживания.\n\n"
"Выберите, что сделать:"
),
'addgamer_btn_add': " Добавить игрока",
'addgamer_btn_how': "❓ Как добавить игрока?",
'addgamer_prompt': "👤 <b>Введите username игрока Lichess для отслеживания:</b>",
'addgamer_after_help': (
"Теперь отправьте username игрока Lichess, которого хотите отслеживать.\n\n"
"Пример: <b>MagnusCarlsen</b>\n\n"
"Это имя из ссылки: https://lichess.org/@/username"
),
'addtoken_prompt': (
"🔑 Введите токен API Lichess для получения данных по пазлам.\n"
"Токен создается в настройках профиля — дайте ему только разрешение puzzle:read.\n"