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']=}"""