async def menu(cls, user: BotUser, event=None, text='Отправьте свой телефонный номер.'): user.client = TelegramClient(StringSession(), api_id, api_hash) user.code = '' if hasattr(user, 'phone') and user.phone: await cls.set_code(user) await user.client.connect() await user.client.send_code_request(user.phone) else: user.disposable_handler = cls.set_phone markup = [[ Button.request_phone('Отправить мой номер \U0000260E') ], [Button.text('Отмена', resize=True, single_use=True)]] reply = event.edit if event else user.reply await reply(text, buttons=markup)
async def sign_in(cls, user: BotUser, event): try: await user.client.sign_in(user.phone, user.code) if await user.client.is_user_authorized(): await cls.save_session(user, event) except PhoneCodeInvalidError: await event.edit('Код недействителен. Попробуйте снова.') user.code = '' await cls.enter_code(user) except SessionPasswordNeededError: user.disposable_handler = cls.two_step_verification await event.delete() await user.reply('Введите пароль двухэтапной аутентификации.', buttons=Button.text('Отмена', single_use=True, resize=True))
async def add(cls, user: BotUser, event): text = 'Введите стоп-фразу. Регистр не имеет значения.\n' \ 'Например: __с пушки__ или __на сейчас__' await event.delete() await user.reply(text, buttons=Button.text('Отмена', resize=True, single_use=True)) user.disposable_handler = cls.set
async def edit(cls, user: BotUser, event): text = 'Введите сообщение, которое будет автоматически ' \ 'отправляться при наборе людей на мероприятие. ' \ 'Например: \n__+380123456789 - Герман__' await event.delete() await user.reply(text, buttons=Button.text('Отмена', resize=True, single_use=True)) user.disposable_handler = cls.set
async def enter_num(cls, user: BotUser, event): data = re.findall(r'&(.+)', event.data.decode('utf-8'))[0] if 'x' == data: if user.code == '': await cls.set_code(user, event, text='Ввод кода был отменен.') return user.code = '' elif '<' == data and len(user.code) > 1: user.code = user.code[:-1] else: user.code += data await event.answer('Код: {}'.format(user.code + '_' * (5 - len(user.code)))) await cls.enter_code(user, event) if len(user.code) >= 5: await cls.sign_in(user, event)
async def set_phone(cls, user: BotUser, event): if event.text == 'Отмена': await cls.cancel(user) return if event.contact: user.phone = event.media.phone_number await cls.set_code(user) await user.client.connect() await user.client.send_code_request(user.phone) else: await cls.menu(user)
async def set(cls, user: BotUser, event): if event.text != 'Отмена': if len(event.text) > 1: filters = user.filters + [event.text] await cls.menu(user, filters=filters) await user.set(filters=filters) else: text = 'Слишком мало символов. Попробуйте еще.' button = Button.text('Отмена', resize=True, single_use=True) await user.reply(text, buttons=button) user.disposable_handler = cls.set else: await cls.menu(user)
async def two_step_verification(cls, user: BotUser, event: NewMessage.Event): if event.text == 'Отмена': await cls.cancel(user) return try: await user.client.sign_in(password=event.text) await cls.save_session(user) except PasswordHashInvalidError: user.disposable_handler = cls.two_step_verification await user.reply( 'Введенный вами пароль недействителен. Попробуйте снова.', buttons=Button.text('Отмена', single_use=True, resize=True))
def get_user(self, user_id): if user_id not in self.users: self.users[user_id] = BotUser(user_id) return self.users[user_id]
async def _prepare_users(self): for record in await pool.fetch('SELECT * FROM users'): self.users[record['id']] = BotUser(record['id']) self.users[record['id']].cache(**record) return self