EN language only
This commit is contained in:
parent
3ec1fe614d
commit
3362bf89e2
4 changed files with 353 additions and 94 deletions
|
|
@ -1,5 +1,6 @@
|
|||
from typing import Dict, Any, Optional
|
||||
from datetime import datetime
|
||||
from i18n import t
|
||||
|
||||
class StatsFormatter:
|
||||
@staticmethod
|
||||
|
|
@ -13,10 +14,10 @@ class StatsFormatter:
|
|||
return f"0"
|
||||
|
||||
@staticmethod
|
||||
def format_stats_response(data: Dict[str, Any], username: str, period: str) -> str:
|
||||
def format_stats_response(data: Dict[str, Any], username: str, period: str, lang: str = 'en') -> str:
|
||||
"""Format statistics response according to the template"""
|
||||
if not data or data.get('data') is None:
|
||||
message = data.get('message', 'Нет данных') if data else 'Нет данных'
|
||||
message = data.get('message', t('no_data', lang)) if data else t('no_data', lang)
|
||||
return f"📭 {message}"
|
||||
|
||||
# Extract data from API response
|
||||
|
|
@ -25,7 +26,7 @@ class StatsFormatter:
|
|||
games = api_data.get('games', {})
|
||||
|
||||
# Format date range
|
||||
date_range = StatsFormatter._get_date_range(period)
|
||||
date_range = StatsFormatter._get_date_range(period, lang)
|
||||
|
||||
# Format tasks section
|
||||
task_text = ""
|
||||
|
|
@ -33,7 +34,7 @@ class StatsFormatter:
|
|||
total_tasks = tasks.get('total', 0)
|
||||
solved = tasks.get('solved', 0)
|
||||
unsolved = tasks.get('unsolved', 0)
|
||||
task_text = f"🧩 Задачи: {total_tasks} (✅ {solved} - ❌ {unsolved})\n\n"
|
||||
task_text = t('puzzles_section', lang, total=total_tasks, solved=solved, unsolved=unsolved)
|
||||
|
||||
# Format games section
|
||||
games_text = ""
|
||||
|
|
@ -55,21 +56,29 @@ class StatsFormatter:
|
|||
# Format rating change
|
||||
rating_change_str = StatsFormatter._format_rating_change(rating_change)
|
||||
|
||||
games_text += f"{emoji} {game_type.title()} — {games_count} игр • {rating_change_str}\n"
|
||||
games_text += f"Рейтинг: {rating}\n"
|
||||
games_text += f"✅ Победы: {wins}\n"
|
||||
games_text += f"❌ Поражения: {losses}\n"
|
||||
games_text += f"🤝 Ничьи: {draws}\n\n"
|
||||
# Get game type name (capitalize first letter)
|
||||
game_type_name = game_type.title()
|
||||
|
||||
games_text += t('games_section', lang,
|
||||
emoji=emoji,
|
||||
game_type=game_type_name,
|
||||
games_count=games_count,
|
||||
rating_change=rating_change_str,
|
||||
rating=rating,
|
||||
wins=wins,
|
||||
losses=losses,
|
||||
draws=draws
|
||||
)
|
||||
|
||||
# Combine all parts
|
||||
result = f"📊 Статистика {username} • {date_range}\n\n"
|
||||
result = t('stats_title', lang, username=username, date_range=date_range)
|
||||
result += task_text
|
||||
result += games_text.rstrip()
|
||||
|
||||
return result
|
||||
|
||||
@staticmethod
|
||||
def _get_date_range(period: str) -> str:
|
||||
def _get_date_range(period: str, lang: str = 'en') -> str:
|
||||
"""Get date range string for the period"""
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
|
|
@ -99,19 +108,19 @@ class StatsFormatter:
|
|||
return emoji_map.get(game_type.lower(), '🎯')
|
||||
|
||||
@staticmethod
|
||||
def format_period_notification(username: str, games_data: Optional[Dict], puzzles_data: Optional[Dict], period_minutes: int) -> str:
|
||||
def format_period_notification(username: str, games_data: Optional[Dict], puzzles_data: Optional[Dict], period_minutes: int, lang: str = 'en') -> str:
|
||||
"""Format notification for periodic checks"""
|
||||
from datetime import datetime
|
||||
|
||||
# Format period text
|
||||
if period_minutes == 1:
|
||||
period_text = "за 1 минуту"
|
||||
period_text = t('period_1_minute', lang)
|
||||
elif period_minutes in [2, 3, 4]:
|
||||
period_text = f"за {period_minutes} минуты"
|
||||
period_text = t('period_2_3_4_minutes', lang, period=period_minutes)
|
||||
else:
|
||||
period_text = f"за {period_minutes} минут"
|
||||
period_text = t('period_minutes_text', lang, period=period_minutes)
|
||||
|
||||
result = f"📊 Статистика {username} • {period_text}\n\n"
|
||||
result = t('period_notification_title', lang, username=username, period_text=period_text)
|
||||
|
||||
# Format puzzles first (if available and there's actual activity)
|
||||
if puzzles_data and puzzles_data.get('data'):
|
||||
|
|
@ -122,7 +131,7 @@ class StatsFormatter:
|
|||
|
||||
# Only show tasks section if there's actual activity (not all zeros)
|
||||
if total_puzzles > 0 or solved > 0 or failed > 0:
|
||||
result += f"🧩 Задачи: {total_puzzles} (✅ {solved} - ❌ {failed})\n\n"
|
||||
result += t('period_puzzles_section', lang, total=total_puzzles, solved=solved, failed=failed)
|
||||
|
||||
# Format games
|
||||
if games_data and games_data.get('data'):
|
||||
|
|
@ -142,14 +151,21 @@ class StatsFormatter:
|
|||
draws = game_data.get('draws', 0)
|
||||
|
||||
rating_change_str = StatsFormatter._format_rating_change(rating_change)
|
||||
result += f"{emoji} {game_type.title()} — {games_count} игр • {rating_change_str}\n"
|
||||
result += f"Рейтинг: {rating}\n"
|
||||
result += f"✅ Победы: {wins}\n"
|
||||
result += f"❌ Поражения: {losses}\n"
|
||||
result += f"🤝 Ничьи: {draws}\n\n"
|
||||
game_type_name = game_type.title()
|
||||
|
||||
result += t('period_games_section', lang,
|
||||
emoji=emoji,
|
||||
game_type=game_type_name,
|
||||
games_count=games_count,
|
||||
rating_change=rating_change_str,
|
||||
rating=rating,
|
||||
wins=wins,
|
||||
losses=losses,
|
||||
draws=draws
|
||||
)
|
||||
|
||||
# If no activity
|
||||
if not (games_data and games_data.get('data')) and not (puzzles_data and puzzles_data.get('data')):
|
||||
result += "📭 Нет активности за этот период"
|
||||
result += t('no_activity', lang)
|
||||
|
||||
return result.rstrip()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue