From 9c669b275e43341ada51a19774bb57950eca9b30 Mon Sep 17 00:00:00 2001
From: Egor Deev <67710823+IGlek@users.noreply.github.com>
Date: Thu, 1 Feb 2024 20:15:42 +0400
Subject: [PATCH] v. 1.0b
---
script.py | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 148 insertions(+)
create mode 100644 script.py
diff --git a/script.py b/script.py
new file mode 100644
index 0000000..5dd7569
--- /dev/null
+++ b/script.py
@@ -0,0 +1,148 @@
+from datetime import datetime, time
+import icalendar
+
+from dateutil.relativedelta import *
+from dateutil.rrule import *
+from dateutil.parser import *
+
+
+def text_ical(user_id, tz):
+ date = dt_now(tz)
+ path = f'../data/icals/{user_id}.ics'
+
+ e = open(path, 'rb')
+
+ ecal = icalendar.Calendar.from_ical(e.read())
+ events = []
+
+ for i, component in enumerate(ecal.walk()):
+ if component.name == "VEVENT":
+
+ # НАЧАЛО
+ dt = icalendar.vDDDTypes.to_ical(component.get('dtstart')).decode('utf-8')
+ dt = dt.split("T")
+
+ dt_start = component.decoded("dtstart")
+ dt_end = component.decoded("dtend")
+
+ if len(dt) == 1:
+ dt_start = datetime.combine(dt_start, time(minute=1))
+ dt_end = datetime.combine(dt_end, time(minute=1))
+ else:
+ dt_start.replace(tzinfo=None)
+ dt_start = dt_start.astimezone(tz)
+
+ dt_end.replace(tzinfo=None)
+ dt_end = dt_end.astimezone(tz)
+
+ # НАСТРОЙКА
+ r_rule = component.get('rrule')
+ if r_rule:
+ list_rrule = icalendar.vRecur.to_ical(r_rule).decode('utf-8').split(';')
+
+ for i, elem in enumerate(list_rrule):
+ if 'UNTIL' in elem:
+ list_rrule.pop(i)
+
+ now_date = "".join(date.date().isoformat().split("-"))
+
+ until = "UNTIL=" + now_date + "T235900Z"
+ date_iso = "".join(dt_start.isoformat().split("-"))
+ time_iso = "".join(date_iso.split(":")).split("+")[0] + "Z"
+ list_rrule.append(until)
+
+ list_rrule = ";".join(list_rrule)
+ print(dt_start.date(), list(rrulestr(list_rrule, dtstart=parse(time_iso))))
+
+
+ if date.date() == dt_start.date():
+ org = component.get("organizer")
+ desc = component.get("description")
+
+ event = {"name": component.get('summary'), "desc": desc if desc else "отсутствует",
+ "org": org if org else "не назначен", "datetime": [dt_start, dt_end]}
+
+ events.append([dt_start.date(), dt_start.time(), i, event])
+ e.close()
+
+ return events
+
+
+def message_form(k, event):
+ txt = ""
+
+ if k:
+ txt += f"-------\n"
+ txt += f"{k}. {event['name']}\n"
+ else:
+ txt += f"{event['name']}\n"
+
+ txt += f"Описание: {event['desc']}\n"
+ txt += f"Организатор: {event['org']}\n\n"
+ txt += f"Начало: {event['datetime'][0].strftime('%H:%M - %d.%m.%Y года')}\n"
+ txt += f"Конец: {event['datetime'][1].strftime('%H:%M - %d.%m.%Y года')}\n"
+
+ return txt
+
+
+def delta_time(d_event, start, end):
+ d_start = datetime.combine(d_event.date(), time(hour=0, minute=start))
+ d_end = datetime.combine(d_event.date(), time(hour=0, minute=end))
+
+ zero = datetime.combine(d_event.date(), time(0, 0, 0, 0))
+
+ dt_start = zero + (d_event - d_start)
+ dt_end = zero + (d_event - d_end)
+
+ return [dt_start.time(), dt_end.time()]
+
+
+def dt_now(tz):
+ return datetime.now(tz=tz)
+
+
+def recur_rule(create_date, now_date, rules):
+ freq = rules['FREQ'][0]
+ inter = rules['INTERVAL'][0]
+
+ if 'UNTIL' in rules.keys():
+ until = rules['UNTIL'][0]
+ until = until if type(until) == type(now_date) else until.date()
+
+ if until < now_date: return False
+
+ count_day = now_date - create_date
+
+ print(create_date, rules)
+ print(freq, inter)
+
+ if freq == 'DAILY':
+ if count_day.days % inter == 0: return True
+
+ elif freq == 'WEEKLY':
+ weekday = now_date.strftime('%a').upper()[:2]
+ days = rules['BYDAY']
+
+ if weekday in days:
+ week = count_day.days // 7 # получаем чётность недели
+ if week % inter == 0: return True
+
+ elif freq == 'MONTHLY':
+ if 'BYMONTHDAY' in rules.keys():
+ dates = list(rrule(MONTHLY, dtstart=create_date, interval=inter,
+ bymonthday=rules['BYMONTHDAY'][0], until=now_date))
+ if now_date in dates: return True
+ else:
+ moment = rules['BYDAY'][0][:-2]
+ day = rules['BYDAY'][0][-2:]
+
+ dates = list(rrule(MONTHLY, dtstart=create_date, interval=inter,
+ byweekday=day(moment), until=now_date))
+ if now_date in dates: return True
+
+ elif freq == 'YEARLY':
+ dates = list(rrule(YEARLY, dtstart=create_date, interval=inter, bymonth=rules['BYMONTH'][0],
+ bymonthday=rules['BYMONTHDAY'][0], until=now_date))
+ if now_date in dates: return True
+
+ return False