Files
limoka/hikariatama/ftg/keyword.py
2025-07-11 08:27:20 +00:00

370 lines
17 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀
# █▀█ █ █ █ █▀█ █▀▄ █
# © Copyright 2022
# https://t.me/hikariatama
#
# 🔒 Licensed under the GNU AGPLv3
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
# scope: hikka_min 1.2.10
# meta pic: https://img.icons8.com/fluency/48/000000/macbook-chat.png
# meta banner: https://mods.hikariatama.ru/badges/keyword.jpg
# meta developer: @hikarimods
# scope: hikka_only
import contextlib
import re
from telethon.tl.types import Message
from .. import loader, utils
@loader.tds
class KeywordMod(loader.Module):
"""Allows you to create custom filters with regexes, commands and unlimited funcionality"""
strings = {
"name": "Keyword",
"args": "🚫 <b>Args are incorrect</b>",
"kw_404": '🚫 <b>Keyword "{}" not found</b>',
"kw_added": "✅ <b>New keyword:\nTrigger: {}\nMessage: {}\n{}{}{}{}{}</b>",
"kw_removed": '✅ <b>Keyword "{}" removed</b>',
"kwbl_list": "🦊 <b>Blacklisted chats:</b>\n{}",
"bl_added": "✅ <b>This chat is now blacklisted for Keywords</b>",
"bl_removed": "✅ <b>This chat is now whitelisted for Keywords</b>",
"sent": "🦊 <b>[Keywords]: Sent message to {}, triggered by {}:\n{}</b>",
"kwords": "🦊 <b>Current keywords:\n</b>{}",
"no_command": (
"🚫 <b>Execution of command forbidden, because message contains reply</b>"
),
}
strings_ru = {
"args": "🚫 <b>Неверные аргументы</b>",
"kw_404": '🚫 <b>Кейворд "{}" не найден</b>',
"kw_added": "✅ <b>Новый кейворд:\nТриггер: {}\nСообщение: {}\n{}{}{}{}{}</b>",
"kw_removed": '✅ <b>Кейворд "{}" удален</b>',
"kwbl_list": "🦊 <b>Чаты в черном списке:</b>\n{}",
"bl_added": "✅ <b>Этот чат теперь в черном списке Кейвордов</b>",
"bl_removed": "✅ <b>Этот чат больше не в черном списке Кейвордов</b>",
"sent": "🦊 <b>[Кейворды]: Отправлено сообщение в {}, активировано {}:\n{}</b>",
"kwords": "🦊 <b>Текущие кейворды:\n</b>{}",
"no_command": (
"🚫 <b>Команда не была выполнена, так как сообщение содержит реплай</b>"
),
"_cmd_doc_kword": (
"<кейворд | можно в кавычках | & для нескольких слов, которые должны быть в"
" сообщении в любом порядке> <сообщение | оставь пустым для удаления"
" кейворда> [-r для полного совпадения] [-m для автопрочтения сообщения]"
" [-l для включения логирования] [-e для включения регулярных выражений]"
),
"_cmd_doc_kwords": "Показать активные кейворды",
"_cmd_doc_kwbl": "Добавить чат в черный список кейвордов",
"_cmd_doc_kwbllist": "Показать чаты в черном списке",
"_cls_doc": "Создавай кастомные кейворды с регулярными выражениями и командами",
}
strings_de = {
"args": "🚫 <b>Falsche Argumente</b>",
"kw_404": '🚫 <b>Keyword "{}" nicht gefunden</b>',
"kw_added": "✅ <b>Neuer Keyword:\nTrigger: {}\nNachricht: {}\n{}{}{}{}{}</b>",
"kw_removed": '✅ <b>Keyword "{}" entfernt</b>',
"kwbl_list": "🦊 <b>Blacklisted Chats:</b>\n{}",
"bl_added": "✅ <b>Dieser Chat ist nun blacklisted für Keywords</b>",
"bl_removed": "✅ <b>Dieser Chat ist nun whitelisted für Keywords</b>",
"sent": "🦊 <b>[Keywords]: Nachricht an {}, getriggert durch {}:\n{}</b>",
"kwords": "🦊 <b>Aktuelle Keywords:\n</b>{}",
"no_command": (
"🚫 <b>Kommando nicht ausgeführt, da die Nachricht einen Reply enthält</b>"
),
"_cmd_doc_kword": (
"<keyword | kann in Anführungszeichen | & für mehrere Wörter, die in"
" Nachricht in irgendeiner Reihenfolge sein müssen> <Nachricht | leer"
" lassen um Keyword zu löschen> [-r für exakte Übereinstimmung] [-m für"
" automatische Nachrichtenlöschung] [-l für Logging] [-e für reguläre"
" Ausdrücke]"
),
"_cmd_doc_kwords": "Zeige aktive Keywords",
"_cmd_doc_kwbl": "Füge Chat zur Keyword Blacklist hinzu",
"_cmd_doc_kwbllist": "Zeige Chats in der Keyword Blacklist",
"_cls_doc": "Erstelle eigene Keywords mit regulären Ausdrücken und Befehlen",
}
strings_hi = {
"args": "🚫 <b>गलत तर्क</b>",
"kw_404": '🚫 <b>"{}" कीवर्ड नहीं मिला</b>',
"kw_added": "✅ <b>नया कीवर्ड:\nट्रिगर: {}\nसंदेश: {}\n{}{}{}{}{}</b>",
"kw_removed": '✅ <b>"{}" कीवर्ड हटा दिया</b>',
"kwbl_list": "🦊 <b>ब्लैकलिस्टेड चैट्स:</b>\n{}",
"bl_added": "✅ <b>यह चैट अब कीवर्ड ब्लैकलिस्ट में है</b>",
"bl_removed": "✅ <b>यह चैट अब कीवर्ड व्हाइटलिस्ट में है</b>",
"sent": "🦊 <b>[कीवर्ड्स]: {} को, {} ने ट्रिगर किया:\n{}</b>",
"kwords": "🦊 <b>वर्तमान कीवर्ड्स:\n</b>{}",
"no_command": "🚫 <b>कमांड नहीं चलाया क्योंकि संदेश रिप्लाई का सामना कर रहा है</b>",
"_cmd_doc_kword": (
"<कीवर्ड | उदाहरण के लिए & | & के बाद एक से अधिक शब्द, जो संदेश में किसी भी"
" क्रम में होने चाहिए> <संदेश | खाली छोड़ने से कीवर्ड हट जाएगा> [-r बिल्कुल"
" मेल के लिए] [-m स्वचालित संदेश हटाने के लिए] [-l लॉगिंग के लिए] [-e"
" रेगुलर एक्सप्रेशन के लिए]"
),
"_cmd_doc_kwords": "वर्तमान कीवर्ड्स दिखाएं",
"_cmd_doc_kwbl": "कीवर्ड ब्लैकलिस्ट में चैट जोड़ें",
"_cmd_doc_kwbllist": "कीवर्ड ब्लैकलिस्ट में चैट दिखाएं",
"_cls_doc": "रेगुलर एक्सप्रेशन और कमांड के साथ अपने कीवर्ड बनाएं",
}
strings_uz = {
"args": "🚫 <b>Noto'g'ri argument</b>",
"kw_404": '🚫 <b>"{}" kalit so\'z topilmadi</b>',
"kw_added": "✅ <b>Yangi kalit so'z:\nTriger: {}\nXabar: {}\n{}{}{}{}{}</b>",
"kw_removed": "✅ <b>\"{}\" kalit so'z o'chirildi</b>",
"kwbl_list": "🦊 <b>Qora ro'yxatli guruhlar:</b>\n{}",
"bl_added": "✅ <b>Bu guruh kalit so'zlarni qora ro'yxatga qo'shildi</b>",
"bl_removed": "✅ <b>Bu guruh kalit so'zlarni oq ro'yxatga qo'shildi</b>",
"sent": "🦊 <b>[Kalit so'zlarni]: {} ga, {} guruhga xabar jo'natdi:\n{}</b>",
"kwords": "🦊 <b>Hozirgi kalit so'zlarni:\n</b>{}",
"no_command": "🚫 <b>Komanda bajarilmadi chunki xabar javob qaytaradi</b>",
"_cmd_doc_kword": (
"<kalit so'z | & orqali bir nechta so'zlarni | & keyingi bir nechta so'z,"
" xabarda biror tartibda bo'lishi kerak> <xabar | bo'sh qoldirish kalit"
" so'zni o'chiradi> [-r to'g'ri moslik uchun] [-m avtomatik xabar o'chirish"
" uchun] [-l yozuvni qayd etish uchun] [-e regular ifodalar uchun]"
),
"_cmd_doc_kwords": "Hozirgi kalit so'zlarni ko'rsatish",
"_cmd_doc_kwbl": "Qora ro'yxatga guruh qo'shish",
"_cmd_doc_kwbllist": "Qora ro'yxatda guruhlar ro'yxatini ko'rsatish",
"_cls_doc": "Regular ifodalarni va buyruqlarni ishlatib kalit so'z yarating",
}
strings_tr = {
"args": "🚫 <b>Yanlış argüman</b>",
"kw_404": '🚫 <b>"{}" anahtar kelime bulunamadı</b>',
"kw_added": "✅ <b>Yeni anahtar kelime:\nTriger: {}\nMesaj: {}\n{}{}{}{}{}</b>",
"kw_removed": '✅ <b>"{}" anahtar kelime kaldırıldı</b>',
"kwbl_list": "🦊 <b>Kara liste sohbetler:</b>\n{}",
"bl_added": "✅ <b>Bu sohbet anahtar kelimeleri kara listeye eklendi</b>",
"bl_removed": "✅ <b>Bu sohbet anahtar kelimeleri açık listeye eklendi</b>",
"sent": "🦊 <b>[Anahtar Kelimeler]: {}'a, {} sohbetine mesaj gönderdi:\n{}</b>",
"kwords": "🦊 <b>Geçerli anahtar kelimeler:\n</b>{}",
"no_command": "🚫 <b>Komut yürütülemedi çünkü mesaj yanıt veriyor</b>",
"_cmd_doc_kword": (
"<anahtar kelime | & ile birden çok sözcük | & sonra birden çok sözcük,"
" mesajda herhangi bir sırayla olmalıdır> <mesaj | boş bırakmak anahtar"
" kelimeyi kaldırır> [-r tam eşleme için] [-m otomatik mesaj silmek için]"
" [-l kayıt için] [-e düzenli ifadeler için]"
),
"_cmd_doc_kwords": "Geçerli anahtar kelimeleri göster",
"_cmd_doc_kwbl": "Sohbeti kara listeye ekle",
"_cmd_doc_kwbllist": "Kara listede sohbetleri göster",
"_cls_doc": (
"Anahtar kelimeleri oluşturmak için düzenli ifadeleri ve komutları kullanın"
),
}
async def client_ready(self):
self.keywords = self.get("keywords", {})
self.bl = self.get("bl", [])
async def kwordcmd(self, message: Message):
"""<keyword | could be in quotes | & for multiple words that should be in msg> <message | empty to remove keyword> [-r for full match] [-m for autoreading msg] [-l to log in pm] [-e for regular expressions]"""
args = utils.get_args_raw(message)
kw, ph, restrict, ar, l, e, c = "", "", False, False, False, False, False
if "-r" in args:
restrict = True
args = args.replace(" -r", "").replace("-r", "")
if "-m" in args:
ar = True
args = args.replace(" -m", "").replace("-m", "")
if "-l" in args:
l = True
args = args.replace(" -l", "").replace("-l", "")
if "-e" in args:
e = True
args = args.replace(" -e", "").replace("-e", "")
if "-c" in args:
c = True
args = args.replace(" -c", "").replace("-c", "")
if args[0] == "'":
kw = args[1 : args.find("'", 1)]
args = args[args.find("'", 1) + 1 :]
elif args[0] == '"':
kw = args[1 : args.find('"', 1)]
args = args[args.find('"', 1) + 1 :]
else:
kw = args.split()[0]
try:
args = args.split(maxsplit=1)[1]
except Exception:
args = ""
if ph := args:
ph = ph.strip()
kw = kw.strip()
self.keywords[kw] = [f"🤖 {ph}", restrict, ar, l, e, c]
self.set("keywords", self.keywords)
return await utils.answer(
message,
self.strings("kw_added").format(
kw,
utils.escape_html(ph),
("Restrict: yes\n" if restrict else ""),
("Auto-read: yes\n" if ar else ""),
("Log: yes" if l else ""),
("Regex: yes" if e else ""),
("Command: yes" if c else ""),
),
)
else:
if kw not in self.keywords:
return await utils.answer(message, self.strings("kw_404").format(kw))
del self.keywords[kw]
self.set("keywords", self.keywords)
return await utils.answer(message, self.strings("kw_removed").format(kw))
async def kwordscmd(self, message: Message):
"""List current kwords"""
res = ""
for kw, ph in self.keywords.items():
res += (
"<code>"
+ kw
+ "</code>\n<b>Message: "
+ utils.escape_html(ph[0])
+ "\n"
+ ("Restrict: yes\n" if ph[1] else "")
+ ("Auto-read: yes\n" if ph[2] else "")
+ ("Log: yes" if ph[3] else "")
+ ("Regex: yes" if len(ph) > 4 and ph[4] else "")
+ ("Command: yes" if len(ph) > 5 and ph[5] else "")
+ "</b>"
)
if res[-1] != "\n":
res += "\n"
res += "\n"
await utils.answer(message, self.strings("kwords").format(res))
@loader.group_admin_ban_users
async def kwblcmd(self, message: Message):
"""Blacklist chat from answering keywords"""
cid = utils.get_chat_id(message)
if cid not in self.bl:
self.bl.append(cid)
self.set("bl", self.bl)
return await utils.answer(message, self.strings("bl_added"))
else:
self.bl.remove(cid)
self.set("bl", self.bl)
return await utils.answer(message, self.strings("bl_removed"))
async def kwbllistcmd(self, message: Message):
"""List blacklisted chats"""
chat = str(utils.get_chat_id(message))
res = ""
for user in self.bl:
try:
u = await self._client.get_entity(user)
except Exception:
self.chats[chat]["defense"].remove(user)
continue
tit = (
u.first_name if getattr(u, "first_name", None) is not None else u.title
)
res += (
" 👺 <a"
f" href=\"tg://user?id={u.id}\">{tit}{(' ' + u.last_name) if getattr(u, 'last_name', None) is not None else ''}</a>\n"
)
if not res:
res = "<i>No</i>"
return await utils.answer(message, self.strings("kwbl_list").format(res))
async def watcher(self, message: Message):
with contextlib.suppress(Exception):
cid = utils.get_chat_id(message)
if cid in self.bl:
return
for kw, ph in self.keywords.copy().items():
if len(ph) > 4 and ph[4]:
try:
if not re.match(kw, message.raw_text):
continue
except Exception:
continue
else:
kws = [
_.strip() for _ in ([kw] if "&" not in kw else kw.split("&"))
]
trigger = False
for k in kws:
if k.lower() in message.text.lower():
trigger = True
if not ph[1]:
break
elif k.lower() not in message.text.lower() and ph[1]:
trigger = False
break
if not trigger:
continue
offset = 2
if (
len(ph) > 5
and ph[5]
and ph[0][offset:].startswith(self.get_prefix())
):
offset += 1
if ph[2]:
await self._client.send_read_acknowledge(cid, clear_mentions=True)
if ph[3]:
chat = await message.get_chat()
ch = (
message.first_name
if getattr(message, "first_name", None) is not None
else ""
)
if not ch:
ch = (
chat.title
if getattr(message, "title", None) is not None
else ""
)
await self._client.send_message(
"me", self.strings("sent").format(ch, kw, ph[0])
)
if not message.reply_to_msg_id:
ms = await utils.answer(message, ph[0])
else:
ms = await message.respond(ph[0])
ms.text = ph[0][2:]
if len(ph) > 5 and ph[5]:
if ph[0][offset:].split()[0] == "del":
await message.delete()
await ms.delete()
elif not message.reply_to_msg_id:
cmd = ph[0][offset:].split()[0]
if cmd in self.allmodules.commands:
await self.allmodules.commands[cmd](ms)
else:
await ms.respond(self.strings("no_command"))