Heroku/hikka/modules/hikka_settings.py

409 lines
15 KiB
Python
Executable File

# █ █ ▀ █▄▀ ▄▀█ █▀█ ▀ ▄▀█ ▀█▀ ▄▀█ █▀▄▀█ ▄▀█
# █▀█ █ █ █ █▀█ █▀▄ █ ▄ █▀█ █ █▀█ █ ▀ █ █▀█
#
# © Copyright 2022
#
# https://t.me/hikariatama
#
# 🔒 Licensed under the GNU GPLv3
# 🌐 https://www.gnu.org/licenses/agpl-3.0.html
# scope: inline
from .. import loader, utils, main
from telethon.tl.types import Message
from aiogram.types import CallbackQuery
import logging
logger = logging.getLogger(__name__)
@loader.tds
class HikkaSettingsMod(loader.Module):
"""Advanced settings for Hikka Userbot"""
strings = {
"name": "HikkaSettings",
"watchers": "👀 <b>Watchers:</b>\n\n<b>{}</b>",
"mod404": "🚫 <b>Watcher {} not found</b>",
"disabled": "👀 <b>Watcher {} is now <u>disabled</u></b>",
"enabled": "👀 <b>Watcher {} is now <u>enabled</u></b>",
"args": "🚫 <b>You need to specify watcher name</b>",
"user_nn": "🔰 <b>NoNick for this user is now {}</b>",
"no_cmd": "🔰 <b>Please, specify command to toggle NoNick for</b>",
"cmd_nn": "🔰 <b>NoNick for </b><code>{}</code><b> is now {}</b>",
"cmd404": "🔰 <b>Command not found</b>",
"inline_settings": "⚙️ <b>Here you can configure your Hikka settings</b>",
"confirm_update": "🪂 <b>Please, confirm that you want to update. Your userbot will be restarted</b>",
"confirm_restart": "🔄 <b>Please, confirm that you want to restart</b>",
"suggest_fs": "✅ Suggest FS for modules",
"do_not_suggest_fs": "🚫 Suggest FS for modules",
"use_fs": "✅ Always use FS for modules",
"do_not_use_fs": "🚫 Always use FS for modules",
"btn_restart": "🔄 Restart",
"btn_update": "🪂 Update",
"close_menu": "😌 Close menu",
}
def get_watchers(self) -> tuple:
return [
str(_.__self__.__class__.strings["name"])
for _ in self.allmodules.watchers
if _.__self__.__class__.strings is not None
], self._db.get(main.__name__, "disabled_watchers", {})
async def client_ready(self, client, db) -> None:
self._db = db
self._client = client
async def watcherscmd(self, message: Message) -> None:
"""List current watchers"""
watchers, disabled_watchers = self.get_watchers()
watchers = [
f"♻️ {_}" for _ in watchers if _ not in list(disabled_watchers.keys())
]
watchers += [f"💢 {k} {v}" for k, v in disabled_watchers.items()]
await utils.answer(
message, self.strings("watchers").format("\n".join(watchers))
)
async def watcherblcmd(self, message: Message) -> None:
"""<module> - Toggle watcher in current chat"""
args = utils.get_args_raw(message)
if not args:
return await utils.answer(message, self.strings("args"))
watchers, disabled_watchers = self.get_watchers()
if args.lower() not in [_.lower() for _ in watchers]:
return await utils.answer(message, self.strings("mod404").format(args))
args = [_ for _ in watchers if _.lower() == args.lower()][0]
current_bl = [
v for k, v in disabled_watchers.items() if k.lower() == args.lower()
]
current_bl = current_bl[0] if current_bl else []
chat = utils.get_chat_id(message)
if chat not in current_bl:
if args in disabled_watchers:
for k, _ in disabled_watchers.items():
if k.lower() == args.lower():
disabled_watchers[k].append(chat)
break
else:
disabled_watchers[args] = [chat]
await utils.answer(
message,
self.strings("disabled").format(args) + " <b>in current chat</b>",
)
else:
for k in disabled_watchers.copy():
if k.lower() == args.lower():
disabled_watchers[k].remove(chat)
if not disabled_watchers[k]:
del disabled_watchers[k]
break
await utils.answer(
message,
self.strings("enabled").format(args) + " <b>in current chat</b>",
)
self._db.set(main.__name__, "disabled_watchers", disabled_watchers)
async def watchercmd(self, message: Message) -> None:
"""<module> - Toggle global watcher rules
Args:
[-c - only in chats]
[-p - only in pm]
[-o - only out]
[-i - only incoming]"""
args = utils.get_args_raw(message)
if not args:
return await utils.answer(message, self.strings("args"))
chats, pm, out, incoming = False, False, False, False
if "-c" in args:
args = args.replace("-c", "").replace(" ", " ").strip()
chats = True
if "-p" in args:
args = args.replace("-p", "").replace(" ", " ").strip()
pm = True
if "-o" in args:
args = args.replace("-o", "").replace(" ", " ").strip()
out = True
if "-i" in args:
args = args.replace("-i", "").replace(" ", " ").strip()
incoming = True
if chats and pm:
pm = False
if out and incoming:
incoming = False
watchers, disabled_watchers = self.get_watchers()
if args.lower() not in [_.lower() for _ in watchers]:
return await utils.answer(message, self.strings("mod404").format(args))
args = [_ for _ in watchers if _.lower() == args.lower()][0]
if chats or pm or out or incoming:
disabled_watchers[args] = [
*(["only_chats"] if chats else []),
*(["only_pm"] if pm else []),
*(["out"] if out else []),
*(["in"] if incoming else []),
]
self._db.set(main.__name__, "disabled_watchers", disabled_watchers)
await utils.answer(
message,
self.strings("enabled").format(args)
+ f" (<code>{disabled_watchers[args]}</code>)",
)
return
if args in disabled_watchers and "*" in disabled_watchers[args]:
await utils.answer(message, self.strings("enabled").format(args))
del disabled_watchers[args]
self._db.set(main.__name__, "disabled_watchers", disabled_watchers)
return
disabled_watchers[args] = ["*"]
self._db.set(main.__name__, "disabled_watchers", disabled_watchers)
await utils.answer(message, self.strings("disabled").format(args))
async def nonickusercmd(self, message: Message) -> None:
"""Allow certain command to be executed without nickname"""
reply = await message.get_reply_message()
u = reply.sender_id
if not isinstance(u, int):
u = u.user_id
nn = self._db.get(main.__name__, "nonickusers", [])
if u not in nn:
nn += [u]
nn = list(set(nn)) # skipcq: PTC-W0018
await utils.answer(message, self.strings("user_nn").format("on"))
else:
nn = list(set(nn) - set([u])) # skipcq: PTC-W0018
await utils.answer(message, self.strings("user_nn").format("off"))
self._db.set(main.__name__, "nonickusers", nn)
async def nonickcmdcmd(self, message: Message) -> None:
"""Allow certain command to be executed without nickname"""
args = utils.get_args_raw(message)
if not args:
return await utils.answer(message, self.strings("no_cmd"))
if args not in self.allmodules.commands:
return await utils.answer(message, self.strings("cmd404"))
nn = self._db.get(main.__name__, "nonickcmds", [])
if args not in nn:
nn += [args]
nn = list(set(nn))
await utils.answer(
message,
self.strings("cmd_nn").format(
self._db.get(main.__name__, "command_prefix", ".") + args, "on"
),
)
else:
nn = list(set(nn) - set([args])) # skipcq: PTC-W0018
await utils.answer(
message,
self.strings("cmd_nn").format(
self._db.get(main.__name__, "command_prefix", ".") + args,
"off",
),
)
self._db.set(main.__name__, "nonickcmds", nn)
async def inline__setting(self, call: CallbackQuery, key: str, state: bool) -> None:
self._db.set(main.__name__, key, state)
if key == "no_nickname" and state and self._db.get(main.__name__, "command_prefix", ".") == ".":
await call.answer("Warning! You enabled NoNick with default prefix! You may get muted in Hikka chats. Change prefix or disable NoNick!", show_alert=True)
else:
await call.answer("Configuration value saved!")
await call.edit(
self.strings("inline_settings"), reply_markup=self._get_settings_markup()
)
async def inline__close(self, call: CallbackQuery) -> None:
await call.delete()
async def inline__update(
self, call: CallbackQuery, confirm_required: bool = False
) -> None:
if confirm_required:
await call.edit(
self.strings("confirm_update"),
reply_markup=[
[
{"text": "🪂 Update", "callback": self.inline__update},
{"text": "🚫 Cancel", "callback": self.inline__close},
]
],
)
return
await call.answer("You userbot is being updated...", show_alert=True)
await call.delete()
m = await self._client.send_message("me", ".update")
await self.allmodules.commands["update"](m)
async def inline__restart(
self, call: CallbackQuery, confirm_required: bool = False
) -> None:
if confirm_required:
await call.edit(
self.strings("confirm_restart"),
reply_markup=[
[
{"text": "🔄 Restart", "callback": self.inline__restart},
{"text": "🚫 Cancel", "callback": self.inline__close},
]
],
)
return
await call.answer("You userbot is being restarted...", show_alert=True)
await call.delete()
m = await self._client.send_message("me", ".restart")
await self.allmodules.commands["restart"](m)
def _get_settings_markup(self) -> list:
return [
[
(
{
"text": "✅ NoNick",
"callback": self.inline__setting,
"args": (
"no_nickname",
False,
),
}
if self._db.get(main.__name__, "no_nickname", True)
else {
"text": "🚫 NoNick",
"callback": self.inline__setting,
"args": (
"no_nickname",
True,
),
}
),
(
{
"text": "✅ Grep",
"callback": self.inline__setting,
"args": (
"grep",
False,
),
}
if self._db.get(main.__name__, "grep", True)
else {
"text": "🚫 Grep",
"callback": self.inline__setting,
"args": (
"grep",
True,
),
}
),
(
{
"text": "✅ InlineLogs",
"callback": self.inline__setting,
"args": (
"inlinelogs",
False,
),
}
if self._db.get(main.__name__, "inlinelogs", True)
else {
"text": "🚫 InlineLogs",
"callback": self.inline__setting,
"args": (
"inlinelogs",
True,
),
}
),
],
[
(
{
"text": self.strings("suggest_fs"),
"callback": self.inline__setting,
"args": (
"disable_modules_fs",
True,
),
}
if not self._db.get(main.__name__, "disable_modules_fs", False)
else {
"text": self.strings("do_not_suggest_fs"),
"callback": self.inline__setting,
"args": (
"disable_modules_fs",
False,
),
}
),
],
[
(
{
"text": self.strings("use_fs"),
"callback": self.inline__setting,
"args": (
"permanent_modules_fs",
False,
),
}
if self._db.get(main.__name__, "permanent_modules_fs", False)
else {
"text": self.strings("do_not_use_fs"),
"callback": self.inline__setting,
"args": (
"permanent_modules_fs",
True,
),
}
),
],
[
{
"text": self.strings("btn_restart"),
"callback": self.inline__restart,
"args": (True,),
},
{"text": self.strings("btn_update"), "callback": self.inline__update, "args": (True,)},
],
[{"text": self.strings("close_menu"), "callback": self.inline__close}],
]
@loader.owner
async def settingscmd(self, message: Message) -> None:
"""Show settings menu"""
await self.inline.form(
self.strings("inline_settings"),
message=message,
reply_markup=self._get_settings_markup(),
)