Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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'])
Esempio n. 4
0
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]}')
Esempio n. 5
0
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)
Esempio n. 6
0
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'])