예제 #1
0
def command_auto_posting_off(m):
    # Статистика
    if config['STATISTIC_TOKEN'] != '':
        track(config['STATISTIC_TOKEN'], m.chat.id, m.text, 'auto_posting_off')
    else:
        logger.info('auto_posting_off')

    cid = m.chat.id

    try:
        db = ScheduleDB(config)
        user = db.find_user(cid)
        if not user:
            bot.send_message(
                cid,
                "Вас ещё нет в базе данных, поэтому пройдите простую процедуру регистрации"
            )
            command_registration(m)
            return

        if db.set_auto_post_time(cid, None, None):
            bot.send_message(
                cid, "Автоматическая отправка расписания успешно отключена")
        else:
            bot.send_message(
                cid,
                "Случилось что то странное, попробуйте ввести команду заново",
                reply_markup=get_date_keyboard())

    except BaseException as e:
        logger.warning('command auto_posting_off: {0}'.format(str(e)))
        bot.send_message(
            cid, "Случилось что то странное, попробуйте ввести команду заново")
예제 #2
0
def command_start(m):
    # Статистика
    if config['STATISTIC_TOKEN'] != '':
        track(config['STATISTIC_TOKEN'], m.chat.id, m.text, 'start')
    else:
        logger.info('start')

    cid = m.chat.id
    command_help(m)

    try:
        with ScheduleDB(config) as db:
            user = db.find_user(cid)
        if user and user[0] is not None:
            bot.send_message(cid,
                             "Вы уже добавлены в базу данных",
                             reply_markup=get_date_keyboard())
        else:
            bot.send_message(
                cid,
                "Вас ещё нет в базе данных, поэтому пройдите простую процедуру регистрации"
            )
            command_registration(m)
    except BaseException as e:
        logger.warning('command start: {0}'.format(str(e)))
        bot.send_message(
            cid,
            "Случилось что то странное, попробуйте ввести команду заново",
            reply_markup=get_date_keyboard())
예제 #3
0
def command_registration(m):
    cid = m.chat.id

    # Процедура регистрации проходит в четрые этапа:
    # 1 этап: выбор учебного заведения <--
    # 2 этап: выбор факультета
    # 3 этап: выбор группы
    # 4 этап: добавление данных о принадлежности пользователя к учебному заведению в БД
    try:
        # Статистика
        if config['STATISTIC_TOKEN'] != '':
            track(config['STATISTIC_TOKEN'], cid, 'stage 1',
                  'registration-stage-1')

        keyboard = types.InlineKeyboardMarkup()

        with ScheduleDB(config) as db:
            result = db.get_organizations()
        for row in result:
            callback_button = types.InlineKeyboardButton(
                text=str(row[0]),
                callback_data="reg:stage 2:{0}".format(
                    str(row[1])[:organization_field_length]))
            keyboard.add(callback_button)

        bot.send_message(cid, "Выберите университет:", reply_markup=keyboard)
    except BaseException as e:
        logger.warning('Registration problem: {0}'.format(str(e)))
        bot.send_message(
            cid,
            "Случилось что-то странное, попробуйте начать сначала, введя команду /registration"
        )
예제 #4
0
def command_send_report(m):
    # Статистика
    if config['STATISTIC_TOKEN'] != '':
        track(config['STATISTIC_TOKEN'], m.chat.id, m.text, 'report')
    else:
        logger.info('report')

    cid = m.chat.id
    data = m.text.split("/send_report")

    if data[1] != '':
        report = data[1]
        with ScheduleDB(config) as db:
            if db.add_report(cid, report):
                bot.send_message(cid, "Сообщение принято")
            else:
                bot.send_message(
                    cid,
                    "Случилось что то странное, попробуйте ввести команду заново",
                    reply_markup=get_date_keyboard())
    else:
        bot.send_message(
            cid,
            "Вы отправили пустую строку. Пример: /send_report <сообщение>",
            reply_markup=get_date_keyboard())
예제 #5
0
def command_help(m):
    # Статистика
    if config['STATISTIC_TOKEN'] != '':
        track(config['STATISTIC_TOKEN'], m.chat.id, m.text, 'help')
    else:
        logger.info('help')

    cid = m.chat.id
    help_text = "Доступны следующие команды: \n"
    for key in commands:
        help_text += "/" + key + ": "
        help_text += commands[key] + "\n"
    bot.send_message(cid, help_text, reply_markup=get_date_keyboard())

    help_text = (
        'Описание кнопок:\nКнопка "Сегодня", как это ни странно выводит расписание на сегодняшний день, '
        'причём с учётом типа недели (числитель/знаменатель), но есть один нюанс: если сегодня воскресенье '
        'или время больше чем 21:30, то выводится расписание на следующий день\n'
    )
    bot.send_message(cid, help_text, reply_markup=get_date_keyboard())

    guide_url = 'https://github.com/paladin-705/UniversityScheduleBot/wiki/Guide'

    help_text = 'Более подробную инструкцию и описание команд (с инструкциями гифками! ^_^) \
    вы можете посмотреть по ссылке: {}'.format(guide_url)
    bot.send_message(cid, help_text, reply_markup=get_date_keyboard())
예제 #6
0
def send_schedule(users, current_time, day, week_type):
    blacklist = config.get('bot', 'VK_ID_BLACKLIST').split(',')

    if users is None:
        return None
    try:
        count = 0
        for user in users:
            uid = user[0]
            tag = user[1]

            if str(uid) in blacklist:
                continue

            schedule, is_empty = create_schedule_text(tag, day, week_type)
            if is_empty:
                continue
            vkapi.send_auto_posting_message(uid, config.get('bot', 'TOKEN'),
                                            schedule)
            count += 1

            # Статистика
            track(config.get('bot', 'STATISTIC_TOKEN'), uid, current_time,
                  'auto_posting')

            if count > 20:
                count = 0
                sleep(1)
    except BaseException as e:
        vkapi.send_error_message(config.get('bot', 'ADMIN_VK_ID'),
                                 config.get('bot', 'TOKEN'), str(e))
예제 #7
0
def callback_registration(call):
    cid = call.message.chat.id

    # Парсинг сообщения указывающего стадию регистрации
    # reg : stage : tag
    callback_data = re.split(r':', call.data)

    # Процедура регистрации проходит в четрые этапа:
    # 1 этап: выбор учебного заведения
    # 2 этап: выбор факультета
    # 3 этап: выбор группы
    # 4 этап: добавление данных о принадлежности пользователя к учебному заведению в БД <--
    try:
        # Статистика
        if config['STATISTIC_TOKEN'] != '':
            track(config['STATISTIC_TOKEN'], cid, 'stage 4',
                  'registration-stage-4')

        group_id = callback_data[2]

        db = ScheduleDB(config)

        row = db.get_group(group_id)
        user = db.find_user(cid)

        if user:
            db.update_user(cid, call.message.chat.first_name,
                           call.message.chat.username, str(row[0][1]))
        else:
            db.add_user(cid, call.message.chat.first_name,
                        call.message.chat.username, str(row[0][1]))

        bot.send_message(
            cid,
            "Отлично, вы зарегистрировались, ваша группа: " + row[0][0] +
            "\nЕсли вы ошиблись, то просто введиде команду /registration и измените данные",
            reply_markup=get_date_keyboard())
        bot.send_message(
            cid,
            "Теперь вы можете настроить автоматическую отправку расписания в заданное вами время,"
            " введя команду /auto_posting_on <время>, "
            "где <время> должно иметь формат ЧЧ:ММ")

    except BaseException as e:
        logger.warning('Registration problem: {0}'.format(str(e)))
        bot.send_message(
            cid,
            "Случилось что-то странное, попробуйте начать сначала, введя команду /registration"
        )
예제 #8
0
def command_auto_posting_on(m):
    # Статистика
    if config['STATISTIC_TOKEN'] != '':
        track(config['STATISTIC_TOKEN'], m.chat.id, m.text, 'auto_posting_on')
    else:
        logger.info('auto_posting_on')

    cid = m.chat.id

    try:
        data = m.text.split("/auto_posting_on")[1].strip()
        if re.match(data, r'\d{1,2}:\d\d'):
            raise BaseException
    except:
        bot.send_message(
            cid,
            "Вы отправили пустую строку или строку неправильного формата. Правильный формат ЧЧ:ММ",
            reply_markup=get_date_keyboard())
        return None

    try:
        db = ScheduleDB(config)
        user = db.find_user(cid)
        if user and user[0] is not None:
            keyboard = types.InlineKeyboardMarkup()
            callback_button = types.InlineKeyboardButton(
                text="На Сегодня", callback_data="ap:{0}:1".format(data))
            keyboard.add(callback_button)
            callback_button = types.InlineKeyboardButton(
                text="На Завтра", callback_data="ap:{0}:0".format(data))
            keyboard.add(callback_button)

            bot.send_message(
                cid,
                "Выберите день на который будет приходить расписание:",
                reply_markup=keyboard)
        else:
            bot.send_message(
                cid,
                "Вас ещё нет в базе данных, поэтому пройдите простую процедуру регистрации"
            )
            command_registration(m)
    except BaseException as e:
        logger.warning('command auto_posting_on: {0}'.format(str(e)))
        bot.send_message(
            cid, "Случилось что то странное, попробуйте ввести команду заново")
예제 #9
0
def exams(m):
    cid = m.chat.id

    # Статистика
    track(config['STATISTIC_TOKEN'], cid, m.text, 'exams')

    # Если пользователя нет в базе, то ему выведет предложение зарегистрироваться
    try:
        with ScheduleDB(config) as db:
            user = db.find_user(cid)
        if not user or user[0] is None:
            message = "Вас ещё нет в базе данных, поэтому пройдите простую процедуру регистрации:\n"
            message += 'Введите команду(без кавычек):\n\nрегистрация "название вуза" "факультет" "группа"\n\n'
            message += 'Если вы допустите ошибку, то просто наберите команду заново.\n'

            bot.send_message(cid, message, reply_markup=get_date_keyboard())
    except BaseException as e:
        bot.send_message(
            cid,
            'Случилось что то странное, попробуйте ввести команду заново',
            reply_markup=get_date_keyboard())

    try:
        with ScheduleDB(config) as db:
            exams_list = db.get_exams(user[0])

        message = ''
        for exam in exams_list:
            message += exam[0].strftime('%d.%m.%Y') + ":\n"

            title = ' '.join(str(exam[1]).split())
            lecturer = ' '.join(str(exam[2]).split())
            classroom = ' '.join(str(exam[3]).split())

            message += title + ' | ' + lecturer + ' | ' + classroom + "\n"
            message += "------------\n"
        if len(message) == 0:
            message = 'Похоже расписания экзаменов для вашей группы нет в базе'

    except BaseException as e:
        message = "Случилось что то странное, попробуйте ввести команду заново"

    bot.send_message(cid, message, reply_markup=get_date_keyboard())
예제 #10
0
def callback_registration(call):
    cid = call.message.chat.id

    # Парсинг сообщения указывающего стадию регистрации
    # reg : stage : tag
    callback_data = re.split(r':', call.data)

    # Процедура регистрации проходит в четрые этапа:
    # 1 этап: выбор учебного заведения
    # 2 этап: выбор факультета <--
    # 3 этап: выбор группы
    # 4 этап: добавление данных о принадлежности пользователя к учебному заведению в БД
    try:
        # Статистика
        if config['STATISTIC_TOKEN'] != '':
            track(config['STATISTIC_TOKEN'], cid, 'stage 2',
                  'registration-stage-2')

        keyboard = types.InlineKeyboardMarkup()

        organization_id = callback_data[2]

        with ScheduleDB(config) as db:
            result = db.get_faculty(organization_id)

        for row in result:
            callback_button = types.InlineKeyboardButton(
                text=str(row[0]),
                callback_data="reg:stage 3:{0}".format(
                    str(row[1])[:organization_field_length +
                                faculty_field_length]))
            keyboard.add(callback_button)

        bot.send_message(cid, "Выберите факультет:", reply_markup=keyboard)
    except BaseException as e:
        logger.warning('Registration problem: {0}'.format(str(e)))
        bot.send_message(
            cid,
            "Случилось что-то странное, попробуйте начать сначала, введя команду /registration"
        )
예제 #11
0
def response_msg(m):
    cid = m.chat.id
    if m.text in ScheduleType:
        # Статистика
        if config['STATISTIC_TOKEN'] != '':
            track(config['STATISTIC_TOKEN'], m.chat.id, m.text, 'schedule')
        else:
            logger.info('message: {0}'.format(m.text))

        # По умолчанию week_type равен -1 и при таком значении будут выводится все занятия,
        # т.е и для чётных и для нечётных недель
        week_type = -1

        if m.text == "Вся неделя":
            days = ScheduleType[m.text]
        elif m.text == "Сегодня":
            today = datetime.now()
            # Если запрашивается расписание на сегодняшний день,
            # то week_type равен остатку от деления на 2 номера недели в году, т.е он определяет чётная она или нечётная
            week_type = get_week_type(today)

            # Если сегодня воскресенье, то показывается расписание на понедельник следующей недели
            # Также в этом случае, как week_type используется тип следующей недели
            if datetime.weekday(today) == 6:
                today += timedelta(days=1)
                week_type = (week_type + 1) % 2

            days = [daysOfWeek[datetime.weekday(today)]]
        elif m.text == 'Завтра':
            tomorrow = datetime.now()
            tomorrow += timedelta(days=1)
            # Если запрашивается расписание на сегодняшний день,
            # то week_type равен остатку от деления на 2 номера недели в году, т.е он определяет чётная она или нечётная
            week_type = get_week_type(tomorrow)

            # Если сегодня воскресенье, то показывается расписание на понедельник следующей недели
            # Также в этом случае, как week_type используется тип следующей недели
            if datetime.weekday(tomorrow) == 6:
                tomorrow += timedelta(days=1)
                week_type = (week_type + 1) % 2

            days = [daysOfWeek[datetime.weekday(tomorrow)]]
        else:
            days = [ScheduleType[m.text]]

        for day in days:
            try:
                with ScheduleDB(config) as db:
                    user = db.find_user(cid)
                if user and user[0] is not None:
                    result = create_schedule_text(user[0], day, week_type)
                    for schedule in result:
                        bot.send_message(cid,
                                         schedule,
                                         reply_markup=get_date_keyboard())
                else:
                    bot.send_message(
                        cid,
                        "Вас ещё нет в базе данных, поэтому пройдите простую процедуру регистрации"
                    )
                    command_registration(m)
            except BaseException as e:
                logger.warning('response_msg: {0}'.format(str(e)))
                bot.send_message(
                    cid,
                    "Случилось что то странное, попробуйте ввести команду заново"
                )
    else:
        # Статистика
        if config['STATISTIC_TOKEN'] != '':
            track(config['STATISTIC_TOKEN'], m.chat.id, m.text, 'unknown')
        else:
            logger.info('unknown message: {0}'.format(m.text))

        bot.send_message(cid,
                         "Неизвестная команда",
                         reply_markup=get_date_keyboard())