Remove references to utils in lieu of just using pylib.
[kiosk.git] / twitter_renderer.py
index 1c9dbeebcf31e924f0ffb75e730921f3d04a3940..40a3385d92fd4746461e067f595c70486ad1f7b3 100644 (file)
@@ -1,19 +1,24 @@
-import file_writer
+#!/usr/bin/env python3
+
 import random
+import re
+from typing import Dict, List
+
+import tweepy  # type: ignore
+
+import file_writer
 import renderer
 import profanity_filter
-import re
-import secrets
-import tweepy
+import kiosk_secrets as secrets
 
 
-class twitter_renderer(renderer.debuggable_abstaining_renderer):
-    def __init__(self, name_to_timeout_dict):
-        super(twitter_renderer, self).__init__(name_to_timeout_dict, False)
-        self.debug = 1
-        self.tweets_by_author = dict()
-        self.handles_by_author = dict()
-        self.filter = profanity_filter.profanity_filter()
+class twitter_renderer(renderer.abstaining_renderer):
+    def __init__(self, name_to_timeout_dict: Dict[str, int]) -> None:
+        super().__init__(name_to_timeout_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.ProfanityFilter()
         self.urlfinder = re.compile(
             "((http|https)://[\-A-Za-z0-9\\.]+/[\?\&\-A-Za-z0-9_\\.]+)"
         )
@@ -38,21 +43,21 @@ class twitter_renderer(renderer.debuggable_abstaining_renderer):
         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)
         except:
@@ -63,50 +68,49 @@ class twitter_renderer(renderer.debuggable_abstaining_renderer):
             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):
+    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_10_3600.html")
-        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")
-        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_word(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})
+#     {"Fetch Tweets" : 1,
+#      "Shuffle Tweets" : 1})
 # x = "bla bla bla https://t.co/EjWnT3UA9U bla bla"
 # x = t.linkify(x)
-# print x
+# print(x)
 # if t.fetch_tweets() == 0:
-#    print("Error fetching tweets, none fetched.")
+#     print("Error fetching tweets, none fetched.")
 # else:
-#    t.shuffle_tweets()
+#     t.shuffle_tweets()