def start(data): message = data.get('object').get('message') sender = message.get('from_id') text = message.get('text') session = create_session() student = Student(vk_id=sender, dialogue_point='register') session.add(student) session.commit() params = { 'user_id': sender, 'random_id': random.randint(1, 2**32), 'message': 'Привет! Для начала необходимо привязать свой аккаунт в электронной школе.', 'keyboard': json.dumps({ 'inline': True, 'buttons': [[{ 'action': { 'type': 'open_link', 'link': 'https://' + SERVER_NAME + f'/register/{sender}', 'label': 'Регистрация' } }]] }), 'access_token': VK_APIKEY, } return VK_API.messages.send(**params)
def main_point(data): from bot_app.services import school_services message = data.get('object').get('message') text = message.get('text') vk_id = message.get('from_id') params = { 'user_id': vk_id, 'random_id': random.randint(1, 2**32), 'access_token': VK_APIKEY, 'keyboard': MAIN_KEYBOARD } if text == HT_FOR_TOMORROW: date = datetime.datetime.now() + datetime.timedelta(hours=16) hometask = school_services.get_hometask(vk_id, date) params['message'] = format_hometask(hometask, date) elif text.startswith('Домашка на') or text.startswith("Дз на"): date = parse_date(text.split(' ')[-1]) if date is None: params[ 'message'] = 'Сори, не могу распознать дату. Попробуй другой формат' else: hometask = school_services.get_hometask(vk_id, date) params['message'] = format_hometask(hometask, date) elif text == MARKS_FOR_TODAY: date = datetime.datetime.now() marks = school_services.get_marks(vk_id, date) params['message'] = format_marks(marks, date) elif text.startswith('Оценки за'): date = parse_date(text.split(' ')[-1]) if date is None: params[ 'message'] = 'Сори, не могу распознать дату. Попробуй другой формат' else: marks = school_services.get_marks(vk_id, date) params['message'] = format_marks(marks, date) elif text == 'Помощь': params['message'] = '''Основные команды: "Домашка на завтра" - домашка на завтра; "Оценки за сегодня" - оценки за сегодня; "Домашка на <дата в формате дд.мм или дд.мм.гг>" - домашка на конкретный день; "Оценки за <дата в формате дд.мм или дд.мм.гг>" - оценки за конкретный день;''' elif text == UNSUBSCRIBE: db_session = create_session() student = db_session.query(Student).filter( Student.vk_id == vk_id).first() student.daily_hometask = False db_session.commit() params['message'] = 'Лааадно' else: params['message'] = 'Ага' return VK_API.messages.send(**params)
def end_config(vk_id): db_session = create_session() student = db_session.query(Student).filter(Student.vk_id == vk_id).first() student.dialogue_point = 'main' params = { 'user_id': vk_id, 'random_id': random.randint(1, 2**32), 'message': 'Настройка завершена.', 'keyboard': MAIN_KEYBOARD, 'access_token': VK_APIKEY, } if student.daily_hometask: params['message'] += ' Жди сообщений ;)' db_session.commit() return VK_API.messages.send(**params)
def config_mailing(vk_id, response=None): db_session = create_session() student = db_session.query(Student).filter(Student.vk_id == vk_id).first() if response == 'Да': student.daily_hometask = True db_session.commit() return end_config(vk_id) elif response == 'Нет': student.daily_hometask = False db_session.commit() return end_config(vk_id) else: params = { 'user_id': vk_id, 'random_id': random.randint(1, 2**32), 'keyboard': json.dumps({ 'inline': False, 'one_time': True, 'buttons': [[{ 'action': { 'type': 'text', 'label': 'Да' }, 'color': 'positive' }, { 'action': { 'type': 'text', 'label': 'Нет' }, 'color': 'negative' }]] }), 'access_token': VK_APIKEY, } if response is None: params['message'] = 'Отлично! Аккаунт привязан, теперь давай займемся настройками. Ты ' \ 'хочешь получать ежедневные уведомления с домашним заданием в 16:00?' else: params['message'] = 'Просто нажми на кнопку Да/Нет' student.dialogue_point = 'mailing' db_session.commit() return VK_API.messages.send(**params)
def handle_message( data): # main function that receives and handle each message message = data.get('object').get('message') text = message.get('text') vk_id = message.get('from_id') db_session = create_session() student = db_session.query(Student).filter(Student.vk_id == vk_id).first() if student is None: new_user = True else: new_user = False if new_user: return start(data) if student.dialogue_point == MAILING: config_mailing(vk_id, text) elif student.dialogue_point == 'main': main_point(data)
def register(vk_id): from bot_app.data.db_session import create_session from bot_app.data.student import Student session = create_session() if session.query(Student).filter(Student.vk_id == vk_id).first() is None or \ session.query(Student).filter( Student.vk_id == vk_id).first().dialogue_point != 'register': try: logger.error( f"Registered user: {vk_id}. DP = {session.query(Student).filter(Student.vk_id == vk_id).first().dialogue_point}") except AttributeError: logger.error(f"Unrecognized user: {vk_id}") abort(404) form = RegisterForm() if form.validate_on_submit(): if not school_services.register(vk_id, form): return render_template('register.html', form=form, message='Неверный логин или пароль') return render_template('success.html', message='Поздравляю, вы успешно привязали аккаунт ' 'Электронной школы! Пожалуйста, следуйте ' 'инструкциям бота') return render_template('register.html', form=form)
def mailing_hometask(): from bot_app.services import school_services db_session = create_session() students = db_session.query(Student).filter(Student.daily_hometask).all() params = { 'access_token': VK_APIKEY, } logger.info(f'Mailing started. Number of students: {len(students)}') for student in students: student.last_mailing = datetime.datetime.now() date = datetime.datetime.now() + datetime.timedelta(hours=16) hometask = school_services.get_hometask(student.vk_id, date) params['user_id'] = student.vk_id params['random_id'] = random.randint(1, 2**32) message = format_hometask(hometask, date, handle_errors=False) if message is None: continue params['message'] = message VK_API.messages.send(**params) logger.info('Mailing successful')