-
Notifications
You must be signed in to change notification settings - Fork 4
/
__init__.py
107 lines (81 loc) · 3.76 KB
/
__init__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import re
import wikipedia as wiki
from datetime import date
import random
from mycroft.util import extract_datetime
from mycroft import MycroftSkill, intent_file_handler, intent_handler
from adapt.intent import IntentBuilder
class TodayInHistory(MycroftSkill):
def __init__(self):
MycroftSkill.__init__(self)
@intent_handler(IntentBuilder('TodayInHistoryIntent').
require("TodayInHistoryKeyword"))
def handle_today_in_history_intent(self, message):
day_query = extract_datetime(message.data.
get("utterance"))[0].strftime("%B %d")
if day_query:
self._search(day_query)
else:
self._search(date.today().strftime("%B %d"))
@intent_handler(IntentBuilder("TellMeMoreIntent").
require("TellMeMoreKeyword").require("initial_response"))
def handle_tell_me_more_intent(self, message):
""" Handler for follow-up inquiries 'tell me more'
enabled after initial response is complete
"""
if not self.events_list:
self.speak("That's all the information I can find.")
else:
events_list = self.events_list
day = self.day
selection_index = random.randrange(len(events_list))
selected_event = events_list[selection_index]
selected_event = day + ", " + selected_event
self.speak(selected_event)
events_list.pop(selection_index)
self.events_list = events_list
def _search(self, day_query):
""" Searches wikipedia for an entry about a given day and replies to user
Arguments:
day_query: a string referencing a calendar day
e.g. "March 15" or "May 6th"
"""
try:
# let the user know we're looking
self.speak_dialog("searching", {"day": day_query})
# get the wikipedia article for the chosen day
# wiki.page will accept a range of day formats
# including "August 5", "August 5th", and "5th of August"
results = wiki.page(day_query)
# remove irrelevant content so we are just looking at events
events = re.search(r'(?<=Events ==\n).*?(?=\n\n\n==)',
results.content, re.DOTALL).group()
# remove words between parenthesis and brackets for better speech
# these are often birth/death days and less relevant asides.
events = re.sub(r'\([^)]*\)|/[^/]*/', '', events)
# parse results into a list.
# Entries are seperated by newline characters
events_list = re.split(r'\n', events)
# choose a random entry from the list
selection_index = random.randrange(len(events_list))
selected_event = events_list[selection_index]
# a little string concatenation for clarity
# right now our selection only contains a year
self.speak(day_query + ", " + selected_event)
# remove spoken entries and save data for further inquiry.
# Flag initial response as complete to enable 'Tell Me More'
# this doesn't work with bool'True'.... wants a string
events_list.pop(selection_index)
self.events_list = events_list
self.day = day_query
self.set_context("initial_response", "complete")
except wiki.exceptions.PageError:
self.speak_dialog("notfound")
except wiki.exceptions.WikipediaExeption:
self.speak("I'm sorry, something went wrong")
except Exception as e:
self.log.error("Error: {0}".format(e))
def stop(self):
pass
def create_skill():
return TodayInHistory()