LichessStatTgWeb/analyze_notifications.py
2025-11-20 01:22:52 +03:00

145 lines
6.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Анализ уведомлений: проверяем сколько пользователей отслеживают каждого игрока
и сколько уведомлений должно быть отправлено
"""
import sqlite3
import os
# Определяем путь к базе данных
db_path = os.getenv("DATABASE_PATH")
if not db_path:
possible_paths = [
"LichessClientTG_bot/data/lichess_bot.db",
"data/lichess_bot.db",
"/app/data/lichess_bot.db"
]
for path in possible_paths:
if os.path.exists(path):
db_path = path
break
if not db_path:
print("База данных не найдена!")
exit(1)
print(f"Используется база данных: {db_path}\n")
# Список игроков, которые играли сегодня (из вашего вывода)
active_players = [
'AARON805', 'Aangelin', 'Agorchakov', 'Almansura', 'Anastaysha_champion',
'Artemij1', 'Benhayatinmagllbuyum', 'Berserkgirl', 'Danila_07', 'DianaVlad',
'ESP2209', 'Epineyf', 'Ferstep', 'Freakwithprime', 'Kerop',
'Kmknnaqw', 'Kraev_Arseniy', 'MX2017', 'MaEstRo_234', 'Maestro_234',
'Matovalov', 'Ovcharovnik', 'PAA17', 'PaholkovMaks', 'PerepechkoD',
'Petyabro', 'Recep-1903', 'Rudy23042014', 'Sayan_13', 'Sergey_Kleiner',
'Soup_Maktavish_t', 'Stolypin_2-0', 'Tahamorphyy', 'Taih', 'TasiaArgylova',
'Timofei700', 'TomasI_25', 'UrielSpb', 'VadimVits', 'Vadimvits',
'Valeria1309', 'Veselin_27', 'Vinni_Jr', 'Vyachesslav_Rusakov', 'Whateverw',
'Yaroslavsm', 'Yuliyana2013', 'besfighter', 'braveyounes', 'gobelen',
'kolobyxov_daniil52', 'kostik2811', 'li_alex2017', 'lmmaster', 'metiforce',
'motheroflearning', 'polypoker', 'qwertycher', 'speedrunchessgames',
'warriorchess70', 'wwwspl', 'yasumichi', 'yeti_tais', 'youngking0007'
]
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
print("="*80)
print("АНАЛИЗ УВЕДОМЛЕНИЙ")
print("="*80)
# 1. Сколько всего пар user-gamer с period_minutes > 0
cursor.execute("SELECT COUNT(*) FROM user_gamers WHERE period_minutes > 0")
total_pairs = cursor.fetchone()[0]
print(f"\n1. Всего пар user-gamer с периодическими уведомлениями: {total_pairs}")
# 2. Сколько уникальных игроков отслеживается с периодами
cursor.execute("SELECT COUNT(DISTINCT gamer_id) FROM user_gamers WHERE period_minutes > 0")
unique_gamers = cursor.fetchone()[0]
print(f"2. Уникальных игроков с периодами: {unique_gamers}")
# 3. Для каждого из 64 активных игроков - сколько пользователей их отслеживают
print(f"\n3. Анализ активных игроков (играли сегодня):")
print("-"*80)
total_expected_notifications = 0
players_with_trackers = []
for player_username in active_players:
# Находим gamer_id по username
cursor.execute("SELECT id FROM gamers WHERE username = ?", (player_username,))
result = cursor.fetchone()
if not result:
continue
gamer_id = result[0]
# Сколько пользователей отслеживают этого игрока с периодом > 0
cursor.execute("""
SELECT COUNT(*)
FROM user_gamers
WHERE gamer_id = ? AND period_minutes > 0
""", (gamer_id,))
tracker_count = cursor.fetchone()[0]
if tracker_count > 0:
total_expected_notifications += tracker_count
players_with_trackers.append((player_username, tracker_count))
# Показываем детали для первых 10
if len(players_with_trackers) <= 10:
print(f"{player_username}: {tracker_count} пользователь(ей) отслеживает")
if len(players_with_trackers) > 10:
print(f" ... и еще {len(players_with_trackers) - 10} игроков с отслеживающими пользователями")
print(f"\n4. ИТОГО:")
print(f" - Активных игроков (играли сегодня): {len(active_players)}")
print(f" - Из них отслеживаются пользователями: {len(players_with_trackers)}")
print(f" - Ожидаемое количество уведомлений: {total_expected_notifications}")
print(f" - Фактически отправлено уведомлений: 27-28")
print(f" - ПРОПУЩЕНО уведомлений: {total_expected_notifications - 27}")
# 5. Проверяем распределение периодов
print(f"\n5. Распределение периодов уведомлений:")
cursor.execute("""
SELECT period_minutes, COUNT(*)
FROM user_gamers
WHERE period_minutes > 0
GROUP BY period_minutes
ORDER BY period_minutes
""")
for period, count in cursor.fetchall():
period_hours = period / 60
print(f" - {period} минут ({period_hours:.1f} ч): {count} пар user-gamer")
# 6. Проверяем, есть ли игроки с несколькими отслеживающими
print(f"\n6. Игроки, отслеживаемые несколькими пользователями:")
cursor.execute("""
SELECT g.username, COUNT(*) as tracker_count
FROM user_gamers ug
JOIN gamers g ON ug.gamer_id = g.id
WHERE ug.period_minutes > 0
GROUP BY g.id, g.username
HAVING tracker_count > 1
ORDER BY tracker_count DESC
LIMIT 10
""")
for username, count in cursor.fetchall():
print(f" - {username}: {count} пользователей")
conn.close()
print("\n" + "="*80)
print("ВЫВОД:")
print("="*80)
print(f"Если ожидалось {total_expected_notifications} уведомлений, а отправлено только 27-28,")
print(f"то пропущено примерно {total_expected_notifications - 27} уведомлений.")
print("Возможные причины:")
print("1. Периодические задачи не запускаются для всех пар user-gamer")
print("2. Логика проверки активности работает неправильно")
print("3. Уведомления не отправляются всем пользователям, отслеживающим одного игрока")