Exemplo n.º 1
0
def select_teacher_from_list_reg(message):

    user = core.User(message.chat)

    msg = 'Добре 👍, буду показувати розклад для {}.'.format(message.text)
    user.update_name(message.text) if user.get_full_name() else user.registration(message.text)
    bot.send_message(message.chat.id, msg, reply_markup=keyboard, parse_mode='HTML')
    return
Exemplo n.º 2
0
def clear_cache_audiences(message):

    user = core.User(message.chat)

    if str(user.get_id()) not in settings.ADMINS_ID:
        return

    core.clear_cache_audiences()

    bot.send_message(user.get_id(), 'Кеш розкладу по аудиторіям був очищений.')
Exemplo n.º 3
0
def clear_cache(message):

    user = core.User(message.chat)

    if str(user.get_id()) not in settings.ADMINS_ID:
        return

    core.Cache.clear_cache()

    bot.send_message(user.get_id(), 'Кеш пар був очищений.')
Exemplo n.º 4
0
def cache_info(message):

    user = core.User(message.chat)

    if str(user.get_id()) not in settings.ADMINS_ID:
        return

    cache_items_count = len(core.Cache.get_keys() or '')

    bot.send_message(user.get_id(), 'In cache: {} units'.format(cache_items_count))
Exemplo n.º 5
0
def week_schedule_handler(call_back):

    user = core.User(call_back.message.chat)
    user_name = user.get_full_name()
    req = call_back.data

    today = datetime.date.today()
    current_week_day_number = today.isoweekday()
    diff_between_saturday_and_today = 6 - current_week_day_number
    last_week_day = today + datetime.timedelta(
        days=diff_between_saturday_and_today)

    next_week_first_day = today + datetime.timedelta(
        days=diff_between_saturday_and_today + 2)
    next_week_last_day = today + datetime.timedelta(
        days=diff_between_saturday_and_today + 7)

    if req == 'Поточний':
        timetable_data = get_timetable(
            teacher=user_name,
            sdate=today.strftime('%d.%m.%Y'),
            edate=last_week_day.strftime('%d.%m.%Y'),
            user_id=user.get_id())
    if req == 'Наступний':
        timetable_data = get_timetable(
            teacher=user_name,
            sdate=next_week_first_day.strftime('%d.%m.%Y'),
            edate=next_week_last_day.strftime('%d.%m.%Y'),
            user_id=user.get_id())

    timetable_for_week = ''

    if timetable_data:
        for timetable_day in timetable_data:
            timetable_for_week += render_day_timetable(timetable_day)

        bot.delete_message(chat_id=user.get_id(),
                           message_id=call_back.message.message_id)

    elif isinstance(timetable_data, list) and not len(timetable_data):
        bot.delete_message(chat_id=user.get_id(),
                           message_id=call_back.message.message_id)
        timetable_for_week = "На тиждень пар не знайдено."

    else:
        return

    bot.send_message(text=timetable_for_week[:4090],
                     chat_id=user.get_id(),
                     parse_mode="HTML",
                     reply_markup=keyboard)
Exemplo n.º 6
0
def user_create():
    data = request.json
    username = data['username']
    email = data['email']
    password = auth.gen_password_hash(data['password'])

    db.session.add(core.User(
        username=username,
        email=email,
        password=password,
    ))
    db.session.commit()

    return jsonify({'message': 'created'}), 201
Exemplo n.º 7
0
def unpack_user_list_response_content(msg):
	user_list = {}

	offset = 5
	while offset < len(msg):
		client_id, client_group, username, ip_int, port = struct.unpack_from(">BB8sLH", msg, offset)

		ip = socket.inet_ntoa(struct.pack('>L',ip_int))
		username = username.decode().strip()

		user_list[client_id] = core.User(client_id, username, client_group, (ip,port))

		offset += 16
	return user_list
Exemplo n.º 8
0
def set_name(message):

    user = core.User(message.chat)
    name = message.text

    if name == 'Відміна':
        current_user_group = user.get_full_name()
        bot.send_message(message.chat.id, 'Добре, залишимо налаштування для {}.'.format(current_user_group),
                         reply_markup=keyboard)
        return

    teachers_list = []

    try:
        with open(os.path.join(settings.BASE_DIR, 'teachers.txt'), 'r', encoding="utf-8") as file:
            all_teachers = json.loads(file.read())
    except Exception as ex:
        bot.send_message('204560928', 'Помилка в роботі бота. Можливо відсутній файл із викладачами.')
        bot.send_message(message.chat.id, 'Під час роботи виникла помилка. Розробник отримав сповіщення.',
                         reply_markup=keyboard)
        core.log(m='Помилка завантаження файлу із викладачами: {}'.format(str(ex)))
        return

    for teacher in all_teachers:
        if teacher.split()[0].upper() == message.text.upper().split()[0]:
            teachers_list.append(teacher)

    if not teachers_list:

        sent = bot.send_message(message.chat.id, 'Не можу знайти викладача з таким прізвищем. Спробуйте ще раз.')
        bot.register_next_step_handler(sent, set_name)
        return

    if len(teachers_list) == 1:
        msg = 'Добро 👍, буду показувати розклад для {}.'.format(teachers_list[0])
        user.update_name(teachers_list[0]) if user.get_full_name() else user.registration(teachers_list[0])
        bot.send_message(message.chat.id, msg, reply_markup=keyboard, parse_mode='HTML')
        return

    if len(teachers_list) > 1:
        teachers_keyboard = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True)
        for teacher in teachers_list:
            teachers_keyboard.row(teacher)

        sent = bot.send_message(message.chat.id, 'Виберіть із списку:', reply_markup=teachers_keyboard)
        bot.register_next_step_handler(sent, select_teacher_from_list_reg)
Exemplo n.º 9
0
def get_logs(message):

    user = core.User(message.chat)

    if str(user.get_id()) not in settings.ADMINS_ID:
        bot.send_message(user.get_id(), 'Немає доступу :(')
        return

    if len(message.text.split()) == 2:
        count = int(message.text.split()[1])
    else:
        count = 65

    with open(os.path.join(settings.BASE_DIR, 'bot_log.txt'), 'r', encoding="utf-8") as log_file:
        log_lines = log_file.readlines()

    logs = ''

    for line in log_lines[-count:]:
        logs += line

    bot.send_message(user.get_id(), logs, reply_markup=keyboard)
Exemplo n.º 10
0
def main_menu(message):

    bot.send_chat_action(message.chat.id, "typing")

    user = core.User(message.chat)
    user_name = user.get_full_name()
    request = message.text

    core.log(message.chat, '> {}'.format(message.text))

    if user_name:

        def is_date_request_or_other():

            if re.search(r'^(\d{1,2})\.(\d{1,2})$', request) or \
               re.search(r'^(\d{1,2})\.(\d{1,2})-(\d{1,2})\.(\d{1,2})$', request) or \
               re.search(r'^(\d{1,2})\.(\d{1,2})\.(\d{2,4})$', request) or \
               re.search(r'^(\d{1,2})\.(\d{1,2})\.(\d{2,4})-(\d{1,2})\.(\d{1,2})\.(\d{2,4})$', request):

                return 'FOR_A_DATE'

            return 'OTHER'

        # Reversed keys and values in dictionary
        request_code = {v: k
                        for k, v in KEYBOARD.items()
                        }.get(request, is_date_request_or_other())
        core.MetricsManager.track(user.get_id(), request_code, user_name)

        if request == KEYBOARD['TODAY']:

            today = datetime.date.today().strftime('%d.%m.%Y')

            timetable_data = get_timetable(teacher=user_name,
                                           user_id=user.get_id(),
                                           sdate=today,
                                           edate=today)

            if timetable_data:
                timetable_for_today = render_day_timetable(timetable_data[0])
            elif isinstance(timetable_data, list) and not len(timetable_data):
                timetable_for_today = "На сьогодні пар не знайдено."
            else:
                return

            bot.send_message(user.get_id(),
                             timetable_for_today,
                             parse_mode='HTML',
                             reply_markup=keyboard)

        elif request == KEYBOARD['TOMORROW']:  # Tomorrow

            tomorrow = datetime.date.today() + datetime.timedelta(days=1)
            tom_day = tomorrow.strftime('%d.%m.%Y')

            timetable_data = get_timetable(teacher=user_name,
                                           sdate=tom_day,
                                           edate=tom_day,
                                           user_id=user.get_id())

            if timetable_data:
                timetable_for_tomorrow = render_day_timetable(
                    timetable_data[0])
            elif isinstance(timetable_data, list) and not len(timetable_data):
                timetable_for_tomorrow = "На завтра пар не знайдено."
            else:
                return

            bot.send_message(user.get_id(),
                             timetable_for_tomorrow,
                             parse_mode='HTML',
                             reply_markup=keyboard)

        elif request == KEYBOARD['FOR_A_WEEK']:  # For a week

            if datetime.date.today().isoweekday() in (5, 6, 7):  # пт, сб, нд

                timetable_for_week = ''
                today = datetime.date.today()
                current_week_day_number = today.isoweekday()
                diff_between_saturday_and_today = 6 - current_week_day_number
                next_week_first_day = today + datetime.timedelta(
                    days=diff_between_saturday_and_today + 2)
                next_week_last_day = today + datetime.timedelta(
                    days=diff_between_saturday_and_today + 7)

                timetable_data = get_timetable(
                    teacher=user_name,
                    sdate=next_week_first_day.strftime('%d.%m.%Y'),
                    edate=next_week_last_day.strftime('%d.%m.%Y'),
                    user_id=user.get_id())

                if timetable_data:
                    for timetable_day in timetable_data:
                        timetable_for_week += render_day_timetable(
                            timetable_day)

                elif isinstance(timetable_data,
                                list) and not len(timetable_data):
                    timetable_for_week = "На тиждень, з {} по {} пар не знайдено.".format(
                        next_week_first_day.strftime('%d.%m'),
                        next_week_last_day.strftime('%d.%m'))

                bot.send_message(text=timetable_for_week[:4090],
                                 chat_id=user.get_id(),
                                 reply_markup=keyboard,
                                 parse_mode="HTML")

                return

            week_type_keyboard = telebot.types.InlineKeyboardMarkup()
            week_type_keyboard.row(*[
                telebot.types.InlineKeyboardButton(text=name,
                                                   callback_data=name)
                for name in ["Поточний", "Наступний"]
            ])

            bot.send_message(user.get_id(),
                             'На який тиждень?',
                             reply_markup=week_type_keyboard)

        elif request == KEYBOARD['TIMETABLE']:

            t = ''
            t += '{} - 8:00 - 9:20\n'.format(emoji_numbers[1])
            t += '{} - 9:30 - 10:50\n'.format(emoji_numbers[2])
            t += '{} - 11:10 - 12:30\n'.format(emoji_numbers[3])
            t += '{} - 12:40 - 14:00\n'.format(emoji_numbers[4])
            t += '{} - 14:10 - 15:30 \n'.format(emoji_numbers[5])

            bot.send_message(user.get_id(), t, reply_markup=keyboard)

        elif request == KEYBOARD['CHANGE_NAME']:

            user_group = user.get_full_name()

            cancel_kb = telebot.types.ReplyKeyboardMarkup(
                resize_keyboard=True, one_time_keyboard=True)
            cancel_kb.row('Відміна')

            msg = 'Збережене ім\'я: {}\nЩоб змінити, введіть нове прізвище'.format(
                user_group)

            sent = bot.send_message(message.chat.id,
                                    msg,
                                    parse_mode='HTML',
                                    reply_markup=cancel_kb)
            bot.register_next_step_handler(sent, set_name)

        elif request == KEYBOARD['HELP']:

            msg = "Для пошуку по датам : <b>15.05</b>, <b>15.05-22.05</b>, <b>1.1.18-10.1.18</b>\n\n" \
                  "<b>Ім`я:</b> <code> {}</code>\n\n" \
                  "<b>Канал:</b> @********\n" \
                  "<b>Новини коледжу:</b> @*********\n" \
                  "<b>Розробник:</b> @***_CBA_Bot\n"

            kb = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True,
                                                   one_time_keyboard=True)
            kb.row(KEYBOARD['MAIN_MENU'])
            kb.row(KEYBOARD['CHANGE_NAME'])

            bot.send_message(message.chat.id,
                             msg.format(user.get_full_name()),
                             reply_markup=kb,
                             parse_mode='HTML')

        elif request == KEYBOARD['FOR_A_GROUP']:
            sent = bot.send_message(
                message.chat.id,
                'Для того щоб подивитись розклад будь якої групи на тиждень введіть її назву (Приклад: 029-18-1)'
            )
            bot.register_next_step_handler(sent, show_other_group)

        elif request == KEYBOARD['IN_AUDIENCE']:

            now_time = datetime.datetime.now().time()

            lessons_time = (
                {
                    'start_time': (8, 0),
                    'end_time': (9, 20)
                },
                {
                    'start_time': (9, 30),
                    'end_time': (10, 50)
                },
                {
                    'start_time': (11, 10),
                    'end_time': (12, 30)
                },
                {
                    'start_time': (12, 40),
                    'end_time': (14, 0)
                },
                {
                    'start_time': (14, 10),
                    'end_time': (15, 30)
                },
            )

            breaks_time = (
                {
                    'start_time': (7, 50),
                    'end_time': (8, 0)
                },
                {
                    'start_time': (9, 20),
                    'end_time': (9, 30)
                },
                {
                    'start_time': (10, 50),
                    'end_time': (11, 10)
                },
                {
                    'start_time': (12, 30),
                    'end_time': (12, 40)
                },
                {
                    'start_time': (14, 00),
                    'end_time': (15, 10)
                },
            )

            current_lesson = 0
            current_break = -1

            for i, lesson in enumerate(lessons_time):
                if datetime.time(
                        *lesson['start_time']) <= now_time <= datetime.time(
                            *lesson['end_time']):
                    current_lesson = i + 1
                    break

            else:
                for i, _break in enumerate(breaks_time):
                    if datetime.time(*_break['start_time']
                                     ) <= now_time <= datetime.time(
                                         *_break['end_time']):
                        current_break = i
                        break
                else:
                    bot.send_message(message.chat.id,
                                     'Час відпочивати.',
                                     parse_mode='HTML',
                                     reply_markup=keyboard)
                    return

            msg = ''
            show_for_lesson = 0

            if current_lesson:
                msg = '\U0001F550 Зараз {} пара.'.format(current_lesson)
                show_for_lesson = current_lesson
            elif current_break >= 0:
                msg = '\U0001F6B6 Зараз перерва, далі {} пара'.format(
                    current_break + 1)
                show_for_lesson = current_break + 1

            msg += '\n\n'

            for audience in (319, 320, 321, 323, 324, 325, 326, 327, 328):
                lesson = core.get_lesson_in_audience(audience, show_for_lesson)

                if lesson:
                    msg += '\U0001F4BB <b>{}</b>\n'.format(audience)
                    msg += '<b>{}</b> ({}) > {} ({})\n\n'.format(
                        lesson['group'], lesson['teacher'], lesson['title'],
                        lesson['type'])

            bot.send_message(message.chat.id,
                             msg,
                             parse_mode='HTML',
                             reply_markup=keyboard)

        elif request == KEYBOARD['FOR_A_TEACHER']:

            sent = bot.send_message(
                message.chat.id,
                'Для того щоб подивитись розклад викладача на поточний тиждень - '
                'введіть його прізвище.')
            bot.register_next_step_handler(sent, select_teachers)

        elif request == KEYBOARD['FOR_A_AUDIENCE']:

            msg = 'Для того щоб подивитись розклад у аудиторії - виберіть потрібну із списку:'

            kb = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True,
                                                   one_time_keyboard=True)

            kb.row(KEYBOARD['MAIN_MENU'], '113', 'Всі')
            kb.row('319', '320', '321')
            kb.row('323', '324', '325')
            kb.row('326', '327', '328')

            sent = bot.send_message(message.chat.id, msg, reply_markup=kb)
            bot.register_next_step_handler(sent, show_in_audience)

        elif re.search(r'^(\d{1,2})\.(\d{1,2})$', request):

            date = request + '.' + str(datetime.date.today().year)
            timetable_data = get_timetable(teacher=user_name,
                                           edate=date,
                                           sdate=date,
                                           user_id=user.get_id())

            if timetable_data:
                timetable_for_date = render_day_timetable(timetable_data[0])
            elif isinstance(timetable_data, list) and not len(timetable_data):
                msg = 'Щоб подивитися розклад на конкретний день, введіть дату в такому форматі:' \
                      '\n<b>05.03</b> або <b>5.3</b>\nПо кільком дням: \n<b>5.03-15.03</b>\n' \
                      '\nДата вводиться без пробілів (день.місяць)<b> рік вводити не обов\'язково</b> ' \

                timetable_for_date = 'На <b>{}</b>, для <b>{}</b> пар не знайдено.\n\n{}'.format(
                    date, user_name, msg)
            else:
                return

            bot.send_message(message.chat.id,
                             timetable_for_date,
                             parse_mode='HTML',
                             reply_markup=keyboard)

        elif re.search(r'^(\d{1,2})\.(\d{1,2})-(\d{1,2})\.(\d{1,2})$',
                       request):

            s_date = message.text.split('-')[0] + '.' + str(
                datetime.date.today().year)
            e_date = message.text.split('-')[1] + '.' + str(
                datetime.date.today().year)
            timetable_for_days = ''
            timetable_data = get_timetable(teacher=user_name,
                                           sdate=s_date,
                                           edate=e_date,
                                           user_id=user.get_id())

            if timetable_data:
                for timetable_day in timetable_data:
                    timetable_for_days += render_day_timetable(timetable_day)

            elif isinstance(timetable_data, list) and not len(timetable_data):
                msg = 'Щоб подивитися розклад на конкретний день, введіть дату в такому форматі:' \
                      '\n<b>05.03</b> або <b>5.3</b>\nПо кільком дням: \n<b>5.03-15.03</b>\n' \
                      '\nДата вводиться без пробілів (день.місяць)<b> рік вводити не обов\'язково</b> '
                timetable_for_days = 'На <b>{} - {}</b>, для <b>{}</b> пар не знайдено.\n\n{}'.format(
                    s_date, e_date, user_name, msg)
            else:
                return

            bot.send_message(user.get_id(),
                             timetable_for_days[:4090],
                             parse_mode='HTML',
                             reply_markup=keyboard)

        elif re.search(r'^(\d{1,2})\.(\d{1,2})\.(\d{2,4})$', request):

            date = request
            timetable_data = get_timetable(teacher=user_name,
                                           edate=date,
                                           sdate=date,
                                           user_id=user.get_id())

            if timetable_data:
                timetable_for_date = render_day_timetable(timetable_data[0])
            elif isinstance(timetable_data, list) and not len(timetable_data):
                msg = 'Щоб подивитися розклад на конкретний день, введіть дату в такому форматі:' \
                      '\n<b>05.03</b> або <b>5.3</b>\nПо кільком дням: \n<b>5.03-15.03</b>\n' \
                      '\nДата вводиться без пробілів (день.місяць)<b> рік вводити не обо\'язково</b> ' \

                timetable_for_date = 'На <b>{}</b>, для <b>{}</b> пар не знайдено.\n\n{}'.format(
                    date, user_name, msg)
            else:
                return

            bot.send_message(message.chat.id,
                             timetable_for_date,
                             parse_mode='HTML',
                             reply_markup=keyboard)

        elif re.search(
                r'^(\d{1,2})\.(\d{1,2})\.(\d{2,4})-(\d{1,2})\.(\d{1,2})\.(\d{2,4})$',
                request):

            s_date = request.split('-')[0]
            e_date = request.split('-')[1]
            timetable_for_days = ''
            timetable_data = get_timetable(teacher=user_name,
                                           sdate=s_date,
                                           edate=e_date,
                                           user_id=user.get_id())

            if timetable_data:
                for timetable_day in timetable_data:
                    timetable_for_days += render_day_timetable(timetable_day)

            elif isinstance(timetable_data, list) and not len(timetable_data):
                msg = 'Щоб подивитися розклад на конкретний день, введіть дату в такому форматі:' \
                      '\n<b>05.03</b> або <b>5.3</b>\nПо кільком дням: \n<b>5.03-15.03</b>\n' \
                      '\nДата вводиться без пробілів (день.місяць)<b> рік вводити не обов`язково</b> '
                timetable_for_days = 'На <b>{} - {}</b>, для <b>{}</b> пар не знайдено.\n\n{}'.format(
                    s_date, e_date, user_name, msg)
            else:
                return

            bot.send_message(user.get_id(),
                             timetable_for_days,
                             parse_mode='HTML',
                             reply_markup=keyboard)

        elif request == KEYBOARD['MAIN_MENU']:
            bot.send_message(user.get_id(),
                             'Меню так меню',
                             reply_markup=keyboard)

        else:
            answers = [
                'м?', 'хм.. \U0001F914', 'не розумію(',
                'виберіть потрібне в меню'
            ]
            bot.send_message(user.get_id(),
                             random.choice(answers),
                             reply_markup=keyboard)

    else:
        bot.send_message(user.get_id(), 'Для початку роботи введіть /start')
Exemplo n.º 11
0
    ##### Logger Settings #####
    logFormatter    = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")
    logger          = logging.getLogger()
    logger.setLevel(logging.INFO)

    fileLog         = os.path.splitext("/var/log/" + os.path.basename(__file__))[0] + ".log"
    fileHandler     = RotatingFileHandler(fileLog, maxBytes=1000, backupCount=5)  # Max 6 mb of logs
    fileHandler.setFormatter(logFormatter)
    logger.addHandler(fileHandler)

    consoleHandler  = logging.StreamHandler()
    consoleHandler.setFormatter(logFormatter)
    logger.addHandler(consoleHandler)
    ###########################
    try:
        user = core.User()
        
        #Login
        login = user.auth()
        #logger.info(login['message']) if login['code'] == 200 else logger.error(login) and exit(1)
        
        #get Me
        myprofile = user.me()
        #logger.info(myprofile['message']) if myprofile['code'] == 200 else logger.error(myprofile) and exit(1)

        #get ADS
        myads = user.getAds()
        #logger.info(myads['message']) if myads['code'] == 200 else logger.error(myads) and exit(1)
        totalAds = len(myads['message'])
#        if totalAds:
#            for i in myads['message']: