import json import datetime import config as _config dayStrings = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'] class Lesson: #EDIT: фулл переделать потому-что формат поменялся сильно def __init__(self, start_end: str, data: dict) -> None: self.start: list[int] = [ int(start_end.split(' - ')[0].split(':')[0]), int(start_end.split(' - ')[0].split(':')[1]) ] self.end: list[int] = [ int(start_end.split(' - ')[1].split(':')[0]), int(start_end.split(' - ')[1].split(':')[1]) ] self.strTime: str = start_end self.raw: str = data['raw'] self.ok: bool = data['ok'] if not self.ok: return self.name: str = data['name'] self.type: str = data['type'] self.info: list[str] = data['info'] def text(self, isToday: bool = False) -> str: date = datetime.datetime.now() lessonStart = datetime.datetime(date.year, date.month, date.day, self.start[0], self.start[1], 10) if self.ok: dateStr: str = f'{self.type.capitalize()} в {self.start[0]}:{self.start[1] if self.start[1] > 9 else "0"+str(self.start[1])}' if isToday: if lessonStart > date and (lessonStart-date).seconds < 30*60: dateStr = f'{self.type.capitalize()} начнется через {max((lessonStart-date).seconds//60, 1)} мин.' elif lessonStart < date and (date-lessonStart).seconds < 31*60: dateStr = f'Сейчас идет {self.type}' elif lessonStart < date and (date-lessonStart).seconds >= 31*60 and (date-lessonStart).seconds < 89*60: dateStr = f'{self.type.capitalize()} закончится через {max(90-(date-lessonStart).seconds//60, 1)} мин.' wrb = '' if self.info: nd: list[str] = [] for data in self.info: if data in self.type: continue if 'подгр' in data: nd.append(data.split('подгр')[0]) nd.append('\nподгр'+data.split('подгр')[1]+f'\n') else: nd.append(data) for data in nd: # print() # print(data, wrb) if ('\n' in data or '\n' in wrb[-2:]): wrb += data elif 'ауд' in data.lower(): audn = '.'.join(data.replace(' ', '').split('.')[1:]) wrb += ', '+f'{data}' else: wrb += ', '+data return f'''\
\ {self.name} {dateStr} {wrb[2:] if wrb else 'Дополнительная информация отсуствует'}
''' else: return f'''\
\
Пара в {self.start[0]}:{self.start[1] if self.start[1] > 9 else '0'+str(self.start[1])}
{self.raw}
''' class Schedule: def __init__(self, responce: dict) -> None: self.weekNumber: int = responce['date']['weekNumber'] self.weekDay: int = responce['date']['weekDay'] self.raw: dict = responce['schedule'] self.days: list[list[list[Lesson]]] = [] for dayInfo in self.raw.values(): currentDay = [] for start_end, lessons in dayInfo.items(): if lessons == [None] or lessons == [None, None]: continue lessonList: list[Lesson | None] = [] for lesson in lessons: if lesson: lessonList.append(Lesson(start_end, lesson)) else: lessonList.append(None) currentDay.append(lessonList) self.days.append(currentDay) def today(self) -> list[list[Lesson]]: return self.days[self.weekDay] if self.weekDay < 5 else [] def getFacCourseByGroup(group: str) -> tuple[str | None, str | None]: for faculty, courses in _config.LOAD.items(): for course in courses: path = f'./timetables/{faculty} {course}.json'.replace(' ', '_') data: dict[str, dict] = json.load( open( path, 'r', encoding = 'utf-8' ) ) if group.lower() in [_.lower() for _ in data.keys()]: return faculty, course return None, None def getSchedulePathByGroup(group: str) -> str | None: faculty, course = getFacCourseByGroup(group) return None if not faculty else f'./timetables/{faculty} {course}.json'.replace(' ', '_') def generateDaySchedule(schedule: Schedule, showOddWeekText: bool = True, isToday: bool = False) -> str: isWeekOdd = schedule.weekNumber%2 == 0 weekDay = schedule.weekDay schedule_today = schedule.today() lastLessonEnds = [0,0] scheduleResult = f'{dayStrings[weekDay]}, {"четная" if isWeekOdd else "нечетная"} неделя\n' if showOddWeekText else f'{dayStrings[weekDay]}' for lessonList in schedule_today: if len(lessonList) == 1: scheduleResult += lessonList[0].text(isToday) + '\n' lastLessonEnds = lessonList[0].end else: lesson = lessonList[1 if isWeekOdd else 0] if lesson: scheduleResult += lesson.text(isToday) + '\n' lastLessonEnds = lesson.end scheduleResult += f'Пары закончатся в {lastLessonEnds[0]}:{lastLessonEnds[1] if lastLessonEnds[1] > 9 else "0"+str(lastLessonEnds[1])}' return scheduleResult