Browse Source

Merge branch 'improvement/new-dynamic-decorator' of kirkleon/rollbot3 into master

kirkleon 6 years ago
parent
commit
f9f40e3fea

+ 3 - 2
mkplugin.sh

@@ -27,8 +27,9 @@ echo "Populating $PLUGIN_FILE with basic plugin called $1"
 echo "from command_system import as_plugin, RollbotResponse" >> $PLUGIN_FILE
 echo "" >> $PLUGIN_FILE
 echo "" >> $PLUGIN_FILE
-echo "@as_plugin(\"$1\")" >> $PLUGIN_FILE
-echo "def $1(db, msg):" >> $PLUGIN_FILE
+echo "@as_plugin # if you want to change the name of the function below, you can just pass \"$1\" to this decorator" >> $PLUGIN_FILE
+echo "def $1(msg):" >> $PLUGIN_FILE
+echo "    # try adding db, bot, and log args, if you need those for your plugin" >> $PLUGIN_FILE
 echo "    return RollbotResponse(msg, txt=\"My first plugin!\")" >> $PLUGIN_FILE
 
 echo "import plugins.$1" >> ./src/plugins/__init__.py

+ 16 - 2
src/command_system.py

@@ -1,6 +1,7 @@
 import logging
 from dataclasses import dataclass
 from enum import Enum, auto
+import inspect
 
 from sqlalchemy.ext.declarative import declarative_base
 
@@ -148,7 +149,6 @@ class RollbotPlugin:
         raise NotImplementedError
 
 
-
 def as_plugin(command):
     if isinstance(command, str):
         command_name = command
@@ -159,12 +159,26 @@ def as_plugin(command):
         RollbotPlugin.__init__(self, command_name, bot, logger=logger)
 
     def decorator(fn):
+        sig = inspect.signature(fn)
+        converters = []
+        for p in sig.parameters:
+            if p in ("msg", "message"):
+                converters.append(lambda self, db, msg: msg)
+            elif p in ("db", "database"):
+                converters.append(lambda self, db, msg: db)
+            elif p in ("log", "logger"):
+                converters.append(lambda self, db, msg: self.logger)
+            elif p == "bot":
+                converters.append(lambda self, db, msg: self.bot)
+            else:
+                raise ValueError(f"Illegal argument name {p} in decorated plugin {command_name}")
+
         return type(
             f"AutoGenerated`{command_name}`Command",
             (RollbotPlugin,),
             dict(
                 __init__=init_standin,
-                on_command=(lambda _, *a: fn(*a))
+                on_command=(lambda self, db, msg: fn(*[c(self, db, msg) for c in converters]))
             )
         )
 

+ 1 - 1
src/plugins/finchat.py

@@ -20,7 +20,7 @@ FFFFFFF
 
 
 @as_plugin("f")
-def finchat(db, msg):
+def finchat(msg):
     if msg.message_txt[1:].strip().startswith("f"):
         return RollbotResponse(msg, txt="frick!")
     return RollbotResponse(msg, txt=Fs)

+ 2 - 10
src/plugins/hangguy.py

@@ -1,11 +1,10 @@
 import datetime
 import re
 import base64
-import logging
 
 from sqlalchemy import Column, Integer, String, DateTime
 
-from command_system import RollbotPlugin, RollbotResponse, RollbotFailure, ModelBase, pop_arg
+from command_system import as_plugin, RollbotResponse, RollbotFailure, ModelBase, pop_arg
 from config import get_secret
 
 
@@ -341,6 +340,7 @@ def subc_alert(bot, msg):
     return RollbotResponse(msg, respond=False)
 
 
+@as_plugin
 def hangguy(bot, db, msg):
     game_state = get_game(db, msg.group_id)
     guy_state = get_guy(db, msg.group_id)
@@ -385,11 +385,3 @@ def hangguy(bot, db, msg):
         )
 
     return RollbotResponse(msg, txt="My first plugin!")
-
-
-class HangGuy(RollbotPlugin):
-    def __init__(self, bot, logger=logging.getLogger(__name__)):
-        RollbotPlugin.__init__(self, "hangguy", bot, logger=logger)
-
-    def on_command(self, db, msg):
-        return hangguy(self.bot, db, msg)

+ 1 - 1
src/plugins/meme.py

@@ -3,7 +3,7 @@ import random
 from command_system import as_plugin, RollbotResponse
 
 @as_plugin
-def meme(db, message):
+def meme(message):
 
         diceroll = random.randint(1,20)
         good = "I love you."

+ 57 - 61
src/plugins/querying.py

@@ -1,17 +1,16 @@
 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
 
 @as_plugin
-def inspire(db, message):
+def inspire(message):
     argstr = message.raw_args
 
     if argstr is not None and "explain" in argstr:
@@ -35,7 +34,7 @@ def inspire(db, message):
 
 
 @as_plugin
-def shield(db, message):
+def shield(message):
     data = """\
 ------RollbotBoundary\r\n\
 Content-Disposition: form-data; name=\"blazon\"\r\n\
@@ -88,7 +87,7 @@ flat\r\n\
 
 
 @as_plugin
-def scp(db, message):
+def scp(message):
     number, _ = pop_arg(message.raw_args)
     try:
         number = int(number.strip())
@@ -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, 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)

+ 1 - 1
src/plugins/roll.py

@@ -4,7 +4,7 @@ from command_system import RollbotResponse, as_plugin
 
 
 @as_plugin
-def roll(db, message):
+def roll(message):
     argstr = message.raw_args
     try:
         rolls = []

+ 1 - 1
src/plugins/seychelles.py

@@ -10,7 +10,7 @@ from config import get_secret
 
 
 @as_plugin
-def seychelles(db, message):
+def seychelles(message):
     argstr = message.raw_args
 
     if argstr is None or "i.imgur.com" not in argstr:

+ 5 - 5
src/plugins/simple.py

@@ -4,27 +4,27 @@ from command_system import as_plugin, RollbotResponse
 
 
 @as_plugin
-def isadmin(db, message):
+def isadmin(message):
     return RollbotResponse(message, txt=str(message.from_admin))
 
 
 @as_plugin
-def debug(db, message):
+def debug(message):
     return RollbotResponse(message, txt=str(message))
 
 
 @as_plugin
-def echo(db, message):
+def echo(message):
     return RollbotResponse(message, txt="'%s' - %s" % (message.raw_args, message.name))
 
 
 @as_plugin
-def greet(db, message):
+def greet(message):
     return RollbotResponse(message, txt=random.choice(("Hi!", "Hello!", "안녕하세요", "こんにちは", "你好", "👋")))
 
 
 @as_plugin
-def console(db, message):
+def console(message):
     argstr = message.raw_args
     opts = [
         "NEVER GIVE UP",

+ 1 - 1
src/plugins/the_guy.py

@@ -12,7 +12,7 @@ THE_GUY = """\
 
 
 @as_plugin("hey")
-def the_guy(db, msg):
+def the_guy(msg):
     for x, y in zip(msg.args(), ("can", "i", "have", "the", "guy")):
         if x.lower() != y:
             return RollbotResponse(msg, failure=RollbotFailure.INVALID_ARGUMENTS)

+ 3 - 3
src/plugins/the_house.py

@@ -24,14 +24,14 @@ housebot = """
 """
 
 @as_plugin("appreciate")
-def the_house(db, msg):
-    
+def the_house(msg):
+
     thehouse = housetop + ' '.join(list(msg.args(normalize=False))) + housebot
 
     return RollbotResponse(msg, txt=thehouse)
 
 @as_plugin("stfu")
-def shut_up(db, msg):
+def shut_up(msg):
 
     shutup = stfutop + ' '.join(list(msg.args(normalize=False))) + housebot