/
CDC-1.2b/
CDC-1.2b/src/
parent $user_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 [["@add-setting-template|@ast * as * on *", 'add_setting_template_cmd], ["@del-setting-template|@dst * from *", 'del_setting_template_cmd], ["@set *", 'set_cmd], ["@set?tings on *", 'settings_on_cmd]]
var $has_commands shortcuts []
var $root inited 1
var $old_command_environment verb_cache #[]
var $old_command_environment command_cache [["@add-setting-template|@ast * as * on *", 'add_setting_template_cmd], ["@del-setting-template|@dst * from *", 'del_setting_template_cmd], ["@set *", 'set_cmd], ["@set?tings on *", 'settings_on_cmd]]
var $old_command_environment shortcuts_cache []

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 settings_on_cmd
    arg cmd, on, args;
    var all, obj, syn;
    
    (> .perms(sender()) <);
    syn = ((cmd + " ") + on) + " <object> [-all]";
    args = $parse.options(args, #[["all", [1, 0]]]);
    if (!(args[1]))
        $parse.tell_error("", syn);
    all = (((args[2])["all"])[1]) ? 'all | 'local;
    obj = .match_env_nice((args[1])[1]);
    if (!(obj.has_ancestor($has_settings)))
        $parse.tell_error(((obj.namef('xref)) + " is not a descendant of ") + ($has_settings.namef('xref)));
    .tell(("Settings available on " + (obj.namef('xref))) + ":");
    .tell(obj.list_settings(all));
    .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()));
.

method set_cmd
    arg cmd, args;
    var flag, value, template, syn, bool, line;
    
    (> .perms(sender(), 'this) <);
    syn = cmd + " [+|-]<flag>[=<value>]";
    if (!args)
        $parse.tell_error("", syn);
    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:
            value = $string.strip(value, "\"");
    }
    .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);
.