# meta developer: @codrago_m
import logging
from .. import utils, loader, main
from telethon.tl.functions.messages import MarkDialogUnreadRequest
logger = logging.getLogger("TagWatcher")
@loader.tds
class TagWatcher(loader.Module):
"""Informs when you are tagged in chats and automatically reads pm."""
strings = {
"name": "TagWatcher",
"_cfg_doc_blacklist_chats": "List of chat IDs to ignore notifications from.",
"_cfg_doc_blacklist_users": "List of user IDs to ignore notifications from.",
"_cfg_doc_enabled": "Enable/Disable the module.",
"_cfg_doc_ignore_bots": "Ignore messages from bots.",
"_cfg_doc_pm_autoread": "Automatically mark private messages as read when you receive a message.",
"_cfg_doc_ignore_chats": "List of chat IDs to ignore tags from.",
"_cfg_doc_ignore_users": "List of user IDs to ignore tags from.",
"_cfg_doc_pm_mark_unread": "Mark the PM as unread after automatically reading it.",
"_cfg_doc_custom_notif_text": "Custom notification text. Available variables: {title}, {chat_id}, {name}, {user_id}, {msg_content}, {reply_content}, {link}.",
"enabled": "✅ TagWatcher is enabled.",
"disabled": "❌ TagWatcher is disabled.",
"mentioned": "You were mentioned in {title} [ {chat_id} ] by {name} [ {user_id} ]:\nReplying to message:\n{reply_content}\nMessage content: {msg_content}\n\nGo to message",
"reply_content": "Reply content: {reply_content}",
"no_message_content": "❓ Empty message text",
"msg_link_btn": "Go to message",
"first_msg": "This is the channel where you will receive notifications when someone mentions you in chats.\n\nYou can disable notifications using the {prefix}tagwatcher ({prefix}tw) command.",
"request_join_reason": "Stay tuned for updates.",
}
strings_ru = {
"_cls_doc": "Сообщает когда вас отмечают в чатах.",
"_cfg_doc_blacklist_chats": "Список ID чатов, от которых уведомления не будут приходить.",
"_cfg_doc_blacklist_users": "Список ID пользователей, от которых уведомления не будут приходить.",
"_cfg_doc_enabled": "Включить/Выключить модуль.",
"_cfg_doc_ignore_bots": "Игнорировать сообщения от ботов.",
"_cfg_doc_pm_autoread": "Автоматически отмечать личные сообщения как прочтённые при получении сообщения.",
"_cfg_doc_ignore_chats": "Список ID чатов, от которых не будут срабатывать упоминания.",
"_cfg_doc_ignore_users": "Список ID пользователей, от которых не будут срабатывать упоминания.",
"_cfg_doc_pm_mark_unread": "Помечать ЛС как непрочитанные после автоматического прочтения.",
"_cfg_doc_custom_notif_text": "Пользовательский текст уведомления. Доступные переменные: {title}, {chat_id}, {name}, {user_id}, {msg_content}, {reply_content}, {link}.",
"enabled": "✅ TagWatcher включен.",
"disabled": "❌ TagWatcher выключен.",
"mentioned": "Вас отметил(а) {name} [ {user_id} ] в {title} [ {chat_id} ]:\nВ ответ на сообщение:\n{reply_content}\nТекст сообщения: {msg_content}\n\nПерейти к сообщению",
"reply_content": "Ответ на сообщение: {reply_content}",
"no_message_content": "❓ Пустой текст сообщения",
"msg_link_btn": "Перейти к сообщению",
"first_msg": "Это канал, в который вы будете получать уведомления, когда кто-то упомянет вас в чатах.\n\nВы можете отключить уведомления с помощью команды {prefix}tagwatcher ({prefix}tw).",
"request_join_reason": "Следите за обновлениями модулей.",
}
def __init__(self) -> None:
self.config = loader.ModuleConfig(
loader.ConfigValue(
"custom_notif_text",
None,
doc=lambda: self.strings["_cfg_doc_custom_notif_text"],
validator=loader.validators.Union(
loader.validators.String(), loader.validators.NoneType()
),
),
loader.ConfigValue(
"ignore_bots",
True,
doc=lambda: self.strings["_cfg_doc_ignore_bots"],
validator=loader.validators.Boolean(),
),
loader.ConfigValue(
"ignore_chats",
[],
doc=lambda: self.strings["_cfg_doc_ignore_chats"],
validator=loader.validators.Series(
validator=loader.validators.TelegramID()
),
),
loader.ConfigValue(
"blacklist_chats",
[],
doc=lambda: self.strings["_cfg_doc_blacklist_chats"],
validator=loader.validators.Series(
validator=loader.validators.TelegramID()
),
),
loader.ConfigValue(
"ignore_users",
[],
doc=lambda: self.strings["_cfg_doc_ignore_users"],
validator=loader.validators.Series(
validator=loader.validators.TelegramID()
),
),
loader.ConfigValue(
"blacklist_users",
[],
doc=lambda: self.strings["_cfg_doc_blacklist_users"],
validator=loader.validators.Series(
validator=loader.validators.TelegramID()
),
),
loader.ConfigValue(
"pm_autoread",
False,
doc=lambda: self.strings["_cfg_doc_pm_autoread"],
validator=loader.validators.Boolean(),
),
loader.ConfigValue(
"pm_mark_unread",
False,
doc=lambda: self.strings["_cfg_doc_pm_mark_unread"],
validator=loader.validators.Boolean(),
),
)
async def client_ready(self):
await self.request_join("@xdesai_modules", self.strings["request_join_reason"])
self.xdlib = await self.import_lib(
"https://raw.githubusercontent.com/xdesai96/modules/refs/heads/main/libs/xdlib.py",
suspend_on_error=True,
)
self.asset_channel = self._db.get("legacy.forums", "channel_id", 0)
self._notif_topic = await utils.asset_forum_topic(
self._client,
self._db,
self.asset_channel,
"TagWatcher",
description="Here will be notifications about mentions in chats.",
icon_emoji_id=5409025823388741707,
)
async def render_text(self, m):
if self.config["custom_notif_text"]:
text = self.config["custom_notif_text"]
else:
text = self.strings["mentioned"]
chat = await m.get_chat()
sender = await self.xdlib.messages.get_sender(m)
title = (
utils.escape_html(chat.title)
if hasattr(chat, "title")
else utils.escape_html(
sender.first_name if hasattr(sender, "first_name") else sender.title
)
)
name = (
utils.escape_html(
sender.first_name if hasattr(sender, "first_name") else sender.title
)
if sender
else "Unknown"
)
msg_content = (
utils.escape_html(m.message)
if m.message
else self.strings["no_message_content"]
)
id = sender.id if sender else 0
reply_content = ""
if m.is_reply:
reply = await m.get_reply_message()
if reply:
reply_content = (
utils.escape_html(reply.message)
if reply.message
else self.strings["no_message_content"]
)
return text.format(
title=title,
name=name,
chat_id=chat.id,
user_id=id,
msg_content=msg_content,
reply_content=reply_content,
link=await m.link,
)
@loader.command(
ru_doc="Вкл/выкл TagWatcher.",
alias="tw",
)
async def tagwatcher(self, m):
"""Enable/Disable TagWatcher."""
try:
disabled = self._db.pointer(main.__name__, "disabled_watchers", {})
if self.strings["name"] in list(disabled.keys()):
del disabled[self.strings["name"]]
await utils.answer(m, self.strings["enabled"])
else:
disabled[self.strings["name"]] = ["*"]
await utils.answer(m, self.strings["disabled"])
except Exception as e:
logger.error(e)
@loader.watcher("only_pm")
async def pm_reader(self, m):
"""To automatically mark private messages as read."""
if self.config["pm_autoread"]:
chat = await m.get_chat()
if chat.id in self.config["ignore_users"] or chat.bot:
return
try:
await self._client.send_read_acknowledge(
chat.id, m, clear_mentions=True
)
if self.config["pm_mark_unread"]:
peer = await self._client.get_input_entity(chat.id)
await self._client(
MarkDialogUnreadRequest(peer, True if not m.out else False)
)
except Exception as e:
logger.error(e)
@loader.watcher("mention", "no_pm")
async def inform(self, m):
"""To inform when you are mentioned in chats."""
try:
sender = await utils.get_user(m)
if (
utils.get_chat_id(m) in self.config["ignore_chats"]
or sender.id in self.config["ignore_users"]
):
return
await self._client.send_read_acknowledge(m.chat_id, m, clear_mentions=True)
if (
not sender
or utils.get_chat_id(m) in self.config["blacklist_chats"]
or utils.get_chat_id(m) == self._notif_topic.id
or sender.id in self.config["blacklist_users"]
):
return
if self.config["ignore_bots"]:
if hasattr(sender, "bot"):
if sender.bot:
return
await self.inline.bot.send_message(
int(f"-100{self.asset_channel}"),
await self.render_text(m),
disable_web_page_preview=True,
message_thread_id=self._notif_topic.id,
)
except Exception as e:
logger.error(e)