## env approximation ## ''' import datetime, json, time class Self: def __init__(self): self.path = "" self.WEEKDAY_NAMES_ROD = ["понеділка", "вівторка", "середи", "четверга", "п'ятниці", "суботи", "неділі"] self.WEEKDAY_NAMES_ROD_WITH_NEXT = ["наступного понеділка", "наступного вівторка", "наступної середи", "наступного четверга", "наступної п'ятниці", "наступної суботи", "наступної неділі"] self.WEEKDAY_NAMES_ROD_WITH_THIS = ["цього понеділка", "цього вівторка", "цієї середи", "цього четверга", "цієї п'ятниці", "цієї суботи", "цієї неділі"] def readfile(path): return open(path).read() self = Self() ''' ## code ## if self.MESSAGE["text"].lower() == "!пара": current_time = datetime.datetime.now() current_week = current_time.isocalendar()[1] % 2 current_day = current_time.weekday() current_seconds = current_week*604800 + current_day*86400 + current_time.hour*3600 + current_time.minute*60 + current_time.second reference_time = int(current_time.strftime("%s")) - current_seconds # baking defined schedule raw_schedule = json.loads( readfile(self.path + "schedule.json") ) schedule = {} for day in range(len(raw_schedule)): for i in raw_schedule[day]: ts = day*86400 + int(i.split(":")[0])*3600 + int(i.split(":")[1])*60 new_item = dict(raw_schedule[day][i]) new_item["source"] = "schedule" schedule[ts] = new_item # baking additions (extra pairs) raw_additions = json.loads( readfile(self.path + "additions.json") ) additions = {} for day in range(len(raw_additions)): for i in raw_additions[day]: ts = day*86400 + int(i.split(":")[0])*3600 + int(i.split(":")[1])*60 new_item = dict(raw_additions[day][i]) new_item["source"] = "additions" schedule[ts] = new_item full_schedule = dict(list(schedule.items()) + list(additions.items())) print("test1") print(f"Full schedule printout: {full_schedule}") print(f"Current delta_time: {current_seconds}") p = None next_pair_time = None key_list = list(full_schedule.keys()) key_list.sort() for i in key_list: if i > current_seconds - 5400: p = full_schedule[i] next_pair_time = i break print("test2") if next_pair_time == None: if len(full_schedule.keys()) > 0: print("test3.1") actual_pair_ts = reference_time + min(full_schedule.keys()) dt_pair = datetime.datetime.fromtimestamp(actual_pair_ts) dt_pair_finish = datetime.datetime.fromtimestamp(actual_pair_ts + 5400) p = full_schedule[min(full_schedule.keys())] print("test3.1.1") print("{} == 6 && {} == 1, {}".format(current_day, dt_pair.strftime('%u'), str( ((current_day + 2) == int(dt_pair.strftime("%u"))) or ((str(current_day) == "6") and (dt_pair.strftime("%u") == "1")) ))) human_readable_date = "" if ((current_day + 2) == int(dt_pair.strftime("%u"))) or ((str(current_day) == "6") and (dt_pair.strftime("%u") == "1")): human_readable_date += "завтра " elif current_week != int(dt_pair.strftime("%W")) % 2: human_readable_date += "{} ".format(self.WEEKDAY_NAMES_ROD_WITH_NEXT[int(dt_pair.strftime("%u")) - 1]) elif current_day != (int(dt_pair.strftime("%u")) - 1): human_readable_date += "{} ".format(self.WEEKDAY_NAMES_ROD_WITH_THIS[int(dt_pair.strftime("%u")) - 1]) else: human_readable_date += "сьогодні " print("test3.1.2") human_readable_date += "з " print("test3.1.3") human_readable_date += dt_pair.strftime("%H:%M") print("test3.1.4") human_readable_date += " до " human_readable_date += dt_pair_finish.strftime("%H:%M") self.RESPONCE = "Актуальна пара: {}\nДата: {}\nВикладач: {}\nПосилання на пару: {}".format(p['name'], human_readable_date, p['teacher'], p['link']) print("test3.1.5") else: self.RESPONCE = "Пар немає взагалі. Ми вільні!" else: print("test3.2") actual_pair_ts = reference_time + next_pair_time dt_pair = datetime.datetime.fromtimestamp(actual_pair_ts) dt_pair_finish = datetime.datetime.fromtimestamp(actual_pair_ts + 5400) human_readable_date = "" if ((current_day + 2) == int(dt_pair.strftime("%u"))) or ((str(current_day) == "6") and (dt_pair.strftime("%u") == "1")): human_readable_date += "завтра " elif current_week != int(dt_pair.strftime("%W")) % 2: human_readable_date += "{} ".format(self.WEEKDAY_NAMES_ROD_WITH_NEXT[int(dt_pair.strftime("%u")) - 1]) elif current_day != (int(dt_pair.strftime("%u")) - 1): human_readable_date += "{} ".format(self.WEEKDAY_NAMES_ROD_WITH_THIS[int(dt_pair.strftime("%u")) - 1]) else: human_readable_date += "сьогодні " human_readable_date += "з " human_readable_date += dt_pair.strftime("%H:%M") human_readable_date += " до " human_readable_date += dt_pair_finish.strftime("%H:%M") self.RESPONCE = "Актуальна пара: {}\nДата: {}\nВикладач: {}\nПосилання на пару: {}".format(p['name'], human_readable_date, p['teacher'], p['link']) if self.MESSAGE["text"].lower().split()[0] == "!пари": command = self.MESSAGE["text"].lower().split() current_time = datetime.datetime.now() current_week = current_time.isocalendar()[1] % 2 current_day = current_time.weekday() current_seconds = current_week*604800 + current_day*86400 + current_time.hour*3600 + current_time.minute*60 + current_time.second reference_time = int(current_time.strftime("%s")) - current_seconds # baking defined schedule raw_schedule = json.loads( readfile(self.path + "schedule.json") ) schedule = {} for day in range(len(raw_schedule)): for i in raw_schedule[day]: ts = day*86400 + int(i.split(":")[0])*3600 + int(i.split(":")[1])*60 new_item = dict(raw_schedule[day][i]) new_item["source"] = "schedule" schedule[ts] = new_item # baking additions (extra pairs) raw_additions = json.loads( readfile(self.path + "additions.json") ) additions = {} for day in range(len(raw_additions)): for i in raw_additions[day]: ts = day*86400 + int(i.split(":")[0])*3600 + int(i.split(":")[1])*60 new_item = dict(raw_additions[day][i]) new_item["source"] = "additions" schedule[ts] = new_item full_schedule = dict(list(schedule.items()) + list(additions.items())) preferences = {"name": True, "date": True, "teacher": True, "link": False} selected_day = current_week*7 + current_day if len(command) >= 2 and len(command[1]) > 0: if command[1][0] == "+": try: selected_day += int(command[1][1:]) except Exception as e: print(f"[auto-schedule-pro:error] Got exception '{e}' while parsing {command[1]}") elif command[1][0] == "-": try: selected_day -= int(command[1][1:]) except Exception as e: print(f"[auto-schedule-pro:error] Got exception '{e}' while parsing {command[1]}") else: try: selected_day = int(command[1]) except Exception as e: print(f"[auto-schedule-pro:error] Got exception '{e}' while parsing {command[1]}") # keeping day in bounds while selected_day > 13: selected_day -= 14 while selected_day < 0: selected_day += 14 if len(command) > 2: for i in command[2:]: if len(i) >= 2: if i[1:] in preferences: if i[0] == "+": preferences[i[1:]] = True elif i[0] == "-": preferences[i[1:]] = False found_pairs = {} for i in full_schedule: if selected_day*86400 <= i < (selected_day+1)*86400: found_pairs[i] = dict(full_schedule[i]) result_text = f"Пари у {self.WEEKDAY_NAMES_ZNAH[selected_day%7]}:\n\n" for i in found_pairs: actual_pair_ts = reference_time + i dt_pair = datetime.datetime.fromtimestamp(actual_pair_ts) dt_pair_finish = datetime.datetime.fromtimestamp(actual_pair_ts + 5400) p = found_pairs[i] human_readable_date = "" if ((current_day + 2) == int(dt_pair.strftime("%u"))) or ((str(current_day) == "6") and (dt_pair.strftime("%u") == "1")): human_readable_date += "завтра " elif current_week != int(dt_pair.strftime("%W")) % 2: human_readable_date += "{} ".format(self.WEEKDAY_NAMES_ROD_WITH_NEXT[int(dt_pair.strftime("%u")) - 1]) elif current_day != (int(dt_pair.strftime("%u")) - 1): human_readable_date += "{} ".format(self.WEEKDAY_NAMES_ROD_WITH_THIS[int(dt_pair.strftime("%u")) - 1]) else: human_readable_date += "сьогодні " human_readable_date += "з " human_readable_date += dt_pair.strftime("%H:%M") human_readable_date += " до " human_readable_date += dt_pair_finish.strftime("%H:%M") if preferences['name']: result_text += f"Назва: {p['name']}\n" if preferences['date']: result_text += f"Дата: {human_readable_date}\n" if preferences['teacher']: result_text += f"Викладач: {p['teacher']}\n" if preferences['link']: result_text += f"Посилання на пару: {p['link']}\n" result_text += "\n" self.RESPONCE = result_text