Files
limoka/MoriSummerz/ftg-mods/airalert.py
2025-07-10 21:02:34 +03:00

344 lines
17 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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