#!/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. Уведомления не отправляются всем пользователям, отслеживающим одного игрока")