示例#1
0
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=
        "Мемас отправлен на модерацию. Благодарим вас за помощь в сборе валежника."
    )
示例#2
0
    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.')
示例#3
0
    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()
示例#4
0
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="Если что ты знаешь, как вернуться😉")
示例#5
0
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)
示例#6
0
    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'
示例#7
0
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Пожалуйста подождите..."
    )
示例#8
0
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)
示例#9
0
 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")
示例#10
0
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)
示例#11
0
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)
示例#12
0
 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()
示例#13
0
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="А ну-ка дядя, напиши мне то что я хочу увидеть.")
示例#14
0
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} мин.")
示例#15
0
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)
示例#16
0
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)
示例#17
0
async def any_message(message: types.Message):
    dispatcher = Dispatcher.get_current()
    bot = dispatcher.bot
    await bot.send_message(chat_id=message.chat.id,
                           text="Моя вас не понимать, я уважаю только мемасы.")