__version__ = (1, 4, 2)
#
# @@@@@@ @@@@@@ @@@@@@@ @@@@@@@ @@@@@@ @@@@@@@@@@ @@@@@@ @@@@@@@ @@@ @@@ @@@ @@@@@@@@ @@@@@@
# @@@@@@@@ @@@@@@@ @@@@@@@ @@@@@@@@ @@@@@@@@ @@@@@@@@@@@ @@@@@@@@ @@@@@@@@ @@@ @@@ @@@ @@@@@@@@ @@@@@@@
# @@! @@@ !@@ @@! @@! @@@ @@! @@@ @@! @@! @@! @@! @@@ @@! @@@ @@! @@@ @@! @@! !@@
# !@! @!@ !@! !@! !@! @!@ !@! @!@ !@! !@! !@! !@! @!@ !@! @!@ !@! @!@ !@! !@! !@!
# @!@!@!@! !!@@!! @!! @!@!!@! @!@ !@! @!! !!@ @!@ @!@ !@! @!@ !@! @!@ !@! @!! @!!!:! !!@@!!
# !!!@!!!! !!@!!! !!! !!@!@! !@! !!! !@! ! !@! !@! !!! !@! !!! !@! !!! !!! !!!!!: !!@!!!
# !!: !!! !:! !!: !!: :!! !!: !!! !!: !!: !!: !!! !!: !!! !!: !!! !!: !!: !:!
# :!: !:! !:! :!: :!: !:! :!: !:! :!: :!: :!: !:! :!: !:! :!: !:! :!: :!: !:!
# :: ::: :::: :: :: :: ::: ::::: :: ::: :: ::::: :: :::: :: ::::: :: :: :::: :: :::: :::: ::
# : : : :: : : : : : : : : : : : : : : :: : : : : : : :: : : : :: :: :: : :
#
# © Copyright 2024
#
# https://t.me/Den4ikSuperOstryyPer4ik
# and
# https://t.me/ToXicUse
#
# 🔒 Licensed under the GNU AGPLv3
# https://www.gnu.org/licenses/agpl-3.0.html
#
# meta developer: @AstroModules
import datetime
import logging
import time
from telethon import types
from telethon.tl.functions.account import UpdateProfileRequest
from telethon.tl.functions.users import GetFullUserRequest
from .. import loader, utils
from ..inline.types import InlineCall
logger = logging.getLogger(__name__)
@loader.tds
class TxAFKMod(loader.Module):
'''Афк модуль от AstroModules с изменением био и имени'''
async def client_ready(self, client, db):
self._db = db
self._me = await client.get_me()
strings = {
"name": "TxAFK",
"lname": "| afk.",
"lname0": " ",
"bt_off_afk": "⚠️ АФК режим отключен",
"bt_on_afk": "💤 АФК режим снова активен",
"_cfg_cst_btn": "Ссылка на чат которая будет отоброжаться вместе с уведомлением. (Чтобы вообще убрать напишите None)",
"standart_bio_text": "Кастомное описание профиля",
"feedback_bot__text": "Юзер вашего фидбэк бота (если имеется)",
"button__text": "Добавить инлайн кнопку отключения АФК режима?",
"custom_text__afk_text": "Кастомный текст афк. Используй {time} для вывода последнего времени нахождения в сети",
}
def __init__(self):
self.config = loader.ModuleConfig(
loader.ConfigValue(
"feedback_bot",
"None",
doc=lambda: self.strings("feedback_bot__text"),
),
loader.ConfigValue(
"custom_text__afk",
"None",
doc=lambda: self.strings("custom_text__afk_text"),
),
loader.ConfigValue(
"standart_bio",
"None",
doc=lambda: self.strings("standart_bio_text"),
),
loader.ConfigValue(
"custom_button",
[
"🦄 AstroModules 🦄",
"https://t.me/AstroModulesChat",
],
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType(),
),
),
loader.ConfigValue(
"ignore_chats",
[],
lambda: "Чаты, в которых при упоминании TxAFК не будет срабатывать",
validator=loader.validators.Series(
validator=loader.validators.Union(
loader.validators.TelegramID(),
loader.validators.RegExp("[0-9]"),
),
),
),
loader.ConfigValue(
"button",
True,
doc=lambda: self.strings("button__text"),
validator=loader.validators.Boolean(),
)
)
async def txcfgcmd(self, message):
"""- открыть конфиг модуля"""
await self.allmodules.commands["config"](
await utils.answer(message, f"{self.get_prefix()}config TxAFK")
)
async def goafkcmd(self, message):
"""- войти в AFK режим"""
try:
user_id = (
(
(
await self._client.get_entity(
args if not args.isdigit() else int(args)
)
).id
)
if args
else reply.sender_id
)
except Exception:
user_id = self._tg_id
user = await self._client(GetFullUserRequest(user_id))
self._db.set(__name__, "afk", True)
self._db.set(__name__, "gone", time.time())
self._db.set(__name__, "ratelimit", [])
a_afk_bio_nofb = "В афк."
lastname = self.strings("lname")
if self.config['feedback_bot'] == None:
await message.client(UpdateProfileRequest(about=a_afk_bio_nofb, last_name=lastname))
else:
a_afk_bio = 'На данный момент в АФК. Связь только через '
feedback = self.config['feedback_bot']
aaa = a_afk_bio + feedback
await message.client(UpdateProfileRequest(about=aaa))
await self.allmodules.log("goafk")
await utils.answer(message, '👍 АФК режим включен!')
await message.client(UpdateProfileRequest(last_name=lastname))
async def ungoafkcmd(self, message):
"""- выйти из режима AFK"""
msg = await utils.answer(message, '⏰ Отключаю режим АФК...')
sbio = self.config['standart_bio']
lastname0 = self.strings('lname0')
self._db.set(__name__, "afk", False)
self._db.set(__name__, "gone", None)
self._db.set(__name__, "ratelimit", [])
await self.allmodules.log("unafk")
if sbio == None:
await message.client(UpdateProfileRequest(about='', last_name=lastname0))
else:
await message.client(UpdateProfileRequest(about=sbio, last_name=lastname0))
time.sleep(1)
await utils.answer(msg, '🆘 Режим AFK отключен!')
def _afk_custom_text(self) -> str:
now = datetime.datetime.now().replace(microsecond=0)
gone = datetime.datetime.fromtimestamp(
self._db.get(__name__, "gone")
).replace(microsecond=0)
time = now - gone
return (
" \n"
+ self.config["custom_text__afk"].format(
time=time,
)
)
async def watcher(self, message):
if not isinstance(message, types.Message):
return
if utils.get_chat_id(message) in self.config['ignore_chats']:
return
if message.mentioned or getattr(message.to_id, "user_id", None) == self._me.id:
afk_state = self.get_afk()
if not afk_state:
return
logger.debug("tagged!")
ratelimit = self._db.get(__name__, "ratelimit", [])
if utils.get_chat_id(message) in ratelimit:
return
else:
self._db.setdefault(__name__, {}).setdefault("ratelimit", []).append(
utils.get_chat_id(message)
)
self._db.save()
user = await utils.get_user(message)
if user.is_self or user.bot or user.verified:
logger.debug("User is self, bot or verified.")
return
if self.get_afk() is False:
return
now = datetime.datetime.now().replace(microsecond=0)
gone = datetime.datetime.fromtimestamp(
self._db.get(__name__, "gone")
).replace(microsecond=0)
time = now - gone
if self.config['custom_button'] == None:
if self.config["button"] == False:
if self.config["custom_text__afk"] == None:
await self.inline.form(message=message, text=f"🔅 Я сейчас нахожусь в АФК.\n\nПоследний раз был в сети {time} назад.")
else:
await self.inline.form(message=message, text=self._afk_custom_text())
elif self.config['button'] == True:
if self.config["custom_text__afk"] == None:
await self.inline.form(
message=message,
text=f"🔅 Я сейчас нахожусь в АФК.\n\nПоследний раз был в сети {time} назад.",
reply_markup=[
[
{
"text": "🚫 Выйти с афк 🚫",
"callback": self.button_cancel,
}
]
]
)
else:
await self.inline.form(
message=message,
text=self._afk_custom_text(),
reply_markup=[
[
{
"text": "🚫 Выйти с афк 🚫",
"callback": self.button_cancel,
}
]
]
)
else:
if self.config["button"] == False:
if self.config["custom_text__afk"] == None:
await self.inline.form(message=message, text=f"🔅 Я сейчас нахожусь в АФК.\n\nПоследний раз был в сети {time} назад.", reply_markup=[{"text": self.config['custom_button'][0], "url": self.config['custom_button'][1]}])
else:
await self.inline.form(message=message, text=self._afk_custom_text(), reply_markup=[{"text": self.config['custom_button'][0], "url": self.config['custom_button'][1]}])
elif self.config['button'] == True:
if self.config["custom_text__afk"] == None:
await self.inline.form(
message=message,
text=f"🔅 Я сейчас нахожусь в АФК.\n\nПоследний раз был в сети {time} назад.",
reply_markup=[
[
{
"text": self.config['custom_button'][0],
"url": self.config['custom_button'][1],
}
],
[
{
"text": "🚫 Выйти с афк 🚫",
"callback": self.button_cancel,
}
]
]
)
else:
await self.inline.form(
message=message,
text=self._afk_custom_text(),
reply_markup=[
[
{
"text": self.config['custom_button'][0],
"url": self.config['custom_button'][1],
}
],
[
{
"text": "🚫 Выйти с афк 🚫",
"callback": self.button_cancel,
}
]
]
)
async def button_cancel(self, call: InlineCall):
self._db.set(__name__, "afk", False)
self._db.set(__name__, "gone", None)
self._db.set(__name__, "ratelimit", [])
await self.allmodules.log("unafk")
if self.config['standart_bio'] == None:
lastname = self.strings("lname0")
about = self.strings("lname0")
await self._client(UpdateProfileRequest(about=about, last_name=lastname))
else:
aboutt = self.config['standart_bio']
lastname = self.strings("lname0")
await self._client(UpdateProfileRequest(about=aboutt, last_name=lastname))
await call.edit(
self.strings["bt_off_afk"],
reply_markup=[
{
"text": "🔰 Войти в афк 🔰",
"callback": self.button_cancel_on,
}
]
)
async def button_cancel_on(self, call: InlineCall):
self._db.set(__name__, "afk", True)
self._db.set(__name__, "gone", time.time())
self._db.set(__name__, "ratelimit", [])
a_afk_bio_nofb = "В афк."
lastname = self.strings("lname")
if self.config['feedback_bot'] == None:
await self._client(UpdateProfileRequest(about=a_afk_bio_nofb, last_name=lastname))
else:
a_afk_bio = 'На данный момент в АФК. Связь только через '
feedback = self.config['feedback_bot']
aaa = a_afk_bio + feedback
await self._client(UpdateProfileRequest(about=aaa))
await call.edit(
self.strings["bt_on_afk"],
reply_markup=[
{
"text": "🚫 Выйти с афк 🚫",
"callback": self.button_cancel,
}
]
)
def get_afk(self):
return self._db.get(__name__, "afk", False)