浏览代码

Rewrote riddle functionality

Kirk Trombley 6 年之前
父节点
当前提交
d094ff34d1
共有 3 个文件被更改,包括 61 次插入34 次删除
  1. 1 0
      .gitignore
  2. 3 0
      config/config.toml
  3. 57 34
      src/plugins/querying.py

+ 1 - 0
.gitignore

@@ -1,3 +1,4 @@
 secrets.toml
 __pycache__/*
 *.pyc
+.venv

+ 3 - 0
config/config.toml

@@ -27,3 +27,6 @@ break = "I'm too robust for that!"
 yiff = "Sorry - I don't think I understand the command '!yiff'... I'll talk to Sam, since he loves this command so much, and get back to you!"
 f = "FFFFFFFFFFFFFFFFFFFFF\nFFFFFFFFFFFFFFFFFFFFF\nFFFFFFFFFFFFFFFFFFFFF\nFFFFFFF\nFFFFFFF\nFFFFFFF\nFFFFFFFFFFFFFF\nFFFFFFFFFFFFFF\nFFFFFFFFFFFFFF\nFFFFFFF\nFFFFFFF\nFFFFFFF\nFFFFFFF\nFFFFFFF"
 rampart = "Hey guys can we please keep the topic to Rampart?"
+
+[riddle]
+sleep_time = 45

+ 57 - 34
src/plugins/querying.py

@@ -1,10 +1,13 @@
 import random
+import logging
+import threading
+import time
 
 import requests
 from requests_html import HTMLSession
 
-from command_system import RollbotResponse, RollbotFailure, as_plugin, pop_arg
-from config import get_secret
+from command_system import RollbotResponse, RollbotPlugin, RollbotFailure, as_plugin, pop_arg
+from config import get_config, get_secret
 from util import upload_image
 
 @as_plugin
@@ -134,39 +137,59 @@ def scp(db, message):
     return RollbotResponse(message, txt=response)
 
 
-@as_plugin
-def riddle(db, message):
-    if message.raw_args is None or message.raw_args != "me piss":
-        return RollbotResponse(message, failure=RollbotFailure.INVALID_ARGUMENTS)
-
-    sesh = HTMLSession()
-    rnum = 7000 # TODO add db logic for if "last_riddle_num" not in store else store["last_riddle_num"]
+class Riddle(RollbotPlugin):
+    def __init__(self, bot, logger=logging.getLogger(__name__)):
+        RollbotPlugin.__init__(self, "riddle", bot, logger=logger)
+        self.sesh = HTMLSession()
+        self.riddle_max = 7545
+        self.sleep_time = get_config("riddle.sleep_time")
 
-    def get_riddle(n):
-        r = sesh.get(f"https://www.riddles.com/{n:d}")
+    def get_riddle(self):
+        n = random.randint(2, self.riddle_max)
+        r = self.sesh.get(f"https://www.riddles.com/{n:d}")
         divs = r.html.find("div")
         panel_bodies = [d.text for d in divs if "class" in d.attrs and "panel-body" in d.attrs["class"]]
-        if len(panel_bodies) == 3:
-            return panel_bodies[0]
-        else:
-            return None
-
-    n = 0
-    while get_riddle(rnum) is not None:
-        rnum += 1
-        n += 1
-        if n > 100:
-            break
-
-    # store["last_riddle_num"] = rnum
-
-    n = 0
-    riddle = None
-    while riddle is None:
-        chosen = random.randint(2, rnum)
-        riddle = get_riddle(chosen)
-        n += 1
-        if n > 20:
-            return RollbotResponse(message, failure=RollbotFailure.SERVICE_DOWN)
 
-    return RollbotResponse(message, txt=riddle)
+        if len(panel_bodies) <= 1:
+            self.logger.info(f"Failed on {n:d} - invalid page")
+            return n, None
+
+        riddle = panel_bodies[0]
+
+        if riddle.startswith("Riddle Status: User Rejected") or riddle.startswith("Riddle Status: User Moderated"):
+            self.logger.info(f"Failed on {n:d} - rejected")
+            return n, None
+
+        parts = riddle.split("\n")
+        self.logger.info(f"Returning riddle {n:d}")
+        return n, (parts[1], parts[3])
+
+    def get_answer_cb(self, message, riddle):
+        gid = message.group_id
+        txt = "\n\n".join(("Here's the riddle answer from before!", *riddle))
+        def cb():
+            time.sleep(self.sleep_time)
+            self.bot.manually_post_message(txt, gid)
+        return cb
+
+    def on_command(self, db, message):
+        if message.raw_args is None or message.raw_args != "me piss":
+            return RollbotResponse(message, failure=RollbotFailure.INVALID_ARGUMENTS)
+
+        n = 0
+        riddle = None
+        while riddle is None:
+            rnum, riddle = self.get_riddle()
+            n += 1
+            if n > 20:
+                return RollbotResponse(message, failure=RollbotFailure.SERVICE_DOWN)
+
+        txt = "\n\n".join((
+            f"Riddle #{rnum}",
+            riddle[0],
+            f"I'll post the response in about {self.sleep_time} seconds!",
+        ))
+
+        threading.Thread(target=self.get_answer_cb(message, riddle)).start()
+
+        return RollbotResponse(message, txt=txt)