mirror of
https://github.com/MuRuLOSE/limoka.git
synced 2026-06-16 14:34:17 +02:00
344 lines
17 KiB
Python
344 lines
17 KiB
Python
__version__ = (1, 1, 0)
|
||
|
||
"""
|
||
█▀▄▀█ █▀█ █▀█ █ █▀ █ █ █▀▄▀█ █▀▄▀█ █▀▀ █▀█
|
||
█ ▀ █ █▄█ █▀▄ █ ▄█ █▄█ █ ▀ █ █ ▀ █ ██▄ █▀▄
|
||
Copyright 2022 t.me/morisummermods
|
||
Licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
|
||
"""
|
||
# scope: inline_content
|
||
# meta developer: @morisummermods
|
||
# meta banner: https://i.imgur.com/V0Qhyi0.jpg
|
||
# meta pic: https://i.imgur.com/AwKGCQe.png
|
||
|
||
import logging
|
||
from asyncio import sleep
|
||
|
||
from aiogram.types import InlineQueryResultArticle, InputTextMessageContent
|
||
from telethon.tl.functions.channels import JoinChannelRequest
|
||
from telethon.tl.types import Message
|
||
from telethon.utils import get_display_name
|
||
|
||
from .. import loader, utils
|
||
from ..inline import GeekInlineQuery, rand
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
ua = [
|
||
"all",
|
||
"Кіровоградська_область",
|
||
"Попаснянська_територіальна_громада",
|
||
"Бердянський_район",
|
||
"Полтавська_область",
|
||
"м_Краматорськ_та_Краматорська_територіальна_громада",
|
||
"м_Старокостянтинів_та_Старокостянтинівська_територіальна_громада",
|
||
"Ізюмський_район",
|
||
"Покровська_територіальна_громада",
|
||
"Волноваський_район",
|
||
"Краматорський_район",
|
||
"Київська_область",
|
||
"м_Київ",
|
||
"Херсонська_область",
|
||
"Ніжинський_район",
|
||
"Бахмутська_територіальна_громада",
|
||
"м_Кремінна_та_Кремінська_територіальна_громада",
|
||
"Рівненська_область",
|
||
"Запорізька_область",
|
||
"м_Маріуполь_та_Маріупольська_територіальна_громада",
|
||
"м_Рівне_та_Рівненська_територіальна_громада",
|
||
"м_Черкаси_та_Черкаська_територіальна_громада",
|
||
"Марїнська_територіальна_громада",
|
||
"Сквирська_територіальна_громада",
|
||
"Охтирський_район",
|
||
"м_Конотоп_та_Конотопська_територіальна_громада",
|
||
"Вознесенський_район",
|
||
"Сарненський_район",
|
||
"Миколаївський_район",
|
||
"Смілянська_територіальна_громада",
|
||
"Сєвєродонецький_район",
|
||
"Гірська_територіальна_громада",
|
||
"Костянтинівська_територіальна_громада",
|
||
"Прилуцький_район",
|
||
"м_Пирятин_та_Пирятинська_територіальна_громада",
|
||
"Вишгородська_територіальна_громада",
|
||
"Воскресенська_територіальна_громада",
|
||
"м_Переяслав_та_Переяславська_територіальна_громада",
|
||
"м_Полтава_та_Полтавська_територіальна_громада",
|
||
"м_Вознесенськ_та_Вознесенська_територіальна_громада",
|
||
"Дружківська_територіальна_громада",
|
||
"Золотоніський_район",
|
||
"Макарівська_територіальна_громада",
|
||
"Дубровицька_територіальна_громада",
|
||
"Хмельницька_область",
|
||
"Великоновосілківська_територіальна_громада",
|
||
"м_Шостка_та_Шосткинська_територіальна_громада",
|
||
"Львівська_область",
|
||
"Волинська_область",
|
||
"Первомайський_район",
|
||
"м_Запоріжжя_та_Запорізька_територіальна_громада",
|
||
"м_Бровари_та_Броварська_територіальна_громада",
|
||
"Лиманська_територіальна_громада",
|
||
"м_Лисичанськ_та_Лисичанська_територіальна_громада",
|
||
"м_Бориспіль_та_Бориспільська_територіальна_громада",
|
||
"м_Обухів_та_Обухівська_територіальна_громада",
|
||
"Звенигородський_район",
|
||
"Роздільнянський_район",
|
||
"м_Нікополь_та_Нікопольська_територіальна_громада",
|
||
"м_Першотравенськ_та_Першотравенська_територіальна_громада",
|
||
"м_Васильків_та_Васильківська_територіальна_громада",
|
||
"Кропивницький_район",
|
||
"Шепетівський_район",
|
||
"Житомирська_область",
|
||
"Вараський_район",
|
||
"Болградський_район",
|
||
"Закарпатська_область",
|
||
"Шосткинський_район",
|
||
"Гребінківська_територіальна_громада",
|
||
"Чернівецька_область",
|
||
"Синельниківський_район",
|
||
"Уманська_територіальна_громада",
|
||
"Олешківська_територіальна_громада",
|
||
"м_Кременчук_та_Кременчуцька_територіальна_громада",
|
||
"Коростенський_район",
|
||
"Купянський_район",
|
||
"Подільський_район",
|
||
"м_Мелітополь_та_Мелітопольська_територіальна_громада",
|
||
"Ізмаїльський_район",
|
||
"Вінницька_область",
|
||
"м_Славутич_та_Славутицька_територіальна_громада",
|
||
"Бородянська_територіальна_громада",
|
||
"Святогірська_територіальна_громада",
|
||
"Добропільська_територіальна_громада",
|
||
"Черкаський_район",
|
||
"Пологівський_район",
|
||
"м_Сарни_та_Сарненська_територіальна_громада",
|
||
"Маріупольський_район",
|
||
"Лозівський_район",
|
||
"Березівський_район",
|
||
"Українська_територіальна_громада",
|
||
"м_Охтирка_та_Охтирська_територіальна_громада",
|
||
"Жашківська_територіальна_громада",
|
||
"Житомирський_район",
|
||
"Донецький_район",
|
||
"м_Кривий_Ріг_та_Криворізька_територіальна_громада",
|
||
"Радомишльська_територіальна_громада",
|
||
"м_Дніпро_та_Дніпровська_територіальна_громада",
|
||
"м_Миколаїв_та_Миколаївська_територіальна_громада",
|
||
"Гостомелська_територіальна_громада",
|
||
"м_Миргород_та_Миргородська_територіальна_громада",
|
||
"Сумська_область",
|
||
"Торецька_територіальна_громада",
|
||
"м_Ватутіне_та_Ватутінська_територіальна_громада",
|
||
"м_Коростень_та_Коростенська_територіальна_громада",
|
||
"Харківський_район",
|
||
"Уманський_район",
|
||
"Сумський_район",
|
||
"Одеський_район",
|
||
"БілгородДністровський_район",
|
||
"Тернопільська_область",
|
||
"Первомайська_територіальна_громада",
|
||
"м_Первомайськ_та_Первомайська_територіальна_громада",
|
||
"Чугуївський_район",
|
||
"м_Фастів_та_Фастівська_територіальна_громада",
|
||
"Миронівська_територіальна_громада",
|
||
"м_Лубни_та_Лубенська_територіальна_громада",
|
||
"Черкаська_область",
|
||
"Луганська_область",
|
||
"м_Житомир_та_Житомирська_територіальна_громада",
|
||
"Новоукраїнський_район",
|
||
"м_Словянськ_та_Словянська_територіальна_громада",
|
||
"Чернігівський_район",
|
||
"м_Очаків_та_Очаківська_територіальна_громада",
|
||
"Вугледарська_територіальна_громада",
|
||
"м_Сєвєродонецьк_та_Сєвєродонецька_територіальна_громада",
|
||
"Дніпропетровська_область",
|
||
"Запорізький_район",
|
||
"Широківська_територіальна_громада",
|
||
"Узинська_територіальна_громада",
|
||
"Миколаївська_область",
|
||
"Харківська_область",
|
||
"НовоградВолинський_район",
|
||
"Курахівська_територіальна_громада",
|
||
"м_Рубіжне_та_Рубіжанська_територіальна_громада",
|
||
"Донецька_область",
|
||
"м_Суми_та_Сумська_територіальна_громада",
|
||
"м_Біла_Церква_та_Білоцерківська_територіальна_громада",
|
||
"Голованівський_район",
|
||
"Одеська_область",
|
||
"Павлоградський_район",
|
||
"Чернігівська_область",
|
||
"Сватівський_район",
|
||
"ІваноФранківська_область",
|
||
"Покровський_район",
|
||
"Бахмутський_район",
|
||
]
|
||
|
||
|
||
class AirAlertMod(loader.Module):
|
||
"""🇺🇦 Предупреждение о воздушной тревоге.
|
||
Нужно быть подписаным на @air_alert_ua и включены уведомления в вашем боте"""
|
||
|
||
strings = {"name": "AirAlert"}
|
||
|
||
async def client_ready(self, client, db) -> None:
|
||
self.regions = db.get(self.strings["name"], "regions", [])
|
||
self.nametag = db.get(self.strings["name"], "nametag", "")
|
||
self.forwards = db.get(self.strings["name"], "forwards", [])
|
||
|
||
if hasattr(self, "hikka"):
|
||
self.me = self._client.tg_id
|
||
self.bot_id = self.inline.bot_id
|
||
await self.request_join(
|
||
"@air_alert_ua", "Required by AirAlert", assure_joined=True
|
||
)
|
||
return
|
||
|
||
self.db = db
|
||
self.client = client
|
||
self.bot_id = (await self.inline.bot.get_me()).id
|
||
self.me = (await client.get_me()).id
|
||
try:
|
||
await client(
|
||
JoinChannelRequest(await self.client.get_entity("t.me/air_alert_ua"))
|
||
)
|
||
except Exception:
|
||
logger.error("Can't join t.me/air_alert_ua")
|
||
try:
|
||
channel = await self.client.get_entity("t.me/morisummermods")
|
||
await client(JoinChannelRequest(channel))
|
||
except Exception:
|
||
logger.error("Can't join morisummermods")
|
||
try:
|
||
post = (await client.get_messages("@morisummermods", ids=[15]))[0]
|
||
await post.react("❤️")
|
||
except Exception:
|
||
logger.error("Can't react to t.me/morisummermods")
|
||
|
||
async def alertforwardcmd(self, message: Message) -> None:
|
||
"""Перенаправление предупреждений в другие чаты.
|
||
Для добавления/удаления введите команду с ссылкой на чат.
|
||
Для просмотра чатов введите команду без аргументов
|
||
Для установки кастомной таблички введите .alertforward set <text>"""
|
||
text = utils.get_args_raw(message)
|
||
if text[:3] == "set":
|
||
self.nametag = text[4:]
|
||
self.db.set(self.strings["name"], "nametag", self.nametag)
|
||
return await utils.answer(
|
||
message,
|
||
f"🏷 <b>Табличка успешно установлена: <code>{self.nametag}</code></b>",
|
||
)
|
||
if not text:
|
||
chats = "<b>Текущие чаты для перенаправления: </b>\n"
|
||
for chat in self.forwards:
|
||
chats += f"{get_display_name(await self.client.get_entity(chat))}\n"
|
||
await utils.answer(message, chats)
|
||
return
|
||
try:
|
||
chat = (await self.client.get_entity(text.replace("https://", ""))).id
|
||
except Exception:
|
||
await utils.answer(message, "<b>Чат не найден</b>")
|
||
return
|
||
if chat in self.forwards:
|
||
self.forwards.remove(chat)
|
||
self.db.set(self.strings["name"], "forwards", self.forwards)
|
||
await utils.answer(message, "<b>Чат успешно удален для перенаправления</b>")
|
||
else:
|
||
self.forwards.append(chat)
|
||
self.db.set(self.strings["name"], "forwards", self.forwards)
|
||
await utils.answer(
|
||
message, "<b>Чат успешно установлен для перенаправления</b>"
|
||
)
|
||
|
||
async def alert_inline_handler(self, query: GeekInlineQuery) -> None:
|
||
"""Выбор регионов.
|
||
Чтобы получать все предупреждения введите alert all.
|
||
Чтобы посмотреть ваши регионы alert my"""
|
||
text = query.args
|
||
if not text:
|
||
result = ua
|
||
elif text == "my":
|
||
result = self.regions
|
||
else:
|
||
result = [region for region in ua if text.lower() in region.lower()]
|
||
if not result:
|
||
await query.e404()
|
||
return
|
||
res = [
|
||
InlineQueryResultArticle(
|
||
id=rand(20),
|
||
title=(
|
||
f"{'✅' if reg in self.regions else '❌'}{reg if reg != 'all' else 'Все уведомления'}"
|
||
),
|
||
description=(
|
||
f"Нажмите чтобы {'удалить' if reg in self.regions else 'добавить'}"
|
||
if reg != "all"
|
||
else (
|
||
"🇺🇦 Нажмите чтобы"
|
||
f" {'выключить' if 'all' in self.regions else 'включить'} все"
|
||
" уведомления"
|
||
)
|
||
),
|
||
input_message_content=InputTextMessageContent(
|
||
f"⌛ Редактирование региона <code>{reg}</code>",
|
||
parse_mode="HTML",
|
||
),
|
||
)
|
||
for reg in result[:50]
|
||
]
|
||
await query.answer(res, cache_time=0)
|
||
|
||
async def watcher(self, message: Message) -> None:
|
||
if (
|
||
getattr(message, "out", False)
|
||
and getattr(message, "via_bot_id", False)
|
||
and message.via_bot_id == self.bot_id
|
||
and "⌛ Редактирование региона" in getattr(message, "raw_text", "")
|
||
):
|
||
self.regions = self.db.get(self.strings["name"], "regions", [])
|
||
region = message.raw_text[25:]
|
||
state = "добавлен"
|
||
if region not in self.regions:
|
||
self.regions.append(region)
|
||
else:
|
||
self.regions.remove(region)
|
||
state = "удален"
|
||
self.db.set(self.strings["name"], "regions", self.regions)
|
||
try:
|
||
e = await self.client.get_entity("t.me/air_alert_ua")
|
||
sub = not e.left
|
||
except Exception:
|
||
sub = False
|
||
n = "\n"
|
||
res = f"<b>Регион <code>{region}</code> успешно {state}</b>{n}"
|
||
if not sub:
|
||
res += (
|
||
"<b>НЕ ВЫХОДИ С @air_alert_ua (иначе ничего работать не будет)</b>"
|
||
)
|
||
if not hasattr(self, "hikka"):
|
||
await self.client(
|
||
JoinChannelRequest(
|
||
await self.client.get_entity("t.me/air_alert_ua")
|
||
)
|
||
)
|
||
await self.inline.form(res, message=message)
|
||
if (
|
||
getattr(message, "peer_id", False)
|
||
and getattr(message.peer_id, "channel_id", 0) == 1766138888
|
||
and (
|
||
"all" in self.regions
|
||
or any(reg in message.raw_text for reg in self.regions)
|
||
)
|
||
):
|
||
for _ in range(3):
|
||
await self.inline.bot.send_message(
|
||
self.me,
|
||
message.text,
|
||
parse_mode="HTML",
|
||
)
|
||
await sleep(1)
|
||
for chat in self.forwards:
|
||
await self.client.send_message(
|
||
chat,
|
||
message.text + "\n\n" + self.nametag,
|
||
)
|