def daemon_loop(config, muni_token, bridge): triggered_rules = [] for stop_id, stop_config in config['stops'].iteritems(): stop = Stop(muni_token, "", stop_id) for route_id, route_config in stop_config.iteritems(): departure = stop.next_departures(route_id, route_config['direction']) print "%s - %s" % (route_id, departure.times) departure_rules_triggered = process_departures( departure, bridge, route_config) triggered_rules.extend(departure_rules_triggered) desired_light_states = colate_lights(triggered_rules) trigger_lights(bridge, desired_light_states) triggered_lights = set() for rule in triggered_rules: triggered_lights.update(rule['lights'].keys()) for light_id in natural_light_state.iterkeys(): if light_id not in triggered_lights: reset_light(bridge, light_id) return False
def daemon_loop(config, muni_token, bridge): triggered_rules = [] for stop_id, stop_config in config['stops'].iteritems(): stop = Stop(muni_token, "", stop_id) for route_id, route_config in stop_config.iteritems(): departure = stop.next_departures(route_id, route_config['direction']) print "%s - %s" % (route_id, departure.times) departure_rules_triggered = process_departures(departure, bridge, route_config) triggered_rules.extend(departure_rules_triggered) desired_light_states = colate_lights(triggered_rules) trigger_lights(bridge, desired_light_states) triggered_lights = set() for rule in triggered_rules: triggered_lights.update(rule['lights'].keys()) for light_id in natural_light_state.iterkeys(): if light_id not in triggered_lights: reset_light(bridge, light_id) return False
def addStop(StopID): """ Adds a stop to the list of stops for the user invoking the skill """ if StopID is None: return question(render_template("no_stop_id")).reprompt( render_template("no_stop_id_reprompt")) stop = Stop(TOKEN, StopID, StopID) try: stop.load() except Exception: log.exception("error loading the stop") return question(render_template( "add_stop_question", stop=StopID)).reprompt(render_template("add_stop_reprompt")) departures = stop.all_departures() buses = list(set(d.route for d in departures)) if len(buses) == 1: newStop = dict(code=stop.code, name=stop.name, buses=[buses[0]]) return updateStopList(session.user.userId, newStop) else: session.attributes[STOPID_KEY] = stop.code session.attributes[STOPNAME_KEY] = stop.name session.attributes[BUSES_KEY] = ",".join(buses) return question( render_template("add_bus_question", buses=getSentence(buses), stop=StopID, bus=buses[0])).reprompt( render_template("add_bus_reprompt"))
def test_departures(self): route = Route(self.token, "SF-MUNI", "45-Union Stockton", "45", True) stop = Stop(self.token, "Union St and Buchanan St", "17056") departures = stop.next_departures(route.code) self.assertIsNotNone(departures) self.assertEqual(departures.route, route.code) self.assertTrue(len(departures.times) > 0) for time in departures.times: self.assertIsNotNone(time) outbound_departures = stop.next_departures(route.code, direction=route.OUTBOUND) self.assertIsNotNone(outbound_departures) self.assertEqual(outbound_departures.route, route.code) self.assertTrue(len(outbound_departures.times) > 0) for time in outbound_departures.times: self.assertIsNotNone(time)
def addBus(BusID): """ Adds a bus to the list of stops for the user invoking the skill """ if STOPID_KEY not in session.attributes or \ STOPNAME_KEY not in session.attributes or \ BUSES_KEY not in session.attributes: return askToAddAStop() buses = session.attributes[BUSES_KEY].split(",") if BusID is None: return question(render_template("no_bus_id", bus=buses[0])).reprompt( "no_bus_id_reprompt", bus=buses[0]) BusID = BusID.upper() stop = Stop(TOKEN, session.attributes[STOPID_KEY], session.attributes[STOPID_KEY]) if BusID not in buses: return question(render_template("bad_route", bus=BusID)).reprompt( render_template("bad_route", bus=BusID)) else: newStop = dict(code=stop.code, name=session.attributes[STOPNAME_KEY], buses=[BusID]) return updateStopList(session.user.userId, newStop)
def getBusTimes(): """ Returns the incoming times of the stops configured for the user. If not configured, it prompts the user to add a stop. """ card_title = render_template('card_title') response = dynamodb_table.query( KeyConditionExpression=Key('userId').eq(session.user.userId)) if isResponseEmpty(response): return askToAddAStop() else: departures = [] for key in response["Items"][0]['stops']: s = response["Items"][0]['stops'][key] stop = Stop(TOKEN, s["name"], s["code"]) if "buses" in s: for r in s["buses"]: try: d = stop.next_departures(r) readable_departure_times = getSentence(d.times) departures.append( dict(bus=d.route, departures=readable_departure_times)) except Exception: log.exception("Failed to get departures for %s", r) if len(departures) == 0: return statement(render_template("get_departures_failed")) else: responseStatement = render_template("get_departures_success", departures=departures) return statement(responseStatement).simple_card( card_title, responseStatement)