aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jesopo2019-04-07 14:00:27 +0100
committerGravatar jesopo2019-04-07 14:00:27 +0100
commitd4c7c41c794d675b83ddd1b827d4cd6b7ac6cbfb (patch)
treeb90cd14f685cb65381384dfc5da09ca48035d0b0
parent'IRCChannels._get_id' -> 'IRCChannels.get_id' (diff)
signature
Add !config command, to group all settings activities in to 1 command
-rw-r--r--modules/set.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/modules/set.py b/modules/set.py
index 2753cdbb..ce573c08 100644
--- a/modules/set.py
+++ b/modules/set.py
@@ -1,9 +1,36 @@
+import enum
from src import ModuleManager, utils
CHANNELSET_HELP = "Get a specified channel setting for the current channel"
CHANNELSETADD_HELP = ("Add to a specified channel setting for the "
"current channel")
+class ConfigInvalidValue(Exception):
+ pass
+
+class ConfigResults(enum.Enum):
+ Changed = 1
+ Retrieved = 2
+class ConfigResult(object):
+ def __init__(self, result, data=None):
+ self.result = result
+ self.data = data
+
+class ConfigChannelTarget(object):
+ def __init__(self, bot, server, channel_name):
+ self._bot = bot
+ self._server = server
+ self._channel_name = channel_name
+ def _get_id(self):
+ return self._server.channels.get_id(self._channel_name)
+ def set_setting(self, setting, value):
+ channel_id = self._get_id()
+ self._bot.database.channel_settings.set(channel_id, setting, value)
+ def get_setting(self, setting, default=None):
+ channel_id = self._get_id()
+ return self._bot.database.channel_settings.get(channel_id, setting,
+ default)
+
class Module(ModuleManager.BaseModule):
def _set(self, category, event, target, array, arg_index=0):
args = event["args_split"][arg_index:]
@@ -185,3 +212,82 @@ class Module(ModuleManager.BaseModule):
:permission: channelsetoverride
"""
self._unset(event, event["args_split"][0], "channelset", event["user"])
+
+ def _get_export_setting(self, context):
+ settings = self.exports.get_all(context)
+ return {setting["setting"].lower(): setting for setting in settings}
+
+ def _config(self, export_settings, target, setting, value=None):
+ if not value == None:
+ validation = export_settings.get("validate", lambda x: x)
+ validated_value = validation(value)
+ if not validated_value == None:
+ target.set_setting(setting, validated_value)
+ return ConfigResult(ConfigResults.Changed)
+ else:
+ raise ConfigInvalidValue()
+ else:
+ existing_value = target.get_setting(setting, None)
+ return ConfigResult(ConfigResults.Retrieved, existing_value)
+
+ @utils.hook("received.command.config", min_args=1)
+ def config(self, event):
+ """
+ :help: Change config options
+ :usage: <context>[:name] [setting [value]]
+ :permission: config
+ """
+
+ arg_count = len(event["args_split"])
+ context, _, name = event["args_split"][0].partition(":")
+ context = context.lower()
+
+ setting = None
+ value = None
+ if arg_count > 1:
+ setting = event["args_split"][1].lower()
+ if arg_count > 2:
+ value = " ".join(event["args_split"][2:])
+
+ target = None
+ setting_key = None
+
+ if context == "user":
+ setting_key = "set"
+ if name:
+ target = event["server"].get_user(name)
+ else:
+ target = event["user"]
+ elif context == "channel":
+ setting_key = "channelset"
+ if name:
+ if name in event["server"].channels:
+ target = event["server"].channels.get(name)
+ else:
+ target = ConfigChannelTarget(self.bot, event["server"],
+ name)
+ else:
+ target = event["target"]
+ elif context == "server":
+ setting_key = "serverset"
+ target = event["server"]
+ elif context == "bot":
+ setting_key = "botset"
+ target = self.bot
+
+ export_settings = self._get_export_setting(setting_key)
+ if not setting == None:
+ if not setting in export_settings:
+ raise utils.EventError("Setting not found")
+
+ try:
+ result = self._config(export_settings, target, setting, value)
+ except ConfigInvalidValue:
+ raise utils.EventError("Invalid value")
+ if result.result == ConfigResults.Changed:
+ event["stdout"].write("Config changed")
+ elif result.result == ConfigResults.Retrieved:
+ event["stdout"].write("%s: %s" % (setting, result.data))
+ else:
+ event["stdout"].write("Available config: %s" %
+ ", ".join(export_settings.keys()))