Changes needed to get the kiosk to run on the rpi.
[kiosk.git] / chooser.py
index 35d38b5ad9ede0e4a3f1170dc31051fcb0f06c70..3fecc09717ff47c43988d76ac167b79cc2e4ef3d 100644 (file)
@@ -8,7 +8,7 @@ import random
 import re
 import sys
 import time
-from typing import Callable, List, Optional, Set, Tuple
+from typing import Any, Callable, List, Optional, Set, Tuple
 
 import constants
 import trigger
@@ -43,21 +43,21 @@ class chooser(ABC):
         return filenames
 
     @abstractmethod
-    def choose_next_page(self) -> str:
+    def choose_next_page(self) -> Any:
         pass
 
 
 class weighted_random_chooser(chooser):
     """Chooser that does it via weighted RNG."""
 
-    def __init__(self, filter_list: List[Callable[[str], bool]]) -> None:
+    def __init__(self, filter_list: Optional[List[Callable[[str], bool]]]) -> None:
         self.last_choice = ""
         self.valid_filename = re.compile("([^_]+)_(\d+)_([^\.]+)\.html")
         self.pages: Optional[List[str]] = None
         self.count = 0
-        self.filter_list = filter_list
-        if filter_list is None:
-            self.filter_list = []
+        self.filter_list: List[Callable[[str], bool]] = []
+        if filter_list is not None:
+            self.filter_list.extend(filter_list)
         self.filter_list.append(self.dont_choose_page_twice_in_a_row_filter)
 
     def dont_choose_page_twice_in_a_row_filter(self, choice: str) -> bool:
@@ -66,7 +66,7 @@ class weighted_random_chooser(chooser):
         self.last_choice = choice
         return True
 
-    def choose_next_page(self) -> str:
+    def choose_next_page(self) -> Any:
         if self.pages is None or self.count % 100 == 0:
             self.pages = self.get_page_list()
 
@@ -110,13 +110,13 @@ class weighted_random_chooser_with_triggers(weighted_random_chooser):
 
     def __init__(
         self,
-        trigger_list: List[trigger.trigger],
+        trigger_list: Optional[List[trigger.trigger]],
         filter_list: List[Callable[[str], bool]],
     ) -> None:
         weighted_random_chooser.__init__(self, filter_list)
-        self.trigger_list = trigger_list
-        if trigger_list is None:
-            self.trigger_list = []
+        self.trigger_list: List[trigger.trigger] = []
+        if trigger_list is not None:
+            self.trigger_list.extend(trigger_list)
         self.page_queue: Set[Tuple[str, int]] = set(())
 
     def check_for_triggers(self) -> bool:
@@ -136,6 +136,7 @@ class weighted_random_chooser_with_triggers(weighted_random_chooser):
         triggered = self.check_for_triggers()
 
         # First try to satisfy from the page queue.
+        now = datetime.datetime.now()
         if len(self.page_queue) > 0:
             print("chooser: Pulling page from queue...")
             page = None
@@ -149,6 +150,12 @@ class weighted_random_chooser_with_triggers(weighted_random_chooser):
             self.page_queue.remove((page, priority))
             return (page, triggered)
 
+        # Always show the clock in the middle of the night.
+        elif now.hour < 7:
+            for page in self.pages:
+                if "clock" in page:
+                    return (page, False)
+
         # Fall back on weighted random choice.
         else:
             return (weighted_random_chooser.choose_next_page(self), False)