stats errors

This commit is contained in:
vrubel 2025-12-20 05:22:55 +03:00
parent 1c99e109b8
commit 8a20b91c54
4 changed files with 477 additions and 47 deletions

79
bot.py
View file

@ -86,7 +86,7 @@ TEXTS = {
"Добавьте бота в группу с правами администратора — "
"он будет автоматически скачивать видео из сообщений участников."
),
'stat': "📊 Статистика бота:\n\n👥 Всего пользователей: {users}\n📹 Всего скачано видео: {downloads}",
'stat': "📊 Статистика бота:\n\n👥 Всего пользователей: {users}\n📹 Всего скачано видео: {downloads}\n\n❌ Ошибки по сервисам:\n{error_stats}",
'send_link': (
"Пожалуйста, отправьте ссылку на видео.\n"
"Поддерживаемые источники:\n"
@ -140,7 +140,7 @@ TEXTS = {
"Add the bot to a group with admin rights — "
"it will automatically download videos from participants' messages."
),
'stat': "📊 Bot statistics:\n\n👥 Total users: {users}\n📹 Total downloads: {downloads}",
'stat': "📊 Bot statistics:\n\n👥 Total users: {users}\n📹 Total downloads: {downloads}\n\n❌ Errors by service:\n{error_stats}",
'send_link': (
"Please send a video link.\n"
"Supported sources:\n"
@ -223,6 +223,19 @@ def init_database():
if cursor.fetchone()[0] == 0:
cursor.execute('INSERT INTO stats (id, total_downloads) VALUES (1, 0)')
# Таблица статистики ошибок по сервисам
cursor.execute('''
CREATE TABLE IF NOT EXISTS error_stats (
service TEXT PRIMARY KEY,
error_count INTEGER DEFAULT 0
)
''')
# Инициализируем счетчики ошибок для всех сервисов
services = ['youtube', 'instagram', 'tiktok', 'vk', 'yapfiles', 'unknown']
for service in services:
cursor.execute('INSERT OR IGNORE INTO error_stats (service, error_count) VALUES (?, 0)', (service,))
conn.commit()
conn.close()
logger.info("База данных инициализирована")
@ -272,6 +285,37 @@ def get_total_users() -> int:
return 0
def increment_error_count(service: str):
"""Увеличивает счетчик ошибок для указанного сервиса"""
try:
conn = sqlite3.connect(str(DB_FILE))
cursor = conn.cursor()
cursor.execute('''
INSERT INTO error_stats (service, error_count)
VALUES (?, 1)
ON CONFLICT(service) DO UPDATE SET error_count = error_count + 1
''', (service,))
conn.commit()
conn.close()
logger.info(f"Увеличено количество ошибок для сервиса {service}")
except Exception as e:
logger.error(f"Ошибка при увеличении счетчика ошибок для {service}: {e}")
def get_error_stats() -> dict[str, int]:
"""Возвращает статистику ошибок по сервисам"""
try:
conn = sqlite3.connect(str(DB_FILE))
cursor = conn.cursor()
cursor.execute('SELECT service, error_count FROM error_stats ORDER BY service')
results = cursor.fetchall()
conn.close()
return {service: count for service, count in results}
except Exception as e:
logger.error(f"Ошибка при получении статистики ошибок: {e}")
return {}
def get_user_locale(chat_id: int) -> str:
"""Возвращает локаль пользователя из базы данных"""
try:
@ -414,6 +458,10 @@ async def process_queue_item(item: QueueItem):
max_size = 50 * 1024 * 1024 # 50 MB
if file_size > max_size:
# Определяем источник и увеличиваем счетчик ошибок
source = detect_video_source(item.url)
increment_error_count(source)
size_mb = file_size / (1024 * 1024)
error_msg = get_text(item.locale, 'error_file_too_large', size_mb=size_mb)
await item.status_message.edit_text(error_msg)
@ -456,6 +504,11 @@ async def process_queue_item(item: QueueItem):
except Exception as e:
logger.error(f"Ошибка при обработке {item.url}: {e}")
# Определяем источник и увеличиваем счетчик ошибок
source = detect_video_source(item.url)
increment_error_count(source)
error_msg = get_text(item.locale, 'error', error=str(e))
try:
await item.status_message.edit_text(error_msg)
@ -918,9 +971,29 @@ async def stat_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
total_downloads = get_total_downloads()
total_users = get_total_users()
error_stats = get_error_stats()
# Форматируем статистику ошибок
error_stats_text = ""
service_names = {
'youtube': 'YouTube',
'instagram': 'Instagram',
'tiktok': 'TikTok',
'vk': 'VK',
'yapfiles': 'Yapfiles',
'unknown': 'Unknown'
}
for service, count in sorted(error_stats.items()):
if count > 0:
service_name = service_names.get(service, service)
error_stats_text += f"{service_name}: {count}\n"
if not error_stats_text:
error_stats_text = " Нет ошибок" if locale == 'ru' else " No errors"
await update.message.reply_text(
get_text(locale, 'stat', users=total_users, downloads=total_downloads)
get_text(locale, 'stat', users=total_users, downloads=total_downloads, error_stats=error_stats_text.strip())
)