From ee3b23ad59fe4f0b700dcdc14030bbde9a0218d7 Mon Sep 17 00:00:00 2001 From: kr0sh512 Date: Sun, 1 Sep 2024 00:52:33 +0300 Subject: [PATCH] refactor --- admin.py | 24 +++-- for_json.py | 276 +++++++++++++++++++++++++++----------------------- json/tmp.json | 42 ++++++++ schedules.py | 10 +- 4 files changed, 211 insertions(+), 141 deletions(-) create mode 100644 json/tmp.json diff --git a/admin.py b/admin.py index 6fd75a1..c47129e 100644 --- a/admin.py +++ b/admin.py @@ -1,12 +1,15 @@ import schedules as bot -admin_id = '856850518' +admin_id = "856850518" + def admin_command(func): def wrapper(*args, **kwargs): message = args[0] if str(message.from_user.id) != admin_id: - bot.send_message(message.from_user.id, 'Команда доступна только администратору') + bot.send_message( + message.from_user.id, "Команда доступна только администратору" + ) return func(*args, **kwargs) @@ -14,15 +17,20 @@ def admin_command(func): return wrapper + def is_admin(message): - if str(message.from_user.id) == admin_id and message.from_user.id == message.chat.id: + if ( + str(message.from_user.id) == admin_id + and message.from_user.id == message.chat.id + ): return True - + return False + def send_admin_message(text): - bot.send_message(admin_id, '🛑 ' + text) - + bot.send_message(admin_id, "🛑 " + text) + + def send_admin_document(file): - bot.send_document(admin_id, file, '🛑 Admin file') - \ No newline at end of file + bot.send_document(admin_id, file, "🛑 Admin file") diff --git a/for_json.py b/for_json.py index 1ffa9fc..5849588 100644 --- a/for_json.py +++ b/for_json.py @@ -3,38 +3,31 @@ import json, schedule import schedules as bot from datetime import datetime -path_users = "json/users.json" # Нужный путь до json файлов -path_schedule = "json/schedule_2sem.json" +path_users = "json/users.json" # Нужный путь до json файлов +path_schedule = "json/schedule_3sem.json" path_students = "json/students.json" -# path_logs = "json/logs.json" allow_update = True -# Возможно разбиение добавление логов на 2 функции: Распарсирование message/call -# 2) добавление самого текста в json - -# def add_logs(logs): # TODO: реализация добавления логов -# pass -# return def save_user(infos): for i in range(len(infos)): if type(infos[i]) == type(None): - infos[i] = '' + infos[i] = "" infos[i] = str(infos[i]) - + infos = { - "id" : infos[0], - "first_name" : infos[1], - "last_name" : infos[2], - "username" : infos[3], - "group" : infos[4] + "id": infos[0], + "first_name": infos[1], + "last_name": infos[2], + "username": infos[3], + "group": infos[4], } - + data = {} - with open(path_users, 'r', encoding='utf-8') as json_file: + with open(path_users, "r", encoding="utf-8") as json_file: data = json.load(json_file) - + data[infos["id"]] = { "username": infos["username"], "first_name": infos["first_name"], @@ -42,220 +35,245 @@ def save_user(infos): "group": infos["group"], "timeout": "10", "allow_message": "yes", - "thread": "General" + "thread": "General", } - with open(path_users, 'w', encoding='utf-8') as json_file: + with open(path_users, "w", encoding="utf-8") as json_file: json.dump(data, json_file, ensure_ascii=False, indent=4) - create_schedule_tasks(manual=True) - # bot.send_admin_message("Новый пользователь:\ - # \nuser: @{}\ - # \ngroup: {}\ - # \nid: {}\ - # \nname: {} {}".format(data[infos["id"]]["username"], - # data[infos["id"]]["group"], - # infos["id"], - # data[infos["id"]]["first_name"], - # data[infos["id"]]["last_name"])) - + + create_schedule_tasks() + return + def change_user_param(id, key, value): id = str(id) data = {} - with open(path_users, 'r', encoding='utf-8') as json_file: + with open(path_users, "r", encoding="utf-8") as json_file: data = json.load(json_file) - + data[id][key] = value - with open(path_users, 'w', encoding='utf-8') as json_file: + with open(path_users, "w", encoding="utf-8") as json_file: json.dump(data, json_file, ensure_ascii=False, indent=4) create_schedule_tasks() - bot.send_admin_message("Изменения:\ + bot.send_admin_message( + "Изменения:\ \nuser: @{}\ \nid: {}\ \nkey: {}\ - \nvalue: {}".format(data[id]["username"], id, key, value)) + \nvalue: {}".format( + data[id]["username"], id, key, value + ) + ) return + def parse_lesson(time, lesson): - text = '' + text = "" start, end = time.split("-") - - if len(lesson["infos"].split('|')) == 2: - teacher = lesson["infos"].split('|')[0] - room = lesson["infos"].split('|')[1] - text = '{}-{} | {}\ + + if len(lesson["infos"].split("|")) == 2: + teacher = lesson["infos"].split("|")[0] + room = lesson["infos"].split("|")[1] + text = "{}-{} | {}\ \n{}\ - \n{}'.format(start, end, room, lesson["name"], teacher) - elif len(lesson["infos"].split('|')) == 4: - infos = lesson["infos"].split('|') - text = '{}-{}\ + \n{}".format( + start, end, room, lesson["name"], teacher + ) + elif len(lesson["infos"].split("|")) == 4: + infos = lesson["infos"].split("|") + text = "{}-{}\ \n{}\ \n({}) {}\ - \n({}) {}'.format(start, end, lesson["name"], - infos[1], - infos[0], - infos[3], - infos[2]) - elif len(lesson["infos"].split('|')) == 1: - text = '{}-{}\ - \n{}'.format(start, end, lesson["name"]) + \n({}) {}".format( + start, end, lesson["name"], infos[1], infos[0], infos[3], infos[2] + ) + elif len(lesson["infos"].split("|")) == 1: + text = "{}-{}\ + \n{}".format( + start, end, lesson["name"] + ) else: print("что-то не так") print(lesson["name"]) - + return text + def create_schedule_tasks(manual=False): global allow_update + if not manual: - bot.send_admin_message('Произошёл auto-update') if not allow_update: return - + + bot.send_admin_message("Произошёл auto-update") + allow_update = True - + schedule.clear() users = {} schdl = {} - with open(path_users, 'r', encoding='utf-8') as json_file: + with open(path_users, "r", encoding="utf-8") as json_file: users = json.load(json_file) - with open(path_schedule, 'r', encoding='utf-8') as json_file: - schdl = json.load(json_file) + with open(path_schedule, "r", encoding="utf-8") as json_file: + schdl = json.load(json_file) for id, params in users.items(): - if params['allow_message'] != 'yes': + if params["allow_message"] != "yes": continue - group = params['group'] - if group == 'other': + group = params["group"] + if group == "other": continue - timeout = params['timeout'] + timeout = params["timeout"] for day in schdl[group]: for i, lesson in schdl[group][day].items(): - if lesson["name"] == "": # Неправильный формат schedule + if lesson["name"] == "": # Неправильный формат schedule continue - + start = i.split("-")[0] text = parse_lesson(i, lesson) - - if text == '': + + if text == "": continue - + thread_id = params["thread"] - - delta = '00:' + params["timeout"] - format = '%H:%M' - start_task = datetime.strptime(start, format) - datetime.strptime(delta, format) - tmp = '' - for i in str(start_task).split(':'): - tmp += (('0' + i ) if len(i) < 2 else i) + ":" + + delta = "00:" + params["timeout"] + format = "%H:%M" + start_task = datetime.strptime(start, format) - datetime.strptime( + delta, format + ) + tmp = "" + for i in str(start_task).split(":"): + tmp += (("0" + i) if len(i) < 2 else i) + ":" start_task = tmp[:-1] - - if day == 'mon': - schedule.every().monday.at(start_task).do(bot.send_message, id, text, thread_id, True) - elif day == 'tue': - schedule.every().tuesday.at(start_task).do(bot.send_message, id, text, thread_id, True) - elif day == 'wed': - schedule.every().wednesday.at(start_task).do(bot.send_message, id, text, thread_id, True) - elif day == 'thu': - schedule.every().thursday.at(start_task).do(bot.send_message, id, text, thread_id, True) - elif day == 'fri': - schedule.every().friday.at(start_task).do(bot.send_message, id, text, thread_id, True) - elif day == 'sat': - schedule.every().saturday.at(start_task).do(bot.send_message, id, text, thread_id, True) - + + if day == "mon": + schedule.every().monday.at(start_task).do( + bot.send_message, id, text, thread_id, True + ) + elif day == "tue": + schedule.every().tuesday.at(start_task).do( + bot.send_message, id, text, thread_id, True + ) + elif day == "wed": + schedule.every().wednesday.at(start_task).do( + bot.send_message, id, text, thread_id, True + ) + elif day == "thu": + schedule.every().thursday.at(start_task).do( + bot.send_message, id, text, thread_id, True + ) + elif day == "fri": + schedule.every().friday.at(start_task).do( + bot.send_message, id, text, thread_id, True + ) + elif day == "sat": + schedule.every().saturday.at(start_task).do( + bot.send_message, id, text, thread_id, True + ) + return + def groups_in_json(): schdl = {} - with open(path_schedule, 'r', encoding='utf-8') as json_file: + with open(path_schedule, "r", encoding="utf-8") as json_file: schdl = json.load(json_file) - + return schdl.keys() + def students_in_group(group): group = str(group) - + data = {} - with open(path_users, 'r', encoding='utf-8') as json_file: + with open(path_users, "r", encoding="utf-8") as json_file: data = json.load(json_file) - + students = [] - + for i in data.keys(): if data[i]["group"] == group: students.append(i) - + return students + def students_in_json(id="", key=""): id = str(id) - + group = {} - with open(path_users, 'r', encoding='utf-8') as json_file: + with open(path_users, "r", encoding="utf-8") as json_file: group = json.load(json_file) group = group[id]["group"] - + stud = {} - with open(path_students, 'r', encoding='utf-8') as json_file: + with open(path_students, "r", encoding="utf-8") as json_file: stud = json.load(json_file) stud = stud.get(group) - + if stud == None: return None - + if key == "": return list(stud.keys()) - + return stud[key] def return_infos(id): id = str(id) data = {} - with open(path_users, 'r', encoding='utf-8') as json_file: + with open(path_users, "r", encoding="utf-8") as json_file: data = json.load(json_file) data = data.get(id) - + return data + def pause_bot(): global allow_update + if allow_update: schedule.clear() allow_update = False - bot.send_admin_message('Бот больше не отправляет расписание') + bot.send_admin_message("Бот больше не отправляет расписание") else: create_schedule_tasks(True) allow_update = True - bot.send_admin_message('Бот возобновил рассылку!') - + bot.send_admin_message("Бот возобновил рассылку!") + return + def get_schedule(id, day): id = str(id) - if day == 'sun': - day = 'mon' - days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat'] - russian_days = ['понедельник', 'вторник', 'среду', 'четверг', 'пятницу', 'субботу'] - - text = 'Расписание на {}:\n\n'.format(russian_days[days.index(day)]) + if day == "sun": + day = "mon" + days = ["mon", "tue", "wed", "thu", "fri", "sat"] + russian_days = ["понедельник", "вторник", "среду", "четверг", "пятницу", "субботу"] + + text = "Расписание на {}:\n\n".format(russian_days[days.index(day)]) schdl_today = {} - with open(path_schedule, 'r', encoding='utf-8') as schedule_file: - group = '' - with open(path_users, 'r', encoding='utf-8') as user_file: - group = json.load(user_file)[id]['group'] - - if (group == 'other'): - return 'У тебя не выбрана группа для рассылки сообщений' - + with open(path_schedule, "r", encoding="utf-8") as schedule_file: + group = "" + with open(path_users, "r", encoding="utf-8") as user_file: + group = json.load(user_file)[id]["group"] + + if group == "other": + return "У тебя не выбрана группа для рассылки сообщений" + try: schdl_today = json.load(schedule_file)[group][day] except: - return 'Расписания твоей группы на {} нет'.format(russian_days[days.index(day)]) - + return "Расписания твоей группы на {} нет".format( + russian_days[days.index(day)] + ) + for i, lesson in schdl_today.items(): - text += '•' + parse_lesson(i, lesson) + '\n\n' - + text += "•" + parse_lesson(i, lesson) + "\n\n" + return text diff --git a/json/tmp.json b/json/tmp.json new file mode 100644 index 0000000..1bb6b84 --- /dev/null +++ b/json/tmp.json @@ -0,0 +1,42 @@ +{ + "studies.begin": { + "y": 2024, + "m": 9, + "d": 1 + }, + "studies.end": null, + "schedule": { + "mon": [ + { + "partity": 1, + "begin": "10:30", + "end": "12:05", + "name": "Практикум на ЭВМ", + "teacher.room": [ + { + "t": "Тюляева В.В.", + "r": "МЗ-3" + } + ], + "building": "2-й гуманитарный корпус", + "note": "Какое-то примечание", + "type": "seminar" + }, + { + "partity": null, + "begin": "10:30", + "end": "12:05", + "name": "Практикум на ЭВМ", + "teacher.room": [ + { + "t": "Тюляева В.В.", + "r": "МЗ-3" + } + ], + "building": "2-й гуманитарный корпус", + "note": "Какое-то примечание", + "type": "seminar" + } + ] + } +} \ No newline at end of file diff --git a/schedules.py b/schedules.py index 2b5b600..109ac14 100644 --- a/schedules.py +++ b/schedules.py @@ -7,7 +7,9 @@ from telegram.constants import ParseMode import for_json from admin import admin_command, is_admin, send_admin_message, send_admin_document -bot = telebot.TeleBot("TOKEN_API") +# bot = telebot.TeleBot("TOKEN_API") +bot = telebot.TeleBot("6998513979:AAGgpjgdDsCEqPE0hC8yxrzclsNSd-oRP1s") # test +# bot = telebot.TeleBot("6355753103:AAGniZ7Wf5XyPkn3z753UJvn6afbhOlImjA") # sсhedule @bot.message_handler(commands=["help", "faq"]) @@ -60,7 +62,7 @@ def test(message): return -@bot.message_handler(commands=["restart", 'r']) +@bot.message_handler(commands=["restart", "r"]) @admin_command def restart_bot(message): send_admin_message("bye") @@ -241,10 +243,10 @@ def stop_msg(message): if len(str(message.text).split(" ")) != 2: send_admin_message("Эта команда вида /stop id_пользователя") return - + for_json.change_user_param(str(message.text).split(" ")[1], "allow_message", "no") send_admin_message("Успешно") - + return