Created
May 20, 2019 20:07
-
-
Save brbcoding/35c90486a5ebc84205b77b25124a0c32 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
import datetime | |
import itertools | |
# time to turn to "upcoming meeting" state in seconds | |
UPCOMING_MEETING_THRESHOLD = 60 | |
def make_time(offset_minutes): | |
return datetime.datetime.now() + datetime.timedelta(minutes=offset_minutes) | |
class Event(): | |
_id = itertools.count() | |
def __init__(self, time_start, time_end): | |
self.time_start = time_start | |
self.time_end = time_end | |
self.duration = time_end - time_start # duration in seconds | |
self.id = next(self._id) # set an id for easier retrieval | |
@staticmethod | |
def time_now(): | |
return round(time.time()) | |
def time_until_end(self): | |
return self.time_end - self.time_now() | |
def time_until_start(self): | |
return abs(self.time_now() - self.time_start) | |
class Calendar(): | |
curr_event = None | |
next_event = None | |
# todo: sort events and always keep them sorted | |
def __init__(self, events): | |
# for event in events: | |
self.set_events(events) | |
# update loop | |
def update(self): | |
now = time.time() | |
curr_event = self.update_curr_event() | |
next_event = self.update_next_event() | |
if curr_event is None: | |
if next_event is None: | |
print("Room Available Forever! (Green Light - No Other Meetings)") | |
elif (next_event.time_start.timestamp() - now < UPCOMING_MEETING_THRESHOLD): | |
print("Upcoming Meeting in " + | |
str(round(next_event.time_start.timestamp() - now)) + " seconds (Blinky Light - Awaiting Check-In)") | |
else: | |
print("Room Available. (Green light for another " + | |
str(round(next_event.time_start.timestamp() - now) - UPCOMING_MEETING_THRESHOLD) + " seconds)") | |
else: | |
print( | |
"Room Should be Occupied (Blinky Light - Awaiting Check-In OR Party + Countdown Checked-In State)") | |
def set_events(self, events): | |
self.events = sorted( | |
events, key=lambda x: round(x.time_start.timestamp())) | |
def update_curr_event(self): | |
now = time.time() | |
curr_event = next((event for event in self.events if now > | |
event.time_start.timestamp() and now < event.time_end.timestamp()), None) | |
if curr_event is None: | |
self.curr_event = None | |
elif self.curr_event is None or self.curr_event.id != curr_event.id: | |
self.curr_event = curr_event | |
return self.curr_event | |
def update_next_event(self): | |
now = time.time() | |
# find first event where time start is after now | |
next_event = next((event for event in self.events if now < | |
event.time_start.timestamp()), None) | |
if next_event is None: | |
self.next_event = None | |
elif self.next_event is None or self.next_event != next_event.id: | |
self.next_event = next_event | |
return self.next_event | |
# todo: check if room is already booked | |
def add_event(self, event): | |
events_updated = self.events + [event] | |
self.set_events(events_updated) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment