Changes needed to get the kiosk to run on the rpi.
[kiosk.git] / twitter_renderer.py
index 49c39da3b46029364c4f403b616f2549c157a296..e595a9ad0c23f0980665f8da10fb5414446ded90 100644 (file)
@@ -1,20 +1,26 @@
-import file_writer
+#!/usr/bin/env python3
+
 import random
+import re
+import tweepy  # type: ignore
+from typing import Dict, List
+
+import file_writer
 import renderer
 import profanity_filter
-import re
 import secrets
-import tweepy
+
 
 class twitter_renderer(renderer.debuggable_abstaining_renderer):
-    def __init__(self, name_to_timeout_dict):
+    def __init__(self, name_to_timeout_dict: Dict[str, int]) -> None:
         super(twitter_renderer, self).__init__(name_to_timeout_dict, False)
-        self.debug = 1
-        self.tweets_by_author = dict()
-        self.handles_by_author = dict()
+        self.debug = True
+        self.tweets_by_author: Dict[str, List[tweepy.models.Status]] = {}
+        self.handles_by_author: Dict[str, str] = {}
         self.filter = profanity_filter.profanity_filter()
         self.urlfinder = re.compile(
-            "((http|https)://[\-A-Za-z0-9\\.]+/[\?\&\-A-Za-z0-9_\\.]+)")
+            "((http|https)://[\-A-Za-z0-9\\.]+/[\?\&\-A-Za-z0-9_\\.]+)"
+        )
 
         # == OAuth Authentication ==
         #
@@ -23,86 +29,87 @@ class twitter_renderer(renderer.debuggable_abstaining_renderer):
 
         # The consumer keys can be found on your application's Details
         # page located at https://dev.twitter.com/apps (under "OAuth settings")
-        consumer_key=secrets.twitter_consumer_key
-        consumer_secret=secrets.twitter_consumer_secret
+        consumer_key = secrets.twitter_consumer_key
+        consumer_secret = secrets.twitter_consumer_secret
 
         # The access tokens can be found on your applications's Details
         # page located at https://dev.twitter.com/apps (located
         # under "Your access token")
-        access_token=secrets.twitter_access_token
-        access_token_secret=secrets.twitter_access_token_secret
+        access_token = secrets.twitter_access_token
+        access_token_secret = secrets.twitter_access_token_secret
 
         auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
         auth.set_access_token(access_token, access_token_secret)
         self.api = tweepy.API(auth)
 
-    def debug_prefix(self):
+    def debug_prefix(self) -> str:
         return "twitter"
 
-    def linkify(self, value):
+    def linkify(self, value: str) -> str:
         return self.urlfinder.sub(r'<a href="\1">\1</a>', value)
 
-    def periodic_render(self, key):
+    def periodic_render(self, key: str) -> bool:
         if key == "Fetch Tweets":
             return self.fetch_tweets()
         elif key == "Shuffle Tweets":
             return self.shuffle_tweets()
         else:
-            raise error('Unexpected operation')
+            raise Exception("Unexpected operation")
 
-    def fetch_tweets(self):
+    def fetch_tweets(self) -> bool:
         try:
-            tweets = self.api.home_timeline(tweet_mode='extended', count=200)
+            tweets = self.api.home_timeline(tweet_mode="extended", count=200)
         except:
-            print "Exception while fetching tweets!"
+            print("Exception while fetching tweets!")
             return False
         for tweet in tweets:
             author = tweet.author.name
             author_handle = tweet.author.screen_name
             self.handles_by_author[author] = author_handle
             if author not in self.tweets_by_author:
-                self.tweets_by_author[author] = list()
+                self.tweets_by_author[author] = []
             l = self.tweets_by_author[author]
             l.append(tweet)
         return True
 
-    def shuffle_tweets(self):
-        authors = self.tweets_by_author.keys()
+    def shuffle_tweets(self) -> bool:
+        authors = list(self.tweets_by_author.keys())
         author = random.choice(authors)
         handle = self.handles_by_author[author]
         tweets = self.tweets_by_author[author]
         already_seen = set()
-        f = file_writer.file_writer('twitter_5_none.html')
-        f.write('<TABLE WIDTH=96%><TR><TD WIDTH=80%>')
-        f.write('<H2>%s (@%s)</H2></TD>\n' % (author, handle))
-        f.write('<TD ALIGN="right" VALIGN="top">')
-        f.write('<IMG SRC="twitter.png" WIDTH=42></TD></TR></TABLE>\n')
-        f.write('<HR>\n<UL>\n')
-        count = 0
-        length = 0
-        for tweet in tweets:
-            text = tweet.full_text
-            if ((text not in already_seen) and
-                (not self.filter.contains_bad_words(text))):
-                already_seen.add(text)
-                text = self.linkify(text)
-                f.write(u'<LI><B>%s</B>\n' % text)
-                count += 1
-                length += len(text)
-                if count > 3 or length > 270:
-                    break
-        f.write('</UL>\n')
-        f.close()
+        with file_writer.file_writer("twitter_10_3600.html") as f:
+            f.write("<TABLE WIDTH=96%><TR><TD WIDTH=86%>")
+            f.write("<H2>%s (@%s)</H2></TD>\n" % (author, handle))
+            f.write('<TD ALIGN="right" VALIGN="top">')
+            f.write('<IMG SRC="twitter.png" WIDTH=42></TD></TR></TABLE>\n')
+            f.write("<HR>\n<UL>\n")
+            count = 0
+            length = 0
+            for tweet in tweets:
+                text = tweet.full_text
+                if (text not in already_seen) and (
+                    not self.filter.contains_bad_words(text)
+                ):
+                    already_seen.add(text)
+                    text = self.linkify(text)
+                    f.write("<LI><B>%s</B>\n" % text)
+                    count += 1
+                    length += len(text)
+                    if count > 3 or length > 270:
+                        break
+            f.write("</UL>\n")
         return True
 
+
 # Test
-t = twitter_renderer(
-    {"Fetch Tweets" : 1,
-     "Shuffle Tweets" : 1})
-#x = "bla bla bla https://t.co/EjWnT3UA9U bla bla"
-#x = t.linkify(x)
-#print x
-if t.fetch_tweets() == 0:
-    print "Error fetching tweets, none fetched."
-else:
-    t.shuffle_tweets()
+t = twitter_renderer(
+    {"Fetch Tweets" : 1,
+     "Shuffle Tweets" : 1})
+# x = "bla bla bla https://t.co/EjWnT3UA9U bla bla"
+# x = t.linkify(x)
+# print(x)
+if t.fetch_tweets() == 0:
+#     print("Error fetching tweets, none fetched.")
+else:
+    t.shuffle_tweets()