summaryrefslogtreecommitdiff
path: root/client/modules/News.py
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2014-07-26 23:31:25 +0000
committerschneefux <schneefux+commit@schneefux.xyz>2014-07-26 23:31:25 +0000
commit78389f252a021d642a7a0146b658f0465da6e264 (patch)
treeb740c6339ceba381004d3441f2459f65d38d02a6 /client/modules/News.py
parent2c55f4da462383ee6c7b89ea44e5c40cd5badf0c (diff)
downloadjasper-client-78389f252a021d642a7a0146b658f0465da6e264.tar.gz
jasper-client-78389f252a021d642a7a0146b658f0465da6e264.zip
Work on Google STT on RPi.
Diffstat (limited to 'client/modules/News.py')
-rw-r--r--client/modules/News.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/client/modules/News.py b/client/modules/News.py
new file mode 100644
index 0000000..59495a3
--- /dev/null
+++ b/client/modules/News.py
@@ -0,0 +1,122 @@
+import feedparser
+import app_utils
+import re
+from semantic.numbers import NumberService
+
+WORDS = ["NEWS", "YES", "NO", "FIRST", "SECOND", "THIRD"]
+
+PRIORITY = 3
+
+URL = 'http://news.ycombinator.com'
+
+
+class Article:
+
+ def __init__(self, title, URL):
+ self.title = title
+ self.URL = URL
+
+
+def getTopArticles(maxResults=None):
+ d = feedparser.parse("http://news.google.com/?output=rss")
+
+ count = 0
+ articles = []
+ for item in d['items']:
+ articles.append(Article(item['title'], item['link'].split("&url=")[1]))
+ count += 1
+ if maxResults and count > maxResults:
+ break
+
+ return articles
+
+
+def handle(text, mic, profile):
+ """
+ Responds to user-input, typically speech text, with a summary of
+ the day's top news headlines, sending them to the user over email
+ if desired.
+
+ Arguments:
+ text -- user-input, typically transcribed speech
+ mic -- used to interact with the user (for both input and output)
+ profile -- contains information related to the user (e.g., phone number)
+ """
+ mic.say("Pulling up the news")
+ articles = getTopArticles(maxResults=3)
+ titles = [" ".join(x.title.split(" - ")[:-1]) for x in articles]
+ all_titles = "... ".join(str(idx + 1) + ")" +
+ title for idx, title in enumerate(titles))
+
+ def handleResponse(text):
+
+ def extractOrdinals(text):
+ output = []
+ service = NumberService()
+ for w in text.split():
+ if w in service.__ordinals__:
+ output.append(service.__ordinals__[w])
+ return [service.parse(w) for w in output]
+
+ chosen_articles = extractOrdinals(text)
+ send_all = chosen_articles is [] and app_utils.isPositive(text)
+
+ if send_all or chosen_articles:
+ mic.say("Sure, just give me a moment")
+
+ if profile['prefers_email']:
+ body = "<ul>"
+
+ def formatArticle(article):
+ tiny_url = app_utils.generateTinyURL(article.URL)
+
+ if profile['prefers_email']:
+ return "<li><a href=\'%s\'>%s</a></li>" % (tiny_url,
+ article.title)
+ else:
+ return article.title + " -- " + tiny_url
+
+ for idx, article in enumerate(articles):
+ if send_all or (idx + 1) in chosen_articles:
+ article_link = formatArticle(article)
+
+ if profile['prefers_email']:
+ body += article_link
+ else:
+ if not app_utils.emailUser(profile, SUBJECT="", BODY=article_link):
+ mic.say(
+ "I'm having trouble sending you these articles. Please make sure that your phone number and carrier are correct on the dashboard.")
+ return
+
+ # if prefers email, we send once, at the end
+ if profile['prefers_email']:
+ body += "</ul>"
+ if not app_utils.emailUser(profile, SUBJECT="Your Top Headlines", BODY=body):
+ mic.say(
+ "I'm having trouble sending you these articles. Please make sure that your phone number and carrier are correct on the dashboard.")
+ return
+
+ mic.say("All set")
+
+ else:
+
+ mic.say("OK I will not send any articles")
+
+ if 'phone_number' in profile:
+ mic.say("Here are the current top headlines. " + all_titles +
+ ". Would you like me to send you these articles? If so, which?")
+ handleResponse(mic.activeListen())
+
+ else:
+ mic.say(
+ "Here are the current top headlines. " + all_titles)
+
+
+def isValid(text):
+ """
+ Returns True if the input is related to the news.
+
+ Arguments:
+ text -- user-input, typically transcribed speech
+ """
+ return bool(re.search(r'\b(news|headline)\b', text, re.IGNORECASE))