Skip to content

Instantly share code, notes, and snippets.

@brbcoding
Created May 20, 2019 20:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brbcoding/35c90486a5ebc84205b77b25124a0c32 to your computer and use it in GitHub Desktop.
Save brbcoding/35c90486a5ebc84205b77b25124a0c32 to your computer and use it in GitHub Desktop.
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