admin_menu.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import datetime
  2. from aiogram import Router, types, F, exceptions
  3. from aiogram.fsm.context import FSMContext
  4. from aiogram.utils.markdown import hpre, hlink, hbold, hitalic
  5. import config
  6. from handlers.users_message import delete_mess
  7. from keyboards.callbacks_data import MenuCategory
  8. from loader import logger, db, bot, scheduler
  9. from filters.admin_filter import IsAdmin
  10. from keyboards import menu_keys
  11. from utils import DefStopWordsStates
  12. router = Router()
  13. router.message.bind_filter(IsAdmin)
  14. router.callback_query.bind_filter(IsAdmin)
  15. router.message.filter(F.chat.type == "private")
  16. # router.callback_query.filter(F.chat.type == "private")
  17. @router.message(commands='start')
  18. async def start(message: types.Message):
  19. await message.answer('Вот чем вы можете управлять:', reply_markup=menu_keys.admin_menu())
  20. @router.message(commands='stop_default')
  21. async def start(message: types.Message, context: dict):
  22. stop_words = context['stop_words']
  23. messages = []
  24. temp_text = ''
  25. for i in stop_words:
  26. temp_text += f"{i}\n"
  27. if len(temp_text) > 4000:
  28. messages.append(temp_text)
  29. temp_text = ''
  30. if i is stop_words[-1]:
  31. messages.append(temp_text)
  32. for list_words in messages:
  33. no_words = 'Сюда пока что ничего не добавили((\nНапишите <code>/stop_add </code>' \
  34. '[слово] - чтобы добавить слово в фильтр\n'
  35. text = f'Список стоп слов назначаемых по-умолчанию: \n{hpre(list_words)}' if len(stop_words) > 0 else no_words
  36. if len(messages) > 1 and list_words not in messages[0]:
  37. text = hpre(list_words)
  38. mess = await message.answer(text)
  39. scheduler.add_job(delete_mess, args=(mess,), trigger='date',
  40. run_date=datetime.datetime.now() + datetime.timedelta(minutes=2))
  41. await message.delete()
  42. @router.callback_query(MenuCategory.filter(F.category == 'statistic'))
  43. async def statistics(call: types.CallbackQuery, callback_data: MenuCategory, context: dict):
  44. """
  45. get count all users
  46. """
  47. users = len(context['users'])
  48. chats = len(db.select_channels_for_ads())
  49. text = f'' \
  50. f'{hbold("Ботом пользуется")}: {hitalic(users)} человек\n' \
  51. f'{hbold("Ваша реклама покажется в")}: {hitalic(chats)} чатах\n'
  52. await call.message.edit_text(text)
  53. await call.message.edit_reply_markup(menu_keys.back(1, 'stop_words'))
  54. @router.callback_query(
  55. MenuCategory.filter(F.category == 'default_words'),
  56. MenuCategory.filter(F.action.in_({'add', 'delete'})),
  57. )
  58. async def add_del_words(call: types.CallbackQuery, callback_data: MenuCategory, context: dict, state: FSMContext):
  59. words_list = '\n'.join(context['stop_words'])
  60. too_long = 'Все слова сюда не поместились. Нажми /stop_default, чтобы увидеть полный список.\n\n'
  61. if callback_data.action == 'add':
  62. await state.set_state(DefStopWordsStates.add)
  63. await call.message.edit_text(
  64. f"Слова по умолчанию:\n{hpre(words_list[:4000])}\n\n"
  65. f"{too_long if len(words_list) > 4000 else ''}"
  66. f"Напиши мне что хочешь добавить. Можно добавить или удалить сразу нескольслко стоп слов."
  67. "Для этого разделяй их по строкам")
  68. await call.message.edit_reply_markup(menu_keys.back(2, 'default_words'))
  69. elif callback_data.action == 'delete':
  70. await state.set_state(DefStopWordsStates.delete)
  71. await call.message.edit_text(
  72. f"Слова по умолчанию:\n{hpre(words_list[:4000])}\n\n"
  73. f"{too_long if len(words_list) > 4000 else ''}"
  74. f"Напиши мне что хочешь удалить. Можно добавить или удалить сразу нескольслко стоп слов."
  75. "Для этого разделяй их по строкам")
  76. await call.message.edit_reply_markup(menu_keys.back(2, 'default_words'))
  77. await state.update_data(call=call)
  78. scheduler.add_job(state.clear, trigger='date',
  79. run_date=datetime.datetime.now() + datetime.timedelta(minutes=3))
  80. @router.message(DefStopWordsStates.add)
  81. async def stop_words_add(m: types.Message, context: FSMContext, state: FSMContext):
  82. data = await state.get_data()
  83. call = data['call']
  84. words = m.text.split('\n')
  85. for word in words:
  86. db.add_word(0, word)
  87. context['stop_words'] = db.select_default_word()
  88. mess = await m.answer(f"Добавил: \n{hbold(m.text)}")
  89. await m.delete()
  90. await add_del_words(call, MenuCategory(level=2, category='default_words', action='add'), context, state)
  91. scheduler.add_job(delete_mess, args=(mess,), trigger='date',
  92. run_date=datetime.datetime.now() + datetime.timedelta(seconds=10))
  93. @router.message(DefStopWordsStates.delete)
  94. async def stop_words_del(m: types.Message, context: FSMContext, state: FSMContext):
  95. data = await state.get_data()
  96. call = data['call']
  97. words = m.text.split('\n')
  98. for word in words:
  99. db.delete_word(0, word)
  100. context['stop_words'] = db.select_default_word()
  101. mess = await m.answer(f"Удалил: \n{hbold(m.text)}")
  102. await m.delete()
  103. await add_del_words(call, MenuCategory(level=2, category='default_words', action='delete'), context, state)
  104. scheduler.add_job(delete_mess, args=(mess,), trigger='date',
  105. run_date=datetime.datetime.now() + datetime.timedelta(seconds=10))
  106. @router.callback_query(
  107. MenuCategory.filter(F.category == 'default_words'),
  108. )
  109. async def show_default_words(call: types.CallbackQuery, callback_data: MenuCategory, context: dict, state: FSMContext):
  110. current_level = callback_data.level
  111. if callback_data.action == 'back':
  112. if current_level == 2:
  113. await state.clear()
  114. current_level -= 1
  115. stop_words = '\n'.join(context['stop_words'])
  116. levels = {
  117. 0: menu_keys.admin_menu() if call.from_user.id in config.ADMIN_ID else menu_keys.client_menu(),
  118. 1: menu_keys.action(2, 'default_words'),
  119. 2: menu_keys.back(2, 'default_words'),
  120. }
  121. texts = {
  122. 0: "Вот чем вы можете управлять:",
  123. 1: f"Слова по умолчанию:\n<code>{stop_words}</code>\nДоступны такие действия: \n",
  124. 2: "Напиши слова/фразы, которые хочешь добавить. Можно добавить или удалить сразу нескольслко стоп слов."
  125. "Для этого разделяй их по строкам"
  126. }
  127. await call.message.edit_text(texts[current_level])
  128. await call.message.edit_reply_markup(levels[current_level])
  129. @router.callback_query(
  130. MenuCategory.filter(),
  131. MenuCategory.filter(F.level <= 5),
  132. )
  133. async def show_menu(call: types.CallbackQuery, callback_data: MenuCategory, state: FSMContext):
  134. logger.debug(callback_data)
  135. current_level = callback_data.level
  136. if callback_data.action == 'back':
  137. current_level -= 1
  138. levels = {
  139. 0: menu_keys.admin_menu(),
  140. }
  141. texts = {
  142. 0: "Вот чем вы можете управлять:",
  143. }
  144. await call.message.edit_text(texts[current_level], disable_web_page_preview=True)
  145. await call.message.edit_reply_markup(levels[current_level])