コード例 #1
0
ファイル: handlers.py プロジェクト: radioval87/telegrambot
    def link_invite_validation(self, update, context, tries=3):
        '''Joined the group via invite link scenario.'''
        print('link_invite_validation')
        chat_id = update.message.chat.id
        new_member = context.user_data.get('new_member')
        if tries > 0:
            msg(self.updater,
                chat_id=chat_id,
                text=(f'{new_member.first_name}, {WELCOME_MSG}'))
            context.chat_data.update({'chat_id': chat_id})
            # activates the timer that bans the target if the due is reached
            set_timer(context, due=CANDIDATE_DUE)

            mention_handler = MessageHandler(
                filters=(Filters.user(new_member.id) & Filters.chat(chat_id) &
                         (Filters.entity('mention')
                          | Filters.entity('text_mention'))),
                callback=lambda update, context: self.new_member_validation(
                    update, context, tries))
            mention_handler.__name__ = ('mention_handler' +
                                        str(new_member.id) + str(chat_id))

            not_mention_handler = MessageHandler(
                filters=(Filters.user(new_member.id) & Filters.chat(chat_id) &
                         (~Filters.entity('mention')
                          | ~Filters.entity('text_mention'))),
                callback=self.delete_message)
            not_mention_handler.__name__ = ('not_mention_handler' +
                                            str(new_member.id) + str(chat_id))

            self.dispatcher.add_handler(mention_handler, group=3)
            self.dispatcher.add_handler(not_mention_handler, group=3)

        else:
            return self.negative_validation(update,
                                            context)  # ran out of tries
コード例 #2
0
ファイル: handlers.py プロジェクト: radioval87/telegrambot
    def positive_validation(self, update, context, additional_context=None):
        print('positive_validation')
        chat_id = update.message.chat.id
        if additional_context is not None:
            inviter, candidate = additional_context
        else:
            inviter = context.user_data.get('inviter')
            candidate = context.user_data.get('new_member')

        context.user_data.update({'inviter': inviter})
        context.user_data.update({'new_member': candidate})
        try:
            unset_timer(context)
            handlers_remover(self.dispatcher,
                             'yes_handler',
                             user_id=inviter.tg_id,
                             chat_id=chat_id,
                             group=2)
            handlers_remover(self.dispatcher,
                             'no_handler',
                             user_id=inviter.tg_id,
                             chat_id=chat_id,
                             group=2)
            context.bot.restrict_chat_member(
                chat_id=chat_id,
                user_id=candidate.id,
                permissions=ChatPermissions(can_send_messages=True,
                                            can_send_media_messages=True,
                                            can_send_other_messages=True,
                                            can_add_web_page_previews=True,
                                            can_send_polls=True,
                                            can_invite_users=True,
                                            can_pin_messages=True))
            logging.info(f'{candidate.username or candidate.first_name}' +
                         ' was invited by link')
        except AttributeError:
            logging.info(f'{candidate.username or candidate.first_name}' +
                         ' was invited directly')
        text = f'{candidate.first_name}, {VALIDATION_POSITIVE_MSG}'
        msg(self.updater,
            chat_id=chat_id,
            text=text,
            reply_markup=remove_keyboard)

        a_callback = lambda update, context: self.add_new_member(
            update, context, additional_context=(inviter, candidate))

        about_handler = MessageHandler(
            filters=(Filters.user(candidate.id) & Filters.regex(r'#осебе')
                     & Filters.chat(chat_id)),
            callback=a_callback)

        about_handler.__name__ = ('about_handler' + str(candidate.id) +
                                  str(chat_id))

        na_callback = lambda update, context: self.delete_message(
            update, context, additional_context=candidate)
        not_about_handler = MessageHandler(
            filters=(Filters.user(candidate.id) & Filters.chat(chat_id) &
                     (~Filters.regex('#осебе'))),
            callback=na_callback)
        not_about_handler.__name__ = ('not_about_handler' + str(candidate.id) +
                                      str(chat_id))

        self.dispatcher.add_handler(about_handler, group=1)
        self.dispatcher.add_handler(not_about_handler, group=1)
        for handler in self.dispatcher.handlers[1]:
            print(handler.filters)
コード例 #3
0
ファイル: handlers.py プロジェクト: radioval87/telegrambot
    def new_member_validation(self, update, context, tries):
        print('new_member_validation')
        chat_id = update.message.chat.id
        candidate = context.user_data.get('new_member')
        unset_timer(context)

        handlers_remover(self.dispatcher,
                         'mention_handler',
                         user_id=candidate.id,
                         chat_id=chat_id,
                         group=3)
        handlers_remover(self.dispatcher,
                         'not_mention_handler',
                         user_id=candidate.id,
                         chat_id=chat_id,
                         group=3)

        inviter_username = (update.message.text).strip('@')
        try:
            inviter = (db.get(
                db.User, username=inviter_username, enter_chat_id=chat_id)
                       or db.get(db.User,
                                 tg_id=update.message.entities[0].user.id,
                                 enter_chat_id=chat_id))
        except AttributeError:
            inviter = None
        if inviter and inviter.invites > 0:
            context.bot.restrict_chat_member(
                chat_id=chat_id,
                user_id=candidate.id,
                permissions=ChatPermissions(
                    can_send_messages=False,
                    can_send_media_messages=False,
                    can_send_other_messages=False,
                    can_add_web_page_previews=False,
                ))
            set_timer(context, due=INVITER_DUE)
            if inviter.username:
                text = (f'@{inviter.username},' + VALIDATION_MSG + ' ' +
                        f'({candidate.first_name}/' +
                        f'{candidate.username or "без username"})?')
                self.updater.bot.sendMessage(
                    chat_id=chat_id,
                    text=text,
                    entities=[
                        MessageEntity(type='mention',
                                      offset=0,
                                      length=30,
                                      user=User(id=inviter.tg_id,
                                                is_bot=False,
                                                first_name=inviter.first_name))
                    ],
                    reply_markup=validation_keyboard)
            else:
                text = (
                    f'[{inviter.first_name}](tg://user?id={inviter.tg_id}),' +
                    f'{VALIDATION_MSG} {candidate.first_name}/' +
                    f'{candidate.username or "без username"}?')
                msg(self.updater,
                    chat_id=chat_id,
                    text=text,
                    entities=[
                        MessageEntity(type='mention',
                                      offset=0,
                                      length=30,
                                      user=User(id=inviter.tg_id,
                                                is_bot=False,
                                                first_name=inviter.first_name))
                    ],
                    reply_markup=validation_keyboard,
                    parse_mode='MarkdownV2')

            y_callback = lambda update, context: self.positive_validation(
                update, context, additional_context=(inviter, candidate))
            yes_handler = MessageHandler(
                filters=(Filters.regex('Да') & Filters.chat(chat_id)
                         & Filters.user(inviter.tg_id)),
                callback=y_callback)
            yes_handler.__name__ = 'yes_handler' + str(
                inviter.tg_id) + str(chat_id)

            n_callback = lambda update, context: self.negative_validation(
                update, context, additional_context=(inviter, candidate))
            no_handler = MessageHandler(
                filters=(Filters.regex('Нет') & Filters.chat(chat_id)
                         & Filters.user(inviter.tg_id)),
                callback=n_callback)

            no_handler.__name__ = 'no_handler' + str(
                inviter.tg_id) + str(chat_id)

            self.dispatcher.add_handler(yes_handler, group=2)
            self.dispatcher.add_handler(no_handler, group=2)
        else:
            msg(self.updater, chat_id=chat_id, text=VALIDATION_NEGATIVE_MSG)
            tries -= 1
            update.message.entities = []
            update.message.text = ''
            return self.link_invite_validation(update, context, tries)