63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
from aiogram import F, Router
|
||
from aiogram.fsm.context import FSMContext
|
||
from aiogram.types import CallbackQuery, Message
|
||
|
||
from bot.factories import AddChannelStates, MenuAction, MenuCallback
|
||
from bot.filters import ChannelOwnerFilter
|
||
from bot.handlers.menu.helpers import edit_menu
|
||
from bot.keyboards import channel_settings_kb
|
||
from utils.db.models import Channel, User
|
||
|
||
router = Router()
|
||
|
||
|
||
@router.callback_query(MenuCallback.filter(F.action == MenuAction.PAGE))
|
||
async def show_menu_page(callback: CallbackQuery, callback_data: MenuCallback):
|
||
if callback.from_user is None or not isinstance(callback.message, Message):
|
||
return
|
||
|
||
await edit_menu(callback.message, callback.from_user.id, callback_data.page)
|
||
await callback.answer()
|
||
|
||
|
||
@router.callback_query(MenuCallback.filter(F.action == MenuAction.SELECT))
|
||
async def toggle_active_channel(callback: CallbackQuery, callback_data: MenuCallback):
|
||
if callback.from_user is None or not isinstance(callback.message, Message):
|
||
return
|
||
|
||
user = await User.get_or_create(callback.from_user.id)
|
||
if user.active_channel_id == callback_data.channel_id:
|
||
user.active_channel_id = None
|
||
else:
|
||
user.active_channel_id = callback_data.channel_id
|
||
await user.save()
|
||
|
||
await edit_menu(callback.message, callback.from_user.id, callback_data.page)
|
||
await callback.answer()
|
||
|
||
|
||
@router.callback_query(
|
||
MenuCallback.filter(F.action == MenuAction.SETTINGS), ChannelOwnerFilter()
|
||
)
|
||
async def open_channel_settings(callback: CallbackQuery, channel: Channel):
|
||
if not isinstance(callback.message, Message):
|
||
return
|
||
|
||
await callback.message.edit_text(
|
||
f"⚙️ <b>{channel.title}</b>", reply_markup=channel_settings_kb(channel)
|
||
)
|
||
await callback.answer()
|
||
|
||
|
||
@router.callback_query(MenuCallback.filter(F.action == MenuAction.ADD))
|
||
async def request_channel_reference(callback: CallbackQuery, state: FSMContext):
|
||
if not isinstance(callback.message, Message):
|
||
return
|
||
|
||
await state.set_state(AddChannelStates.waiting_channel)
|
||
await callback.message.edit_text(
|
||
"Отправьте @username или числовой ID канала.\n"
|
||
"Бот должен быть добавлен как админ с правом отправки сообщений."
|
||
)
|
||
await callback.answer()
|