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