/
CDC-1.1/
parent $interfaces
object $settings_ui

var $root dbref 'settings_ui
var $root child_index 0
var $root fertile 0
var $root manager $settings_ui
var $root owned [$settings_ui]
var $root owners [$settings_ui]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $has_commands commands [["@set?tings *", 'settings_cmd], ["@add-setting-template|@ast * as * on *", 'add_setting_template_cmd], ["@del-setting-template|@dst * from *", 'del_setting_template_cmd]]
var $has_commands shortcuts []
var $root inited 1

method settings_cmd
    arg cmd, args;
    var flag, value, template, syn, bool, line;
    
    (> .perms(sender()) <);
    syn = cmd + " [+|-]<flag>[=<value>]";
    if (!args) {
        return .list_settings('local);
    } else if (args in ["-all", "-a"]) {
        return .list_settings('all);
    } else {
        bool = (args[1]) in ["-", "+"];
        if (bool)
            args = substr(args, 2);
        args = explode(args, "=");
        flag = args[1];
        if (listlen(args) == 2)
            value = args[2];
        else
            value = "";
        template = .setting_template(flag);
        if (!template)
            $parse.tell_error(("No setting available with the flag \"" + flag) + "\".", syn);
        switch (template[2]) {
            case 'boolean:
                if (!bool)
                    $parse.tell_error(("Value must be boolean (+|-" + flag) + ").", syn);
                value = bool - 1;
            case 'integer:
                if (!($string.is_numeric(value)))
                    $parse.tell_error(("Value must be an integer (" + flag) + "=<integer>).", syn);
                value = toint(value);
            case 'string:
                if (!value)
                    $parse.tell_error(("Value must be a string (" + flag) + "=<string>).", syn);
        }
        .set_setting(flag, value);
        line = ("Setting " + flag) + " set to ";
        switch (template[2]) {
            case 'boolean:
                line = line + ((value == 1) ? "+" | "-");
            default:
                line = line + toliteral(value);
        }
        .tell(line);
    }
.

method list_settings
    arg how;
    var templates, settings, setting_templates, t, x, len, line;
    
    (> .perms(sender()) <);
    len = ((.linelen()) - 2) / 2;
    switch (how) {
        case 'all:
            templates = .all_setting_templates();
            settings = .settings();
            setting_templates = dict_keys(settings);
            for x in (templates) {
                .tell(("Settings available on " + ((x[1]).namef('xref))) + ":");
                for t in (x[2]) {
                    switch (t[2]) {
                        case 'boolean:
                            line = "  " + pad("[+|-]" + (t[1]), len);
                        case 'integer:
                            line = "  " + pad(("     " + (t[1])) + "=<integer>", len);
                        case 'string:
                            line = "  " + pad(("     " + (t[1])) + "=<string>", len);
                    }
                    if (!((t[1]) in setting_templates)) {
                        line = line + " is unset";
                    } else {
                        switch (t[2]) {
                            case 'boolean:
                                line = (line + " is ") + (((settings[t[1]])[2]) ? "+" | "-");
                            default:
                                line = (line + " is ") + toliteral((settings[t[1]])[2]);
                        }
                    }
                    .tell(line);
                }
            }
        case 'local:
            settings = .settings();
            if (!settings)
                return .tell("All of your settings are either off or unset.");
            .tell("Your settings:");
            for x in (settings) {
                switch ((x[2])[1]) {
                    case 'boolean:
                        line = "  +" + (x[1]);
                    default:
                        line = (("   " + (x[1])) + "=") + toliteral((x[2])[2]);
                }
                .tell(line);
            }
    }
    .tell("---");
.

method add_setting_template_cmd
    arg cmd, flag, as, vtype, on, obj;
    var syn;
    
    (> .perms(sender()) <);
    syn = ((((cmd + " <flag> ") + as) + " <setting type> ") + on) + " <object>";
    obj = .match_env_nice(obj);
    if ((flag[1]) in ["-", "+"])
        flag = substr(flag, 2);
    if ((vtype[1]) == "'")
        vtype = substr(vtype, 2);
    vtype = tosym(vtype);
    if (!(vtype in ['boolean, 'integer, 'string]))
        $parse.tell_error("Setting type must be one of: 'boolean, 'integer, or 'string.", syn);
    catch ~perm {
        obj.add_setting_template(flag, vtype);
    } with handler {
        $parse.tell_error(("You cannot add settings to " + (obj.namef('xref))) + ".", syn);
    }
    .tell((((("Setting template with flag \"" + flag) + "\" as value of type ") + tostr(vtype)) + " added to ") + (obj.dbref()));
.

method del_setting_template_cmd
    arg cmd, flag, from, obj;
    var syn;
    
    (> .perms(sender()) <);
    syn = ((cmd + " <flag> ") + from) + " <object>";
    obj = .match_env_nice(obj);
    if ((flag[1]) in ["-", "+"])
        flag = substr(flag, 2);
    catch ~perm {
        obj.del_setting_template(flag);
    } with handler {
        $parse.tell_error(("You cannot change settings on " + (obj.namef('xref))) + ".", syn);
    }
    .tell((("Setting template with flag \"" + flag) + "\" deleted from ") + (obj.dbref()));
.