querying.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import random
  2. import threading
  3. import time
  4. import requests
  5. from requests_html import HTMLSession
  6. from command_system import RollbotResponse, RollbotFailure, as_plugin, pop_arg
  7. from config import get_config, get_secret
  8. from util import upload_image
  9. @as_plugin
  10. def inspire(message):
  11. argstr = message.raw_args
  12. if argstr is not None and "explain" in argstr:
  13. return "Using the command !inspire will request an inspiration image from http://inspirobot.me/"
  14. try:
  15. url = requests.get("http://inspirobot.me/api?generate=true").text
  16. return RollbotResponse(message, img=url)
  17. except ConnectionError as e:
  18. return RollbotResponse(
  19. message,
  20. failure=RollbotFailure.SERVICE_DOWN,
  21. debugging={
  22. "explain": "Could not reach inspirobot.",
  23. "exception": e
  24. }
  25. )
  26. @as_plugin
  27. def shield(message):
  28. data = """\
  29. ------RollbotBoundary\r\n\
  30. Content-Disposition: form-data; name=\"blazon\"\r\n\
  31. \r\n\
  32. %s\r\n\
  33. ------RollbotBoundary\r\n\
  34. Content-Disposition: form-data; name=\"asfile\"\r\n\
  35. \r\n\
  36. 1\r\n\
  37. ------RollbotBoundary\r\n\
  38. Content-Disposition: form-data; name=\"palette\"\r\n\
  39. \r\n\
  40. wappenwiki\r\n\
  41. ------RollbotBoundary\r\n\
  42. Content-Disposition: form-data; name=\"effect\"\r\n\
  43. \r\n\
  44. flat\r\n\
  45. ------RollbotBoundary
  46. """ % message.raw_args
  47. # TODO - this should probably have a random number as part of the boundary
  48. try:
  49. r = requests.post(
  50. "https://drawshield.net/include/drawshield.php",
  51. headers={
  52. 'Content-Type': "multipart/form-data; boundary=----RollbotBoundary",
  53. 'Cache-Control': "no-cache",
  54. },
  55. data=data
  56. )
  57. except ConnectionError as e:
  58. return RollbotResponse(
  59. message,
  60. failure=RollbotFailure.SERVICE_DOWN,
  61. debugging={
  62. "explain": "Could not reach DrawShield.",
  63. "exception": e,
  64. }
  65. )
  66. success, result = upload_image(get_secret("imgur_client_id"), r.content)
  67. if success:
  68. return RollbotResponse(message, img=result)
  69. else:
  70. return RollbotResponse(
  71. message,
  72. failure=RollbotFailure.SERVICE_DOWN,
  73. debugging=result
  74. )
  75. @as_plugin
  76. def scp(message):
  77. number, _ = pop_arg(message.raw_args)
  78. try:
  79. number = int(number.strip())
  80. except ValueError as e:
  81. return RollbotResponse(
  82. message,
  83. failure=RollbotFailure.INVALID_ARGUMENTS,
  84. debugging={
  85. "explain": "Could not parse argument %s into integer." % number,
  86. "exception": e,
  87. }
  88. )
  89. page_url = "http://www.scp-wiki.net/scp-%03d" % number
  90. series_url = "http://www.scp-wiki.net/scp-series"
  91. series = (number // 1000) + 1
  92. if series != 1:
  93. series_url += "-" + str(series)
  94. sesh = HTMLSession()
  95. r = sesh.get(page_url)
  96. r2 = sesh.get(series_url)
  97. ps = r.html.find("p")
  98. lis = r2.html.find("li")
  99. object_class = "Error retrieving object class!"
  100. for p in ps:
  101. if "Object Class" in p.text:
  102. object_class = p.text
  103. break
  104. query = "SCP-%03d" % number
  105. flavortext = "Error retrieving title!"
  106. for li in lis:
  107. if query in li.text:
  108. flavortext = li.text.split("-", 2)[-1].strip()
  109. break
  110. response = "Item # %d\n" % number
  111. response += object_class + "\n"
  112. response += flavortext + "\n"
  113. response += page_url
  114. return response
  115. def get_riddle(sesh, logger):
  116. n = random.randint(2, 7545)
  117. r = sesh.get(f"https://www.riddles.com/{n:d}")
  118. divs = r.html.find("div")
  119. panel_bodies = [d.text for d in divs if "class" in d.attrs and "panel-body" in d.attrs["class"]]
  120. if len(panel_bodies) <= 1:
  121. logger.info(f"Failed on {n:d} - invalid page")
  122. return n, None
  123. riddle = panel_bodies[0]
  124. if riddle.startswith("Riddle Status: User Rejected") or riddle.startswith("Riddle Status: User Moderated"):
  125. logger.info(f"Failed on {n:d} - rejected")
  126. return n, None
  127. parts = riddle.split("\n")
  128. logger.info(f"Returning riddle {n:d}")
  129. return n, (parts[1], parts[3])
  130. def get_answer_cb(bot, message, riddle):
  131. gid = message.group_id
  132. txt = "\n\n".join(("Here's the riddle answer from before!", *riddle))
  133. def cb():
  134. time.sleep(get_config("riddle.sleep_time"))
  135. bot.manually_post_message(txt, gid)
  136. return cb
  137. @as_plugin
  138. def riddle(bot, message, log):
  139. if message.raw_args is None or message.raw_args != "me piss":
  140. return RollbotResponse(message, failure=RollbotFailure.INVALID_ARGUMENTS)
  141. sesh = HTMLSession()
  142. n = 0
  143. riddle = None
  144. while riddle is None:
  145. rnum, riddle = get_riddle(sesh, log)
  146. n += 1
  147. if n > 20:
  148. return RollbotResponse(message, failure=RollbotFailure.SERVICE_DOWN)
  149. threading.Thread(target=get_answer_cb(bot, message, riddle)).start()
  150. return "\n\n".join((
  151. f"Riddle #{rnum}",
  152. riddle[0],
  153. f"I'll post the response in about {get_config('riddle.sleep_time')} seconds!",
  154. ))
  155. @as_plugin
  156. def fortune():
  157. sesh = HTMLSession()
  158. r = sesh.get("http://www.fortunecookiemessage.com/")
  159. quote = r.html.xpath("//div[contains(@class, 'quote')]/a")[0].text
  160. learn, lotto = [x.split(":", 1)[-1].strip() for x in r.html.xpath("//div[contains(@class, 'bottom-message')]")[0].text.split("\n")[:2]]
  161. return f"'{quote}'\nLucky Numbers: {lotto}\nLearn Chinese: {learn}"