def collect_values(message, user_id): user = db_operator.get_user(user_id) try: user['last_sending_date'] except KeyError: db_operator.set_user_last_date(user_id, str(datetime.today())) lens = db_operator.check_collect_progress(user_id) if lens[1] < lens[0] and db_operator.get_current_state( user_id) == constants.States.S_ENTER_DATA.value: if data_processing.msg_check(message, 'digit'): if db_operator.update_data_value(user_id, user['vars'][f'{lens[1] + 22}'], message): lens = db_operator.check_collect_progress(user_id) if lens[0] >= lens[1] + 1: text = f"Введите {user['vars'][f'{lens[1] + 22}']}" options = { 'later_hour': 'через час', 'later_day': 'завтра', } bot_actions.bot_send_keyboard(text, user_id, options) else: bot_actions.send_message( user_id, text="Нужно ввести цифры, попробуй ещё раз.") if lens[1] == lens[0]: send_data(user_id) db_operator.set_user_next_date(user_id) bot_actions.send_message( user_id, f'Ваши данные успешно отправлены на адрес {user["mail_to"]}.\n' f'Следующая дата отправки - ' f'{db_operator.get_user_data(user_id, "next_date").split(".")[0][:-3]}' ) db_operator.set_state(user_id, constants.States.S_USER_WAIT.value) time.sleep(1)
def when_timer_stop(flag, user_id, in_progress=False): user = db_operator.get_user(user_id) db_operator.set_state(user_id, user['last_state']) print(f'state is {db_operator.get_current_state(user_id)}') text = '' options = { 'later_hour': 'через час', 'later_day': 'завтра', } try: if flag: text = "Введите ранее запрошенные показания:" else: try: if str(datetime.today() )[:10] == user['last_sending_date'][:10]: data_v = db_operator.get_last_data(user_id) us_vars = db_operator.get_user_data(user_id, 'vars').values() if all(x in data_v.keys() for x in us_vars): db_operator.set_user_last_date( user_id, str(datetime.today() + timedelta(days=1))) db_operator.set_user_next_date(user_id) bot_actions.send_message( user_id, 'Данные за сегодняшнее число уже были отправлены\n' '<b>Следующая дата отправки</b>: ' f'{db_operator.get_user_data(user_id, "next_date")}', parse_mode='HTML') user_set_timer(None, user_id) return elif not in_progress: lens = db_operator.check_collect_progress(user_id) text = f"Введите {user['vars'][f'{lens[1] + 22}']}" except Exception: if not in_progress: lens = db_operator.check_collect_progress(user_id) text = f"Введите {user['vars'][f'{lens[1] + 22}']}" except KeyError: try: print(user['last_sending_date']) except KeyError: db_operator.set_user_last_date(user_id, str(datetime.today())) text = "Подтвердите отправку" options = {'send': 'Отправить'} if text: bot_actions.bot_send_keyboard(text, user_id, options)
def user_set_timer(message, user_id): user_id = str(user_id) user = db_operator.get_user(user_id) if user and user['collecting'] == 'true': db_operator.set_user_last_state(user_id, constants.States.S_ENTER_DATA.value) db_operator.set_state(user_id, constants.States.S_USER_WAIT.value) seconds = datetime.fromisoformat(user['next_date']) - datetime.today() if seconds.total_seconds() > TIMEOUT_MAX: timer = Timer(timedelta(days=30).total_seconds(), user_set_timer, args=(None, user_id)) else: timer = Timer( seconds.total_seconds() - timedelta(hours=user['tz_delta']).total_seconds(), lambda: when_timer_stop(False, user_id)) timers.update({user_id: {'timer': timer, 'in_progress': False}}) timers[user_id]['timer'].start() print(timers[user_id]['timer'])
def user_wait(message, user_id): user_id = str(user_id) if timers[user_id]['in_progress'] or 'отмен' in message.lower(): timers[user_id]['timer'].cancel() if 'отмен' in message.lower(): bot_actions.send_message(user_id, 'Отправка данных отменена') db_operator.set_state(user_id, constants.States.S_START.value) db_operator.swap_collect(user_id) return elif message.isdigit(): when_timer_stop(False, user_id, in_progress=True) db_operator.set_state( user_id, db_operator.get_user_data(user_id, 'last_state')) actions[db_operator.get_user_data(user_id, 'last_state')](message, user_id) else: when_timer_stop(True, user_id) else: user = db_operator.get_user(user_id) bot_actions.send_message( user_id, 'Следующая отправка данных:\n' f'{user["next_date"].split(".")[0][:-3]}')
def new_user_init(user_id): if db_operator.get_user(user_id): bot_actions.send_message( user_id, 'Я нашел ваши данные!\n' 'Если хотите проверить и изменить свои данные, используйте команду /update\n' 'Если хотите удалить свои данные - /delete') else: if db_operator.init_user(user_id=user_id): bot_actions.send_message( user_id, 'Начнем с формирования шаблона!\n<b>Если ' 'вдруг что-то пойдет не так - воспользуйтесь командой</b> /delete!\n' 'Введите текст письма. Следуйте примеру, выделяя места появления данных' ' и текущей даты фигурными скобками (если отметить место для текущей даты' ', при отправке письма она будет появляться в выбранном месте ' 'автоматически). Пример:\n\n' '<i>Добрый день!\n' 'Показания ИПУ по адресу ул. Пушкина, д. 1, кв. 2 на {дата}:\n\n' 'Электроэнергия: {показания счетчика электроэнергии}\n' 'Холодное водоснабжение: {показания счетчика холодной воды}\n' 'Горячее водоснабжение: {показания счетчика горячей воды}\n\n' 'С уважением, Петров А. А.</i>', parse_mode='HTML') db_operator.set_state(user_id, constants.States.S_SET_TEMPLATE.value)
def callback_wait(user_id, option): user_id = str(user_id) user = db_operator.get_user(user_id) if option == 'day': time_obj = parse(parse_time(user['at_time'])) seconds_delta = datetime.today() + timedelta(days=1) seconds_delta = seconds_delta.replace(hour=time_obj.hour, minute=time_obj.minute, second=0) - datetime.today() bot_actions.send_message( user_id, text=f"Переспрошу завтра в {time_obj.hour}:{time_obj.minute}") else: seconds_delta = timedelta(hours=1) bot_actions.send_message(user_id, text="Переспрошу через час") timer = Timer(seconds_delta.total_seconds(), when_timer_stop, args=(True, user_id)) timers.update({user_id: {'timer': timer, 'in_progress': True}}) db_operator.set_user_last_state(user_id, constants.States.S_ENTER_DATA.value) db_operator.set_state(user_id, constants.States.S_USER_WAIT.value) timers[user_id]['timer'].start() print(timers[user_id]['timer'])