|
@@ -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)
|