diff --git a/.gitignore b/.gitignore index 73243d0..a14b345 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ json_remake script.py nohup.out config.yaml +old_files/ +yaml_groups/* +!yaml_groups/202.yaml \ No newline at end of file diff --git a/README.md b/README.md index 5c6a447..eb259f0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,81 @@ -# Telegram-bot-schedule - Прямо сейчас бот работает здесь: https://t.me/vmk_schedule_bot +# Telegram Bot Schedule +This project is a Telegram bot designed to manage and display schedules. The bot can help users keep track of their daily activities, appointments, and events. + +## Features + +- View preloaded schedules +- Group schedules for better organization +- Receive reminders for upcoming events +- User-friendly commands and interface + +## Installation + +1. Clone the repository: + ```sh + git clone https://github.com/yourusername/Telegram-bot-schedule.git + ``` +2. Navigate to the project directory: + ```sh + cd Telegram-bot-schedule + ``` +3. Install the required dependencies: + ```sh + pip install -r requirements.txt + ``` + +## Usage + +1. Create a new bot on Telegram and get the API token. +2. Set the API token in the environment variables or in a configuration file. +3. You need to create schedules files for groups. +4. Run the bot: + ```sh + python bot.py + ``` + +## Commands + +- `/start` - используй, чтобы сменить номер группы. +- `/schedule` - используй, чтобы получить расписание на сегодня. +- `/random` - сделай очередь из людей +- `/info` - используй, чтобы узнать твои настройки бота +- `/pause` - используй, чтобы прекратить получать сообщения от бота +- `/thread` - используй в нужном чате канала, чтобы бот отправлял сообщения именно туда +- `/timeout` - настрой время, когда бот будет присылать тебе сообщение +- `/request` - используй, чтобы отправить разработчику какой-то запрос +- `/source` - Страница бота на Github +- `/restart` - перезапуск бота (admin only). +- `/update` - обновление schedule задач (admin only) +- `/stats` - получание статистики (admin only) +- `/json` - получить файл пользователей и расписания (admin only) +- `/info` id_пользователя - узнать настройки пользователя (admin only) +- `/spam` - сделать рассылку (admin only) +- `/pause_all` - приостановить бота для всех (каникулы/выходные) (admin only) +- `/stop` id_пользователя - приостановить отправку сообщений для пользователя (admin only) + +## Contributing + +Contributions are welcome! Please fork the repository and create a pull request with your changes. + +## Contact + +For any questions or suggestions, please open an issue or contact the project maintainer at [gudovdo@my.msu.ru]. + +## Target Audience + +This bot is particularly useful for students to track their lessons and manage their academic schedules effectively. + +## Limitations + +- Cannot create or edit schedule entities directly +- Only works with preloaded schedules and groups + + + + + + + + + + diff --git a/convert_into_yaml.py b/convert_into_yaml.py new file mode 100644 index 0000000..c664738 --- /dev/null +++ b/convert_into_yaml.py @@ -0,0 +1,40 @@ +import os +import json +import yaml + + +def convert_json_to_yaml(json_dir, yaml_dir): + # Iterate over all files in the directory + for filename in os.listdir(json_dir): + if filename.endswith(".json"): + json_path = os.path.join(json_dir, filename) + + # Read JSON file + with open(json_path, "r", encoding="utf-8") as json_file: + data = json.load(json_file) + + # Convert to YAML + yaml_data = yaml.dump( + data, + default_flow_style=None, + encoding="utf-8", + allow_unicode=True, + width=float("inf"), + sort_keys=False, + ) + + # Write YAML file + yaml_path = os.path.join(yaml_dir, filename.replace(".json", ".yaml")) + with open(yaml_path, "wb") as yaml_file: + yaml_file.write(yaml_data) + + print("Conversion completed.") + + +if __name__ == "__main__": + json_dir = "json_remake" + yaml_dir = "yaml_groups" + + convert_json_to_yaml(json_dir, yaml_dir) + + pass diff --git a/for_json.py b/for_json.py index e8fea00..0edc58f 100644 --- a/for_json.py +++ b/for_json.py @@ -1,12 +1,12 @@ #!/usr/bin/python3.3 -import json, schedule +import json, yaml, schedule import schedules as bot from datetime import datetime path_users = "json/users.json" # Нужный путь до json файлов -# path_schedule = "json/schedule_3sem.json" -path_schedule = "json/groups/{}.json" +path_schedule = "yaml_groups/{}.yaml" path_students = "json/students.json" +path_groups = "json/groups.json" allow_update = True @@ -129,7 +129,8 @@ def create_schedule_tasks(manual=False): continue with open(path_schedule.format(group), "r", encoding="utf-8") as json_file: - schdl = json.load(json_file)["schedule"] + # schdl = json.load(json_file)["schedule"] + schdl = yaml.safe_load(json_file)["schedule"] for day in schdl: for lesson in schdl[day]: @@ -183,11 +184,11 @@ def create_schedule_tasks(manual=False): def groups_in_json() -> list[str]: - schdl = {} - with open(path_schedule.format("groups"), "r", encoding="utf-8") as json_file: - schdl = json.load(json_file) + groups = {} + with open(path_groups, "r", encoding="utf-8") as json_file: + groups = json.load(json_file) - return schdl + return groups def students_in_group(group) -> list[str]: @@ -276,7 +277,8 @@ def get_schedule(id: str, day: str) -> str: try: with open(path_schedule.format(group), "r", encoding="utf-8") as schedule_file: try: - schdl_today = json.load(schedule_file)["schedule"][day] + # schdl_today = json.load(schedule_file)["schedule"][day] + schdl_today = yaml.safe_load(schedule_file)["schedule"][day] except: return "Расписания твоей группы на {} нет".format( russian_days[days.index(day)] diff --git a/json/groups/groups.json b/json/groups.json similarity index 100% rename from json/groups/groups.json rename to json/groups.json diff --git a/json/groups/202.json b/json/groups/202.json deleted file mode 100644 index 7433f87..0000000 --- a/json/groups/202.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "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" - }, - { - "t": "Тюляева В.В.", - "r": "МЗ-3" - }, - { - "t": "Тюляева В.В.", - "r": "МЗ-3" - } - ], - "building": "2-й гуманитарный корпус", - "note": "Какое-то примечание", - "type": "seminar" - }, - { - "partity": null, - "begin": "10:30", - "end": "12:05", - "name": "Практикум на ЭВМ", - "teacher.room": [], - "building": "2-й гуманитарный корпус", - "note": "Какое-то примечание", - "type": "seminar" - } - ] - } -} \ No newline at end of file diff --git a/json/schedule_expl.json b/json/schedule_expl.json deleted file mode 100644 index 1ae3328..0000000 --- a/json/schedule_expl.json +++ /dev/null @@ -1,282 +0,0 @@ -{ - "102": { - "mon": { - "8:45-10:20": { - "name": "Алгоритмы и алгоритмические языки", - "infos": "Белеванцев Андрей Андреевич|П-6" - }, - "10:30-12:05": { - "name": "Английский язык", - "infos": "Шубина Юлия Витальевна|73|Бим Мария Моисеевна|735" - }, - "12:50-14:25": { - "name": "Математический анализ", - "infos": "Лапонин Владислав Сергеевич|606" - }, - "15:00-16:30": { - "name": "Физическая культура", - "infos": "" - }, - "16:45-18:15": { - "name": "Консультация. Алгебра и геометрия", - "infos": "Руднев Сергей Геннадьевич|???" - } - }, - "tue": { - "10:30-12:05": { - "name": "Алгебра и геометрия", - "infos": "Тыртышников Евгений Евгеньевич|П-6" - }, - "12:50-14:25": { - "name": "Математический анализ", - "infos": "Садовничая Инна Викторовна|П-6" - }, - "14:35-16:10": { - "name": "Алгебра и геометрия", - "infos": "Руднев Сергей Геннадьевич|682" - }, - "16:20-17:55": { - "name": "Практикум на ЭВМ", - "infos": "Цыбров Евгений Германович|371|Кулагин Алексей Владимирович|МЗ-0" - } - }, - "wed": { - "8:45-10:20": { - "name": "Алгоритмы и алгоритмические языки", - "infos": "Белеванцев Андрей Андреевич|П-6" - }, - "10:30-12:05": { - "name": "Математический анализ", - "infos": "Лапонин Владислав Сергеевич|606" - }, - "12:50-14:25": { - "name": "Английский язык", - "infos": "Шубина Юлия Витальевна|735|Бим Мария Моисеевна|71" - } - }, - "thu": { - "8:45-10:20": { - "name": "Алгебра и геометрия", - "infos": "Тыртышников Евгений Евгеньевич|П-6" - }, - "10:30-12:05": { - "name": "Математический анализ", - "infos": "Садовничая Инна Викторовна|П-6" - }, - "12:50-14:25": { - "name": "История России", - "infos": "Чубыкин Игорь Валерьевич|523" - }, - "14:35-16:10": { - "name": "Алгебра и геометрия", - "infos": "Руднев Сергей Геннадьевич|606" - }, - "16:20-17:55": { - "name": "История России", - "infos": "Чубыкин Игорь Валерьевич|П-6" - } - }, - "fri": { - "9:00-10:30": { - "name": "Физическая культура", - "infos": "" - }, - "10:40-12:15": { - "name": "Безопасность жизнедеятельности", - "infos": "Сладкова Наталья Валерьевна|609" - }, - "12:50-14:25": { - "name": "Практикум на ЭВМ", - "infos": "Цыбров Евгений Германович|371|Кулагин Алексей Владимирович|МЗ-0" - } - } - }, - "103": { - "mon": { - "8:45-10:20": { - "name": "Алгоритмы и алгоритмические языки", - "infos": "Белеванцев Андрей Андреевич|П-6" - }, - "10:30-12:05": { - "name": "Математический анализ", - "infos": "Зайцева Наталья Владимировна|71" - }, - "12:50-14:25": { - "name": "Практикум на ЭВМ", - "infos": "Кузьменкова Евгения Анатольевна|731|Малышев Никита Евгеньевич|778" - }, - "15:00-16:30": { - "name": "Физическая культура", - "infos": "" - } - }, - "tue": { - "8:45-10:20": { - "name": "Консультация. Алгебра и геометрия", - "infos": "Будак Александр Борисович|612" - }, - "10:30-12:05": { - "name": "Алгебра и геометрия", - "infos": "Тыртышников Евгений Евгеньевич|П-6" - }, - "12:50-14:25": { - "name": "Математический анализ", - "infos": "Садовничая Инна Викторовна|П-6" - }, - "14:35-16:10": { - "name": "Английский язык", - "infos": "Плиева Сима Ивановна|783|Дзампова Татьяна Борисовна|736" - }, - "16:20-17:55": { - "name": "Английский язык", - "infos": "Дзампова Татьяна Борисовна|736" - } - }, - "wed": { - "8:45-10:20": { - "name": "Алгоритмы и алгоритмические языки", - "infos": "Белеванцев Андрей Андреевич|П-6" - }, - "10:30-12:05": { - "name": "Математический анализ", - "infos": "Зайцева Наталья Владимировна|72" - }, - "12:50-14:25": { - "name": "Алгебра и геометрия", - "infos": "Будак Александр Борисович|605" - } - }, - "thu": { - "8:45-10:20": { - "name": "Алгебра и геометрия", - "infos": "Тыртышников Евгений Евгеньевич|П-6" - }, - "10:30-12:05": { - "name": "Математический анализ", - "infos": "Садовничая Инна Викторовна|П-6" - }, - "12:50-14:25": { - "name": "Алгебра и геометрия", - "infos": "Будак Александр Борисович|605" - }, - "14:35-16:10": { - "name": "Английский язык", - "infos": "Плиева Сима Ивановна|783" - }, - "16:20-17:55": { - "name": "История России", - "infos": "Чубыкин Игорь Валерьевич|П-6" - } - }, - "fri": { - "9:00-10:30": { - "name": "Физическая культура", - "infos": "" - }, - "10:40-12:15": { - "name": "Безопасность жизнедеятельности", - "infos": "Гимишли Николай Федосеевич|614" - }, - "12:50-14:25": { - "name": "Практикум на ЭВМ", - "infos": "Кузьменкова Евгения Анатольевна|248|Малышев Никита Евгеньевич|780" - }, - "14:35-16:10": { - "name": "История России", - "infos": "Чубыкин Игорь Валерьевич|523" - } - } - }, - "105": { - "mon": { - "8:45-10:20": { - "name": "Алгоритмы и алгоритмические языки", - "infos": "Белеванцев Андрей Андреевич|П-6" - }, - "10:30-12:05": { - "name": "Математический анализ", - "infos": "Никитин Алексей Антонович|72" - }, - "12:15-13:40": { - "name": "Алгебра и геометрия", - "infos": "Лебедева Ольга Сергеевна|508|Замарашкин Николай Леонидович|508" - }, - "15:00-16:30": { - "name": "Физическая культура", - "infos": "" - } - }, - "tue": { - "10:30-12:05": { - "name": "Алгебра и геометрия", - "infos": "Тыртышников Евгений Евгеньевич|П-6" - }, - "12:50-14:25": { - "name": "Математический анализ", - "infos": "Садовничая Инна Викторовна|П-6" - }, - "14:35-16:10": { - "name": "Английский язык", - "infos": "Лаптинова Анастасия Ильинична|73|Кашелкина Ольга Александровна|790" - }, - "16:20-17:55": { - "name": "Практикум на ЭВМ", - "infos": "Русол Андрей Владимирович|МЗ-4|Гуляев Анатолий Викторович|574" - } - }, - "wed": { - "8:45-10:20": { - "name": "Алгоритмы и алгоритмические языки", - "infos": "Белеванцев Андрей Андреевич|П-6" - }, - "10:30-12:05": { - "name": "Математический анализ", - "infos": "Никитин Алексей Антонович|778" - }, - "12:50-14:25": { - "name": "Алгебра и геометрия", - "infos": "Лебедева Ольга Сергеевна|506|Замарашкин Николай Леонидович|506" - } - }, - "thu": { - "8:45-10:20": { - "name": "Алгебра и геометрия", - "infos": "Тыртышников Евгений Евгеньевич|П-6" - }, - "10:30-12:05": { - "name": "Математический анализ", - "infos": "Садовничая Инна Викторовна|П-6" - }, - "12:50-14:25": { - "name": "История России", - "infos": "Чубыкин Игорь Валерьевич|523" - }, - "14:35-16:10": { - "name": "Английский язык", - "infos": "Лаптинова Анастасия Ильинична|71|Кашелкина Ольга Александровна|736" - }, - "16:20-17:55": { - "name": "История России", - "infos": "Чубыкин Игорь Валерьевич|П-6" - } - }, - "fri": { - "9:00-10:30": { - "name": "Физическая культура", - "infos": "" - }, - "10:40-12:15": { - "name": "Консультация. Математический анализ", - "infos": "Никитин Алексей Антонович|72" - }, - "12:50-14:25": { - "name": "Практикум на ЭВМ", - "infos": "Русол Андрей Владимирович|МЗ-4|Гуляев Анатолий Викторович|574" - }, - "14:35-16:10": { - "name": "Безопасность жизнедеятельности", - "infos": "Гимишли Николай Федосеевич|614" - } - } - } -} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..47f0fd0 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +python-telegram-bot==13.7 +requests==2.26.0 +python-dotenv==0.19.0 +schedule==1.1.0 \ No newline at end of file diff --git a/schedules.py b/schedules.py index a00a8c2..a093dd3 100644 --- a/schedules.py +++ b/schedules.py @@ -398,7 +398,15 @@ def send_schedule(message): day = datetime.today().strftime("%A").lower()[:3] # mon tue ... text = for_json.get_schedule(message.chat.id, day) except Exception as e: - send_admin_message("Schedule error from: {} \n\n {}".format(message.chat.id, e)) + # send_admin_message( + # "Schedule error from: {} \n\n {}".format(message.chat.id, str(e)) + # ) + bot.send_message( + message.chat.id, + "Пожалуйста, проверь, что ты зарегестрировался с помощью команды /start", + ParseMode.HTML, + message_thread_id=message.message_thread_id, + ) markup = types.InlineKeyboardMarkup() markup.add( @@ -586,7 +594,7 @@ def change_thread(message): def set_timeout(message): send_message( message.chat.id, - "Пришли мне число от 1 до 60. \ + "Пришли мне число от 1 до 59. \ \nЭто будет количество минут, за которое я буду присылать тебе напоминание о паре (По умолчанию: 10)", ) bot.register_next_step_handler(message, save_timeout) @@ -597,7 +605,7 @@ def set_timeout(message): def save_timeout(message): if ( str(message.text).isdigit() - and int(message.text) <= 60 + and int(message.text) <= 59 and int(message.text) >= 1 ): for_json.change_user_param(message.chat.id, "timeout", str(message.text)) @@ -610,7 +618,7 @@ def save_timeout(message): else: send_message( message.chat.id, - "Пожалуйста, пришли число от 1 до 60. \ + "Пожалуйста, пришли число от 1 до 59. \ \nПо умолчанию: 10", ) send_message(message.chat.id, "Изменения не были внесены") diff --git a/yaml_groups/202.yaml b/yaml_groups/202.yaml new file mode 100644 index 0000000..7dde3c7 --- /dev/null +++ b/yaml_groups/202.yaml @@ -0,0 +1,201 @@ +studies.begin: {y: 2024, m: 9, d: 1} +studies.end: null +schedule: + mon: + - begin: '8:45' + end: '10:20' + name: Английский язык + teacher.room: + - {t: Бим М.М., r: '735'} + - {t: ' Шубина Ю.В.', r: '73'} + type: seminar + parity: null + - begin: '10:30' + end: '12:05' + name: Практикум на ЭВМ + teacher.room: + - {t: Тюляева В.В., r: МЗ-4} + - {t: '', r: null} + type: seminar + parity: null + - begin: '12:15' + end: '13:50' + name: Классическая механика + teacher.room: + - {t: Брандт Н.Н., r: '659'} + type: seminar + parity: null + - begin: '15:00' + end: '16:30' + name: Физическая культура + teacher.room: [] + type: null + parity: null + tue: + - begin: '8:45' + end: '10:20' + name: Теория вероятностей и математическая статистика + teacher.room: + - {t: профессор Королёв Виктор Юрьевич, r: П-13} + type: lecture + parity: null + - begin: '10:30' + end: '12:05' + name: Математический анализ + teacher.room: + - {t: доцент Крицков Леонид Владимирович, r: П-11} + type: lecture + parity: null + - begin: '12:15' + end: '13:50' + name: Математический анализ + teacher.room: + - {t: Сычугов Д.Ю., r: '606'} + type: seminar + parity: null + - begin: '14:35' + end: '16:10' + name: Обыкновенные дифференциальные ур-я + teacher.room: + - {t: Дмитриева И.В., r: '607'} + type: seminar + parity: null + - begin: '16:20' + end: '17:55' + name: null + teacher.room: [] + type: seminar + parity: null + wed: + - begin: '8:45' + end: '10:20' + name: Практикум на ЭВМ + teacher.room: + - {t: Тюляева В.В., r: '507'} + type: seminar + parity: null + - begin: '10:30' + end: '12:05' + name: Математический анализ + teacher.room: + - {t: доцент Крицков Леонид Владимирович, r: П-6} + type: lecture + parity: null + - begin: '12:15' + end: '13:50' + name: Обыкновенные дифференциальные уравнения + teacher.room: + - {t: профессор Денисов Александр Михайлович, r: П-6} + type: lecture + parity: null + - begin: '15:10' + end: '18:50' + name: Межфакультетские курсы + teacher.room: [] + type: seminar + parity: null + thu: + - begin: '8:45' + end: '10:20' + name: Операционные системы + teacher.room: + - {t: профессор Машечкин Игорь Валерьевич, r: П-13} + type: lecture + parity: null + - begin: '10:30' + end: '12:05' + name: Операционные системы + teacher.room: + - {t: профессор Машечкин Игорь Валерьевич, r: П-13} + type: lecture + parity: null + - begin: '12:15' + end: '13:50' + name: Английский язык + teacher.room: + - {t: Бим М.М., r: '71'} + - {t: '', r: null} + type: seminar + parity: null + - begin: '14:35' + end: '16:10' + name: Введение в численные методы + teacher.room: + - {t: доцент Нефёдов Владимир Вадимович, r: П-5} + type: lecture + parity: null + - begin: '16:20' + end: '17:55' + name: null + teacher.room: [] + type: seminar + parity: null + fri: + - begin: '8:45' + end: '10:20' + name: Английский язык + teacher.room: + - {t: Шубина Ю.В., r: '506'} + type: seminar + parity: null + - begin: '10:50' + end: '12:20' + name: Физическая культура + teacher.room: [] + type: null + parity: null + - begin: '12:50' + end: '14:25' + name: Теория вероятностей и математич. статистика + teacher.room: + - {t: Шевцова И.Г., r: '504'} + type: seminar + parity: null + - begin: '14:35' + end: '16:10' + name: Математический анализ + teacher.room: + - {t: Сычугов Д.Ю., r: '615'} + type: seminar + parity: null + - begin: '16:20' + end: '17:55' + name: null + teacher.room: [] + type: seminar + parity: null + sat: + - begin: '8:45' + end: '10:20' + name: Философия + teacher.room: + - {t: профессор Девятова Светлана Владимировна, r: П-14} + type: lecture + parity: null + - begin: '10:30' + end: '12:05' + name: Философия Девятова С.В. + teacher.room: + - {t: null, r: '508'} + type: seminar + parity: null + - begin: '12:15' + end: '13:50' + name: null + teacher.room: [] + type: seminar + parity: null + - begin: '14:35' + end: '16:10' + name: Операционные системы + teacher.room: + - {t: профессор Машечкин Игорь Валерьевич, r: П-13} + type: lecture + parity: null + - begin: '16:20' + end: '17:55' + name: Операционные системы + teacher.room: + - {t: профессор Машечкин Игорь Валерьевич, r: П-13} + type: lecture + parity: null