From aef4dd091ded114498a8e1523ab235556c34ba10 Mon Sep 17 00:00:00 2001 From: profitroll Date: Sun, 2 Apr 2023 22:17:54 +0200 Subject: [PATCH] Warnings can now be revoked using /warnings --- holochecker.py | 1 + locale/uk.json | 10 +++++--- modules/callbacks/warnings.py | 27 ++++++++++++++++++++++ modules/commands/warnings.py | 43 +++++++++++++++++++++++++++++++---- requirements.txt | 1 + 5 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 modules/callbacks/warnings.py diff --git a/holochecker.py b/holochecker.py index c9c65e4..61fffcc 100644 --- a/holochecker.py +++ b/holochecker.py @@ -37,6 +37,7 @@ from modules.callbacks.spoiler import * from modules.callbacks.sponsorship import * from modules.callbacks.sub import * from modules.callbacks.sus import * +from modules.callbacks.warnings import * from modules.handlers.confirmation import * from modules.handlers.contact import * diff --git a/locale/uk.json b/locale/uk.json index 50bb530..c47c73d 100644 --- a/locale/uk.json +++ b/locale/uk.json @@ -76,10 +76,12 @@ "application_invalid_syntax": "Неправильний синтаксис!\nТреба: `/application ID/NAME/USERNAME`", "warned": "Попереджено **{0}** (`{1}`) про порушення правил", "warned_reason": "Попереджено **{0}** (`{1}`)\n\n**Причина:**\n{2}", - "warnings_1": "Користувач **{0}** (`{1}`) має **{2}** попередження", - "warnings_2": "Користувач **{0}** (`{1}`) має **{2}** попереджень", + "warnings_1": "Користувач **{0}** (`{1}`) має **{2}** попередження\n\nОбрати та зняти попередження:\n`/warnings {3} revoke`", + "warnings_2": "Користувач **{0}** (`{1}`) має **{2}** попереджень\n\nОбрати та зняти попередження:\n`/warnings {3} revoke`", "warnings_all": "**Список попереджень**\n\n{0}\n\nДля перегляду попереджень окремо взятого користувача слід використовувати `/warnings ID/NAME/USERNAME`", "warnings_entry": "• {0} (`{1}`)\n Попереджень: {2}", + "warnings_empty": "Щось тут порожньо...\nЗ іншого боку, це добре!", + "warnings_revoke": "**Попередження {0}:**\n\n{1}\n\nБудь ласка, користуйтесь клавіатурою щоб зняти попередження з відповідним номером.", "no_warnings": "Користувач **{0}** (`{1}`) не має попереджень", "no_user_warnings": "Не знайдено користувачів за запитом **{0}**", "syntax_warnings": "Неправильний синтаксис!\nТреба: `/warnings ID/NAME/USERNAME`", @@ -259,7 +261,9 @@ "sponsor_accepted": "✅ Форму {0} схвалено", "sponsor_rejected": "❌ Форму {0} відхилено", "spoiler_sent": "✅ Повідомлення надіслано в холо-чат", - "spoiler_forbidden": "❌ Треба бути учасником чату" + "spoiler_forbidden": "❌ Треба бути учасником чату", + "warning_revoked": "✅ Попередження скасовано", + "warning_not_found": "❌ Попередження вже скасовано або не існує" }, "inline": { "forbidden": { diff --git a/modules/callbacks/warnings.py b/modules/callbacks/warnings.py new file mode 100644 index 0000000..975482c --- /dev/null +++ b/modules/callbacks/warnings.py @@ -0,0 +1,27 @@ +from datetime import datetime +from app import app +from pyrogram import filters +from pyrogram.types import CallbackQuery +from pyrogram.client import Client +from modules.utils import locale +from modules.database import col_warnings +from bson import ObjectId + + +@app.on_callback_query(filters.regex("w_rev_[\s\S]*")) +async def callback_query_warning_revoke(app: Client, clb: CallbackQuery): + warning = col_warnings.find_one({"_id": ObjectId(str(clb.data).split("_")[2])}) + if warning is None: + await clb.answer( + text=locale("warning_not_found", "callback", locale=clb.from_user), + show_alert=True, + ) + return + col_warnings.update_one( + {"_id": warning["_id"]}, + {"$set": {"active": False, "revoke_date": datetime.now()}}, + ) + await clb.answer( + text=locale("warning_revoked", "callback", locale=clb.from_user).format(), + show_alert=True, + ) diff --git a/modules/commands/warnings.py b/modules/commands/warnings.py index b65cc4e..f533ccd 100644 --- a/modules/commands/warnings.py +++ b/modules/commands/warnings.py @@ -7,6 +7,7 @@ from pyrogram.enums.chat_members_filter import ChatMembersFilter from modules.utils import configGet, jsonLoad, locale, should_quote from modules.database import col_users, col_warnings from modules import custom_filters +from pykeyboard import InlineKeyboard, InlineButton @app.on_message( @@ -38,15 +39,20 @@ async def cmd_warnings(app: Client, msg: Message): warnings[warning]["name"], warning, warnings[warning]["warns"] ), ) + warnings_output = ( + locale("warnings_empty", "message", locale=msg.from_user) + if len(warnings_output) == 0 + else "\n".join(warnings_output) + ) await msg.reply_text( locale("warnings_all", "message", locale=msg.from_user).format( - "\n".join(warnings_output) + warnings_output ), quote=should_quote(msg), ) return - if len(msg.command) > 2: + if len(msg.command) > 3: await msg.reply_text( locale("syntax_warnings", "message", locale=msg.from_user), quote=should_quote(msg), @@ -78,6 +84,35 @@ async def cmd_warnings(app: Client, msg: Message): ) return + if len(msg.command) == 3 and msg.command[2].lower() == "revoke": + if col_warnings.count_documents({"user": target_id, "active": True}) == 0: + await msg.reply_text( + locale("no_warnings", "message", locale=msg.from_user).format( + target_name, target_id + ), + quote=should_quote(msg), + ) + return + keyboard = InlineKeyboard() + buttons = [] + warnings = [] + for index, warning in enumerate( + list(col_warnings.find({"user": target_id, "active": True})) + ): + warnings.append( + f'{index+1}. {warning["date"].strftime("%d.%m.%Y, %H:%M")}\n Адмін: {warning["admin"]}\n Причина: {warning["reason"]}' + ) + buttons.append(InlineButton(str(index + 1), f'w_rev_{str(warning["_id"])}')) + keyboard.add(*buttons) + await msg.reply_text( + locale("warnings_revoke", "message", locale=msg.from_user).format( + target_name, "\n".join(warnings) + ), + reply_markup=keyboard, + quote=should_quote(msg), + ) + return + warns = col_warnings.count_documents({"user": target_id, "active": True}) if warns == 0: @@ -91,14 +126,14 @@ async def cmd_warnings(app: Client, msg: Message): if warns <= 5: await msg.reply_text( locale("warnings_1", "message", locale=msg.from_user).format( - target_name, target_id, warns + target_name, target_id, warns, target_id ), quote=should_quote(msg), ) else: await msg.reply_text( locale("warnings_2", "message", locale=msg.from_user).format( - target_name, target_id, warns + target_name, target_id, warns, target_id ), quote=should_quote(msg), ) diff --git a/requirements.txt b/requirements.txt index 1d4868c..b10a4c4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ psutil==5.9.4 pymongo==4.3.3 Pyrogram~=2.0.102 python_dateutil==2.8.2 +pykeyboard==0.1.5 requests==2.28.2 starlette==0.26.1 tgcrypto==1.2.5