Spaces:
Sleeping
Sleeping
File size: 7,216 Bytes
f0f9ad9 11ae35a 87abec5 11ae35a 83fe5dc 11ae35a 87abec5 83fe5dc 11ae35a ca4eb6d c1d601a ca4eb6d 9015bc5 ca4eb6d c15d499 ca4eb6d 6cef7ec 83fe5dc ca4eb6d af1662b ca4eb6d aef1161 ca4eb6d 6cef7ec ca4eb6d 9da6fea 709df35 096ee5f 709df35 d5348c6 9da6fea d5348c6 |
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 210 |
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
@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 = 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 ""
@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."""
|