diff --git a/app/bot.py b/app/bot.py index 8389d54..cd4a4e6 100644 --- a/app/bot.py +++ b/app/bot.py @@ -7,6 +7,7 @@ from time import sleep from threading import Thread import shelve +from . import report from .query_log import logging from .me import get_me from .config import bot, ADMIN_ID, TOKEN @@ -183,15 +184,21 @@ def remind_manually(message): def list_jobs(message): """ List all the jobs in schedule. """ if message.chat.id == ADMIN_ID: - text = reminder.print_get_jobs() - bot.send_message(message.chat.id, text, parse_mode='HTML') + bot.send_message(ADMIN_ID, reminder.print_get_jobs(), + parse_mode='HTML', disable_web_page_preview=True) - with shelve.open('chat_stats') as s: - bot.send_message(ADMIN_ID, f"""Доброе утро, мир! - -👮🏼 Статистика нарушений за сутки - ├ Заблокировано спамеров: {s['Banned']} - └ Удалено сообщений: {s['Deleted']}""", parse_mode='HTML') + +@bot.message_handler(commands=['stats']) +def send_stats(message): + bot.send_message(message.chat.id, report.create_report_text(), + parse_mode='HTML', disable_web_page_preview=True) + + +@bot.message_handler(commands=['reset_stats']) +def send_stats(message): + report.reset_report_stats() + bot.send_message(message.chat.id, report.reset_report_stats(), + parse_mode='HTML', disable_web_page_preview=True) def check_unwanted_list(type_message: types.Message) -> bool: @@ -208,6 +215,17 @@ def unwanted_mentions(message: types.Message): bot.reply_to(message, f'У нас таких не любят! 🥴', parse_mode='HTML') +@bot.message_handler(func=lambda a: True) +def unwanted_mentions(message: types.Message): + """ Count messages. """ + with shelve.open('chat_stats', writeback=True) as s: + s['Messages'][message.from_user.id] = s['Messages'].get(message.from_user.id, + {'Name': message.from_user.first_name, + 'Username': message.from_user.username, + 'Count': 0}) + s['Messages'][message.from_user.id]['Count'] += 1 + + @app.route(f"/bot{TOKEN}/", methods=['POST']) def webhook(): """ Parse POST requests from Telegram. """ diff --git a/app/reminder.py b/app/reminder.py index 34a3c16..b75310a 100644 --- a/app/reminder.py +++ b/app/reminder.py @@ -5,8 +5,8 @@ import time from threading import Thread from datetime import datetime as dt import csv -import shelve from .config import PYTHONCHATRU, bot +from . import report # https://core.telegram.org/bots/api Telegram Bot API @@ -41,13 +41,9 @@ def remind(chat_to_repeat, today): @repeat(every().day.at('05:00'), PYTHONCHATRU) def stat_report(chat_to_repeat): - with shelve.open('chat_stats') as s: - bot.send_message(chat_to_repeat, f"""Доброе утро, мир! - -👮🏼 Статистика нарушений за сутки - ├ Заблокировано спамеров: {s['Banned']} - └ Удалено сообщений: {s['Deleted']}""", parse_mode='HTML') - s['Banned'] = s['Deleted'] = 0 # Clear + bot.send_message(chat_to_repeat, report.create_report_text(), + parse_mode='HTML', disable_web_page_preview=True) + report.reset_report_stats() def print_get_jobs(): diff --git a/app/report.py b/app/report.py new file mode 100644 index 0000000..60f4ad3 --- /dev/null +++ b/app/report.py @@ -0,0 +1,36 @@ +import shelve + + +def create_report_text(): + with shelve.open('chat_stats') as s: + text = '' + flooders = [] + for n in range(min(5, len(s['Messages']))): + flooders.append( + s['Messages'][sorted(s['Messages'], key=lambda a: s['Messages'][a]['Count'], reverse=True)[n]]) + + for i, flooder in enumerate(flooders): + username = flooder['Username'] + name = flooder['Name'] + count = flooder['Count'] + text += f'\n {i + 1}. {name} ({count})' + report = f"""Доброе утро, мир! + +ЗА ПРОШЕДШИЕ СУТКИ: + +👮🏼 Заблокировано + ├ Пользователей: {s['Banned']} + └ Сообщений: {s['Deleted']} + +🏆 Почётные флудеры{text}""" + return report + + +def reset_report_stats(): + with shelve.open('chat_stats') as s: + s['Messages'] = {} + s['Banned'] = s['Deleted'] = 0 + return f""" +{s['Messages']=} +{s['Banned']=} +{s['Deleted']=}"""