DavidShel/MonarchFiles
0
1import asyncio2import logging3from aiogram import Bot, Dispatcher, types, F4from aiogram.filters import Command5from aiogram.utils.keyboard import InlineKeyboardBuilder6from aiogram.client.session.aiohttp import AiohttpSession7 8BOT_TOKEN = "8708277591:AAG_o5yrRnvzGM6OllsPobgpXnPeMLXOBhU"9CHANNEL_ID = -100240042746610PRIVATE_STORAGE_ID = -100372058240111CHANNEL_URL = "https://t.me/+Nw7GlD5f_y85ZTJi"12 13session = AiohttpSession()14bot = Bot(token=BOT_TOKEN, session=session)15dp = Dispatcher()16logging.basicConfig(level=logging.INFO)17 18VIDEO_DB = {19 "s5_0": {"🇷🇺 Русский дубляж": 3},20 "s5_1": {"🇷🇺 Русский дубляж": 5},21 "s5_2": {"🇷🇺 Русский дубляж": 6},22 "s5_3": {"🇷🇺 Русский дубляж": 7},23 "s5_4": {"🇷🇺 Русский дубляж": 8},24 "s5_5": {"🇷🇺 Русский дубляж": 9},25 "s5_6": {"🇷🇺 Русский дубляж": 10},26 "s5_7": {"🇷🇺 Русский дубляж": 11},27 "s5_8": {"🇷🇺 Русский дубляж": 12},28 "s5_9": {"🇷🇺 Русский дубляж": 13},29 "s5_10": {"🇷🇺 Русский дубляж": 14},30 "s5_11": {"🇷🇺 Русский дубляж": 15},31 "s5_12": {"🇷🇺 Русский дубляж": 18},32 "s5_13": {"🇷🇺 Русский дубляж": 17},33 "s5_14": {"🇷🇺 Русский дубляж": 16},34 "s5_15": {"🇷🇺 Русский дубляж": 19},35 "s5_16": {"🇷🇺 Русский дубляж": 20},36 "s5_17": {"🇷🇺 Русский дубляж": 21},37 "s5_18": {"🇷🇺 Русский дубляж": 22},38 "s5_19": {"🇷🇺 Русский дубляж": 23},39 "s5_20": {"🇷🇺 Русский дубляж": 24},40 "s5_21": {"🇷🇺 Русский дубляж": 25},41 "s5_22": {"🇷🇺 Русский дубляж": 26},42 "s5_23": {"🇷🇺 Русский дубляж": 27},43 "s5_24": {"🇷🇺 Русский дубляж": 28},44 "s5_25": {"🇷🇺 Русский дубляж": 29},45 "s5_26": {"🇷🇺 Русский дубляж": 30},46 "spec_0": {"🇷🇺 Русский дубляж": 32},47 "spec_1": {"🇷🇺 Русский дубляж": 31},48 "spec_2": {"🇷🇺 Русский дубляж": 33},49 50 "s6_0": {"🇷🇺 Русский дубляж": 34},51 "s6_1": {"🇷🇺 Русский дубляж": 35},52 "s6_2": {"🇷🇺 Русский дубляж": 36},53 "s6_3": {"🇷🇺 Русский дубляж": 37},54 "s6_4": {"🇷🇺 Русский дубляж": 38},55 "s6_5": {"🇷🇺 Русский дубляж": 44},56 "s6_6": {"🇷🇺 Русский дубляж": 45}, 57 "s6_7": {"🇷🇺 Озвучка Юпикс": 39},58 "s6_8": {"🇷🇺 Русский дубляж": 46},59 "s6_9": {"🇷🇺 Русский дубляж": 47},60 "s6_10": {"🇷🇺 Русский дубляж": 40},61 "s6_11": {"🇷🇺 Русский дубляж": 48},62 "s6_12": {"🇷🇺 Русский дубляж": 49},63 "s6_13": {"🇷🇺 Озвучка Юпикс": 41},64 "s6_14": {"🇷🇺 Русский дубляж": 50},65 "s6_15": {"🇷🇺 Русский дубляж": 51},66 "s6_16": {"🇷🇺 Озвучка Юпикс": 52},67 "s6_18": {"🇷🇺 Озвучка Юпикс": 53},68 "s6_19": {"🇷🇺 Озвучка Юпикс": 42},69 "s6_20": {"🇫🇷 Французский дубляж": 55},70 "s6_21": {"🇷🇺 Озвучка Юпикс": 43},71 "s6_22": {"🇷🇺 Озвучка Юпикс": 54},72}73 74S5_EPS = [75 "Эволюция", "Умножение", "Разрушение", "Ликование", "Иллюзия", "Решительность",76 "Страсть", "Воссоединение", "Восторг", "Передача (Выбор Квами - Часть 1)", "Сгорание (Выбор Квами - Часть 2)",77 "Совершенство", "Перемещение", "Насмешка", "Интуиция", "Защита", "Обожание",78 "Эмоция", "Притворство", "Откровение", "Противостояние", "Сговор", "Революция",79 "Воплощение", "Устройство (Последний День - Часть 1)", "Воссоздание (Последний День - Часть 2)", "Действие"80]81 82S6_EPS = [83 "Королева Климата", "Художник-Злюка", "Сублимация", "Папа-Коп", "Деды-Оборотни",84 "Спящая Сирена", "Каменный Бык", "Вампигами", "Месье Агрест", "Тёмный Замок",85 "Разоблачитель", "Исцелитель", "Якши Годзен", "Памперсайзер", "Выпрямительница",86 "Ноэ", "Фея сладких снов", "Пачкуны", "РеДжинерация", "Сердце-Целительница",87 "Скованные титаны", "Леди Хаос", "Грустнанси", "Королева Страхвиля",88 "Секретный протокол", "Немезида"89]90 91SPECIALS = ["Леди Баг и Супер Кот: Париж, истории о Токси Баг и Когте Нуаре", "Леди Баг и Супер Кот: Лондон, на краю времени", "Леди Баг и Супер Кот: Токио, Звёздный Отряд"]92 93async def check_sub(user_id: int):94 try:95 member = await bot.get_chat_member(chat_id=CHANNEL_ID, user_id=user_id)96 return member.status in ["member", "administrator", "creator"]97 except:98 return False99 100def main_menu_kb():101 builder = InlineKeyboardBuilder()102 builder.row(types.InlineKeyboardButton(text="🎬 5 сезон:", callback_data="list_s5"))103 builder.row(types.InlineKeyboardButton(text="🎬 6 сезон:", callback_data="list_s6"))104 builder.row(types.InlineKeyboardButton(text="✨ Спешелы:", callback_data="list_spec"))105 return builder.as_markup()106 107@dp.message(Command("start"))108async def start_cmd(message: types.Message):109 if await check_sub(message.from_user.id):110 await message.answer("🍿 Архив Монарха приветствует тебя!\nВыбери раздел:", reply_markup=main_menu_kb(), parse_mode="Markdown")111 else:112 builder = InlineKeyboardBuilder()113 builder.row(types.InlineKeyboardButton(text="📢 Подписаться", url=CHANNEL_URL))114 builder.row(types.InlineKeyboardButton(text="🔄 Проверить подписку", callback_data="recheck"))115 await message.answer("❌ Доступ закрыт!\nПодпишись на канал.", reply_markup=builder.as_markup())116@dp.callback_query(F.data.startswith("list_"))117async def show_list(callback: types.CallbackQuery):118 if not await check_sub(callback.from_user.id):119 await callback.answer("⚠️ Сначала подпишись!", show_alert=True)120 return121 122 mode = callback.data.split("_")[1]123 builder = InlineKeyboardBuilder()124 125 if mode == "s5": items, prefix, title = S5_EPS, "s5", "5 Сезон"126 elif mode == "s6": items, prefix, title = S6_EPS, "s6", "6 Сезон"127 else: items, prefix, title = SPECIALS, "spec", "Спешелы"128 129 for i, name in enumerate(items):130 builder.add(types.InlineKeyboardButton(text=f"{i+1}. {name}", callback_data=f"opt_{prefix}_{i}"))131 132 builder.adjust(1)133 builder.row(types.InlineKeyboardButton(text="⬅️ Назад", callback_data="to_main"))134 await callback.message.edit_text(f"📂 {title}:", reply_markup=builder.as_markup(), parse_mode="Markdown")135 136@dp.callback_query(F.data.startswith("opt_"))137async def select_option(callback: types.CallbackQuery):138 episode_key = callback.data.replace("opt_", "")139 options = VIDEO_DB.get(episode_key, {})140 141 if not options:142 await callback.answer("⏳ Этот эпизод ещё не вышел, подпишитесь на новостной канал «Monarch Files 🍿», чтобы не пропустить!", show_alert=True)143 return144 145 builder = InlineKeyboardBuilder()146 for label, msg_id in options.items():147 builder.add(types.InlineKeyboardButton(text=label, callback_data=f"get_{msg_id}"))148 149 season_prefix = episode_key.split("_")[0]150 builder.adjust(1)151 builder.row(types.InlineKeyboardButton(text="⬅️ Назад к списку", callback_data=f"list_{season_prefix}"))152 await callback.message.edit_text("🌍 Выбери вариант озвучки:", reply_markup=builder.as_markup(), parse_mode="Markdown")153 154@dp.callback_query(F.data.startswith("get_"))155async def send_custom_video(callback: types.CallbackQuery):156 msg_id = int(callback.data.replace("get_", ""))157 try:158 await bot.copy_message(159 chat_id=callback.message.chat.id,160 from_chat_id=PRIVATE_STORAGE_ID,161 message_id=msg_id162 )163 await callback.answer()164 except Exception as e:165 logging.error(f"Ошибка копирования: {e}")166 await callback.answer("❌ Ошибка: серия не найдена в хранилище.", show_alert=True)167 168@dp.callback_query(F.data == "to_main")169async def to_main(callback: types.CallbackQuery):170 await callback.message.edit_text("🍿 Файлы Монарха:", reply_markup=main_menu_kb(), parse_mode="Markdown")171 172@dp.callback_query(F.data == "recheck")173async def recheck(callback: types.CallbackQuery):174 if await check_sub(callback.from_user.id):175 await callback.message.delete()176 await start_cmd(callback.message)177 else:178 await callback.answer("❌ Подписка не найдена!", show_alert=True)179 180async def run():181 await dp.start_polling(bot)182 183if __name__ == "__main__":184 asyncio.run(run())