async def create_private_poll(message: types.Message): dispatcher = Dispatcher.get_current() bot = dispatcher.bot bot_config = dispatcher["config"]["bot"]["posts"] UsersMemePoll = dispatcher["app"]["polls"]["users"] user_meme_message = await bot.send_photo( chat_id=bot_config["moderate_channel_id"], photo=message.photo[1].file_id, disable_notification=UsersMemePoll.DISABLE_NOTIFICATION) question = f"{UsersMemePoll.QUESTION}: @{message.from_user.username}\n" \ f"Доп. инфа:\n" \ f"Bot: {'Да' if message.from_user.is_bot else 'Нет'} | " \ f"UserName: {message.from_user.username} | " \ f"- LastName: {message.from_user.last_name} | " \ f"- FirstName: {message.from_user.first_name}" message_with_poll = await bot.send_poll( chat_id=bot_config["moderate_channel_id"], question=question, options=UsersMemePoll.OPTIONS, disable_notification=UsersMemePoll.DISABLE_NOTIFICATION, reply_to_message_id=user_meme_message.message_id) await UsersMemePoll.add_poll(message, message_with_poll) await bot.send_message( chat_id=message.chat.id, text= "Мемас отправлен на модерацию. Благодарим вас за помощь в сборе валежника." )
async def message_throttled(self, message: types.Message, throttled: Throttled): """ Notify user only on first exceed and notify about unlocking only on last exceed """ handler = current_handler.get() dispatcher = Dispatcher.get_current() if handler: key = getattr(handler, 'throttling_key', f"{self.prefix}_{handler.__name__}") else: key = f"{self.prefix}_message" # Calculate how many time is left till the block ends delta = throttled.rate - throttled.delta # Prevent flooding if throttled.exceeded_count <= 2: await message.reply('<b>Antiflood:</b> \n\nСлишком много запросов.' ) # Sleep. await asyncio.sleep(delta) # Check lock status thr = await dispatcher.check_key(key) # If current message is not last with current key - do not send message if thr.exceeded_count == throttled.exceeded_count: await message.reply('Unlocked.')
async def on_process_callback_query(self, cb: types.CallbackQuery, data: dict): """ This handler is called when dispatcher receives a message """ # Get current handler handler = current_handler.get() # Get dispatcher from context dispatcher = Dispatcher.get_current() # If handler was configured, get rate limit and key from handler if handler: limit = getattr(handler, 'throttling_rate_limit', self.rate_limit) key = getattr(handler, 'throttling_key', f"{self.prefix}_{handler.__name__}") else: limit = self.rate_limit key = f"{self.prefix}_callback" # Use Dispatcher.throttle method. try: await dispatcher.throttle(key, rate=limit) except Throttled as t: # Execute action await self.callback_throttled(cb, t) # Cancel current handler raise CancelHandler()
async def exit(message: types.Message, state: FSMContext): """ `/exit - Выйти из настроек ` """ dispatcher = Dispatcher.get_current() bot = dispatcher.bot await state.reset_state() await bot.send_message(chat_id=message.chat.id, text="Если что ты знаешь, как вернуться😉")
async def start(message: types.Message): """ `/start` """ dispatcher = Dispatcher.get_current() bot = dispatcher.bot text = "Шалом паря! Сейчас мы начнём валежничать по полной😎\n" \ "Скидывай мне мемасики, а уж я разберусь что с ними делать😉" await bot.send_message(chat_id=message.chat.id, text=text)
async def get_user_locale(self, action, args) -> str: user = User.get_current() db = dp.get_current()['db'] try: # пробуем достать локаль из базы return await db.get_user_locale(user.id) except LocaleNotFound: # возвращаем локаль, которую вернул телеграм if user.locale: return user.locale.language return 'ru'
async def throttled_message(*args, **kwargs): dispatcher = Dispatcher.get_current() config = dispatcher["config"] throttle_time_limit = config["bot"]["posts"]["throttle_time_limit"] message = args[0] val = f'{throttle_time_limit} секунд.' if throttle_time_limit // 60 == 0 else \ f'{throttle_time_limit // 60} минут.' await message.answer( text= f"Извините, но мемасы можно отправлять раз в {val}\nПожалуйста подождите..." )
async def settings(message: types.Message): """ `/settings` """ dispatcher = Dispatcher.get_current() bot = dispatcher.bot text = "Ты находишься в меню настроек:\n\n" \ "/set_post_channel <channel_id> - Установить канал в который постить после модерации.\n\n" \ "/set_moderate_channel <channel_id> - Установить канал в который отправлять на модерацию.\n\n" \ "/set_timeout <timeout> - Установить таймаут между постами в канал.(устанавливается в минутах)\n\n" \ "/exit - Выйти из настроек.\n" await bot.send_message(chat_id=message.chat.id, text=text)
async def broadcast(self): if self.first: msg = "Введіть повідомлення для броадкасту:" kb = self.kb() kb.add(self.btn(Lang.back_btn)) await self.send_msg(msg, kb) elif self.message.text == Lang.back_btn: await self.to_state("admin_panel") else: dp = Dispatcher.get_current() dp.loop.create_task(broadcaster(self.message.text)) await self.to_state("admin_panel")
async def create_group_poll(message: types.Message): dispatcher = Dispatcher.get_current() bot = dispatcher.bot GroupMemePoll = dispatcher["app"]["polls"]["group"] message = await bot.send_poll( chat_id=message.chat.id, question=GroupMemePoll.QUESTION, options=GroupMemePoll.OPTIONS, disable_notification=GroupMemePoll.DISABLE_NOTIFICATION, reply_to_message_id=message.message_id) await GroupMemePoll.add_poll(message)
async def admin_banned(message: types.Message, state: FSMContext): dispatcher = Dispatcher.get_current() bot = dispatcher.bot remaining = Banned.is_ban(message.from_user.username) if remaining: await bot.send_message( chat_id=message.chat.id, text=f"Ты был забанен на 1 час. Осталось: {remaining} минут.") else: await state.reset_state() await admin(message, state)
async def on_process_message(self, message: types.Message, data: dict): chat = message.chat if (chat.type == types.chat.ChatType.GROUP or chat.type == types.chat.ChatType.SUPER_GROUP) and len( message.new_chat_members) == 0: dp = Dispatcher.get_current() me = await dp.bot.get_me() if me.id not in [ admin.user.id for admin in await chat.get_administrators() ]: await message.reply("Бот должен иметь права администратора") raise CancelHandler()
async def admin(message: types.Message, state: FSMContext): """ `/admin` """ dispatcher = Dispatcher.get_current() bot = dispatcher.bot current_state = await state.get_state() if current_state == Auth.settings: await bot.send_message( chat_id=message.chat.id, text="Ты уже избранный, и можешь все (/settings).") return await state.set_state(Auth.check_password.try_1) await bot.send_message( chat_id=message.chat.id, text="А ну-ка дядя, напиши мне то что я хочу увидеть.")
async def set_timeout(message: types.Message): """ `/set_timeout - Выйти из настроек ` """ dispatcher = Dispatcher.get_current() bot = dispatcher.bot config = dispatcher["config"] argument = message.get_args() if not argument: return await message.reply( text="Необходим аргумент <timeout>: Например: /set_timeout 4") if not argument.isdigit(): return await message.reply( text= "Аргумент <timeout> должен быть числом: Например: /set_timeout 4") config["bot"]["posts"]["time_between_posts"] = argument await bot.send_message( chat_id=message.chat.id, text=f"Установлено время между постами: {argument} мин.")
async def track_group_poll(poll: types.Poll): dispatcher = Dispatcher.get_current() bot = dispatcher.bot GroupMemePoll = dispatcher["app"]["polls"]["group"] MemeQueue = dispatcher["app"]["queue"] message_with_poll = await GroupMemePoll.get_poll(poll.id) if message_with_poll is None: return for option_index, option in enumerate(poll.options): if option["voter_count"] >= GroupMemePoll.THRESHOLD_VOTES_TO_STOP: await bot.stop_poll(chat_id=message_with_poll.chat.id, message_id=message_with_poll.message_id) await GroupMemePoll.delete_poll(poll.id) await bot.send_message( chat_id=message_with_poll.chat.id, text=GroupMemePoll.OPTIONS_ANSWERS[option_index], reply_to_message_id=message_with_poll.reply_to_message. message_id) if option_index == GroupMemePoll.INDEX_ANSWER_TO_POST: await MemeQueue.put(message_with_poll) return await GroupMemePoll.update_poll(poll)
async def check_password(message: types.Message, state: FSMContext): dispatcher = Dispatcher.get_current() bot = dispatcher.bot config = dispatcher["config"] if message.text == config["bot"]["admin"]["password"]: await state.set_state(Auth.settings) await bot.send_message( chat_id=message.chat.id, text= "О боги, ты избранный!\nНааа... валяй, что вздумается /settings") else: current_state = await state.get_state() if current_state == Auth.check_password.try_1.state: await bot.send_message( chat_id=message.chat.id, text="Херня какая-то, наверное ты что-то не то ввел\n" "Давай-ка еще разок попробуй.") await state.set_state(Auth.check_password.try_2) elif current_state == Auth.check_password.try_2.state: await bot.send_message( chat_id=message.chat.id, text="Ну ты криворукий канеш)\nДавай-ка еще разок попробуй.") await state.set_state(Auth.check_password.try_3) elif current_state == Auth.check_password.try_3.state: await bot.send_message( chat_id=message.chat.id, text="Ты чё это взломать меня удумал?\nЛадно дам тебе еще шанс." ) await state.set_state(Auth.check_password.last) elif current_state == Auth.check_password.last.state: await bot.send_message( chat_id=message.chat.id, text="Ну все дядя, ты доигрался, увидимся через час.") Banned.add_user(message.from_user.username) await state.set_state(Auth.check_password.banned)
async def any_message(message: types.Message): dispatcher = Dispatcher.get_current() bot = dispatcher.bot await bot.send_message(chat_id=message.chat.id, text="Моя вас не понимать, я уважаю только мемасы.")