Update cabin camera URL.
[kiosk.git] / reddit_renderer.py
index 097bd82f55f44dc85508eb54cef2037e0c1b27d3..d24d36063d0ce16564c0e8d7a22ed3c4d8253fce 100644 (file)
@@ -1,20 +1,23 @@
 #!/usr/bin/env python3
 
-import praw
-import random
-from typing import Callable, Dict, List
+import logging
+from typing import Callable, Dict, Iterable, List, Set
+
+import praw  # type: ignore
+
+from scottutilz import profanity_filter
 
-import constants
 import file_writer
 import grab_bag
 import page_builder
-import profanity_filter
 import renderer
-import renderer_catalog
-import secrets
+import kiosk_secrets as secrets
+
+
+logger = logging.getLogger(__name__)
 
 
-class reddit_renderer(renderer.debuggable_abstaining_renderer):
+class reddit_renderer(renderer.abstaining_renderer):
     """A renderer to pull text content from reddit."""
 
     def __init__(
@@ -24,9 +27,9 @@ class reddit_renderer(renderer.debuggable_abstaining_renderer):
         *,
         min_votes: int = 20,
         font_size: int = 24,
-        additional_filters: List[Callable[[str], bool]] = [],
+        additional_filters: Iterable[Callable[[str], bool]] = [],
     ):
-        super(reddit_renderer, self).__init__(name_to_timeout_dict, True)
+        super().__init__(name_to_timeout_dict)
         self.subreddit_list = subreddit_list
         self.praw = praw.Reddit(
             client_id=secrets.reddit_client_id,
@@ -36,52 +39,50 @@ class reddit_renderer(renderer.debuggable_abstaining_renderer):
         self.min_votes = min_votes
         self.font_size = font_size
         self.messages = grab_bag.grab_bag()
-        self.filters = [profanity_filter.profanity_filter().contains_bad_words]
+        self.filters: List[Callable[..., bool]] = [
+            profanity_filter.ProfanityFilter().contains_bad_word
+        ]
         self.filters.extend(additional_filters)
-        self.deduper = set()
-
-    def debug_prefix(self) -> str:
-        x = ""
-        for subreddit in self.subreddit_list:
-            x += f"{subreddit} "
-        return f"reddit({x.strip()})"
+        self.deduper: Set[str] = set()
 
     def periodic_render(self, key: str) -> bool:
-        self.debug_print('called for "%s"' % key)
+        logger.debug('called for "%s"' % key)
         if key == "Scrape":
             return self.scrape_reddit()
         elif key == "Shuffle":
             return self.shuffle_messages()
         else:
-            raise error("Unexpected operation")
+            raise Exception("Unexpected operation")
 
     def append_message(self, messages: List[str]) -> None:
         for msg in messages:
-            if msg.title in self.deduper:
+            title = str(msg.title)
+            if title in self.deduper:
                 continue
             filtered = ""
-            for filter in self.filters:
-                if filter(msg.title) is True:
-                    filtered = filter.__name__
+            for filt in self.filters:
+                if filt(title) is True:
+                    filtered = filt.__name__
                     break
             if filtered != "":
-                print(f'Filter {filtered} struck down "{msg.title}"')
+                logger.info(f'Filter {filtered} struck down "{title}"')
                 continue
             if msg.ups < self.min_votes:
-                print(f'"{msg.title}" doesn\'t have enough upvotes to be interesting')
+                logger.debug(
+                    f'"{title}" doesn\'t have enough upvotes to be interesting'
+                )
                 continue
 
-            try:
-                self.deduper.add(msg.title)
-                content = f"{msg.ups}"
-                if (
-                    msg.thumbnail != "self"
-                    and msg.thumbnail != "default"
-                    and msg.thumbnail != ""
-                ):
-                    content = f'<IMG SRC="{msg.thumbnail}">'
-                self.messages.add(
-                    f"""
+            self.deduper.add(title)
+            content = f"{msg.ups}"
+            if (
+                msg.thumbnail != "self"
+                and msg.thumbnail != "default"
+                and msg.thumbnail != ""
+            ):
+                content = f'<IMG SRC="{msg.thumbnail}">'
+            self.messages.add(
+                f"""
 <TABLE STYLE="font-size:{self.font_size}pt;">
   <TR>
     <!-- The number of upvotes or item image: -->
@@ -91,15 +92,13 @@ class reddit_renderer(renderer.debuggable_abstaining_renderer):
 
     <!-- The content and author: -->
     <TD>
-      <B>{msg.title}</B><BR><FONT COLOR=#bbbbbb>({msg.author})</FONT>
+      <B>{title}</B><BR><FONT COLOR=#bbbbbb>({msg.author})</FONT>
     </TD>
   </TR>
 </TABLE>"""
-                )
-            except:
-                self.debug_print("Unexpected exception, skipping message.")
+            )
 
-    def scrape_reddit(self) -> None:
+    def scrape_reddit(self) -> bool:
         self.deduper.clear()
         self.messages.clear()
         for subreddit in self.subreddit_list:
@@ -128,7 +127,7 @@ class reddit_renderer(renderer.debuggable_abstaining_renderer):
                 self.append_message(msg)
             except:
                 pass
-            self.debug_print(f"There are now {self.messages.size()} messages")
+            logger.debug(f"There are now {self.messages.size()} messages")
         return True
 
     def shuffle_messages(self) -> bool:
@@ -145,7 +144,7 @@ class reddit_renderer(renderer.debuggable_abstaining_renderer):
         layout.set_title("Reddit /r/%s" % x.strip())
         subset = self.messages.subset(4)
         if subset is None:
-            self.debug_print("Not enough messages to pick from.")
+            logger.debug("Not enough messages to pick from.")
             return False
         for msg in subset:
             layout.add_item(msg)
@@ -156,27 +155,26 @@ class reddit_renderer(renderer.debuggable_abstaining_renderer):
 
 class til_reddit_renderer(reddit_renderer):
     def __init__(self, name_to_timeout_dict: Dict[str, int]):
-        super(til_reddit_renderer, self).__init__(
-            name_to_timeout_dict, ["todayilearned"], min_votes=200, font_size=20
+        super().__init__(
+            name_to_timeout_dict, ["todayilearned"], min_votes=100, font_size=20
         )
 
 
 class quotes_reddit_renderer(reddit_renderer):
     def __init__(self, name_to_timeout_dict: Dict[str, int]):
-        super(quotes_reddit_renderer, self).__init__(
-            name_to_timeout_dict, ["quotes"], min_votes=200, font_size=20
-        )
+        super().__init__(name_to_timeout_dict, ["quotes"], min_votes=100, font_size=20)
 
 
 class showerthoughts_reddit_renderer(reddit_renderer):
+    @staticmethod
     def dont_tell_me_about_gift_cards(msg: str) -> bool:
-        return not "IMPORTANT PSA: No, you did not win a gift card" in msg
+        return "gift card" in msg
 
     def __init__(self, name_to_timeout_dict: Dict[str, int]):
-        super(showerthoughts_reddit_renderer, self).__init__(
+        super().__init__(
             name_to_timeout_dict,
             ["showerthoughts"],
-            min_votes=350,
+            min_votes=150,
             additional_filters=[
                 showerthoughts_reddit_renderer.dont_tell_me_about_gift_cards
             ],
@@ -185,7 +183,7 @@ class showerthoughts_reddit_renderer(reddit_renderer):
 
 class seattle_reddit_renderer(reddit_renderer):
     def __init__(self, name_to_timeout_dict: Dict[str, int]):
-        super(seattle_reddit_renderer, self).__init__(
+        super().__init__(
             name_to_timeout_dict,
             ["seattle", "seattleWA", "SeaWA", "bellevue", "kirkland", "CoronavirusWA"],
             min_votes=50,
@@ -194,9 +192,7 @@ class seattle_reddit_renderer(reddit_renderer):
 
 class lifeprotips_reddit_renderer(reddit_renderer):
     def __init__(self, name_to_timeout_dict: Dict[str, int]):
-        super(lifeprotips_reddit_renderer, self).__init__(
-            name_to_timeout_dict, ["lifeprotips"], min_votes=100
-        )
+        super().__init__(name_to_timeout_dict, ["lifeprotips"], min_votes=50)
 
 
 # x = reddit_renderer({"Test", 1234}, ["seattle","bellevue"], min_votes=50, font_size=24)