__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)