|
@@ -1,12 +1,11 @@
|
|
|
import random
|
|
|
-import logging
|
|
|
import threading
|
|
|
import time
|
|
|
|
|
|
import requests
|
|
|
from requests_html import HTMLSession
|
|
|
|
|
|
-from command_system import RollbotResponse, RollbotPlugin, RollbotFailure, as_plugin, pop_arg
|
|
|
+from command_system import RollbotResponse, RollbotFailure, as_plugin, pop_arg
|
|
|
from config import get_config, get_secret
|
|
|
from util import upload_image
|
|
|
|
|
@@ -137,59 +136,56 @@ def scp(db, message):
|
|
|
return RollbotResponse(message, txt=response)
|
|
|
|
|
|
|
|
|
-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(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) <= 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)
|
|
|
+def get_riddle(sesh, logger):
|
|
|
+ n = random.randint(2, 7545)
|
|
|
+ r = 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) <= 1:
|
|
|
+ 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"):
|
|
|
+ logger.info(f"Failed on {n:d} - rejected")
|
|
|
+ return n, None
|
|
|
+
|
|
|
+ parts = riddle.split("\n")
|
|
|
+ logger.info(f"Returning riddle {n:d}")
|
|
|
+ return n, (parts[1], parts[3])
|
|
|
+
|
|
|
+
|
|
|
+def get_answer_cb(bot, message, riddle):
|
|
|
+ gid = message.group_id
|
|
|
+ txt = "\n\n".join(("Here's the riddle answer from before!", *riddle))
|
|
|
+ def cb():
|
|
|
+ time.sleep(get_config("riddle.sleep_time"))
|
|
|
+ bot.manually_post_message(txt, gid)
|
|
|
+ return cb
|
|
|
+
|
|
|
+
|
|
|
+@as_plugin
|
|
|
+def riddle(bot, db, message, log):
|
|
|
+ if message.raw_args is None or message.raw_args != "me piss":
|
|
|
+ return RollbotResponse(message, failure=RollbotFailure.INVALID_ARGUMENTS)
|
|
|
+
|
|
|
+ sesh = HTMLSession()
|
|
|
+ n = 0
|
|
|
+ riddle = None
|
|
|
+ while riddle is None:
|
|
|
+ rnum, riddle = get_riddle(sesh, log)
|
|
|
+ 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 {get_config('riddle.sleep_time')} seconds!",
|
|
|
+ ))
|
|
|
+
|
|
|
+ threading.Thread(target=get_answer_cb(bot, message, riddle)).start()
|
|
|
+
|
|
|
+ return RollbotResponse(message, txt=txt)
|