#!/usr/bin/env python2 # -*- coding: utf-8-*- 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 = not chosen_articles and app_utils.isPositive(text) if send_all or chosen_articles: mic.say("Sure, just give me a moment") if profile['prefers_email']: body = "" 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))