добавлены картинки с подсказкой как добавить игрока
This commit is contained in:
parent
ce586dcddb
commit
6ed6ab866e
4 changed files with 163 additions and 16 deletions
|
|
@ -1,8 +1,10 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
import os
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Dict, Any, Optional
|
from typing import Dict, Any, Optional
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
|
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
|
||||||
from telegram.ext import (
|
from telegram.ext import (
|
||||||
|
|
@ -286,33 +288,154 @@ class LichessBot:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
async def addgamer_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
|
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
|
user_id = update.effective_user.id
|
||||||
logger.info(f"addgamer_start called for user {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)
|
lang = self.get_user_language_from_update(update)
|
||||||
try:
|
try:
|
||||||
# Mark that we are awaiting a username reply
|
keyboard = [
|
||||||
if context and hasattr(context, "user_data"):
|
[
|
||||||
context.user_data['awaiting_addgamer_username'] = True
|
InlineKeyboardButton(
|
||||||
await update.message.reply_text(t('addgamer_prompt', lang), parse_mode='HTML')
|
text=t('addgamer_btn_add', lang),
|
||||||
logger.info(f"Addgamer prompt sent to user {user_id}")
|
callback_data="addgamer_add"
|
||||||
self.counters.increment('addgamer')
|
)
|
||||||
|
],
|
||||||
|
[
|
||||||
|
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:
|
except Exception as e:
|
||||||
logger.error(f"Error sending addgamer prompt: {e}")
|
logger.error(f"Error sending addgamer menu: {e}")
|
||||||
import traceback
|
import traceback
|
||||||
logger.error(traceback.format_exc())
|
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
|
# No conversation state returned; handler-based flow
|
||||||
return
|
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):
|
async def addtoken_start(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||||
"""Start addtoken command - token required"""
|
"""Start addtoken command - token required"""
|
||||||
# Reset any existing conversation state
|
# Reset any existing conversation state
|
||||||
|
|
@ -1561,6 +1684,8 @@ class LichessBot:
|
||||||
application.add_handler(CommandHandler("test_admin_notify", self.test_admin_notify))
|
application.add_handler(CommandHandler("test_admin_notify", self.test_admin_notify))
|
||||||
|
|
||||||
# Callback handlers (order matters - more specific patterns first)
|
# 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_language_selection, pattern="^lang_"))
|
||||||
application.add_handler(CallbackQueryHandler(self.handle_profile_selection, pattern="^profile_"))
|
application.add_handler(CallbackQueryHandler(self.handle_profile_selection, pattern="^profile_"))
|
||||||
application.add_handler(CallbackQueryHandler(self.select_gamer_for_period, pattern="^select_gamer_period_"))
|
application.add_handler(CallbackQueryHandler(self.select_gamer_for_period, pattern="^select_gamer_period_"))
|
||||||
|
|
|
||||||
BIN
LichessClientTG_bot/helpEN.jpeg
Normal file
BIN
LichessClientTG_bot/helpEN.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
BIN
LichessClientTG_bot/helpRU.jpeg
Normal file
BIN
LichessClientTG_bot/helpRU.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
|
|
@ -45,7 +45,18 @@ TRANSLATIONS = {
|
||||||
),
|
),
|
||||||
|
|
||||||
# Add gamer commands
|
# 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_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': (
|
'addtoken_prompt': (
|
||||||
"🔑 Enter the Lichess API token to get puzzle data.\n"
|
"🔑 Enter the Lichess API token to get puzzle data.\n"
|
||||||
"The token is created in profile settings — give it only puzzle:read permission.\n"
|
"The token is created in profile settings — give it only puzzle:read permission.\n"
|
||||||
|
|
@ -169,7 +180,18 @@ TRANSLATIONS = {
|
||||||
),
|
),
|
||||||
|
|
||||||
# Add gamer commands
|
# Add gamer commands
|
||||||
|
'addgamer_menu': (
|
||||||
|
"➕ Добавление игрока для отслеживания.\n\n"
|
||||||
|
"Выберите, что сделать:"
|
||||||
|
),
|
||||||
|
'addgamer_btn_add': "➕ Добавить игрока",
|
||||||
|
'addgamer_btn_how': "❓ Как добавить игрока?",
|
||||||
'addgamer_prompt': "👤 <b>Введите username игрока Lichess для отслеживания:</b>",
|
'addgamer_prompt': "👤 <b>Введите username игрока Lichess для отслеживания:</b>",
|
||||||
|
'addgamer_after_help': (
|
||||||
|
"Теперь отправьте username игрока Lichess, которого хотите отслеживать.\n\n"
|
||||||
|
"Пример: <b>MagnusCarlsen</b>\n\n"
|
||||||
|
"Это имя из ссылки: https://lichess.org/@/username"
|
||||||
|
),
|
||||||
'addtoken_prompt': (
|
'addtoken_prompt': (
|
||||||
"🔑 Введите токен API Lichess для получения данных по пазлам.\n"
|
"🔑 Введите токен API Lichess для получения данных по пазлам.\n"
|
||||||
"Токен создается в настройках профиля — дайте ему только разрешение puzzle:read.\n"
|
"Токен создается в настройках профиля — дайте ему только разрешение puzzle:read.\n"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue