Spaces:
Paused
Paused
| from traceback import format_exc | |
| from pyrogram import filters | |
| from pyrogram.enums import ChatMembersFilter as cmf | |
| from pyrogram.enums import ChatType | |
| from pyrogram.errors import RPCError | |
| from pyrogram.types import CallbackQuery, Message | |
| from Powers import LOGGER | |
| from Powers.bot_class import Gojo | |
| from Powers.database.reporting_db import Reporting | |
| from Powers.supports import get_support_staff | |
| from Powers.utils.custom_filters import admin_filter, command | |
| from Powers.utils.kbhelpers import ikb | |
| from Powers.utils.parser import mention_html | |
| async def report_setting(_, m: Message): | |
| args = m.text.split() | |
| db = Reporting(m.chat.id) | |
| if m.chat.type == ChatType.PRIVATE: | |
| if len(args) >= 2: | |
| option = args[1].lower() | |
| if option in ("yes", "on", "true"): | |
| db.set_settings(True) | |
| elif option in ("no", "off", "false"): | |
| db.set_settings(False) | |
| await m.reply_text("Turned off reporting! You wont get any reports.") | |
| else: | |
| await m.reply_text( | |
| f"Your current report preference is: `{(db.get_settings())}`", | |
| ) | |
| elif len(args) >= 2: | |
| option = args[1].lower() | |
| if option in ("yes", "on", "true"): | |
| db.set_settings(True) | |
| await m.reply_text( | |
| "Turned on reporting! Admins who have turned on reports will be notified when /report " | |
| "or @admin is called.", | |
| quote=True, | |
| ) | |
| elif option in ("no", "off", "false"): | |
| db.set_settings(False) | |
| await m.reply_text( | |
| "Turned off reporting! No admins will be notified on /report or @admin.", | |
| quote=True, | |
| ) | |
| else: | |
| await m.reply_text( | |
| f"This group's current setting is: `{(db.get_settings())}`", | |
| ) | |
| async def report_watcher(c: Gojo, m: Message): | |
| if m.chat.type not in [ChatType.SUPERGROUP, ChatType.GROUP]: | |
| return | |
| if not m.from_user: | |
| return | |
| me = await c.get_me() | |
| db = Reporting(m.chat.id) | |
| if (m.chat and m.reply_to_message) and (db.get_settings()): | |
| reported_msg_id = m.reply_to_message.id | |
| reported_user = m.reply_to_message.from_user | |
| chat_name = m.chat.title or m.chat.username | |
| if reported_user.id == me.id: | |
| await m.reply_text("Nice try.") | |
| return | |
| SUPPORT_STAFF = get_support_staff() | |
| if reported_user.id in SUPPORT_STAFF: | |
| await m.reply_text("Uh? You reporting my support team?") | |
| return | |
| if m.chat.username: | |
| msg = ( | |
| f"<b>β οΈ Report: </b>{m.chat.title}\n" | |
| f"<b> β’ Report by:</b> {(await mention_html(m.from_user.first_name, m.from_user.id))} (<code>{m.from_user.id}</code>)\n" | |
| f"<b> β’ Reported user:</b> {(await mention_html(reported_user.first_name, reported_user.id))} (<code>{reported_user.id}</code>)\n" | |
| ) | |
| else: | |
| msg = f"{(await mention_html(m.from_user.first_name, m.from_user.id))} is calling for admins in '{chat_name}'!\n" | |
| link_chat_id = str(m.chat.id).replace("-100", "") | |
| # message link | |
| link = f"https://t.me/c/{link_chat_id}/{reported_msg_id}" | |
| reply_markup = ikb( | |
| [ | |
| [("β‘ Message", link, "url")], | |
| [ | |
| ( | |
| "β Kick", | |
| f"report_{m.chat.id}=kick={reported_user.id}={reported_msg_id}", | |
| ), | |
| ( | |
| "βοΈ Ban", | |
| f"report_{m.chat.id}=ban={reported_user.id}={reported_msg_id}", | |
| ), | |
| ], | |
| [ | |
| ( | |
| "β Delete Message", | |
| f"report_{m.chat.id}=del={reported_user.id}={reported_msg_id}", | |
| ), | |
| ], | |
| ], | |
| ) | |
| await m.reply_text( | |
| ( | |
| f"{(await mention_html(m.from_user.first_name, m.from_user.id))} " | |
| "reported the message to the admins." | |
| ), | |
| quote=True, | |
| ) | |
| async for admin in c.get_chat_members(m.chat.id, filter=cmf.ADMINISTRATORS): | |
| if ( | |
| admin.user.is_bot or admin.user.is_deleted | |
| ): # can't message bots or deleted accounts | |
| continue | |
| if Reporting(admin.user.id).get_settings(): | |
| try: | |
| await c.send_message( | |
| admin.user.id, | |
| msg, | |
| reply_markup=reply_markup, | |
| disable_web_page_preview=True, | |
| ) | |
| try: | |
| await m.reply_to_message.forward(admin.user.id) | |
| if len(m.text.split()) > 1: | |
| await m.forward(admin.user.id) | |
| except Exception: | |
| pass | |
| except Exception: | |
| pass | |
| except RPCError as ef: | |
| LOGGER.error(ef) | |
| LOGGER.error(format_exc()) | |
| return "" | |
| async def report_buttons(c: Gojo, q: CallbackQuery): | |
| splitter = (str(q.data).replace("report_", "")).split("=") | |
| chat_id = int(splitter[0]) | |
| action = str(splitter[1]) | |
| user_id = int(splitter[2]) | |
| message_id = int(splitter[3]) | |
| if action == "kick": | |
| try: | |
| await c.ban_chat_member(chat_id, user_id) | |
| await q.answer("β Succesfully kicked") | |
| await c.unban_chat_member(chat_id, user_id) | |
| return | |
| except RPCError as err: | |
| await q.answer( | |
| f"π Failed to Kick\n<b>Error:</b>\n</code>{err}</code>", | |
| show_alert=True, | |
| ) | |
| elif action == "ban": | |
| try: | |
| await c.ban_chat_member(chat_id, user_id) | |
| await q.answer("β Succesfully Banned") | |
| return | |
| except RPCError as err: | |
| await q.answer(f"π Failed to Ban\n<b>Error:</b>\n`{err}`", show_alert=True) | |
| elif action == "del": | |
| try: | |
| await c.delete_messages(chat_id, message_id) | |
| await q.answer("β Message Deleted") | |
| return | |
| except RPCError as err: | |
| await q.answer( | |
| f"π Failed to delete message!\n<b>Error:</b>\n`{err}`", | |
| show_alert=True, | |
| ) | |
| return | |
| __PLUGIN__ = "reporting" | |
| __alt_name__ = ["reports", "report"] | |
| __HELP__ = """ | |
| **Report** | |
| β’ /report `<reason>`: reply to a message to report it to admins. | |
| Γ @admin: reply to a message to report it to admins. | |
| **NOTE:** Neither of these will get triggered if used by admins. | |
| **Admins Only:** | |
| β’ /reports `<on/off/yes/no>`: change report setting, or view current status. | |
| β£ If done in PM, toggles your status. | |
| β£ If in group, toggles that groups's status.""" | |