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
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)
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)