Spaces:
Running
Running
File size: 7,241 Bytes
eef97a7 1b5719b 98ab4e9 1b5719b 3580517 1b5719b 98ab4e9 1b5719b 7956eb0 711b749 7956eb0 78d4936 7956eb0 effac34 7956eb0 4056428 3580517 7956eb0 b002286 7956eb0 d7e1221 7956eb0 4056428 7956eb0 818d601 d76971a 809532c d76971a 2707517 818d601 2707517 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
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 DEV_USERS, LOGGER, SUDO_USERS, WHITELIST_USERS
from Powers.bot_class import Gojo
from Powers.database.reporting_db import Reporting
from Powers.utils.custom_filters import admin_filter, command
from Powers.utils.kbhelpers import ikb
from Powers.utils.parser import mention_html
@Gojo.on_message(
command("reports") & (filters.private | admin_filter),
)
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())}`",
)
@Gojo.on_message(command("report") & filters.group)
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 = DEV_USERS.union(SUDO_USERS).union(WHITELIST_USERS)
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 ""
@Gojo.on_callback_query(filters.regex("^report_"))
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."""
|