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}")