Update requirements.txt, readme.md and .gitignore

now groups schedule in yaml format
This commit is contained in:
kr0sh512
2024-09-14 14:05:08 +03:00
parent 28b2640327
commit 653364b8a6
10 changed files with 352 additions and 357 deletions
+3
View File
@@ -8,3 +8,6 @@ json_remake
script.py
nohup.out
config.yaml
old_files/
yaml_groups/*
!yaml_groups/202.yaml
+81 -2
View File
@@ -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` <i>id_пользователя</i> - узнать настройки пользователя (admin only)
- `/spam` - сделать рассылку (admin only)
- `/pause_all` - приостановить бота для всех (каникулы/выходные) (admin only)
- `/stop` <i>id_пользователя</i> - приостановить отправку сообщений для пользователя (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
+40
View File
@@ -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
+11 -9
View File
@@ -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)]
-60
View File
@@ -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"
}
]
}
}
-282
View File
@@ -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"
}
}
}
}
+4
View File
@@ -0,0 +1,4 @@
python-telegram-bot==13.7
requests==2.26.0
python-dotenv==0.19.0
schedule==1.1.0
+12 -4
View File
@@ -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,
"Пожалуйста, пришли <u>число</u> от 1 до 60. \
"Пожалуйста, пришли <u>число</u> от 1 до 59. \
\nПо умолчанию: 10",
)
send_message(message.chat.id, "Изменения не были внесены")
+201
View File
@@ -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