separated tag and pm logger.
This commit is contained in:
@@ -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"))
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -40,7 +40,7 @@ SUDO_TRIGGER=!
|
||||
# Trigger for bot
|
||||
|
||||
|
||||
TLOGGER_CHAT=
|
||||
MESSAGE_LOGGER_CHAT=
|
||||
# PM and Tag Logger chat.
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user