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