def test_extract_ambiguous_time_en(self): morning = datetime(2017, 6, 27, 8, 1, 2) evening = datetime(2017, 6, 27, 20, 1, 2) noonish = datetime(2017, 6, 27, 12, 1, 2) self.assertEqual( extract_datetime('feed fish at 10 o\'clock', morning)[0], datetime(2017, 6, 27, 10, 0, 0)) self.assertEqual( extract_datetime('feed fish at 10 o\'clock', noonish)[0], datetime(2017, 6, 27, 22, 0, 0)) self.assertEqual( extract_datetime('feed fish at 10 o\'clock', evening)[0], datetime(2017, 6, 27, 22, 0, 0))
def test_extract_ambiguous_time_it(self): mattina = datetime(2017, 6, 27, 8, 1, 2) sera = datetime(2017, 6, 27, 20, 1, 2) mezzogiorno = datetime(2017, 6, 27, 12, 1, 2) self.assertEqual( extract_datetime('dai da mangiare ai pesci alle 10 in punto', mattina, lang='it-it')[0], datetime(2017, 6, 27, 10, 0, 0)) self.assertEqual( extract_datetime('dai da mangiare ai pesci alle 10 in punto', mezzogiorno, lang='it-it')[0], datetime(2017, 6, 27, 22, 0, 0)) self.assertEqual( extract_datetime('dai da mangiare ai pesci alle 10 in punto', sera, lang='it-it')[0], datetime(2017, 6, 27, 22, 0, 0))
def test_extractdatetime_default_pt(self): default = time(9, 0, 0) anchor = datetime(2017, 6, 27, 0, 0) res = extract_datetime( 'marca consulta para 2 semanas e 6 dias depois de Sabado', anchor, lang='pt-pt', default_time=default) self.assertEqual(default, res[0].time())
def test_extract_datetime_relative_failing(self): self.assertEqual( extract_datetime("mañana", anchorDate=datetime(1998, 1, 1), lang='es')[0], datetime(1998, 1, 2))
def extractWithFormat(text): date = datetime(2017, 06, 27, 00, 00) [extractedDate, leftover] = extract_datetime(text, date) extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover]
def extractWithFormat(text): date = datetime(2017, 6, 27, 13, 4) # Tue June 27, 2017 @ 1:04pm [extractedDate, leftover] = extract_datetime(text, date) extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover]
def test_extractdatetime_default_it(self): default = time(9, 0, 0) anchor = datetime(2017, 6, 27, 0, 0) res = extract_datetime('Come è il meteo 3 tra giorni?', anchor, lang='it-it', default_time=default) self.assertEqual(default, res[0].time())
def extractWithFormat_fr(text): date = datetime(2017, 6, 27, 0, 0) [extractedDate, leftover] = extract_datetime(text, date, lang="fr-fr") extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover]
def test_extractdatetime_default_it(self): default = time(9, 0, 0) anchor = datetime(2017, 6, 27, 0, 0) res = extract_datetime("Come è il meteo 3 tra giorni?", anchor, lang='it-it', default_time=default) self.assertEqual(default, res[0].time())
def handle_set_alarm(self, message): """Handler for "set an alarm for...""" utt = message.data.get('utterance').lower() recur = None if message.data.get('Recurring'): # Just ignoring the 'Recurrence' now, we support more complex stuff # recurrence = message.data.get('Recurrence') recur = self._create_day_set(utt) # TODO: remove days following an "except" in the utt while not recur: r = self.get_response('query.recurrence', num_retries=1) if not r: return recur = self._create_day_set(r) if self.voc_match(utt, "Except"): # TODO: Support exceptions self.speak_dialog("no.exceptions.yet") return # Get the time when, utt_no_datetime = extract_datetime(utt, lang=self.lang) or (None, utt) # Get name from leftover string from extract_datetime name = self._get_alarm_name(utt_no_datetime) # Will return dt of unmatched string today = extract_datetime(self.texts.get('today'), lang=self.lang) today = today[0] # Check the time if it's midnight. This is to check if the user # said a recurring alarm with only the Day or if the user did # specify to set an alarm on midnight. If it's confirmed that # it's for a day only, then get another response from the user # to clarify what time on that day the recurring alarm is. is_midnight = self._check_if_utt_has_midnight(utt, when, self.threshold) if (when is None or when.time() == today.time()) and not is_midnight: r = self.get_response('query.for.when', validator=extract_datetime) if not r: self.speak_dialog("alarm.schedule.cancelled") return when_temp = extract_datetime(r, lang=self.lang) if when_temp is not None: when_temp = when_temp[0] # TODO add check for midnight # is_midnight = self._check_if_utt_has_midnight(r, when_temp, # self.threshold) when = when_temp if when is None \ else datetime(tzinfo=when.tzinfo, year=when.year, month=when.month, day=when.day, hour=when_temp.hour, minute=when_temp.minute) else: when = None # Verify time alarm_time = when confirmed_time = False while (not when or when == today) and not confirmed_time: if recur: t = nice_time(alarm_time, use_ampm=not self.use_24hour, use_24hour = self.use_24hour) conf = self.ask_yesno('confirm.recurring.alarm', data={ 'time': t, 'recurrence': self._recur_desc(recur) }) else: t = nice_date_time(alarm_time, now=today, use_ampm= not self.use_24hour, use_24hour = self.use_24hour, lang=self.lang) conf = self.ask_yesno('confirm.alarm', data={'time': t}) if not conf: return if conf == 'yes': when = [alarm_time] confirmed_time = True else: # check if a new (corrected) time was given when = extract_datetime(conf, lang=self.lang) if when is not None: when = when[0] if not when or when == today: # Not a confirmation and no date/time in statement, quit return alarm_time = when when = None # reverify alarm = {} if not recur: alarm_time_ts = to_utc(alarm_time).timestamp() now_ts = now_utc().timestamp() if alarm_time_ts > now_ts: alarm = self.set_alarm(alarm_time, name) else: if (self.texts.get('today') in utt) or (self.texts.get('tonight') in utt): self.speak_dialog('alarm.past') return else: # Set the alarm to find the next 24 hour time slot while alarm_time_ts < now_ts: alarm_time_ts += 86400.0 alarm_time = datetime.utcfromtimestamp(alarm_time_ts) alarm = self.set_alarm(alarm_time, name) else: alarm = self.set_alarm(alarm_time, name, repeat=recur) if not alarm: # none set, it was a duplicate return # Don't want to hide the animation self.enclosure.deactivate_mouth_events() if confirmed_time: self.speak_dialog("alarm.scheduled") else: t = self._describe(alarm) reltime = nice_relative_time(self.get_alarm_local(alarm), lang=self.lang) if recur: self.speak_dialog("recurring.alarm.scheduled.for.time", data={"time": t, "rel": reltime}) else: self.speak_dialog("alarm.scheduled.for.time", data={"time": t, "rel": reltime}) self._show_alarm_anim(alarm_time) self.enclosure.activate_mouth_events()
def handle_add_appoint(self, message): event = message.data.get("event") while not event: #We need to get the event event = self.get_response("new.event.name") utterance = message.data['utterance'] date, rest = extract_datetime(utterance, datetime.now(), self.lang) while rest == normalize(utterance): utterance = self.get_response("new.event.date") date, rest = extract_datetime(utterance) self.log.info(" Calendar skill new event: date: " + str(date) + " event: " + event) #ADD EVENT server_type = self.check_server() if server_type == "Handled": return elif server_type == True: #Home server_address = self.settings.get("server_address") port = self.settings.get("port") username = self.settings.get("username") password = self.settings.get("password") #start creating a vevent: cal = vobject.iCalendar() cal.add("vevent") #add name cal.vevent.add("summary").value = str(event) #add date cal.vevent.add('dtstart').value = date # add it to the calendar url = "http://{}:{}@{}:{}/".format(username, password, server_address, port) try: client = caldav.DAVClient(url) principal = client.principal() #Select calendar events = [] for calendar in principal.calendars(): calendar.add_event(str(cal.serialize())) self.speak_dialog("new.event.summary", data={"event": str(event)}) except: self.speak_dialog("error.logging.in") return None elif server_type is None: # Password local server_address = self.settings.get("server_address") calendar = self.settings.get("calendar") port = self.settings.get("port") account_config = self.config_core.get("calendar", {}) username = account_config.get("username") password = account_config.get("password") # start creating a vevent: cal = vobject.iCalendar() cal.add("vevent") # add name cal.vevent.add("summary").value = str(event) # add date cal.vevent.add('dtstart').value = date # add it to the calendar url = "http://{}:{}@{}:{}/".format(username, password, server_address, port) try: client = caldav.DAVClient(url) principal = client.principal() # Select calendar events = [] for calendar in principal.calendars(): calendar.add_event(str(cal.serialize())) self.speak_dialog("new.event.summary", data={"event": str(event)}) except: self.speak_dialog("error.logging.in") return None elif server_type == False: #Local #The calendar is on the device #Check if it needs to be made... fs = FileSystemAccess(str(self.skill_id)) if fs.exists("calendar.ics"): #YAY! exists calendar = self.read_file("calendar.ics") c = ics.Calendar(calendar) e = ics.Event() #add event e.name = str(event) e.begin = str(arrow.get(date)) c.events.apaddpend(e) self.write_file("calendar.ics", str(c)) self.speak_dialog("new.event.summary", data={"event": str(event)}) else: #create calendar c = ics.Calendar() e = ics.Event() #add event e.name = str(event) e.begin = str(arrow.get(date)) c.events.add(e) self.write_file("calendar.ics", str(c)) self.speak_dialog("new.event.summary", data={"event": str(event)})
def test_extractdatetime_default_fr(self): default = time(9, 0, 0) anchor = datetime(2017, 6, 27, 0, 0) res = extract_datetime("faire les plantations le 3ème jour de mars", anchor, lang='fr-fr', default_time=default) self.assertEqual(default, res[0].time())
def test_extract_datetime(self): """Check that extract_datetime returns the expected timezone.""" tz = default_timezone() dt, _ = extract_datetime("today") self.assertEqual(tz, dt.tzinfo)
def contains_datetime(utterance, lang='en-us'): return extract_datetime(utterance) is not None
def _get_alarm_matches(self, utt, alarm=None, max_results=1, dialog='ask.which.alarm', is_response=False): """Get list of alarms that match based on a user utterance. Arguments: utt (str): string spoken by the user alarm (list): list of alarm to match against max_results (int): max number of results desired dialog (str): name of dialog file used for disambiguation is_response (bool): is this being called by get_response Returns: (str): ["All", "Matched", "No Match Found", or "User Cancelled"] (list): list of matched alarm """ alarms = alarm or self.settings['alarm'] all_words = self.translate_list('all') next_words = self.translate_list('next') status = ["All", "Matched", "No Match Found", "User Cancelled", "Next"] # No alarms if alarms is None or len(alarms) == 0: self.log.error("Cannot get match. No active alarms.") return (status[2], None) # Extract Alarm Time when, utt_no_datetime = extract_datetime(utt, lang=self.lang) or (None, None) # Will return dt of unmatched string today = extract_datetime(self.texts.get('today'), lang=self.lang) today = today[0] # Check the time if it's midnight. This is to check if the user # said a recurring alarm with only the Day or if the user did # specify to set an alarm on midnight. If it's confirmed that # it's for a day only, then get another response from the user # to clarify what time on that day the recurring alarm is. is_midnight = self._check_if_utt_has_midnight(utt, when, self.threshold) if when == today and not is_midnight: when = None time_matches = None time_alarm = None if when: time_alarm = to_utc(when).timestamp() if is_midnight: time_alarm = time_alarm + 86400.0 time_matches = [a for a in alarms if abs(a["timestamp"] - time_alarm) <= 60] # Extract Recurrence recur = None recurrence_matches = None for word in self.recurrence_dict: is_match = self._fuzzy_match(word, utt.lower(), self.threshold) if is_match: recur = self._create_day_set(utt) alarm_recur = self._create_recurring_alarm(when, recur) recurrence_matches = [a for a in alarms if a["repeat_rule"] == alarm_recur["repeat_rule"] ] break utt = utt_no_datetime or utt # Extract Ordinal/Cardinal Numbers number = extract_number(utt, ordinals=True, lang=self.lang) if number and number > 0: number = int(number) else: number = None # Extract Name name_matches = [a for a in alarms if a["name"] and self._fuzzy_match(a["name"], utt, self.threshold)] # Match Everything alarm_to_match = None if when: if recur: alarm_to_match = alarm_recur else: alarm_to_match = {"timestamp": time_alarm, "repeat_rule": ""} # Find the Intersection of the Alarms list and all the matched alarms orig_count = len(alarms) if when and time_matches: alarms = [a for a in alarms if a in time_matches] if recur and recurrence_matches: alarms = [a for a in alarms if a in recurrence_matches] if name_matches: alarms = [a for a in alarms if a in name_matches] # Utterance refers to all alarms if utt and any(self._fuzzy_match(i, utt, 1) for i in all_words): return (status[0], alarms) # Utterance refers to the next alarm to go off elif utt and any(self._fuzzy_match(i, utt, 1) for i in next_words): return (status[4], [alarms[0]]) # Given something to match but no match found if ((number and number > len(alarms)) or (recur and not recurrence_matches) or (when and not time_matches)): return (status[2], None) # If number of alarms filtered were the same, assume user asked for # All alarms if (len(alarms) == orig_count and max_results > 1 and not number and not when and not recur): return (status[0], alarms) # Return immediately if there is ordinal if number and number <= len(alarms): return (status[1], [alarms[number - 1]]) # Return immediately if within maximum results elif alarms and len(alarms) <= max_results: return (status[1], alarms) # Ask for reply from user and iterate the function elif alarms and len(alarms) > max_results: desc = [] for alarm in alarms: desc.append(self._describe(alarm)) items_string = '' if desc: items_string = join_list(desc, self.translate('and')) reply = self.get_response(dialog, data={ 'number': len(alarms), 'list': items_string, }, num_retries=1) if reply: return self._get_alarm_matches(reply, alarm=alarms, max_results=max_results, dialog=dialog, is_response=True) else: return (status[3], None) # No matches found return (status[2], None)
def handle_add_event_intent(self, message): utt = message.data['utterance'] time_delta, remaining_utt = extract_duration( utt) # get time duration from utterance start_time, remaining_utt = extract_datetime( remaining_utt) # get time from utterance owner = message.data.get('Owner') # get calendar owner utt = normalize(utt).replace("'s", "") # normalize and drop 's in utterance parsed_utt = asjson( self.PEGParser.parse(utt)) # parse utterance for owner owner = parsed_utt.get('calendar_owner') if owner is None: # if parser failed to get owner, prompt user owner = self.get_response('ask.calendar.owner') self.log.info('using owner: {}'.format(owner)) try: # get the calendar belonging to owner calName = self.nameToCalendar[owner] # throw error if none found except KeyError: self.speak_dialog('no.calendar.found.error', {'name': owner}) return if start_time is None: # if start time not found start_time, _ = extract_datetime( self.get_response('ask.start.time')) # ask the user if time_delta is None: # if duration not found time_delta, _ = extract_duration( self.get_response('ask.duration')) # ask the user if time_delta is None or start_time is None: # if duration of start time STILL unkonwn self.speak( 'sorry. i was not able to understand. please start over.' ) # fail return end_time = start_time + time_delta # calculate end time eventName = self.get_response( 'ask.event.name').title() # ask for event name confirmation = self.ask_yesno( 'confirm.event', # confirm details { 'event_name': eventName, 'confirmation_text': self.confirmEventDetails( start_time, end_time), 'owner': self.calendarToName[calName] }) if confirmation == 'no': self.speak_dialog('confirmation.failed') elif confirmation == 'yes': url, user, password = self.getConfigs() # get configs if url is None: # if getConfigs returned None, it failed and pass # already spoke to user else: calendar = self.getCalendar( calName, url, user, password) # get calendar and create the event self.makeEvent(calendar, start_time, end_time, eventName, owner=self.calendarToName[calName]) else: self.speak('sorry i did not understand.')
def convertSpokenTimeRangeToDT(self, time_range_string): time_range_list = time_range_string.split(' ') # attempt to get starting datetime directly try: extracted_dt = extract_datetime( time_range_string ) # try using mycroft's parser to get the start time if extracted_dt is None: # is likely 'this week' or 'this weekend' if 'week' in time_range_list: start = dt.now( ) # start at current time so as to ignore any of todays self.log.info( 'got this week') # events that have allready passed elif 'weekend' in time_range_list: self.log.info('got weekend') now = dt.now( ) # for 'this weekend' start should be the upcoming sat current_dow = now.weekday( ) # unless it is already sat or sun. It it is sat or sun offset = 5 - current_dow # start at current time if offset <= 0: offset = 0 if 'next' in time_range_list: # for 'next weekend', add 7 to the calculated offset offset += 7 # from above start = dt(now.year, now.month, now.day) + timedelta(offset) else: # all other key words for time range should be captured self.speak("i could not parse the given time range" ) # in the other conditional blocks assert False, "key word not supported." else: if time_range_string == "next week": # 'next week' will get parsed incorrectly by self.log.info('got next week') # extract_datetime now = dt.now() current_dow = now.weekday( ) # get the upcoming sunday; if it is currently sunday offset = 6 - current_dow # get the following one if offset == 0: offset = 7 start = dt(now.year, now.month, now.day) + timedelta(offset) else: # otherwise use the datetime provided by extract_datetime self.log.info('got something else') start = extracted_dt[0] # now that the start time is found get the end time from the time string if 'day' in time_range_string or 'tomorrow' in time_range_string: # handles day, today, monday, tuesday, etc end = dt(start.year, start.month, start.day, 23, 59) # end on 11:59pm of same day elif 'weekend' in time_range_string: # start is saturday morn, so end on last min of sunday end = dt(start.year, start.month, start.day, 23, 59) + timedelta(1) elif 'week' in time_range_string: starting_dow = start.weekday( ) # end on the saturday of the given week if starting_dow == 6: # if it is sunday, +6 days 23h 59m end = dt(start.year, start.month, start.day, 23, 59) + timedelta(6) else: # if it is not sunday, add the required days + 23:59 to reach sat end = dt(start.year, start.month, start.day, 23, 59) + timedelta(5 - starting_dow) else: # afternoon, evening, morning resutls in 4h ranges end = start + timedelta(hours=4) self.log.info("start: {}".format(start)) self.log.info("end: {}".format(end)) return start, end except Exception as e: # log and notify of any errors self.speak("i could not parse given time range") self.log.error(e)
def handle_cinema_deckchair(self, message): try: now_date = datetime.now() # 1. Scrape website for movie on this date try: program_tr_list = self.cinema_program.fetch( cache=[join(self.file_system.path), now_date]) except (exceptions.ConnectionError or exceptions.HTTPError or exceptions.Timeout or exceptions.TooManyRedirects) as e: self.log.error('Error: {0}'.format(e)) self.speak_dialog('error.http') return # 2. Extract date from utterance, or default to today when = extract_datetime(message.data.get('utterance'))[0] if self.testing_date is not None: when = self.testing_date # 3. Test if date is in deckchair program range first_date = self._get_date_from_list(program_tr_list, 'first') last_date = self._get_date_from_list(program_tr_list, 'last') if when < first_date or last_date < when: self.speak_dialog( 'error.datenotfound', { 'when': nice_date(when, now=now_date), 'first_date': nice_date(first_date, now=now_date), 'last_date': nice_date(last_date, now=now_date) }) return False # 4. Find movie on provided date try: date_row = next( (x for x in program_tr_list if x.getchildren()[0].text == when.strftime('%A %-d %B'))) except StopIteration: self.log.info('Date note found: {}'.format( when.strftime('%A %-d %B'))) return self.speak_dialog( 'error.datenotfound', { 'when': nice_date(when, now=now_date), 'first_date': nice_date(first_date, now=now_date), 'last_date': nice_date(last_date, now=now_date) }) movies_on_date = self._add_movie_from_date(date_row, movies_on_date=[]) # 5. Construct message to return movie_details_dialog = [] for movie in movies_on_date: if len(movie_details_dialog) > 0: movie_details_dialog.append(self.translate('and')) movie_title = movie.getchildren()[0].getchildren()[0].text movie_time = nice_time( when.replace(hour=int(movie.getchildren()[1].text[0:-5]), minute=int( movie.getchildren()[1].text[-4:-2]))) movie_details_dialog.append( self.translate('movie.at.time', { 'title': movie_title, 'time': movie_time })) self.speak_dialog( 'whats.on', { 'when': nice_date(when, now=datetime.now()), 'movie_details': ', '.join(movie_details_dialog) }) # 6. Fetch data and set context for follow up questions # Reset data from previous requests. self._movies_on_requested_date = [] self._current_movie_context = '' for movie in movies_on_date: movie_details = self._fetch_movie_details(movie) self._movie_dict[movie_details['title']] = movie_details self._movies_on_requested_date.append( movie.getchildren()[0].getchildren()[0].text) self.set_context('DeckchairContext', 'True') except Exception as e: self.log.exception(format(e)) self.speak_dialog('error')
def handle_current_weather(self, message): try: # Get a date from requests like "weather for next Tuesday" today = extract_datetime(" ")[0] when, _ = extract_datetime(message.data.get('utterance'), lang=self.lang) if today != when: LOG.info("Doing a forecast" + str(today) + " " + str(when)) return self.handle_forecast(message) report = self.__initialize_report(message) # Get current conditions currentWeather = self.owm.weather_at_place( report['full_location'], report['lat'], report['lon']).get_weather() condition = self.__translate(currentWeather.get_detailed_status()) report['condition'] = condition report['temp'] = self.__get_temperature(currentWeather, 'temp') report['icon'] = currentWeather.get_weather_icon_name() # Get forecast for the day # can get 'min', 'max', 'eve', 'morn', 'night', 'day' # Set time to 12 instead of 00 to accomodate for timezones forecastWeather = self.__get_forecast(today.replace(hour=12), report['full_location'], report['lat'], report['lon']) report['temp_min'] = self.__get_temperature(forecastWeather, 'min') report['temp_max'] = self.__get_temperature(forecastWeather, 'max') weather_code = str(report['icon']) img_code = self.CODES[weather_code] futureWeather = self.owm.daily_forecast(report['full_location'], report['lat'], report['lon'], limit=5) f = futureWeather.get_forecast() forecastDump = {} forecastList = [] days = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ] unit = self.__get_temperature_unit() for weather in f.get_weathers(): result_temp = weather.get_temperature(unit) result_temp_day = days[datetime.weekday( datetime.fromtimestamp(weather.get_reference_time()))] forecastList.append({ "weathercode": self.CODES[weather.get_weather_icon_name()], "max": result_temp['max'], "min": result_temp['min'], "date": result_temp_day }) forecastList.pop(0) forecastDump['forecast'] = forecastList LOG.info(forecastDump['forecast']) self.enclosure.bus.emit( Message( "metadata", { "type": "mycroft-weather", "current": report["temp"], "min": report["temp_min"], "max": report["temp_max"], "location": report["full_location"], "condition": report["condition"], "icon": report["icon"], "weathercode": img_code, "forecastDump": forecastDump })) self.__report_weather("current", report) except HTTPError as e: self.__api_error(e) except Exception as e: LOG.error("Error: {0}".format(e))
def extractWithFormat(text): date = datetime(2017, 6, 27, 10, 1, 2) [extractedDate, leftover] = extract_datetime(text, date, lang='it-it') extractedDate = extractedDate.strftime('%Y-%m-%d %H:%M:%S') return [extractedDate, leftover]
def extractWithFormat(text): date = datetime(2018, 1, 13, 0, 0) [extractedDate, leftover] = extract_datetime(text, date, lang="it") extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover]
def handle_update_end_date(self): # Getting the credentials for G.People API storage = Storage('info.dat') credentials = storage.get() if credentials is None or credentials.invalid is True: credentials = tools.run_flow(FLOW, storage) http = httplib2.Http() http = credentials.authorize(http) people_service = build(serviceName='people', version='v1', http=http) results = people_service.people().connections().list( resourceName='people/me', pageSize=10, personFields='emailAddresses,names').execute() connections = results.get('connections', []) # Get credentials for google calendar with [email protected] # and token management creds = None # The file token.pickle stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists('token.pickle'): with open('token.pickle', 'rb') as token: creds = pickle.load(token) # If there are no (valid) credentials available, let the user log in. if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( 'credentials.json', SCOPES) creds = flow.run_local_server() # Save the credentials for the next run with open('token.pickle', 'wb') as token: pickle.dump(creds, token) service = build('calendar', 'v3', credentials=creds) # Getting the event you want to update title = self.get_response('what\'s the name of the event') events_result = service.events().list(calendarId='primary', maxResults=1, singleEvents=True, orderBy='startTime', q=title).execute() events = events_result.get('items', []) if not events: self.speak('event not found') for event in events: eventid = event['id'] # Getting inputs end = self.get_response('when does it end?') et = extract_datetime(end) event['start'] = et # Updating the Event service.events().update(calendarId='primary', eventId=eventid, body=event).execute() self.speak_dialog('successful.update')
def handle_device(self, message): storage1 = Storage( '/opt/mycroft/skills/devicereservation.hanabouzid/info.dat') credentials = storage1.get() if credentials is None or credentials.invalid == True: credentials = tools.run_flow(FLOW, storage1) print(credentials) # Create an httplib2.Http object to handle our HTTP requests and # authorize it with our good Credentials. http = httplib2.Http() http = credentials.authorize(http) service = build('calendar', 'v3', http=http) people_service = build(serviceName='people', version='v1', http=http) results = people_service.people().connections().list( resourceName='people/me', pageSize=100, personFields='names,emailAddresses', fields='connections,totalItems,nextSyncToken').execute() connections = results.get('connections', []) print("authorized") listdiv = [] utt = message.data.get("utterance", None) liste1 = utt.split(" a ") liste2 = liste1[1].split(" for ") if ("and") in liste2[0]: listdiv = liste2[0].split(" and ") else: listdiv.append(liste2[0]) print(listdiv) date1 = liste2[1] st = extract_datetime(date1) st = st[0] - self.utc_offset datestart = st.strftime('%Y-%m-%dT%H:%M:00') datestart += UTC_TZ print(datestart) date2 = self.get_response('when will you return the device?') et = extract_datetime(date2) et = et[0] - self.utc_offset dater = et.strftime('%Y-%m-%dT%H:%M:00') dater += UTC_TZ print(dater) nameListe = [] adsmails = [] # attendee est la liste des invités qui sont disponibles attendees = [] for person in connections: emails = person.get('emailAddresses', []) names = person.get('names', []) adsmails.append(emails[0].get('value')) nameListe.append(names[0].get('displayName')) print(nameListe) print(adsmails) nameEmp = self.get_response('What is your name please?') mailEmp = self.recherche(nameListe, adsmails, nameEmp) #service.list(customer='my_customer' , orderBy=None, pageToken=None, maxResults=None, query=None) #.get(customer=*, calendarResourceId=*) listD = ['pcfocus'] listDmails = [ '*****@*****.**' ] freeDevices = [] freemails = [] for i in range(len(listDmails)): x = self.freebusy(i, datestart, dater, service) if x == True: freeDevices.append(listD[i]) freemails.append(listDmails[i]) print(freemails) print(freeDevices) s = ",".join(freeDevices) print('free devices' + s) for device in listdiv: l = [] for i in freeDevices: print(i) if device in i.lower(): l.append(i) print(l) if l != []: self.speak_dialog('free', data={"device": device, "s": s}) choice = self.get_response('what is your choice?') email = self.recherche(freeDevices, freemails, choice) attendees.append({'email': email}) summary = choice + "reservation for Mr/Ms" + nameEmp description = "Mr/Ms" + nameEmp + "'s email:" + mailEmp reservation = { 'summary': summary, 'description': description, 'location': 'Focus corporation', 'start': { 'dateTime': datestart, 'timeZone': 'America/Los_Angeles', }, 'end': { 'dateTime': dater, 'timeZone': 'America/Los_Angeles', }, 'recurrence': ['RRULE:FREQ=DAILY;COUNT=1'], 'attendees': attendees, 'reminders': { 'useDefault': False, 'overrides': [ { 'method': 'email', 'minutes': 24 * 60 }, { 'method': 'popup', 'minutes': 10 }, ], }, } reservation = service.events().insert( calendarId='primary', sendNotifications=True, body=reservation).execute() print('Event created: %s' % (reservation.get('htmlLink'))) self.speak_dialog('deviceReserved', data={"device": device}) else: self.speak_dialog('busy', data={"device": device})
def handle_windy(self, message): report = self.__initialize_report(message) when = extract_datetime(message.data.get('utterance'))[0] if when == extract_datetime(" ")[0]: weather = self.owm.weather_at_place(report['full_location'], report['lat'], report['lon']).get_weather() else: # Get forecast for that day weather = self.__get_forecast(when, report['full_location'], report['lat'], report['lon']) if not weather or weather.get_wind() == 0: self.speak_dialog("do not know") return wind = weather.get_wind() speed = wind["speed"] # get speed if self.__get_speed_unit() == "mph": speed *= 2.23694 unit = self.__translate("miles per hour") else: unit = self.__translate("meters per second") speed = round(speed) # get direction, convert compass degrees to named direction if "deg" in wind: deg = wind["deg"] if deg < 22.5: dir = "N" elif deg < 67.5: dir = "NE" elif deg < 112.5: dir = "E" elif deg < 157.5: dir = "SE" elif deg < 202.5: dir = "S" elif deg < 247.5: dir = "SW" elif deg < 292.5: dir = "W" elif deg < 337.5: dir = "NW" else: dir = "N" dir = self.__translate(dir) value = self.__translate("wind.speed.dir", data={ "dir": dir, "speed": nice_number(speed), "unit": unit }) else: value = self.__translate("wind.speed", data={ "speed": nice_number(speed), "unit": unit }) self.__report_condition(self.__translate("winds"), value, when)
def test_extractdatetime_default_da(self): default = time(9, 0, 0) anchor = datetime(2017, 6, 27, 0, 0) res = extract_datetime("lad os mødes på fredag klokken 9 om morgenen", anchor, lang='da-dk', default_time=default) self.assertEqual(default, res[0].time())
def test_extract_datetime_relative(self): self.assertEqual( extract_datetime("esta noche", anchorDate=datetime(1998, 1, 1), lang='es'), [datetime(1998, 1, 1, 21, 0, 0), 'esta']) self.assertEqual( extract_datetime("ayer noche", anchorDate=datetime(1998, 1, 1), lang='es')[0], datetime(1997, 12, 31, 21)) self.assertEqual( extract_datetime("el noche anteayer", anchorDate=datetime(1998, 1, 1), lang='es')[0], datetime(1997, 12, 30, 21)) self.assertEqual( extract_datetime("el noche ante ante ayer", anchorDate=datetime(1998, 1, 1), lang='es')[0], datetime(1997, 12, 29, 21)) self.assertEqual( extract_datetime("mañana en la mañana", anchorDate=datetime(1998, 1, 1), lang='es')[0], datetime(1998, 1, 2, 8)) self.assertEqual( extract_datetime("ayer en la tarde", anchorDate=datetime(1998, 1, 1), lang='es')[0], datetime(1997, 12, 31, 15)) self.assertEqual( extract_datetime("que año es", anchorDate=datetime(1998, 1, 1), lang='es')[0], datetime(1998, 1, 1)) self.assertEqual( extract_datetime("hoy 2 a.m.", lang='es', anchorDate=datetime(1998, 1, 1))[0], datetime(1998, 1, 1, 2)) self.assertEqual( extract_datetime("hoy 2 am", lang='es', anchorDate=datetime(1998, 1, 1))[0], datetime(1998, 1, 1, 2)) self.assertEqual( extract_datetime("hoy 2 p.m.", lang='es', anchorDate=datetime(1998, 1, 1))[0], datetime(1998, 1, 1, 14)) self.assertEqual( extract_datetime("hoy 2 pm", lang='es', anchorDate=datetime(1998, 1, 1))[0], datetime(1998, 1, 1, 14))
def updateevent(self, message): #AUTHORIZE storage1 = Storage( '/opt/mycroft/skills/updateeventskill.hanabouzid/info3.dat') credentials = storage1.get() if credentials is None or credentials.invalid == True: credentials = tools.run_flow(FLOW, storage1) print(credentials) # Create an httplib2.Http object to handle our HTTP requests and # authorize it with our good Credentials. http = httplib2.Http() http = credentials.authorize(http) # Build a service object for interacting with the API. To get an API key for # your application, visit the Google API Console # and look at your application's credentials page. service = build('calendar', 'v3', http=http) people_service = build(serviceName='people', version='v1', http=http) print("authorized") # To get the person information for any Google Account, use the following code: # profile = people_service.people().get('people/me', pageSize=100, personFields='names,emailAddresses').execute() # To get a list of people in the user's contacts, # results = service.people().connections().list(resourceName='people/me',personFields='names,emailAddresses',fields='connections,totalItems,nextSyncToken').execute() results = people_service.people().connections().list( resourceName='people/me', pageSize=100, personFields='names,emailAddresses,events', fields='connections,totalItems,nextSyncToken').execute() connections = results.get('connections', []) print("connections:", connections) utt = message.data.get("utterance", None) # extract the location #location = message.data.get("Location", None) print(utt) #listname1=utt.split(" named ") #listname2=listname1[1].split(" with ") #title =listname2[0] lister = utt.split(" starts ") lister2 = lister[1].split(" in ") location = lister2[1] print(location) strtdate = lister2[0] st = extract_datetime(strtdate) st = st[0] - self.utc_offset datestart = st.strftime('%Y-%m-%dT%H:%M:00') datestart += UTC_TZ print(datestart) lister3 = lister[0].split(" the event ") title = lister3[1] print(title) # liste de contacts nameliste = [] adsmails = [] for person in connections: emails = person.get('emailAddresses', []) adsmails.append(emails[0].get('value')) names = person.get('names', []) nameliste.append(names[0].get('displayName')) # liste of meeting rooms namerooms = [ 'midoune room', 'aiguilles room', 'barrouta room', 'kantaoui room', 'gorges room', 'ichkeul room', 'khemir room', 'tamaghza room', 'friguia room', 'ksour room', 'medeina room', 'thyna room' ] emailrooms = [ "*****@*****.**", "*****@*****.**", "*****@*****.**", "*****@*****.**", "*****@*****.**", "*****@*****.**", "*****@*****.**", "*****@*****.**", "*****@*****.**", "*****@*****.**", "*****@*****.**", "*****@*****.**" ] events_result = service.events().list(calendarId='primary', timeMin=datestart, maxResults=1, singleEvents=True, orderBy='startTime', q=location).execute() events = events_result.get('items', []) if not events: self.speak_dialog("notEvent") for event in events: eventid = event['id'] eventend = event['end']['dateTime'] attendees = event['attendees'] # freerooms freemails = [] freerooms = [] for i in range(0, len(emailrooms)): if self.freebusy(emailrooms[i], datestart, eventend, service): # la liste freerooms va prendre les noms des salles free freerooms.append(namerooms[i]) freemails.append(emailrooms[i]) suggroom = freerooms[0] suggmail = freemails[0] ask = self.get_response('what do you want to update') if ask == "update title": newtitle = self.get_response('what is the new title?') eventup = { 'summary': newtitle, } elif ask == "update description": newdesc = self.get_response('what is the new description?') eventup = { 'description': newdesc, } elif ask == "update start date time ": newdatestrt = self.get_response('what is the new start date time?') st1 = extract_datetime(newdatestrt) st1 = st1[0] - self.utc_offset newdatestart = st1.strftime('%Y-%m-%dT%H:%M:00') newdatestart += UTC_TZ eventup = { 'start': { 'dateTime': newdatestart, 'timeZone': 'America/Los_Angeles', }, } elif ask == "update end date time ": newdatd = self.get_response('what is the new start date time?') et1 = extract_datetime(newdatd) et1 = et1[0] - self.utc_offset newdateend = et1.strftime('%Y-%m-%dT%H:%M:00') newdateend += UTC_TZ eventup = { 'end': { 'dateTime': newdateend, 'timeZone': 'America/Los_Angeles', }, } elif ask == "update location": for j, e in enumerate(namerooms): if location == e: deletemail = emailrooms[j] email = {'email': deletemail} print(email) for i in attendees: if i == email: print(i) attendees.remove(i) newlocation = self.get_response('what is the new location?') roommail = self.recherche(namerooms, emailrooms, newlocation) x = self.freebusy(roommail, datestart, eventend, service) if x == True: self.speak_dialog('roomfree', data={"newlocation": newlocation}) email = {'email': roommail} attendees.append(email) eventup = { 'location': newlocation, 'attendees': attendees, } else: self.speak_dialog('roombusy', data={"newlocation": newlocation}) self.speak_dialog("suggestionroom", data={"suggroom": suggroom}) x = self.get_response( "Do you agree making a reservation for this meeting room") if x == "yes": newlocation = suggroom email = {'email': suggmail} attendees.append(email) else: s = ",".join(freerooms) # print("les salles disponibles a cette date sont", freerooms) self.speak_dialog("freerooms", data={"s": s}) room = self.get_response( 'which Room do you want to make a reservation for??') for i in range(0, len(freerooms)): if (freerooms[i] == room): # ajouter l'email de room dans la liste des attendees newlocation = room email = {'email': freemails[i]} attendees.append(email) eventup = { 'location': newlocation, 'attendees': attendees, } elif ask == "delete attendee": name = self.get_response("what is the attendee's name?") for j, e in enumerate(nameliste): if name == e: deletemail = adsmails[j] email = {'email': deletemail} print(email) for i in attendees: if i == email: print(i) attendees.remove(i) eventup = { 'attendees': attendees, } elif ask == "add attendee": name = self.get_response("what is the attendee's name?") for j, e in enumerate(nameliste): if name == e: addemail = adsmails[j] email = {'email': addemail} print(email) x = self.freebusy(addemail, datestart, eventend, service) if x == True: self.speak_dialog('attfree', data={"name": name}) email = {'email': addemail} attendees.append(email) eventup = { 'attendees': attendees, } else: self.speak_dialog('attbusy', data={"name": name}) print(eventup) service.events().patch(calendarId='primary', eventId=eventid, sendNotifications=True, body=eventup).execute() self.speak_dialog("eventUpdated")
def handle_query_date(self, message, response_type="simple"): utt = message.data.get('utterance', "").lower() try: extract = extract_datetime(utt) except Exception: self.speak_dialog('date.not.found') return day = extract[0] if extract else now_local() # check if a Holiday was requested, e.g. "What day is Christmas?" year = extract_number(utt) if not year or year < 1500 or year > 3000: # filter out non-years year = day.year all_holidays = {} # TODO: How to pick a location for holidays? for st in holidays.US.STATES: holiday_dict = holidays.US(years=[year], state=st) for d, name in holiday_dict.items(): if name not in all_holidays: all_holidays[name] = d for name in all_holidays: d = all_holidays[name] # Uncomment to display all holidays in the database # self.log.info("Day, name: " +str(d) + " " + str(name)) if name.replace(" Day", "").lower() in utt: day = d break location = self._extract_location(utt) today = to_local(now_utc()) if location: # TODO: Timezone math! if (day.year == today.year and day.month == today.month and day.day == today.day): day = now_utc() # for questions ~ "what is the day in sydney" day = self.get_local_datetime(location, dtUTC=day) if not day: return # failed in timezone lookup speak_date = nice_date(day, lang=self.lang) # speak it if response_type == "simple": self.speak_dialog("date", {"date": speak_date}) elif response_type == "relative": # remove time data to get clean dates day_date = day.replace(hour=0, minute=0, second=0, microsecond=0) today_date = today.replace(hour=0, minute=0, second=0, microsecond=0) num_days = (day_date - today_date).days if num_days >= 0: speak_num_days = nice_duration(num_days * 86400) self.speak_dialog("date.relative.future", { "date": speak_date, "num_days": speak_num_days }) else: # if in the past, make positive before getting duration speak_num_days = nice_duration(num_days * -86400) self.speak_dialog("date.relative.past", { "date": speak_date, "num_days": speak_num_days }) # and briefly show the date self.answering_query = True self.show_date(location, day=day) time.sleep(10) mycroft.audio.wait_while_speaking() if self.platform == "mycroft_mark_1": self.enclosure.mouth_reset() self.enclosure.activate_mouth_events() self.answering_query = False self.displayed_time = None
def test_extractdatetime_default_de(self): default = time(9, 0, 0) anchor = datetime(2017, 6, 27, 0, 0) res = extract_datetime("lass uns treffen am freitag", anchor, lang='de-de', default_time=default) self.assertEqual(default, res[0].time())
def deleteEvent(self, message): storage1 = Storage( '/opt/mycroft/skills/deleteeventskill.hanabouzid/info3.dat') credentials = storage1.get() if credentials is None or credentials.invalid == True: credentials = tools.run_flow(FLOW, storage1) print(credentials) # Create an httplib2.Http object to handle our HTTP requests and # authorize it with our good Credentials. http = httplib2.Http() http = credentials.authorize(http) service = build('calendar', 'v3', http=http) people_service = build(serviceName='people', version='v1', http=http) print("authorized") # To get a list of people in the user's contacts, results = people_service.people().connections().list( resourceName='people/me', pageSize=100, personFields='names,emailAddresses', fields='connections,totalItems,nextSyncToken').execute() connections = results.get('connections', []) # Call the Calendar API now = datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time print('Getting the upcoming 10 events') events_result = service.events().list(calendarId='primary', timeMin=now, maxResults=10, singleEvents=True, orderBy='startTime').execute() events = events_result.get('items', []) if not events: print('No upcoming events found.') for event in events: start = event['start'].get('dateTime', event['start'].get('date')) print(start, event['summary']) #extraire la date et le titre utt = message.data.get("utterance", None) # extract the location # location = message.data.get("Location", None) print(utt) # listname1=utt.split(" named ") # listname2=listname1[1].split(" with ") # title =listname2[0] lister = utt.split(" starts ") lister2 = lister[1].split(" in ") location = lister2[1] print(location) strtdate = lister2[0] st = extract_datetime(strtdate) st = st[0] - self.utc_offset datestart = st.strftime('%Y-%m-%dT%H:%M:00') datestart += UTC_TZ print(datestart) lister3 = lister[0].split(" the event ") title = lister3[1] print(title) events_result = service.events().list(calendarId='primary', timeMin=datestart, maxResults=1, singleEvents=True, orderBy='startTime', q=location).execute() events = events_result.get('items', []) if not events: self.speak_dialog("notEvent") for event in events: eventid = event['id'] service.events().delete(calendarId='primary', eventId=eventid, sendUpdates='all').execute() self.speak_dialog("eventdeleted", data={"title": title})
def extractWithFormatNoDate_fr(text): [extractedDate, leftover] = extract_datetime(text, lang="fr-fr") extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover]
def test_extractdatetime_fr(self): def extractWithFormat_fr(text): date = datetime(2017, 6, 27, 0, 0) [extractedDate, leftover] = extract_datetime(text, date, lang="fr-fr") extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover] def testExtract_fr(text, expected_date, expected_leftover): res = extractWithFormat_fr(text) self.assertEqual(res[0], expected_date) self.assertEqual(res[1], expected_leftover) def extractWithFormatDate2_fr(text): date = datetime(2017, 6, 30, 17, 0) [extractedDate, leftover] = extract_datetime(text, date, lang="fr-fr") extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover] def testExtractDate2_fr(text, expected_date, expected_leftover): res = extractWithFormatDate2_fr(text) self.assertEqual(res[0], expected_date) self.assertEqual(res[1], expected_leftover) def extractWithFormatNoDate_fr(text): [extractedDate, leftover] = extract_datetime(text, lang="fr-fr") extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover] def testExtractNoDate_fr(text, expected_date, expected_leftover): res = extractWithFormatNoDate_fr(text) self.assertEqual(res[0], expected_date) self.assertEqual(res[1], expected_leftover) testExtract_fr("Planifier l'embûche dans 5 jours", "2017-07-02 00:00:00", "planifier embûche") testExtract_fr("Quel temps fera-t-il après-demain ?", "2017-06-29 00:00:00", "quel temps fera-t-il") testExtract_fr("Met un rappel à 10:45 du soir", "2017-06-27 22:45:00", "met 1 rappel") testExtract_fr("quel temps est prévu pour vendredi matin ?", "2017-06-30 08:00:00", "quel temps est prévu pour") testExtract_fr("quel temps fait-il demain", "2017-06-28 00:00:00", "quel temps fait-il") testExtract_fr( "rappelle-moi d'appeler maman dans 8 semaines et" " 2 jours", "2017-08-24 00:00:00", "rappelle-moi appeler maman") testExtract_fr("Jouer des musiques de Beyonce 2 jours après vendredi", "2017-07-02 00:00:00", "jouer musiques beyonce") testExtract_fr("Commencer l'invasion à 15 heures 45 jeudi", "2017-06-29 15:45:00", "commencer invasion") testExtract_fr("Lundi, commander le gâteau à la boulangerie", "2017-07-03 00:00:00", "commander gâteau à boulangerie") testExtract_fr("Jouer la chanson Joyeux anniversaire dans 5 ans", "2022-06-27 00:00:00", "jouer chanson joyeux" " anniversaire") testExtract_fr("Skyper Maman à 12 heures 45 jeudi prochain", "2017-07-06 12:45:00", "skyper maman") testExtract_fr("Quel temps fera-t-il jeudi prochain ?", "2017-07-06 00:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il vendredi matin ?", "2017-06-30 08:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il vendredi soir", "2017-06-30 19:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il vendredi après-midi", "2017-06-30 15:00:00", "quel temps fera-t-il") testExtract_fr("rappelle-moi d'appeler maman le 3 août", "2017-08-03 00:00:00", "rappelle-moi appeler maman") testExtract_fr("Acheter des feux d'artifice pour le 14 juil", "2017-07-14 00:00:00", "acheter feux artifice pour") testExtract_fr("Quel temps fera-t-il 2 semaines après vendredi", "2017-07-14 00:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il mercredi à 7 heures", "2017-06-28 07:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il mercredi à 7 heures", "2017-06-28 07:00:00", "quel temps fera-t-il") testExtract_fr("Prendre rendez-vous à 12:45 jeudi prochain", "2017-07-06 12:45:00", "prendre rendez-vous") testExtract_fr("Quel temps fait-il ce jeudi ?", "2017-06-29 00:00:00", "quel temps fait-il") testExtract_fr( "Organiser une visite 2 semaines et 6 jours après" " samedi", "2017-07-21 00:00:00", "organiser 1 visite") testExtract_fr("Commencer l'invasion à 3 heures 45 jeudi", "2017-06-29 03:45:00", "commencer invasion") testExtract_fr("Commencer l'invasion à 20 heures jeudi", "2017-06-29 20:00:00", "commencer invasion") testExtract_fr("Lancer la fête jeudi à 8 heures du soir", "2017-06-29 20:00:00", "lancer fête") testExtract_fr("Commencer l'invasion à 4 heures de l'après-midi jeudi", "2017-06-29 16:00:00", "commencer invasion") testExtract_fr("Commencer l'invasion jeudi à midi", "2017-06-29 12:00:00", "commencer invasion") testExtract_fr("Commencer l'invasion jeudi à minuit", "2017-06-29 00:00:00", "commencer invasion") testExtract_fr("Commencer l'invasion jeudi à dix-sept heures", "2017-06-29 17:00:00", "commencer invasion") testExtract_fr("rappelle-moi de me réveiller dans 4 années", "2021-06-27 00:00:00", "rappelle-moi me réveiller") testExtract_fr("rappelle-moi de me réveiller dans 4 ans et 4 jours", "2021-07-01 00:00:00", "rappelle-moi me réveiller") testExtract_fr("Quel temps fera-t-il 3 jours après demain ?", "2017-07-01 00:00:00", "quel temps fera-t-il") testExtract_fr("3 décembre", "2017-12-03 00:00:00", "") testExtract_fr("retrouvons-nous à 8:00 ce soir", "2017-06-27 20:00:00", "retrouvons-nous") testExtract_fr("retrouvons-nous demain à minuit et demi", "2017-06-28 00:30:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à midi et quart", "2017-06-27 12:15:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à midi moins le quart", "2017-06-27 11:45:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à midi moins dix", "2017-06-27 11:50:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à midi dix", "2017-06-27 12:10:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à minuit moins 23", "2017-06-27 23:37:00", "retrouvons-nous") testExtract_fr("mangeons à 3 heures moins 23 minutes", "2017-06-27 02:37:00", "mangeons") testExtract_fr("mangeons aussi à 4 heures moins le quart du matin", "2017-06-27 03:45:00", "mangeons aussi") testExtract_fr("mangeons encore à minuit moins le quart", "2017-06-27 23:45:00", "mangeons encore") testExtract_fr("buvons à 4 heures et quart", "2017-06-27 04:15:00", "buvons") testExtract_fr("buvons également à 18 heures et demi", "2017-06-27 18:30:00", "buvons également") testExtract_fr("dormons à 20 heures moins le quart", "2017-06-27 19:45:00", "dormons") testExtract_fr("buvons le dernier verre à 10 heures moins 12 du soir", "2017-06-27 21:48:00", "buvons dernier verre") testExtract_fr("s'échapper de l'île à 15h45", "2017-06-27 15:45:00", "s'échapper île") testExtract_fr("s'échapper de l'île à 3h45min de l'après-midi", "2017-06-27 15:45:00", "s'échapper île") testExtract_fr("décale donc ça à 3h48min cet après-midi", "2017-06-27 15:48:00", "décale donc ça") testExtract_fr("construire un bunker à 9h42min du matin", "2017-06-27 09:42:00", "construire 1 bunker") testExtract_fr("ou plutôt à 9h43 ce matin", "2017-06-27 09:43:00", "ou plutôt") testExtract_fr("faire un feu à 8h du soir", "2017-06-27 20:00:00", "faire 1 feu") testExtract_fr("faire la fête jusqu'à 18h cette nuit", "2017-06-27 18:00:00", "faire fête jusqu'à") testExtract_fr("cuver jusqu'à 4h cette nuit", "2017-06-27 04:00:00", "cuver jusqu'à") testExtract_fr("réveille-moi dans 20 secondes aujourd'hui", "2017-06-27 00:00:20", "réveille-moi") testExtract_fr("réveille-moi dans 33 minutes", "2017-06-27 00:33:00", "réveille-moi") testExtract_fr("tais-toi dans 12 heures et 3 minutes", "2017-06-27 12:03:00", "tais-toi") testExtract_fr("ouvre-la dans 1 heure 3", "2017-06-27 01:03:00", "ouvre-la") testExtract_fr("ferme-la dans 1 heure et quart", "2017-06-27 01:15:00", "ferme-la") testExtract_fr("scelle-la dans 1 heure et demi", "2017-06-27 01:30:00", "scelle-la") testExtract_fr("zippe-la dans 2 heures moins 12", "2017-06-27 01:48:00", "zippe-la") testExtract_fr("soude-la dans 3 heures moins le quart", "2017-06-27 02:45:00", "soude-la") testExtract_fr("mange la semaine prochaine", "2017-07-04 00:00:00", "mange") testExtract_fr("bois la semaine dernière", "2017-06-20 00:00:00", "bois") testExtract_fr("mange le mois prochain", "2017-07-27 00:00:00", "mange") testExtract_fr("bois le mois dernier", "2017-05-27 00:00:00", "bois") testExtract_fr("mange l'an prochain", "2018-06-27 00:00:00", "mange") testExtract_fr("bois l'année dernière", "2016-06-27 00:00:00", "bois") testExtract_fr("reviens à lundi dernier", "2017-06-26 00:00:00", "reviens") testExtract_fr("capitule le 8 mai 1945", "1945-05-08 00:00:00", "capitule") testExtract_fr("rédige le contrat 3 jours après jeudi prochain", "2017-07-09 00:00:00", "rédige contrat") testExtract_fr("signe le contrat 2 semaines après jeudi dernier", "2017-07-06 00:00:00", "signe contrat") testExtract_fr("lance le four dans un quart d'heure", "2017-06-27 00:15:00", "lance four") testExtract_fr("enfourne la pizza dans une demi-heure", "2017-06-27 00:30:00", "enfourne pizza") testExtract_fr("arrête le four dans trois quarts d'heure", "2017-06-27 00:45:00", "arrête four") testExtract_fr("mange la pizza dans une heure", "2017-06-27 01:00:00", "mange pizza") testExtract_fr("bois la bière dans 2h23", "2017-06-27 02:23:00", "bois bière") testExtract_fr("faire les plantations le 3ème jour de mars", "2018-03-03 00:00:00", "faire plantations") testExtract_fr("récolter dans 10 mois", "2018-04-27 00:00:00", "récolter") testExtract_fr("point 6a: dans 10 mois", "2018-04-27 06:00:00", "point") testExtract_fr("l'après-midi démissionner à 4:59", "2017-06-27 16:59:00", "démissionner") testExtract_fr("cette nuit dormir", "2017-06-27 02:00:00", "dormir") testExtract_fr("ranger son bureau à 1700 heures", "2017-06-27 17:00:00", "ranger son bureau") testExtractDate2_fr("range le contrat 2 semaines après lundi", "2017-07-17 00:00:00", "range contrat") testExtractDate2_fr("achète-toi de l'humour à 15h", "2017-07-01 15:00:00", "achète-toi humour") # Disabling test until French Extract-date incorporates the fixes for # UTC / Local timezones. Until then this test fails periodically # whenever test is run and the date in the local timezone (where the # test is being run) is a different than the date in UTC. # # testExtractNoDate_fr("tais-toi aujourd'hui", # datetime.now().strftime("%Y-%m-%d") + " 00:00:00", # "tais-toi") self.assertEqual(extract_datetime("", lang="fr-fr"), None) self.assertEqual(extract_datetime("phrase inutile", lang="fr-fr"), None) self.assertEqual( extract_datetime("apprendre à compter à 37 heures", lang="fr-fr"), None)
def test_extractdatetime_fr(self): def extractWithFormat_fr(text): date = datetime(2017, 6, 27, 0, 0) [extractedDate, leftover] = extract_datetime(text, date, lang="fr-fr") extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover] def testExtract_fr(text, expected_date, expected_leftover): res = extractWithFormat_fr(text) self.assertEqual(res[0], expected_date) self.assertEqual(res[1], expected_leftover) def extractWithFormatDate2_fr(text): date = datetime(2017, 6, 30, 17, 0) [extractedDate, leftover] = extract_datetime(text, date, lang="fr-fr") extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover] def testExtractDate2_fr(text, expected_date, expected_leftover): res = extractWithFormatDate2_fr(text) self.assertEqual(res[0], expected_date) self.assertEqual(res[1], expected_leftover) def extractWithFormatNoDate_fr(text): [extractedDate, leftover] = extract_datetime(text, lang="fr-fr") extractedDate = extractedDate.strftime("%Y-%m-%d %H:%M:%S") return [extractedDate, leftover] def testExtractNoDate_fr(text, expected_date, expected_leftover): res = extractWithFormatNoDate_fr(text) self.assertEqual(res[0], expected_date) self.assertEqual(res[1], expected_leftover) testExtract_fr("Planifier l'embûche dans 5 jours", "2017-07-02 00:00:00", "planifier embûche") testExtract_fr("Quel temps fera-t-il après-demain ?", "2017-06-29 00:00:00", "quel temps fera-t-il") testExtract_fr("Met un rappel à 10:45 du soir", "2017-06-27 22:45:00", "met 1 rappel") testExtract_fr("quel temps est prévu pour vendredi matin ?", "2017-06-30 08:00:00", "quel temps est prévu pour") testExtract_fr("quel temps fait-il demain", "2017-06-28 00:00:00", "quel temps fait-il") testExtract_fr("rappelle-moi d'appeler maman dans 8 semaines et" " 2 jours", "2017-08-24 00:00:00", "rappelle-moi appeler maman") testExtract_fr("Jouer des musiques de Beyonce 2 jours après vendredi", "2017-07-02 00:00:00", "jouer musiques beyonce") testExtract_fr("Commencer l'invasion à 15 heures 45 jeudi", "2017-06-29 15:45:00", "commencer invasion") testExtract_fr("Lundi, commander le gâteau à la boulangerie", "2017-07-03 00:00:00", "commander gâteau à boulangerie") testExtract_fr("Jouer la chanson Joyeux anniversaire dans 5 ans", "2022-06-27 00:00:00", "jouer chanson joyeux" " anniversaire") testExtract_fr("Skyper Maman à 12 heures 45 jeudi prochain", "2017-07-06 12:45:00", "skyper maman") testExtract_fr("Quel temps fera-t-il jeudi prochain ?", "2017-07-06 00:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il vendredi matin ?", "2017-06-30 08:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il vendredi soir", "2017-06-30 19:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il vendredi après-midi", "2017-06-30 15:00:00", "quel temps fera-t-il") testExtract_fr("rappelle-moi d'appeler maman le 3 août", "2017-08-03 00:00:00", "rappelle-moi appeler maman") testExtract_fr("Acheter des feux d'artifice pour le 14 juil", "2017-07-14 00:00:00", "acheter feux artifice pour") testExtract_fr("Quel temps fera-t-il 2 semaines après vendredi", "2017-07-14 00:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il mercredi à 7 heures", "2017-06-28 07:00:00", "quel temps fera-t-il") testExtract_fr("Quel temps fera-t-il mercredi à 7 heures", "2017-06-28 07:00:00", "quel temps fera-t-il") testExtract_fr("Prendre rendez-vous à 12:45 jeudi prochain", "2017-07-06 12:45:00", "prendre rendez-vous") testExtract_fr("Quel temps fait-il ce jeudi ?", "2017-06-29 00:00:00", "quel temps fait-il") testExtract_fr("Organiser une visite 2 semaines et 6 jours après" " samedi", "2017-07-21 00:00:00", "organiser 1 visite") testExtract_fr("Commencer l'invasion à 3 heures 45 jeudi", "2017-06-29 03:45:00", "commencer invasion") testExtract_fr("Commencer l'invasion à 20 heures jeudi", "2017-06-29 20:00:00", "commencer invasion") testExtract_fr("Lancer la fête jeudi à 8 heures du soir", "2017-06-29 20:00:00", "lancer fête") testExtract_fr("Commencer l'invasion à 4 heures de l'après-midi jeudi", "2017-06-29 16:00:00", "commencer invasion") testExtract_fr("Commencer l'invasion jeudi à midi", "2017-06-29 12:00:00", "commencer invasion") testExtract_fr("Commencer l'invasion jeudi à minuit", "2017-06-29 00:00:00", "commencer invasion") testExtract_fr("Commencer l'invasion jeudi à dix-sept heures", "2017-06-29 17:00:00", "commencer invasion") testExtract_fr("rappelle-moi de me réveiller dans 4 années", "2021-06-27 00:00:00", "rappelle-moi me réveiller") testExtract_fr("rappelle-moi de me réveiller dans 4 ans et 4 jours", "2021-07-01 00:00:00", "rappelle-moi me réveiller") testExtract_fr("Quel temps fera-t-il 3 jours après demain ?", "2017-07-01 00:00:00", "quel temps fera-t-il") testExtract_fr("3 décembre", "2017-12-03 00:00:00", "") testExtract_fr("retrouvons-nous à 8:00 ce soir", "2017-06-27 20:00:00", "retrouvons-nous") testExtract_fr("retrouvons-nous demain à minuit et demi", "2017-06-28 00:30:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à midi et quart", "2017-06-27 12:15:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à midi moins le quart", "2017-06-27 11:45:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à midi moins dix", "2017-06-27 11:50:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à midi dix", "2017-06-27 12:10:00", "retrouvons-nous") testExtract_fr("retrouvons-nous à minuit moins 23", "2017-06-27 23:37:00", "retrouvons-nous") testExtract_fr("mangeons à 3 heures moins 23 minutes", "2017-06-27 02:37:00", "mangeons") testExtract_fr("mangeons aussi à 4 heures moins le quart du matin", "2017-06-27 03:45:00", "mangeons aussi") testExtract_fr("mangeons encore à minuit moins le quart", "2017-06-27 23:45:00", "mangeons encore") testExtract_fr("buvons à 4 heures et quart", "2017-06-27 04:15:00", "buvons") testExtract_fr("buvons également à 18 heures et demi", "2017-06-27 18:30:00", "buvons également") testExtract_fr("dormons à 20 heures moins le quart", "2017-06-27 19:45:00", "dormons") testExtract_fr("buvons le dernier verre à 10 heures moins 12 du soir", "2017-06-27 21:48:00", "buvons dernier verre") testExtract_fr("s'échapper de l'île à 15h45", "2017-06-27 15:45:00", "s'échapper île") testExtract_fr("s'échapper de l'île à 3h45min de l'après-midi", "2017-06-27 15:45:00", "s'échapper île") testExtract_fr("décale donc ça à 3h48min cet après-midi", "2017-06-27 15:48:00", "décale donc ça") testExtract_fr("construire un bunker à 9h42min du matin", "2017-06-27 09:42:00", "construire 1 bunker") testExtract_fr("ou plutôt à 9h43 ce matin", "2017-06-27 09:43:00", "ou plutôt") testExtract_fr("faire un feu à 8h du soir", "2017-06-27 20:00:00", "faire 1 feu") testExtract_fr("faire la fête jusqu'à 18h cette nuit", "2017-06-27 18:00:00", "faire fête jusqu'à") testExtract_fr("cuver jusqu'à 4h cette nuit", "2017-06-27 04:00:00", "cuver jusqu'à") testExtract_fr("réveille-moi dans 20 secondes aujourd'hui", "2017-06-27 00:00:20", "réveille-moi") testExtract_fr("réveille-moi dans 33 minutes", "2017-06-27 00:33:00", "réveille-moi") testExtract_fr("tais-toi dans 12 heures et 3 minutes", "2017-06-27 12:03:00", "tais-toi") testExtract_fr("ouvre-la dans 1 heure 3", "2017-06-27 01:03:00", "ouvre-la") testExtract_fr("ferme-la dans 1 heure et quart", "2017-06-27 01:15:00", "ferme-la") testExtract_fr("scelle-la dans 1 heure et demi", "2017-06-27 01:30:00", "scelle-la") testExtract_fr("zippe-la dans 2 heures moins 12", "2017-06-27 01:48:00", "zippe-la") testExtract_fr("soude-la dans 3 heures moins le quart", "2017-06-27 02:45:00", "soude-la") testExtract_fr("mange la semaine prochaine", "2017-07-04 00:00:00", "mange") testExtract_fr("bois la semaine dernière", "2017-06-20 00:00:00", "bois") testExtract_fr("mange le mois prochain", "2017-07-27 00:00:00", "mange") testExtract_fr("bois le mois dernier", "2017-05-27 00:00:00", "bois") testExtract_fr("mange l'an prochain", "2018-06-27 00:00:00", "mange") testExtract_fr("bois l'année dernière", "2016-06-27 00:00:00", "bois") testExtract_fr("reviens à lundi dernier", "2017-06-26 00:00:00", "reviens") testExtract_fr("capitule le 8 mai 1945", "1945-05-08 00:00:00", "capitule") testExtract_fr("rédige le contrat 3 jours après jeudi prochain", "2017-07-09 00:00:00", "rédige contrat") testExtract_fr("signe le contrat 2 semaines après jeudi dernier", "2017-07-06 00:00:00", "signe contrat") testExtract_fr("lance le four dans un quart d'heure", "2017-06-27 00:15:00", "lance four") testExtract_fr("enfourne la pizza dans une demi-heure", "2017-06-27 00:30:00", "enfourne pizza") testExtract_fr("arrête le four dans trois quarts d'heure", "2017-06-27 00:45:00", "arrête four") testExtract_fr("mange la pizza dans une heure", "2017-06-27 01:00:00", "mange pizza") testExtract_fr("bois la bière dans 2h23", "2017-06-27 02:23:00", "bois bière") testExtract_fr("faire les plantations le 3ème jour de mars", "2018-03-03 00:00:00", "faire plantations") testExtract_fr("récolter dans 10 mois", "2018-04-27 00:00:00", "récolter") testExtract_fr("point 6a: dans 10 mois", "2018-04-27 06:00:00", "point") testExtract_fr("l'après-midi démissionner à 4:59", "2017-06-27 16:59:00", "démissionner") testExtract_fr("cette nuit dormir", "2017-06-27 02:00:00", "dormir") testExtract_fr("ranger son bureau à 1700 heures", "2017-06-27 17:00:00", "ranger son bureau") testExtractDate2_fr("range le contrat 2 semaines après lundi", "2017-07-17 00:00:00", "range contrat") testExtractDate2_fr("achète-toi de l'humour à 15h", "2017-07-01 15:00:00", "achète-toi humour") # Disabling test until French Extract-date incorporates the fixes for # UTC / Local timezones. Until then this test fails periodically # whenever test is run and the date in the local timezone (where the # test is being run) is a different than the date in UTC. # # testExtractNoDate_fr("tais-toi aujourd'hui", # datetime.now().strftime("%Y-%m-%d") + " 00:00:00", # "tais-toi") self.assertEqual(extract_datetime("", lang="fr-fr"), None) self.assertEqual(extract_datetime("phrase inutile", lang="fr-fr"), None) self.assertEqual(extract_datetime( "apprendre à compter à 37 heures", lang="fr-fr"), None)
def extractWithFormat_it(text): date = datetime(2018, 1, 13, 13, 4) # Sab 13 Gen, 2018 @ 13:04 [extractedDate, leftover] = extract_datetime(text, date, lang='it-it') extractedDate = extractedDate.strftime('%Y-%m-%d %H:%M:%S') return [extractedDate, leftover]
def handle_create_event(self): # Getting the credentials for G.People API storage = Storage('info.dat') credentials = storage.get() if credentials is None or credentials.invalid is True: credentials = tools.run_flow(FLOW, storage) http = httplib2.Http() http = credentials.authorize(http) people_service = build(serviceName='people', version='v1', http=http) results = people_service.people().connections().list( resourceName='people/me', pageSize=10, personFields='emailAddresses,names').execute() connections = results.get('connections', []) # Get credentials for google calendar with [email protected] # and token management creds = None # The file token.pickle stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists('token.pickle'): with open('token.pickle', 'rb') as token: creds = pickle.load(token) # If there are no (valid) credentials available, let the user log in. if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( 'credentials.json', SCOPES) creds = flow.run_local_server() # Save the credentials for the next run with open('token.pickle', 'wb') as token: pickle.dump(creds, token) service = build('calendar', 'v3', credentials=creds) # Getting information about the event title = self.get_response('what\'s the name of the new event') description = self.get_response('can you tell me more about it ?') reservation = self.get_response('do you need to make a reservation for a meeting room? Yes or No?') if reservation == 'yes': r = self.get_response('which Room do you want to make a reservation for? ') maxattendees = 10 if r == "Midoun meeting room": room = "*****@*****.**" elif r == "Aiguilles Meeting Room": room = "*****@*****.**" elif r == "Barrouta Meeting Room": room = "*****@*****.**" elif r == "Kantaoui Meeting Room": room = "*****@*****.**" elif r == "Gorges Meeting Room": room = "*****@*****.**" elif r == "Ichkeul Meeting Room": room = "*****@*****.**" elif r == "Khemir Meeting Room": room = "*****@*****.**" elif r == "Tamaghza Meeting Room": room = "*****@*****.**" elif r == "Friguia Meeting Room": room = "*****@*****.**" maxattendees = 15 elif r == "Ksour Meeting Room": room = "*****@*****.**" elif r == "Medeina Meeting Room": room = "*****@*****.**" elif r == "Thyna Meeting Room": room = "*****@*****.**" else: # needs to be verified !!!!!!! room = "" mr = {'email': room} start = self.get_response('when does it start?') end = self.get_response('when does it end?') st = extract_datetime(start) et = extract_datetime(end) invitation = self.get_response('would you like to invite an other employees to this meeting? Yes or No?') if invitation == 'yes': # getting the attendees atto = [] noms = [] f = 0 i = 1 g = 0 found = False found2 = False attendees = ['blabla@blabla'] * maxattendees for person in connections: emailAddresses = person.get('emailAddresses', []) names = person.get('names', []) atto.append(emailAddresses[0].get('value')) noms.append(names[0].get('displayName')) p = len(noms) # first attendee a = self.get_response('who do you want to invite first?') if a != '': while (g != p) & (found is False): # if the name in the input matches the a name in the list we add the email of that person to the # attendees list which will be treated later to delete the examples '*****@*****.**' if noms[g] == a: attendees[0] = atto[g] g = g + 1 found = True else: g = g + 1 if found is False: print('contact not found try again please') else: print('no attendees added') # other attendees to add less then max while i != maxattendees: a = input() if a == '': break else: while (f != p) | (found2 is False): if noms[f] == a: attendees[i] = atto[f] found2 = True f = f + 1 i = i + 1 # until this stage we have a list of attendees + blanks filled with [email protected] # print(attendees) l = len(attendees) # print(l) # in this part we are going to get the attendees without the blanks t = 0 att = [] while t != l: if attendees[t] != 'blabla@blabla': att.append(attendees[t]) t = t + 1 else: t = t + 1 l2 = len(att) # print(att) # print(l2) attendee = [] for r in range(l2): email = {'email': att[r]} attendee.append(email) attendee.append(mr) # Add an event event = { 'summary': title, 'location': r, 'description': description, 'start': { 'dateTime': st, 'timeZone': 'Tunisia/Tunis', }, 'end': { 'dateTime': et, 'timeZone': 'Tunisia/Tunis', }, 'recurrence': [ 'RRULE:FREQ=DAILY;COUNT=2' ], 'attendees': attendee, 'reminders': { 'useDefault': False, 'overrides': [ {'method': 'email', 'minutes': 24 * 60}, {'method': 'popup', 'minutes': 10}, ], }, } event = service.events().insert(calendarId='primary', sendNotifications=True, body=event).execute() print 'Event created: %s' % (event.get('htmlLink')) self.speak_dialog('eventAdded')