bot/utils/calendar.py
2026-08-30 13:48:59 +03:00

62 lines
No EOL
2.6 KiB
Python

from ics import Calendar, Event
from datetime import datetime, timedelta
import pytz
from models.schedule import Schedule
from models.user import User
timezone = pytz.timezone("Europe/Moscow")
class ICS:
def __init__(self, user: User, use_this_week: bool = False) -> None:
self.userID: int = user.id
schedule: Schedule = user.schedule()
if not schedule: raise ValueError
if not use_this_week: # happens only on Sunday -> move to next week
schedule.weekNumber += 1
self.start_week_date = timezone.localize(datetime.now()) + timedelta(days=7-schedule.weekDay)
else: # on this week
self.start_week_date = timezone.localize(datetime.now()) - timedelta(days=schedule.weekDay)
self.isWeekOdd = schedule.weekNumber%2 == 0
self.calendar = Calendar()
for target in range(5):
schedule.weekDay = target
event_date = self.start_week_date + timedelta(days=target)
# print(f'\n\n--- {target} -> {event_date.strftime("%Y-%m-%d")} ---')
for lessonList in schedule.today():
lesson = lessonList[0] if len(lessonList) == 1 else lessonList[1 if self.isWeekOdd else 0]
if not lesson: continue
event = Event()
event.name = f'{lesson.name}'
event.description = f'{lesson.type} ({", ".join([_ for _ in lesson.info if "ауд" in _])})'
if ' ()' in event.description: event.description = event.description.replace(' ()', '')
event.begin = event_date.replace(hour=lesson.start[0], minute=lesson.start[1], second=0, microsecond=0)
event.duration = timedelta(hours=1, minutes=30)
event.end = event_date.replace(hour=lesson.end[0], minute=lesson.end[1], second=0, microsecond=0)
self.calendar.events.add(event)
# print(event.name, '|', event.description, f'[{event.begin} - {event.end}]')
# break
# break
def save(self) -> str:
"""returns path to file"""
content = self.calendar.serialize()
for line in self.calendar.serialize().split('\n'):
if 'DTSTART' in line:
ts = line.split(':')[1]
content = content.replace(f'DTSTART:{ts}', f'DTSTART:{ts}\nDTSTAMP:{ts}')
path = f'./temp/{self.userID}.ics'
with open(path, 'w', encoding='utf-8', newline='') as file: file.writelines(content)
return path