separated tag and pm logger.

This commit is contained in:
thedragonsinn
2024-01-15 21:32:54 +05:30
parent c68b5152b2
commit b9b5e29c9b
14 changed files with 157 additions and 89 deletions

View File

@@ -35,11 +35,15 @@ class _Config:
self.SUDO_TRIGGER: str = os.environ.get("SUDO_TRIGGER", "!")
self.TLOGGER: bool = False
self.PM_LOGGER: bool = False
self.TLOGGER_CHAT: int = int(os.environ.get("TLOGGER_CHAT", self.LOG_CHAT))
self.TAG_LOGGER: bool = False
self.TLOGGER_TASK = None
self.MESSAGE_LOGGER_CHAT: int = int(
os.environ.get("MESSAGE_LOGGER_CHAT", self.LOG_CHAT)
)
self.MESSAGE_LOGGER_TASK = None
self.OWNER_ID = int(os.environ.get("OWNER_ID"))

View File

@@ -69,10 +69,11 @@ class BOT(Client, AddCmd):
await idle()
await self.shut_down()
async def shut_down(self):
@staticmethod
async def shut_down():
await aio.close()
if Config.TLOGGER_TASK:
Config.TLOGGER_TASK.cancel()
if Config.MESSAGE_LOGGER_TASK:
Config.MESSAGE_LOGGER_TASK.cancel()
LOGGER.info("DB Closed.")
DB_CLIENT.close()
@@ -126,7 +127,7 @@ class BOT(Client, AddCmd):
disable_web_page_preview=disable_web_page_preview,
**kwargs,
)
return Message.parse_message(message=message)
return Message.parse(message=message)
doc = BytesIO(bytes(text, encoding="utf-8"))
doc.name = name
return (await super().send_document(

View File

@@ -18,6 +18,7 @@ class Conversation:
self.chat_id = chat_id
self.filters = filters
self.timeout = timeout
self.response = None
self.responses: list = []
self.set_future()
from app import bot

View File

@@ -10,7 +10,7 @@ from app.core import Message, filters
@bot.on_message(filters.owner_filter | filters.sudo_filter, group=1)
@bot.on_edited_message(filters.owner_filter | filters.sudo_filter, group=1)
async def cmd_dispatcher(bot: BOT, message: Message) -> None:
message = Message.parse_message(message)
message = Message.parse(message)
func = Config.CMD_DICT[message.cmd].func
coro = func(bot, message)
x = await run_coro(coro, message)

View File

@@ -16,7 +16,7 @@ def try_(func):
except BaseException:
text = (
f"<b>FUNC</b>: {func.__name__}"
f"\n</b>TRACEBACK</b>:\n<pre language=python>{traceback.format_exc()}</pre>"
f"\n</b>#TRACEBACK</b>:\n<pre language=python>{traceback.format_exc()}</pre>"
)
await bot.log_text(text=text, name="traceback.txt", type="error")
@@ -30,7 +30,7 @@ def try_(func):
except BaseException:
text = (
f"<b>FUNC</b>: {func.__name__}"
f"\n</b>TRACEBACK</b>:\n<pre language=python>{traceback.format_exc()}</pre>"
f"\n</b>#TRACEBACK</b>:\n<pre language=python>{traceback.format_exc()}</pre>"
)
bot.log_text(text=text, name="traceback.txt", type="error")

View File

@@ -41,14 +41,12 @@ class Message(Msg):
@cached_property
def is_from_owner(self) -> bool:
if self.from_user and self.from_user.id == Config.OWNER_ID:
return True
return False
return self.from_user and self.from_user.id == Config.OWNER_ID
@cached_property
def replied(self) -> "Message":
if self.reply_to_message:
return Message.parse_message(self.reply_to_message)
return Message.parse(self.reply_to_message)
@cached_property
def reply_id(self) -> int | None:
@@ -99,7 +97,8 @@ class Message(Msg):
if del_in:
reply = await self.async_deleter(task=task, del_in=del_in, block=block)
else:
reply = Message.parse_message(await task)
reply = Message.parse((await task)) # fmt:skip
self.text = text
else:
_, reply = await asyncio.gather(
super().delete(), self.reply(text, **kwargs)
@@ -150,8 +149,8 @@ class Message(Msg):
if del_in:
await self.async_deleter(task=task, del_in=del_in, block=block)
else:
return Message.parse_message((await task)) # fmt:skip
return Message.parse((await task)) # fmt:skip
@classmethod
def parse_message(cls, message: Msg) -> "Message":
def parse(cls, message: Msg) -> "Message":
return cls(message)

View File

@@ -111,7 +111,7 @@ async def fed_ban(bot: BOT, message: Message):
reason = f"{reason}{proof_str}"
if message.replied:
me = await userge.get_chat_member(message.chat.id, "me")
me = await bot.get_chat_member(message.chat.id, "me")
if me.status in {ChatMemberStatus.OWNER, ChatMemberStatus.ADMINISTRATOR}:
await message.reply(
f"!dban {reason}", disable_web_page_preview=True, del_in=3, block=False
@@ -138,7 +138,12 @@ async def fed_ban(bot: BOT, message: Message):
if not total:
await progress.edit("You Don't have any feds connected!")
return
resp_str = f" <b>FBanned</b> {user.mention}\n<b>ID</b>: {user.id}\n<b>Reason</b>: {reason}\n<b>Initiated in</b>: {message.chat.title or 'PM'}"
resp_str = (
f" <b>FBanned</b> {user.mention}"
f"\n<b>ID</b>: {user.id}"
f"\n<b>Reason</b>: {reason}"
f"\n<b>Initiated in</b>: {message.chat.title or 'PM'}"
)
if failed:
resp_str += f"\n<b>Failed</b> in: {len(failed)}/{total}\n" + "\n".join(
failed

View File

@@ -28,7 +28,7 @@ async def sudo(bot: BOT, message: Message):
.sudo | .sudo -c
"""
if "-c" in message.flags:
await message.reply(text=f"Sudo is enabled: <b>{Config.SUDO}</b>", del_in=8)
await message.reply(text=f"Sudo is enabled: <b>{Config.SUDO}</b>!", del_in=8)
return
value = not Config.SUDO
Config.SUDO = value
@@ -36,6 +36,7 @@ async def sudo(bot: BOT, message: Message):
SUDO.add_data({"_id": "sudo_switch", "value": value}),
message.reply(text=f"Sudo is enabled: <b>{value}</b>!", del_in=8),
)
await init_task()
@bot.add_cmd(cmd="addsudo")

View File

@@ -13,15 +13,15 @@ async def get_ids(bot: BOT, message: Message) -> None:
ids: str = ""
reply_forward = reply.forward_from_chat
reply_user = reply.from_user
ids += f"<b>Chat</b> : `{reply.chat.id}`\n"
ids += f"<b>Chat</b>: `{reply.chat.id}`\n"
if reply_forward:
ids += f"<b>Replied {'Channel' if reply_forward.type == ChatType.CHANNEL else 'Chat'}</b> : `{reply_forward.id}`\n"
ids += f"<b>Replied {'Channel' if reply_forward.type == ChatType.CHANNEL else 'Chat'}</b>: `{reply_forward.id}`\n"
if reply_user:
ids += f"<b>User</b> : {reply.from_user.id}"
ids += f"<b>User</b>: {reply.from_user.id}"
elif message.input:
ids: int = (await bot.get_chat(message.input[1:])).id
else:
ids: str = f"<b>Chat</b> :`{message.chat.id}`"
ids: str = f"<b>Chat</b>:`{message.chat.id}`"
await message.reply(ids)

View File

@@ -1,116 +1,171 @@
import asyncio
from pyrogram import filters
from pyrogram.enums import ChatType, MessageEntityType
from pyrogram.enums import MessageEntityType
from pyrogram.errors import MessageIdInvalid
from app import BOT, Config, CustomDB, Message, bot
from app import BOT, Config, CustomDB, Message, bot, try_
TLOGGER = CustomDB("COMMON_SETTINGS")
LOGGER = CustomDB("COMMON_SETTINGS")
MESSAGE_CACHE: dict[int, list[Message]] = {}
async def init_task():
log_check = await TLOGGER.find_one({"_id": "tlogger_switch"})
if not log_check:
return
Config.TLOGGER = log_check["value"]
Config.TLOGGER_TASK = asyncio.create_task(tlogger_runner())
tag_check = await LOGGER.find_one({"_id": "tag_logger_switch"})
pm_check = await LOGGER.find_one({"_id": "pm_logger_switch"})
if tag_check:
Config.TAG_LOGGER = tag_check["value"]
if pm_check:
Config.PM_LOGGER = pm_check["value"]
Config.MESSAGE_LOGGER_TASK = asyncio.create_task(runner())
@bot.add_cmd(cmd="tlogger")
@bot.add_cmd(cmd=["taglogger", "pmlogger"])
async def logger_switch(bot: BOT, message: Message):
"""
CMD: TLOGGER
INFO: Enable/Disable PM and Tag Logger.
CMD: TAGLOGGER | PMLOGGER
INFO: Enable/Disable PM or Tag Logger.
FLAGS: -c to check status.
USAGE:
.tlogger | .tlogger -c
"""
text = "pm" if message.cmd == "pmlogger" else "tag"
conf_str = f"{text.upper()}_LOGGER"
if "-c" in message.flags:
await message.reply(
text=f"PM and Tag Logger is enabled: <b>{Config.TLOGGER}</b>", del_in=8
text=f"{text.capitalize()} Logger is enabled: <b>{getattr(Config, conf_str)}</b>!",
del_in=8,
)
return
value = not Config.TLOGGER
Config.TLOGGER = value
value: bool = not getattr(Config, conf_str)
setattr(Config, conf_str, value)
await asyncio.gather(
TLOGGER.add_data({"_id": "tlogger_switch", "value": value}),
message.reply(text=f"PM and Tag Logger is enabled: <b>{value}</b>!", del_in=8),
LOGGER.add_data({"_id": f"{text}_logger_switch", "value": value}),
message.reply(
text=f"{text.capitalize()} Logger is enabled: <b>{value}</b>!", del_in=8
),
bot.log_text(
text=f"#{text.capitalize()}Logger is enabled: <b>{value}</b>!", type="info"
),
)
Config.MESSAGE_LOGGER_TASK = asyncio.create_task(runner())
basic_filters = (
~filters.channel
& ~filters.bot
& ~filters.service
& ~filters.chat(chats=[bot.me.id])
)
@try_
@bot.on_message(
filters=(~filters.channel & ~filters.bot & ~filters.service) & filters.incoming,
filters=basic_filters
& filters.private
& filters.create(lambda _, __, ___: Config.PM_LOGGER),
group=2,
)
async def tlogger_cacher(bot: BOT, message: Message):
if not Config.TLOGGER:
return
if message.chat.type == ChatType.PRIVATE:
cache_message(message)
return
if message.mentioned:
for entity in message.entities:
if (
entity.type == MessageEntityType.MENTION
and entity.user
and entity.user.id == bot.me.id
):
cache_message(message)
if message.reply_to_message:
cache_message(message.reply_to_message)
return
text = message.text or message.caption
if text and bot.me.username and bot.me.username in text:
async def pm_logger(bot: BOT, message: Message):
cache_message(message)
tag_filter = filters.create(lambda _, __, ___: Config.TAG_LOGGER)
@try_
@bot.on_message(
filters=(basic_filters & filters.reply & tag_filter) & ~filters.private, group=2
)
async def reply_logger(bot: BOT, message: Message):
if (
message.reply_to_message
and message.reply_to_message.from_user
and message.reply_to_message.from_user.id == bot.me.id
):
cache_message(message)
message.continue_propagation()
@try_
@bot.on_message(
filters=(basic_filters & filters.mentioned & tag_filter) & ~filters.private, group=2
)
async def mention_logger(bot: BOT, message: Message):
for entity in message.entities or []:
if (
entity.type == MessageEntityType.MENTION
and entity.user
and entity.user.id == bot.me.id
):
if message.reply_to_message:
cache_message(message.reply_to_message)
cache_message(message)
message.continue_propagation()
@try_
@bot.on_message(
filters=(basic_filters & (filters.text | filters.media) & tag_filter)
& ~filters.private,
group=2,
)
async def username_logger(bot: BOT, message: Message):
text = message.text or message.caption or ""
if bot.me.username and bot.me.username in text:
if message.reply_to_message:
cache_message(message.reply_to_message)
cache_message(message)
message.continue_propagation()
@try_
def cache_message(message: Message):
id = message.chat.id
if id in MESSAGE_CACHE.keys():
if len(MESSAGE_CACHE[id]) > 10:
bot.log.error("Flood detected, Message not cached.")
return
MESSAGE_CACHE[id].append(message)
else:
MESSAGE_CACHE[id] = [message]
async def tlogger_runner():
if not Config.TLOGGER:
@try_
async def runner():
if not (Config.TAG_LOGGER or Config.PM_LOGGER):
return
while True:
for cache_id, cached_list in MESSAGE_CACHE.items():
for cache_id, cached_list in list(MESSAGE_CACHE.items()):
if not cached_list:
MESSAGE_CACHE.pop(cache_id)
continue
for msg in cached_list:
try:
await msg.forward(Config.TLOGGER_CHAT)
await bot.send_message(
chat_id=Config.TLOGGER_CHAT,
text=f"{msg.from_user.mention} [{msg.from_user.id}] in Chat:\n{msg.link}",
logged_message = await msg.forward(Config.MESSAGE_LOGGER_CHAT)
await logged_message.reply(
text=f"{msg.from_user.mention} [{msg.from_user.id}]\nMessage: <a href='{msg.link}'>Link</a>",
)
except MessageIdInvalid:
await log_deleted_message(msg)
MESSAGE_CACHE[cache_id].remove(msg)
await asyncio.sleep(15)
await asyncio.sleep(30)
await asyncio.sleep(5)
await asyncio.sleep(15)
await asyncio.sleep(5)
@try_
async def log_deleted_message(message: Message):
notice = f"{message.from_user.mention} [{message.from_user.id}] deleted this message.\n\nLink: {message.link}\n\nText:\n"
notice = f"{message.from_user.mention} [{message.from_user.id}] deleted this message.\n\n---\n\nMessage: <a href='{message.link}'>Link</a>\n\n---\n\n"
if not message.media:
await bot.send_message(
chat_id=Config.TLOGGER_CHAT,
text=notice + message.text,
chat_id=Config.MESSAGE_LOGGER_CHAT,
text=f"{notice}Text:\n{message.text}",
disable_web_page_preview=True,
)
return
kwargs = dict(
chat_id=Config.TLOGGER_CHAT, caption=f"{notice}Caption:\n\n{message.caption}"
chat_id=Config.MESSAGE_LOGGER_CHAT,
caption=f"{notice}Caption:\n{message.caption or 'No Caption in media.'}",
)
if message.photo:
await bot.send_photo(**kwargs, photo=message.photo.file_id)
@@ -130,7 +185,7 @@ async def log_deleted_message(message: Message):
await bot.send_voice(**kwargs, voice=message.voice.file_id)
elif message.sticker:
await bot.send_sticker(
chat_id=Config.TLOGGER_CHAT, sticker=message.sticker.file_id
chat_id=Config.MESSAGE_LOGGER_CHAT, sticker=message.sticker.file_id
)
else:
await bot.send_message(chat_id=Config.TLOGGER_CHAT, text=str(message))
await bot.send_message(chat_id=Config.MESSAGE_LOGGER_CHAT, text=str(message))

View File

@@ -12,9 +12,7 @@ PM_GUARD = CustomDB("COMMON_SETTINGS")
ALLOWED_USERS: list[int] = []
allowed_filter = filters.create(
lambda _, __, m: m.chat.id in ALLOWED_USERS and m.chat.id != bot.me.id
)
allowed_filter = filters.create(lambda _, __, m: m.chat.id in ALLOWED_USERS)
guard_check = filters.create(lambda _, __, ___: Config.PM_GUARD)
@@ -32,7 +30,8 @@ async def init_task():
@bot.on_message(
(guard_check & filters.private & filters.incoming)
& (~allowed_filter & ~filters.bot),
& (~allowed_filter & ~filters.bot)
& ~filters.chat(chats=[bot.me.id]),
group=0,
)
async def handle_new_pm(bot: BOT, message: Message):
@@ -61,11 +60,12 @@ async def handle_new_pm(bot: BOT, message: Message):
@bot.on_message(
(guard_check & filters.private & filters.outgoing)
& (~allowed_filter & ~filters.bot),
& (~allowed_filter & ~filters.bot)
& ~filters.chat(chats=[bot.me.id]),
group=2,
)
async def auto_approve(bot: BOT, message: Message):
message = Message.parse_message(message=message)
message = Message.parse(message=message)
await message.reply("Auto-Approved to PM.", del_in=5)
ALLOWED_USERS.append(message.chat.id)
await PM_USERS.insert_one({"_id": message.chat.id})
@@ -91,6 +91,7 @@ async def pmguard(bot: BOT, message: Message):
PM_GUARD.add_data({"_id": "guard_switch", "value": value}),
message.reply(text=f"PM Guard is enabled: <b>{value}</b>!", del_in=8),
)
await init_task()
@bot.add_cmd(cmd=["a", "allow"])

View File

@@ -4,7 +4,7 @@ from app import BOT, Config, Message, bot
@bot.add_cmd(cmd="ci")
async def cmd_info(bot: BOT, message=Message):
async def cmd_info(bot: BOT, message: Message):
"""
CMD: CI (CMD INFO)
INFO: Get Github File URL of a Command.
@@ -20,8 +20,8 @@ async def cmd_info(bot: BOT, message=Message):
branch = Config.REPO.active_branch
remote_url = os.path.join(str(repo), "blob", str(branch), plugin_path)
resp_str = (
f"<pre language=bash>CMD={cmd}"
f"\nLocal_Path={cmd_path}</pre>"
f"<pre language=JS>CMD: {cmd}"
f"\nLocal_Path: {cmd_path}</pre>"
f"\nLink: <a href='{remote_url}'>Github</a>"
)
await message.reply(resp_str, disable_web_page_preview=True)

View File

@@ -38,7 +38,8 @@ class Aio:
)
await site.start()
async def handle_request(self, _):
@staticmethod
async def handle_request(_):
return web.Response(text="Web Server Running...")
async def get_json(
@@ -70,7 +71,7 @@ class Aio:
async def thumb_dl(self, thumb) -> BytesIO | str | None:
if not thumb or not thumb.startswith("http"):
return thumb
return await in_memory_dl(thumb) # NOQA
return await self.in_memory_dl(thumb) # NOQA
aio = Aio()

View File

@@ -40,7 +40,7 @@ SUDO_TRIGGER=!
# Trigger for bot
TLOGGER_CHAT=
MESSAGE_LOGGER_CHAT=
# PM and Tag Logger chat.