__version__ = (2, 1, 4)
#
# @@@@@@ @@@@@@ @@@@@@@ @@@@@@@ @@@@@@ @@@@@@@@@@ @@@@@@ @@@@@@@ @@@ @@@ @@@ @@@@@@@@ @@@@@@
# @@@@@@@@ @@@@@@@ @@@@@@@ @@@@@@@@ @@@@@@@@ @@@@@@@@@@@ @@@@@@@@ @@@@@@@@ @@@ @@@ @@@ @@@@@@@@ @@@@@@@
# @@! @@@ !@@ @@! @@! @@@ @@! @@@ @@! @@! @@! @@! @@@ @@! @@@ @@! @@@ @@! @@! !@@
# !@! @!@ !@! !@! !@! @!@ !@! @!@ !@! !@! !@! !@! @!@ !@! @!@ !@! @!@ !@! !@! !@!
# @!@!@!@! !!@@!! @!! @!@!!@! @!@ !@! @!! !!@ @!@ @!@ !@! @!@ !@! @!@ !@! @!! @!!!:! !!@@!!
# !!!@!!!! !!@!!! !!! !!@!@! !@! !!! !@! ! !@! !@! !!! !@! !!! !@! !!! !!! !!!!!: !!@!!!
# !!: !!! !:! !!: !!: :!! !!: !!! !!: !!: !!: !!! !!: !!! !!: !!! !!: !!: !:!
# :!: !:! !:! :!: :!: !:! :!: !:! :!: :!: :!: !:! :!: !:! :!: !:! :!: :!: !:!
# :: ::: :::: :: :: :: ::: ::::: :: ::: :: ::::: :: :::: :: ::::: :: :: :::: :: :::: :::: ::
# : : : :: : : : : : : : : : : : : : : :: : : : : : : :: : : : :: :: :: : :
#
# © 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 banner: https://raw.githubusercontent.com/Den4ikSuperOstryyPer4ik/Astro-modules/main/Banners/AstroAFK.jpg
# meta developer: @AstroModules
import asyncio
import datetime
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
class AstroAfkMod(loader.Module):
"""Полностью настраиваемый модуль для ухода в АФК режим! Обновление TxAFK!"""
async def client_ready(self, client, db):
self._me = await client.get_me()
strings = {
"name": "AstroAFK",
"lname": "| afk.",
"bt_off_afk": "🚫 АФК режим отключен!",
"_cfg_cst_btn": "Ссылка на чат, которая будет находиться под текстом АФК. Чтобы вовсе убрать, напишите None",
"feedback_bot__text": "Юзернейм вашего feedback бота. Если нету - не трогайте",
"button__text": "Добавить инлайн кнопку отключения АФК режима?",
"custom_text__afk_text": "Кастомный текст афк. Используй {time} для вывода последнего времени нахождения в сети и {reason} для указания причины ухода в афк",
}
def render_settings(self):
"""Settings message"""
active = self._db.get(__name__, "afk")
a_active = "Включен ✅" if active else "Выключен 🚫"
change_bio = self._db.get(__name__, "change_bio")
a_change_bio = "Да" if change_bio else "Нет"
change_name = self._db.get(__name__, "change_name")
a_change_name = "Да" if change_name else "Нет"
fb = self.config["feedback"]
text = (
f"🎆 AstroAfk\n"
f"├{a_active}\n"
f"├Смена биографии: {a_change_bio} 📖\n"
f"├Смена префикса: {a_change_name} 📝\n"
f"└Бот для связи: @{fb} 🤖"
)
return text
def __init__(self):
self.config = loader.ModuleConfig(
loader.ConfigValue(
"prefix",
"| afk.",
doc=lambda: "Префикс, который будет добавляться к вашему имени во время входа в АФК"
),
loader.ConfigValue(
"feedback",
None,
doc=lambda: self.strings("feedback_bot__text"),
),
loader.ConfigValue(
"about_text",
None,
doc=lambda: "Текст, который будет выставляться в био при входе в АФК. Используйте {bot} для указания фидбэк бота и {reason} для причины."
),
loader.ConfigValue(
"afk_text",
"None",
doc=lambda: self.strings("custom_text__afk_text"),
),
loader.ConfigValue(
"link_button",
None,
lambda: self.strings("_cfg_cst_btn"),
validator=loader.validators.Union(
loader.validators.Series(fixed_len=2),
loader.validators.NoneType()
),
),
loader.ConfigValue(
"ignore_chats",
[1554874075],
lambda: "Чаты, в которых AstroAfk не будет срабатывать (По умолчанию выставлен Support chat хикки, лучше не убирать его)",
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(),
)
)
def _afk_custom_text(self) -> str:
"""Custom text afk"""
now = datetime.datetime.now().replace(microsecond=0)
gone = datetime.datetime.fromtimestamp(
self._db.get(__name__, "gone")
).replace(microsecond=0)
time = now - gone
reason = self._db.get(__name__, "reason")
return (
" \n"
+ self.config["afk_text"].format(
time=time,
reason=reason,
)
)
def _afk_about_text(self) -> str:
"""Custom text about"""
bot = self.config["feedback"]
reason = self._db.get(__name__, "reason")
return (
""
+ self.config["about_text"].format(
bot=bot,
reason=reason
)
)
@loader.command()
async def asst(self, message):
"""- открыть настройки модуля"""
await self.inline.form(
message=message,
text="⚙️ Открыть настройки",
reply_markup=[{"text": "🔴 Открыть", "callback": self.settings}],
silent=True
)
@loader.command()
async def goafk(self, message):
""" - войти в АФК режим"""
reason = utils.get_args_raw(message)
if "-n" in reason:
reason = reason.replace("-n", "")
self._db.set(__name__, "force", True)
if not reason:
self._db.set(__name__, "reason", "")
else:
self._db.set(__name__, "reason", reason)
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", [])
change_bio = self._db.get(__name__, "change_bio")
change_name = self._db.get(__name__, "change_name")
about = user.full_user.about
self._db.set(__name__, "about", about)
if change_name:
prefix = self.config["prefix"]
await message.client(UpdateProfileRequest(last_name=prefix))
if change_bio:
cfg_bio = self.config["about_text"]
if not cfg_bio:
await message.client(UpdateProfileRequest(about="Нахожусь в афк."))
else:
bio = self._afk_about_text()
await message.client(UpdateProfileRequest(about=bio))
m = await utils.answer(message, "✅ АФК режим был успешно включен!")
await asyncio.sleep(5)
await m.delete()
@loader.command()
async def ungoafk(self, message):
"""- выйти из режима АФК"""
self._db.set(__name__, "afk", False)
self._db.set(__name__, "gone", None)
self._db.set(__name__, "ratelimit", [])
change_bio = self._db.get(__name__, "change_bio")
change_name = self._db.get(__name__, "change_name")
if self._db.get(__name__, "force"):
self._db.set(__name__, "force", False)
if change_name:
await message.client(UpdateProfileRequest(last_name=" "))
if change_bio:
try:
await message.client(UpdateProfileRequest(about=f"{self.db.get(__name__, 'about')}"))
except:
await message.client(UpdateProfileRequest(about="@AstroOfftop - лучший чат для общения."))
m = await utils.answer(message, "❌ АФК режим был успешно выключен!")
await self.allmodules.log("AstroAfk now stoped.")
await asyncio.sleep(5)
await m.delete()
@loader.watcher()
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
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:
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
reason = self._db.get(__name__, "reason")
if self._db.get(__name__, "forcenot "):
if not self.config["link_button"]:
if self.config["buttonnot "]:
if not self.config["afk_text"]:
await self.inline.form(
message=message,
text=f"😴 Сейчас я в АФК режиме\n\n❇️ Был онлайн: {time} назад.\n📝 Ушел по причине: {reason}",
reply_markup=[
{
"text": "🚫 Закрыть",
"callback": self.callback_handler_ok,
"args": (message.chat.id,)
}
],
silent=True
)
else:
await self.inline.form(
message=message,
text=self._afk_custom_text(),
reply_markup=[
{
"text": "🚫 Закрыть",
"callback": self.callback_handler_ok,
"args": (message.chat.id, )
}
],
silent=True
)
elif self.config["button"]:
if not self.config["afk_text"]:
await self.inline.form(
message=message,
text=f"😴 Сейчас я в АФК режиме\n❇️ Был онлайн: {time} назад.\n📝 Ушел по причине: {reason}",
reply_markup=[
[
{
"text": "🥱 Выйти из АФК",
"callback": self.button_cancel,
}
],
[
{
"text": "🚫 Закрыть",
"callback": self.callback_handler_ok,
"args": (message.chat.id,)
}
]
],
silent=True
)
else:
await self.inline.form(
message=message,
text=self._afk_custom_text(),
reply_markup=[
[
{
"text": "🥱 Выйти из АФК",
"callback": self.button_cancel,
}
],
[
{
"text": "🚫 Закрыть",
"callback": self.callback_handler_ok,
"args": (message.chat.id,)
}
]
],
silent=True
)
else:
if not self.config["button"]:
if not self.config["afk_text"]:
await self.inline.form(
message=message,
text=f"😴 Сейчас я в АФК режиме\n❇️ Был онлайн: {time} назад.\n📝 Ушел по причине: {reason}",
reply_markup=[
[
{
"text": self.config["link_button"][0],
"url": self.config["link_button"][1]
}
],
[
{
"text": "🚫 Закрыть",
"callback": self.callback_handler_ok,
"args": (message.chat.id, )
}
]
],
silent=True
)
else:
await self.inline.form(
message=message,
text=self._afk_custom_text(),
reply_markup=[
[
{
"text": self.config["link_button"][0],
"url": self.config["link_button"][1]
}
],
[
{
"text": "🚫 Закрыть",
"callback": self.callback_handler_ok,
"args": (message.chat.id,)
}
]
],
silent=True
)
elif self.config["button"]:
if not self.config["afk_text"]:
await self.inline.form(
message=message,
text=f"😴 Сейчас я в АФК режиме\n❇️ Был онлайн: {time} назад.\n📝 Ушел по причине: {reason}",
reply_markup=[
[
{
"text": self.config["link_button"][0],
"url": self.config["link_button"][1],
}
],
[
{
"text": "🥱 Выйти из АФК",
"callback": self.button_cancel,
}
],
[
{
"text": "🚫 Закрыть",
"callback": self.callback_handler_ok,
"args": (message.chat.id,)
}
]
],
silent=True
)
else:
await self.inline.form(
message=message,
text=self._afk_custom_text(),
reply_markup=[
[
{
"text": self.config["link_button"][0],
"url": self.config["link_button"][1],
}
],
[
{
"text": "🥱 Выйти из АФК",
"callback": self.button_cancel,
}
],
[
{
"text": "🚫 Закрыть",
"callback": self.callback_handler_ok,
"args": (message.chat.id,)
}
]
],
silent=True
)
else:
if not self.config["afk_text"]:
await utils.answer(
message,
(
"😴 Сейчас я в АФК режиме\n"
f"❇️ Был онлайн: {time}"
" назад.\n📝 Ушел по причине:"
f" {reason}"
)
)
else:
await utils.answer(message, self._afk_custom_text())
async def button_cancel(self, call: InlineCall):
"""Callback button"""
self._db.set(__name__, "afk", False)
self._db.set(__name__, "gone", None)
self._db.set(__name__, "ratelimit", [])
change_bio = self._db.get(__name__, "change_bio")
change_name = self._db.get(__name__, "change_name")
await self.allmodules.log("TxAFК now not working.")
if not change_name and not change_bio:
await call.edit(self.strings["bt_off_afk"])
return
if change_name:
await self._client(UpdateProfileRequest(last_name=" "))
if change_bio:
try:
await self._client(UpdateProfileRequest(about=self.db.get(__name__, "about")))
except:
await self._.client(UpdateProfileRequest(about="@AstroOfftop - лучший чат для общения."))
await call.edit(self.strings["bt_off_afk"])
async def settings(self, call: InlineCall):
"""Callback button"""
info = self.render_settings()
await call.edit(
text=info,
reply_markup=[
[
{
"text": "📖 Биография",
"callback": self.settings_about
},
{
"text": "📝 Префикс",
"callback": self.settings_name
}
],
[
{
"text": "🚫 Закрыть",
"action": "close"
}
]
]
)
async def settings_name(self, call: InlineCall):
"""Callback button"""
await call.edit(
text=(
"📖 Установка префикса\n\n"
+ "❔ Хотите ли Вы, чтобы при входе в АФК режим к вашему "
+ "нику добавлялся префикс | afk. ?\n\n"
+ "ℹ️ Так же Вы можете изменить префикс, "
+ "отменить или сделать действие, нажав на кнопки ниже"
),
reply_markup=[
[
{
"text": "✅ Да",
"callback": self.name_yes
},
{
"text": "🚫 Нет",
"callback": self.name_no
}
],
[
{
"text": "↩️ Назад",
"callback": self.settings
}
]
]
)
async def name_yes(self, call: InlineCall):
"""Callback button"""
self._db.set(__name__, "change_name", True)
info = self.render_settings()
await call.edit(
text=info,
reply_markup=[
[
{
"text": "📖 Биография",
"callback": self.settings_about
},
{
"text": "📝 Префикс",
"callback": self.settings_name
}
],
[
{
"text": "🚫 Закрыть",
"action": "close"
}
]
]
)
async def name_no(self, call: InlineCall):
"""Callback button"""
self._db.set(__name__, "change_name", False)
info = self.render_settings()
await call.edit(
text=info,
reply_markup=[
[
{
"text": "📖 Биография",
"callback": self.settings_about
},
{
"text": "📝 Префикс",
"callback": self.settings_name
}
],
[
{
"text": "🚫 Закрыть",
"action": "close"
}
]
]
)
async def settings_about(self, call: InlineCall):
"""Callback button"""
if not self.config["feedback"]:
text = (
"📖 Смена биографии"
+ "\n\n❔ Хотите ли Вы, чтобы при входе в АФК режим Ваша биография менялась"
+ " на \"Нахожусь в афк\"?\n\n"
+ "ℹ️ Так же Вы можете изменить биографию в конфиге. "
+ "Можно отменить или сделать действие, нажав на кнопки ниже"
)
else:
text = (
"📖 Смена биографии"
+ "\n\n❔ Хотите ли Вы, чтобы при входе в АФК режим "
+ "Ваша биография менялась на \"Нет, на месте нахожусь в афк."
+ f" Связь только через @{self.config['feedback']}\"?\n🤖 Бот для связи: @{self.config['feedback']}\n\n"
+ "ℹ️ Так же Вы можете изменить биографию в конфиге. "
+ "Можно отменить или сделать действие, нажав на кнопки ниже"
)
await call.edit(
text=text,
reply_markup=[
[
{
"text": "✅ Да",
"callback": self.bio
},
{
"text": "🚫 Нет",
"callback": self.bio_n
}
],
[
{
"text": "↩️ Назад",
"callback": self.settings
}
]
]
)
async def bio(self, call: InlineCall):
"""Callback button"""
self._db.set(__name__, "change_bio", True)
info = self.render_settings()
await call.edit(
text=info,
reply_markup=[
[
{
"text": "📖 Биография",
"callback": self.settings_about
},
{
"text": "📝 Префикс",
"callback": self.settings_name
}
],
[
{
"text": "🚫 Закрыть",
"action": "close"
}
]
]
)
async def bio_n(self, call: InlineCall):
"""Callback button"""
self._db.set(__name__, "change_bio", False)
info = self.render_settings()
await call.edit(
text=info,
reply_markup=[
[
{
"text": "📖 Биография",
"callback": self.settings_about
},
{
"text": "📝 Префикс",
"callback": self.settings_name
}
],
[
{
"text": "🚫 Закрыть",
"action": "close"
}
]
]
)
async def callback_handler_ok(self, call, chat_id: int):
"""Callback button"""
await call.delete()
limit: list = self._db.get(__name__, "ratelimit", [])
limit.remove(chat_id)
self._db.set(__name__, "ratelimit", limit)
def get_afk(self):
return self._db.get(__name__, "afk", False)