plugin: add handling conditions for ques. & cmd.
The main purpose of this feature is to not answer questions when the bot is not awake in the sleep plugin, but by making it a requirement purely in the configuration we avoid making some plugins mandatory for the bot.
This commit is contained in:
parent
f346b9cb58
commit
f055ef76c4
|
@ -43,7 +43,7 @@ Missing features
|
|||
- [ ] Youtube: parsing for title, requests for channel or video
|
||||
- [ ] Command aliases
|
||||
- [ ] Question aliases
|
||||
- [ ] Sleep
|
||||
- [x] Sleep
|
||||
- [ ] Various macros:
|
||||
- [ ] asks someone to stop doing something
|
||||
- [ ] king of
|
||||
|
|
|
@ -15,7 +15,12 @@
|
|||
"opening_text": "/me cracks open a {beer} for {target}"
|
||||
},
|
||||
"common": {
|
||||
"command_suffix": "please"
|
||||
"command_suffix": "please",
|
||||
"handling_conditions": {
|
||||
"sleep": {
|
||||
"awake": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"horoscope": {
|
||||
"commands": ["horoscope"],
|
||||
|
|
|
@ -9,8 +9,8 @@ class Plugin:
|
|||
def __init__(self, bot):
|
||||
self.bot = bot
|
||||
self.name = self.__class__.__name__.lower()[:-6] # Remove "Plugin".
|
||||
self.config = self._get_config()
|
||||
self.is_ready = self._check_config()
|
||||
self.config = self.__get_config()
|
||||
self.is_ready = self.__check_config()
|
||||
|
||||
@property
|
||||
def callbacks(self):
|
||||
|
@ -21,7 +21,7 @@ class Plugin:
|
|||
if cb.startswith("on_") and callable(getattr(self, cb))
|
||||
}
|
||||
|
||||
def _get_config(self):
|
||||
def __get_config(self):
|
||||
"""Return the plugin section from the bot config, plus common values."""
|
||||
plugins_configs = self.bot.config["plugins"]
|
||||
config = plugins_configs["common"].copy()
|
||||
|
@ -37,7 +37,7 @@ class Plugin:
|
|||
self.bot.log_e(f"Could not load resource at {resource_path}.")
|
||||
return config
|
||||
|
||||
def _check_config(self):
|
||||
def __check_config(self):
|
||||
"""Return True if the plugin config is properly setup."""
|
||||
missing = False
|
||||
for key in self.REQUIRED_CONFIGS:
|
||||
|
@ -88,10 +88,16 @@ class Plugin:
|
|||
def should_answer_question(self, message):
|
||||
"""Store Question in object and return True if it should answer it."""
|
||||
words = message.split()
|
||||
# Is the message addressed to me?
|
||||
if words[0].lower() not in self.bot.names:
|
||||
return False
|
||||
question = message[len(words[0]):].strip()
|
||||
|
||||
# Are the config conditions to answer a question valid?
|
||||
if not self.__respects_handling_conditions():
|
||||
return False
|
||||
|
||||
# Is it a question I can answer?
|
||||
question = message[len(words[0]):].strip()
|
||||
for q in self.config.get("questions", []):
|
||||
if question.startswith(q):
|
||||
self.question = Question(q, question[len(q):].strip())
|
||||
|
@ -101,9 +107,16 @@ class Plugin:
|
|||
|
||||
def should_handle_command(self, message, no_content=False):
|
||||
"""Store Command in object and return True if it should handle it."""
|
||||
# Are the config conditions to handle a command valid?
|
||||
if not self.__respects_handling_conditions():
|
||||
return False
|
||||
|
||||
# Is it a valid command?
|
||||
command = self.parse_command(message, no_content=no_content)
|
||||
if not command:
|
||||
return False
|
||||
|
||||
# Is it a command I can handle?
|
||||
commands = self.config.get("commands", [])
|
||||
if (
|
||||
any(command.ident == c for c in commands) or
|
||||
|
@ -127,6 +140,19 @@ class Plugin:
|
|||
content = " ".join(words[2:-1])
|
||||
return Command(ident, content)
|
||||
|
||||
def __respects_handling_conditions(self):
|
||||
"""Check if question conditions are valid."""
|
||||
conditions = self.config.get("handling_conditions", {})
|
||||
for plugin_ns, plugin_conditions in conditions.items():
|
||||
for condition_key, condition_value in plugin_conditions.items():
|
||||
value = self.get_runtime_value(condition_key, ns=plugin_ns)
|
||||
if condition_value != value:
|
||||
self.bot.log_d(
|
||||
f"Handling condition {plugin_ns}.{condition_key} false."
|
||||
)
|
||||
return False
|
||||
return True
|
||||
|
||||
def signal_failure(self, target):
|
||||
"""Signal a plugin failure to target."""
|
||||
self.bot.say(target, self.bot.config["error_message"])
|
||||
|
|
Loading…
Reference in a new issue