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
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(), 'Кеш розкладу по аудиторіям був очищений.')
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(), 'Кеш пар був очищений.')
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))
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)
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
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
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)
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)
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')
##### 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']: