diff --git a/app/bot.py b/app/bot.py index 332045c..6b02ec3 100644 --- a/app/bot.py +++ b/app/bot.py @@ -34,9 +34,8 @@ def moderate_messages(message: types.Message): logging.warning(f'[BAN] {message.from_user.id} {message.from_user.username} - {message.text}') bot.delete_message(message.chat.id, message.id) bot.ban_chat_member(message.chat.id, message.from_user.id) - if message.chat.id == PYTHONCHATRU: - with shelve.open('chat_stats') as chat_stats: - chat_stats['Banned'] += 1 + with shelve.open(f'{DATA}{message.chat.id}') as s: + s['Banned'] += 1 @bot.message_handler(func=check_caption_spam_list, content_types=['video']) @@ -45,8 +44,8 @@ def catch_videos(message: types.Message): logging.warning(f'[BAN] {message.from_user.id} {message.from_user.first_name} - {message.video.file_name}') bot.delete_message(message.chat.id, message.id) bot.ban_chat_member(message.chat.id, message.from_user.id) - with shelve.open('chat_stats') as chat_stats: - chat_stats['Banned'] += 1 + with shelve.open(f'{DATA}{message.chat.id}') as s: + s['Banned'] += 1 @bot.edited_message_handler(func=check_delete_list) @@ -54,9 +53,8 @@ def catch_videos(message: types.Message): def delete_message(message: types.Message): """ Delete unwanted message. """ bot.delete_message(message.chat.id, message.id) - if message.chat.id == PYTHONCHATRU: - with shelve.open('chat_stats') as chat_stats: - chat_stats['Deleted'] += 1 + with shelve.open(f'{DATA}{message.chat.id}') as s: + s['Deleted'] += 1 @bot.message_handler(commands=['links']) @@ -138,63 +136,11 @@ def remind_manually(message): f"/remind 09-13-2022") -@bot.message_handler(commands=['jobs']) -def list_jobs(message): - """ List all the jobs in schedule. """ - if message.chat.id == ADMIN_ID: - bot.send_message(ADMIN_ID, reminder.print_get_jobs()) - - -@bot.message_handler(commands=['stats']) -def send_stats(message): - bot.send_message(message.chat.id, report.create_report_text()) - - -@bot.message_handler(commands=['add']) -def add_stan_quote(message): - if message.reply_to_message and message.reply_to_message.text: - with open('Stan.txt', 'a', encoding='utf8') as stan_quotes: - stan_quotes.write('\n' + message.reply_to_message.text) - bot.send_message(message.chat.id, f'Добавил: {message.reply_to_message.text}') - - @bot.message_handler(commands=['quote']) def stan_speak(message): bot.send_message(message.chat.id, stan.speak(0)) -@bot.message_handler(commands=['reset_stats']) -def send_stats(message): - report.reset_report_stats() - bot.send_message(message.chat.id, report.reset_report_stats()) - - -@bot.message_handler(commands=['reload']) -def send_stats(message): - reloads.reload_modules() - bot.send_message(message.chat.id, 'Reloaded successfully') - - -@bot.message_handler(func=lambda a: a.from_user.id == ADMIN_ID, commands=['pydel', 'pyban', 'unban_id']) -def admin_panel(message: types.Message): - """ Admin panel. """ - if message.text == '/ddel' and message.reply_to_message: - bot.delete_message(message.chat.id, message.id) - bot.delete_message(message.chat.id, message.reply_to_message.id) - logging.warning( - f'[DEL (M)] {message.reply_to_message.from_user.id} {message.reply_to_message.from_user.first_name} - {message.reply_to_message.text}') - elif message.text == '/bban' and message.reply_to_message: - bot.delete_message(message.chat.id, message.id) - bot.delete_message(message.chat.id, message.reply_to_message.id) - bot.ban_chat_member(message.chat.id, message.reply_to_message.from_user.id) - logging.warning( - f'[BAN (M)] {message.reply_to_message.from_user.id} {message.reply_to_message.from_user.first_name} - {message.reply_to_message.text}') - elif message.text.split()[0] == '/unban_id' and message.text.split()[-1].isdigit(): - unban_id = int(message.text.split()[-1]) - bot.unban_chat_member(PYTHONCHATRU, unban_id) - logging.warning(f'[UNBAN (M)] {unban_id}') - - @bot.message_handler(commands=['tsya']) def send_tsya(message: types.Message): send_or_reply(message, '-тся/-ться') @@ -262,14 +208,78 @@ def tease_nongrata(message: types.Message): bot.reply_to(message, f'у нас тут таких не любят') -@bot.message_handler(func=check_chat, content_types=['text', 'sticker', 'photo', 'animation', 'video', - 'audio', 'document']) +""" + [ ADMIN PANEL ] +""" + + +@bot.message_handler(func=is_admin, commands=['reload']) +def send_stats(message): + logging.warning('Reloading...') + reloads.reload_modules() + bot.send_message(message.chat.id, 'Reloaded successfully') + + +@bot.message_handler(func=is_admin, commands=['ddel', 'bban', 'unban_id']) +def admin_panel(message: types.Message): + """ Admin panel. """ + if message.text == '/ddel' and message.reply_to_message: + bot.delete_message(message.chat.id, message.id) + bot.delete_message(message.chat.id, message.reply_to_message.id) + logging.warning( + f'[DEL (M)] {message.reply_to_message.from_user.id} {message.reply_to_message.from_user.first_name} - {message.reply_to_message.text}') + elif message.text == '/bban' and message.reply_to_message: + bot.delete_message(message.chat.id, message.id) + bot.delete_message(message.chat.id, message.reply_to_message.id) + bot.ban_chat_member(message.chat.id, message.reply_to_message.from_user.id) + logging.warning( + f'[BAN (M)] {message.reply_to_message.from_user.id} {message.reply_to_message.from_user.first_name} - {message.reply_to_message.text}') + elif message.text.split()[0] == '/unban_id' and message.text.split()[-1].isdigit(): + unban_id = int(message.text.split()[-1]) + bot.unban_chat_member(PYTHONCHATRU, unban_id) + logging.warning(f'[UNBAN (M)] {unban_id}') + + +@bot.message_handler(func=is_admin, commands=['jobs']) +def list_jobs(message): + """ List all the jobs in schedule. """ + bot.send_message(ADMIN_ID, reminder.print_get_jobs()) + + +@bot.message_handler(func=is_admin, commands=['add']) +def add_stan_quote(message): + if message.reply_to_message and message.reply_to_message.text: + with open('Stan.txt', 'a', encoding='utf8') as stan_quotes: + stan_quotes.write('\n' + message.reply_to_message.text) + bot.send_message(message.chat.id, f'Добавил: {message.reply_to_message.text}') + + +@bot.message_handler(func=is_admin, commands=['stats']) +def send_stats(message: types.Message): + if len(message.text.split()) == 1: + bot.send_message(message.chat.id, report.create_report_text(message.chat.id)) + else: + bot.send_message(message.chat.id, report.create_report_text(message.text.split()[-1])) + + +@bot.message_handler(func=is_admin, commands=['reset_stats'], chat_types=['supergroup', 'group']) +def send_stats(message: types.Message): + logging.warning('reset_stats') + report.reset_report_stats(message.chat.id) + bot.send_message(message.chat.id, report.reset_report_stats(message.chat.id)) + + +@bot.message_handler(content_types=['text', 'sticker', 'photo', 'animation', 'video', 'audio', 'document'], + chat_types=['supergroup', 'group']) def handle_msg(message: types.Message): - """ Count messages, Stan speak. """ - with shelve.open('chat_stats', writeback=True) as s: + """ Count messages, Stan. """ + with shelve.open(f'{DATA}{message.chat.id}', writeback=True) as s: + if 'Messages' not in s: + report.reset_report_stats(message.chat.id) + if message.from_user.id not in s['Messages']: - s['Messages'][message.from_user.id] = {'User': message.from_user, 'Count': 0} - logging.warning(f'New counter: {message.from_user.id} - {message.from_user.first_name}') + s['Messages'][message.from_user.id] = {'User': message.from_user, 'Count': 1} + logging.warning(f'CNTR {message.chat.id}: {message.from_user.first_name} ({message.from_user.id})') else: s['Messages'][message.from_user.id]['Count'] += 1 diff --git a/app/check.py b/app/check.py index 22fffc1..b43f2fe 100644 --- a/app/check.py +++ b/app/check.py @@ -45,9 +45,8 @@ def check_nongrata(type_message: types.Message) -> bool: return True -def check_chat(message: types.Message): - if message.chat.id == PYTHONCHATRU: - return True +def is_admin(message: types.Message) -> bool: + return message.from_user.id == ADMIN_ID def send_or_reply(m: types.Message, answer): diff --git a/app/config.py b/app/config.py index fd3f0fa..c380b7d 100644 --- a/app/config.py +++ b/app/config.py @@ -4,15 +4,17 @@ import logging from telebot import TeleBot from dotenv import load_dotenv -logging.basicConfig(level=logging.DEBUG, format='%(message)s') +logging.basicConfig(level=logging.INFO, format='%(message)s') logging.warning('>>> PYBOT STARTED!') load_dotenv() TOKEN = os.environ.get('LUTZPYBOT', 'Token not in ENVIRON') -bot = TeleBot(TOKEN, 'HTML', skip_pending=True, disable_web_page_preview=True, allow_sending_without_reply=True) +bot = TeleBot(TOKEN, 'HTML', disable_web_page_preview=True, allow_sending_without_reply=True) -ADMIN_ID = 280887861 # Rykov7 +DATA = 'data/chat' + +ADMIN_ID = 280887861 # Rykov7 PYTHONCHATRU = -1001338616632 # pythonchatru URL_RX = re.compile(r'\w+\.\w+/\w+') diff --git a/app/reloads.py b/app/reloads.py index 63f7d41..e666306 100644 --- a/app/reloads.py +++ b/app/reloads.py @@ -1,15 +1,17 @@ from importlib import reload +from . import bot as bot_mod +from . import check from . import config from . import me -from . import stan from . import report -from . import bot as bot_mod +from . import stan def reload_modules(): - reload(report) + reload(bot_mod) + reload(check) reload(config) reload(me) - reload(bot_mod) + reload(report) reload(stan) diff --git a/app/reminder.py b/app/reminder.py index 8a722cd..01c50f9 100644 --- a/app/reminder.py +++ b/app/reminder.py @@ -41,8 +41,8 @@ def remind(chat_to_repeat, today): @repeat(every().day.at('06:00'), PYTHONCHATRU) def stat_report(chat_to_repeat): - bot.send_message(chat_to_repeat, report.create_report_text()) - report.reset_report_stats() + bot.send_message(chat_to_repeat, report.create_report_text(PYTHONCHATRU)) + report.reset_report_stats(PYTHONCHATRU) def print_get_jobs(): diff --git a/app/report.py b/app/report.py index 34cd973..6c2af49 100644 --- a/app/report.py +++ b/app/report.py @@ -1,36 +1,42 @@ import shelve +import os +from .config import DATA - -def create_report_text(): +def create_report_text(chat_id): top_users = '' flooders = [] - with shelve.open('chat_stats') as s: - for n in range(min(3, len(s['Messages']))): - top_user = s['Messages'][sorted(s['Messages'], key=lambda a: s['Messages'][a]['Count'], reverse=True)[n]] - if top_user['Count'] >= 10: - flooders.append(top_user) + if os.path.exists(f'{DATA}{chat_id}.db'): + with shelve.open(f'{DATA}{chat_id}') as s: + for n in range(min(3, len(s['Messages']))): + top_user = s['Messages'][sorted(s['Messages'], key=lambda a: s['Messages'][a]['Count'], reverse=True)[n]] + if top_user['Count'] >= 10: + flooders.append(top_user) - for i, flooder in enumerate(flooders): - user = flooder["User"] - name = f"{user.first_name} {user.last_name}" if user.last_name else user.first_name - top_users += f'\n {i + 1}. {name} ({flooder["Count"]})' - report = f"Hello, World! 🌍\n" - if s['Banned'] or s['Deleted']: - report += f""" + for i, flooder in enumerate(flooders): + user = flooder["User"] + name = f"{user.first_name} {user.last_name}" if user.last_name else user.first_name + top_users += f'\n {i + 1}. {name} ({flooder["Count"]})' + report = f"Hello, World! 🌍\n" + if s['Banned'] or s['Deleted']: + report += f""" Заблокировано ⛔ ├ Пользователей: {s['Banned']} └ Сообщений: {s['Deleted']} """ - if len(flooders) >= 3: - report += f"\nТоп 🗣{top_users}" - return report + if len(flooders) >= 3: + report += f"\nТоп 🗣{top_users}" + return report + else: + return f'Невозможно получить статистику.\n{DATA}{chat_id}.db не существует, возможно запрос в приватном чате. ' -def reset_report_stats(): - with shelve.open('chat_stats') as s: +def reset_report_stats(chat_id): + with shelve.open(f'{DATA}{chat_id}') as s: s['Messages'] = {} - s['Banned'] = s['Deleted'] = 0 - return f""" + s['Banned'] = 0 + s['Deleted'] = 0 + return f"""Chat ID: {chat_id} + {s['Messages']=} {s['Banned']=} {s['Deleted']=}"""