import contextlib __version__ = (0, 0, 2) # _ _ _ _ # | | | | (_) | # | | ___ | |_ ___ ___ _| | __ # | | / _ \| __/ _ \/ __| | |/ / # | |___| (_) | || (_) \__ \ | < # \_____/\___/ \__\___/|___/_|_|\_\ # # © Copyright 2022 # # developed by @lotosiiik, @byateblan # █ █ ▀ █▄▀ ▄▀█ █▀█ ▀ ▄▀█ ▀█▀ ▄▀█ █▀▄▀█ ▄▀█ # █▀█ █ █ █ █▀█ █▀▄ █ ▄ █▀█ █ █▀█ █ ▀ █ █▀█ # # 🔒 Licensed under the GNU AGPLv3 # 🌐 https://www.gnu.org/licenses/agpl-3.0.html # meta developer: @hikkaftgmods # meta banner: https://i.imgur.com/2KZ38Pv.jpeg # meta pic: https://i.imgur.com/QntqxyH.jpeg import logging import re import asyncio from .. import loader, utils from telethon.tl.types import Message logger = logging.getLogger(__name__) @loader.tds class IrisLabMod(loader.Module): """Показывает лаб/жертв. Возможны задержки на получение инф-ции""" strings = { "name": "IrisLab", "saved": "💾 Заметка с именем {} сохранена.", "no_reply": "🚫 Требуется реплай на контент заметки.", "no_name": "🚫 Укажите имя заметки.", "no_note": "🚫 Данная заметка не найдена или она не существует.", "available_notes": "💾 Текущие заметки:\n", "no_notes": "😔 У тебя пока что нет заметок", "deleted": "🙂 Заметка с именем {} удалена", "lab_data": { "d": "(.*) Досье лаборатории (.*)", "s": "(.*) Руководитель: (.*)", "с": "(.*) В составе Корпорации (.*)", "n": "(.*) Имя патогена: (.*)", "p": "(.*) Готовых патогенов: (.*) из (.*)", "q": "(.*) Квалификация учёных: (.*)", "np": "(.*) Новый патоген: (.*)", "inf": "(.*) Заразность: (.*)", "imn": "(.*) Иммунитет: (.*)", "m": "(.*) Летальность: (.*)", "ss": "(.*) Служба безопасности: (.*)", "be": "(.*) Био-опыт: (.*)", "br": "(.*) Био-ресурс: (.*)", "so": "(.*) Спецопераций: (.*)", "prev": "(.*) Предотвращены: (.*)", "i": "(.*) Заражённых: (.*)", "dis": "(.*) Своих болезней: (.*)", "f": " Руководитель в состоянии горячки", }, } async def client_ready(self, client, db): db.set("Iris", "chat_biowar", "@iris_black_bot") self.client = client self.db = db self._notes = self.get("victims_list", {}) async def message_q( self, text: str, user_id: int, mark_read: bool = False, delete: bool = False, ): """Отправляет сообщение и возращает ответ""" async with self.client.conversation(user_id) as conv: msg = await conv.send_message(text) response = await conv.get_response() if mark_read: await conv.mark_read() if delete: await msg.delete() await response.delete() return response async def labcmd(self, message): """Модуль который выдаст вам статистику вашей лаборатории (лаб)""" bot = "@iris_black_bot" lab = await self.message_q(".Лаб", bot, mark_read=True, delete=True) args_raw = utils.get_args_raw(message) if not args_raw: return await utils.answer(message, lab.text) data, text = self.strings("lab_data"), [] flags = "".join(args_raw.split(" ")).split("-") if "" in flags: flags.remove("") for flag in flags: search = re.search(data[flag], lab.text) if flag in data else None if search: if flag == "be": num = search.group().split(":")[-1].replace(" ", "") if num[-1] == "k": num = ( int(num[:-1].replace(",", "")) * 100 / 100 * 10 if "," in num else int(num[:-1]) * 1000 / 100 * 10 ) elif num[:-1] != "k": num = int(num) / 100 * 10 text.append(f"{search.group()} | {num}") elif flag == "d": text.append(search.group()[:-1]) else: text.append(search.group()) elif flag == "parametrs": text = """ d: Имя лаборатории s: Руководитель с: Корпорация n: Имя патогена p: Готовых патогенов q: Квалификация учёных 👨‍🔬 np: Новый патоген через... ⏱ inf: Заразность imn: Иммунитет 🛡️ m: Летальность ☠️ ss: Служба безопасности be: Био-опыт ☣️ br: Био-ресурс 🧬 so: Спецопераций 😷 prev: Предотвращены 🥽 i: заражённых 🤒 dis: Своих болезней 🤒 f: Горячка руководителя v: Ежедневная премия(ежа) 💸""" return await utils.answer(message, text) elif flag == "v": await asyncio.sleep(3) bot = "@iris_black_bot" victims = await self.message_q( "Мои жертвы", bot , mark_read=True, delete=True ) result = re.search( r"""(.*) Ежедневная премия: (.*)""", victims.text ).group() text.append(result) elif flag in data: app_text = ( "✅ Все патогены приготовлены" if flag == "np" else "❌ Горячки нету" ) text.append(app_text) else: text.append(f"Параметр -{flag} не указан.") return await utils.answer(message, "\n".join(text)) async def victimscmd(self, message): """Комманда показывает ваши жертвы""" bot = "@iris_black_bot" victims = await self.message_q( "Мои жертвы", bot, mark_read=True, delete=True, ) args_raw = utils.get_args_raw(message) if not args_raw: await utils.answer(message, victims.text) async def upgcmd(self, message): """Увеличивает зз/имун и тд.Как использовать(Пример) .upg летальность (число 1-5)""" args = utils.get_args(message) bot = "@iris_black_bot" characteristics = ( "заразность", "летальность", "иммунитет", "безопасность", "разработка", "патоген", ) if len(args) != 2: await utils.answer(message, "Указано больше или меньше двух параметров") elif args[0].lower() not in characteristics: await utils.answer(message, "Данного улучшения не существует") elif not args[1].isdigit(): await utils.answer(message, "Второй параметр не является числом") elif int(args[1]) > 5 or int(args[1]) < 0: await utils.answer(message, "Уровень указан вне допустимого диапазона") else: upgrade = await self.message_q( f"++{args[0].lower()} {args[1]}", bot, mark_read=True, delete=True, ) args_raw = utils.get_args_raw(message) await utils.answer(message, upgrade.text) async def gcmd(self, message: Message): """ - показывает заметку""" args = utils.get_args_raw(message) if not args: await utils.answer(message, self.strings("no_name")) return asset = self._get_note(args) if not asset: await utils.answer(message, self.strings("no_note")) return await self._client.send_message( message.peer_id, await self._db.fetch_asset(asset["id"]), reply_to=getattr(message, "reply_to_msg_id", False), ) if message.out: await message.delete() async def svcmd(self, message): """ - для сохранения заметки""" args = utils.get_args_raw(message) folder = "victims_list" reply = await message.get_reply_message() if not (reply and args): await utils.answer(message, self.strings("no_reply")) return if folder not in self._notes: self._notes[folder] = {} logger.warning(f"Created new folder {folder}") asset = await self._db.store_asset(reply) type_ = "☣️" self._notes[folder][args] = {"id": asset, "type": type_} self.set("victims_list", self._notes) await utils.answer(message, self.strings("saved").format(args, folder)) def _get_note(self, name: str): for notes in self._notes.values(): for note, asset in notes.items(): if note == name: return asset def _del_note(self, name: str): for category, notes in self._notes.copy().items(): for note in notes.copy(): if note == name: del self._notes[category][note] if not self._notes[category]: del self._notes[category] self.set("victims_list", self._notes) return True return False async def dcmd(self, message: Message): """ - удаляет заметку""" args = utils.get_args_raw(message) if not args: await utils.answer(message, self.strings("no_name")) return asset = self._get_note(args) if not asset: await utils.answer(message, self.strings("no_note")) return with contextlib.suppress(Exception): await (await self._db.fetch_asset(asset["id"])).delete() self._del_note(args) await utils.answer(message, self.strings("deleted").format(args)) async def listcmd(self, message: Message): """[folder] - показывает все заметки""" args = utils.get_args_raw(message) if not self._notes: await utils.answer(message, self.strings("no_notes")) return result = self.strings("available_notes") if not args or args not in self._notes: for category, notes in self._notes.items(): result += f"\n🔸 {category}\n" for note, asset in notes.items(): result += f" {asset['type']} {note}\n" await utils.answer(message, result) return for note, asset in self._notes[args].items(): result += f"{asset['type']} {note}\n" await utils.answer(message, result) async def iccmd(self, message: Message): """Комманда котрая вычисляет сколько 🧬Био-ресурсов или же ic☣️ нужно\nПример: .ic <характеристика> <уровень С> <уровень До>""" args = utils.get_args(message) if not args or len(args) != 3 or not args[1].isdigit() or not args[2].isdigit() or int(args[2]) == int(args[1]) or int(args[2]) < int(args[1]): await utils.answer( message, "🚫| Чтобы использовать калькулятор напишите .ic <навык> <уровень С> <уровень До>" ) return skill, from_lvl, to_lvl = args from_lvl, to_lvl = int(from_lvl), int(to_lvl) amount = ( await self._client.inline_query( "@hikkaftgbot", f"{skill}#{from_lvl}#{to_lvl}" ) )[0].title if not amount.isdigit(): await utils.answer(message, amount) return amount = f"{int(amount):,}".replace(",", " ") await utils.answer( message, f"🍀| Чтобы увеличить навык «{skill}» с {from_lvl} до {to_lvl} уровня" f" потребуется: {amount} био-ресурсов🧬 или же ic☣️", ) async def listcmd(self, message): """Помощь по ирис лабу.""" hi = '🍀| Флаги которые помогут узнать отдельную часть лаборатории:\n\n"d": "Досье лаборатории ",\n"s": "Руководитель: ",\n"с": "В составе Корпорации ",\n"n": "Имя патогена: ",\n"p": "Готовых патогенов: ",\n"q": "Квалификация учёных: ",\n"np": "Новый патоген: ",\n"inf": "Заразность: ",\n"imn": "Иммунитет: ",\n"m": "Летальность: ",\n"ss": "Служба безопасности: ",\n"be": "Био-опыт: ",\n"br": "Био-ресурс: ",\n"so": " Спецопераций: ",\n"prev": " Предотвращены: ",\n"i": " Заражённых: ",\n"dis": "Своих болезней: ",\n"f": "Руководитель в состоянии горячки"\n\n Пример использования флагов: .lab v or .lab np' await utils.answer(message, f"{hi}")