require_channels.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from aiogram import Router, F, exceptions
  2. from aiogram import types
  3. from aiogram.fsm.context import FSMContext
  4. from aiogram.utils.markdown import hbold, hlink, hitalic
  5. import config
  6. from keyboards import menu_keys
  7. from keyboards.callbacks_data import MenuCategory
  8. from loader import logger, bot, db, scheduler
  9. from utils import RequireChannelsStates
  10. router = Router()
  11. router.message.filter(F.chat.type == "private")
  12. @router.callback_query(
  13. MenuCategory.filter(F.category == 'require_channels'),
  14. MenuCategory.filter(F.action.in_({'add', 'delete'})),
  15. MenuCategory.filter(F.level == 4)
  16. )
  17. async def add_del_words(call: types.CallbackQuery, callback_data: MenuCategory, context: dict, state: FSMContext):
  18. if callback_data.action == 'add':
  19. db.add_require_channel(call.from_user.id, callback_data.chat_id, callback_data.req_channel_id)
  20. elif callback_data.action == 'delete':
  21. db.delete_require_channel(call.from_user.id, callback_data.chat_id, callback_data.req_channel_id)
  22. context['users'] = db.get_all_clients()
  23. await show_menu(call, MenuCategory(level=2, category='require_channels', chat_id=callback_data.chat_id), state)
  24. @router.callback_query(
  25. MenuCategory.filter(F.category == 'require_channels'),
  26. MenuCategory.filter(F.action.in_({'add', 'delete'})),
  27. )
  28. async def add_del_words(call: types.CallbackQuery, callback_data: MenuCategory, context: dict, state: FSMContext):
  29. if callback_data.action == 'add':
  30. await show_menu(call,
  31. MenuCategory(level=3, category='require_channels', action='add', chat_id=callback_data.chat_id),
  32. state)
  33. await state.set_state(RequireChannelsStates.add)
  34. await state.update_data(chat_id=callback_data.chat_id)
  35. await state.update_data(action='add')
  36. elif callback_data.action == 'delete':
  37. await show_menu(call, MenuCategory(level=3, category='require_channels', action='delete',
  38. chat_id=callback_data.chat_id), state)
  39. @router.callback_query(
  40. MenuCategory.filter(F.category == 'require_channels'),
  41. MenuCategory.filter(F.level <= 5),
  42. )
  43. async def show_menu(call: types.CallbackQuery, callback_data: MenuCategory, state: FSMContext):
  44. # logger.debug(callback_data)
  45. current_level = callback_data.level
  46. chats = None
  47. if callback_data.action == 'back':
  48. current_level -= 1
  49. if current_level == 2:
  50. chats_from_db = db.select_channels_by_chat(call.from_user.id, callback_data.chat_id, 'list')
  51. entities = []
  52. for c in chats_from_db:
  53. try:
  54. e = await bot.get_chat(c)
  55. entities.append(e)
  56. except exceptions.TelegramBadRequest:
  57. continue
  58. except exceptions.TelegramForbiddenError:
  59. continue
  60. # db.delete_channel(call.from_user.id, )
  61. chats = '\n'.join([f"⚡️ {hlink(e.title, e.invite_link)}" for e in entities]) if entities else None
  62. chats_text = f'Уже привязаные чаты/калалы к этому чату:\n{chats}' if chats else hitalic(
  63. 'Привязанных каналов ещё нет\n')
  64. levels = {
  65. 0: menu_keys.admin_menu() if call.from_user.id in config.ADMIN_ID else menu_keys.client_menu(),
  66. 1: await menu_keys.list_groups_buttons(call.from_user.id),
  67. 2: menu_keys.action(3, 'require_channels', callback_data.chat_id),
  68. 3: menu_keys.back(1, 'require_channels')
  69. }
  70. texts = {
  71. 0: "Вот чем вы можете управлять:",
  72. 1: f"{hbold('Выбери чат из списка:')} \n\n"
  73. "Если ты не видишь нужный чат в списке - скорее всего бот там не администратор.",
  74. 2: f"{chats_text}\nДоступны такие действия: \n",
  75. 3: f"Видимо что-то пошло не так"
  76. }
  77. if callback_data.action == 'add':
  78. texts[3] = 'Здесь список всех чатов и каналов куда вы добавили бота. \n' \
  79. 'Выберите чат/канал для добавления как обязательный к подписке:'
  80. levels[3] = await menu_keys.list_channels_buttons(4, call.from_user.id, callback_data.chat_id, action='add')
  81. elif callback_data.action == 'delete':
  82. texts[3] = 'Выберите чат для удаления:'
  83. levels[3] = await menu_keys.list_channels_buttons(4, call.from_user.id, callback_data.chat_id, action='delete')
  84. await call.message.edit_text(texts[current_level], disable_web_page_preview=True)
  85. await call.message.edit_reply_markup(levels[current_level])