/
ColdCore-3.0a8/
ColdCore-3.0a8/src/
new object $settings_ui: $user_interfaces;

var $has_commands local = \
	#[["@set?tings", [["@set?tings", "on|from *", "@set?tings on|from <object reference>", 'settings_on_cmd, #[[2, ['objref, []]]]]]],\
  ["@set|@setting?s",\
    [["@set|@setting?s", "*", "@set|@setting?s <any>", 'set_cmd, #[[1, ['any, []]]]]]]];
var $root created_on = 796268969;
var $root flags = ['methods, 'code, 'variables, 'core];
var $root inited = 1;
var $root managed = [$settings_ui];
var $root manager = $settings_ui;

public method ._change_setting() {
    arg name, value, definer, object;
    var current, style, index, pos;
    
    (> .perms(sender(), 'writers) <);
    style = name.last();
    if (style in ["+", "-"]) {
        name = name.subrange(1, (name.length()) - 1);
        if (!definer)
            definer = object._find_setting_definer(name);
        current = (object.setting(name, definer)) || [];
        if (style == "+")
            value = [@current || [], value];
        else
            value = current.delete(toint(value));
    }
    catch ~check, ~set
        (> object.OLD_set_setting(definer, name, value) <);
    with
        throw(~stop, (traceback()[1])[2]);
};

public method ._show_setting() {
    arg setting, definer, object;
    var line;
    
    line = ("  " + setting) + " = ";
    setting = (| object.display_setting(setting, definer) |);
    if (setting != ~setting)
        line += setting;
    return line;
};

public method ._show_settings() {
    arg object;
    var a, s, out;
    
    if (!(object.trusts(this())))
        return (((object.namef('ref)) + " does not trust you enough to show you ") + (((| object.gender() |) || $gender_neuter).pronoun('pp))) + " settings.";
    out = [];
    for a in (object.ancestors()) {
        if (a == $has_settings)
            break;
        s = (| a.OLD_defined_settings() |);
        if (s)
            out += [._show_settings_on(a, object)];
    }
    return out.reverse();
};

public method ._show_settings_on() {
    arg definer, object;
    var settings, s, setting, line, out;
    
    if (!(object.trusts(this())))
        return [(definer.namef('xref)) + ":", "  ** Unable to see settings **"];
    settings = (| definer.OLD_defined_settings() |) || [];
    out = [];
    for s in (settings)
        out += [._show_setting(s, definer, object)];
    if (!out)
        out = ["  (none)"];
    return [(definer.namef('xref)) + ":"] + out;
};

protected method .set_cmd() {
    arg cmdstr, cmd, args;
    var opt, definer, t, p, name, value, object, reg, s;
    
    (> .perms(caller(), 'command) <);
    if (!args)
        return ._show_settings(this());
    if ((reg = regexp(args, "^ *(.*)<([^)]+)>(.*) *$"))) {
        definer = (> .match_env_nice(reg[2]) <);
        args = (((reg[1]).trim()) + " ") + ((reg[3]).trim());
    }
    if ((reg = regexp(args, "^ *([^:=]+): *(.*) *$"))) {
        object = (> .match_env_nice(reg[1]) <);
        args = reg[2];
    } else {
        object = this();
    }
    if ((reg = regexp(args, "^ *([a-z0-9_@-]+)[ =](.*)$"))) {
        name = (reg[1]).trim();
        args = (reg[2]).trim();
    } else {
        name = args;
        args = "";
    }
    if (!name)
        return [("-- Settings on " + (object.namef('ref))) + ":", ._show_settings(object), "--"];
    
    // this should fix the quotes
    value = args.unquote();
    
    // change it
    catch any {
        ._change_setting(name, value, definer, object);
        .tell(["-- Setting changed to:", ._show_setting(name, definer, object), "--"]);
    } with {
        return (traceback()[1])[2];
    }
};

protected method .settings_cmd() {
    arg cmdstr, cmd, args;
    var flag, value, template, syn, bool, line;
    
    (> .perms(caller(), 'command) <);
    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 = args.subrange(2);
        args = args.explode("=");
        flag = args[1];
        if ((args.length()) == 2)
            value = args[2];
        else
            value = "";
        template = .setting_template(flag);
        if (!template)
            return ("No setting available with the flag \"" + flag) + "\".";
        switch (template[2]) {
            case 'boolean:
                if (!bool)
                    return ("Value must be boolean (+|-" + flag) + ").";
                value = bool - 1;
            case 'integer:
                if (!($string.is_numeric(value)))
                    return ("Value must be an integer (" + flag) + "=<integer>).";
                value = toint(value);
            case 'string:
                if (!value)
                    return ("Value must be a string (" + flag) + "=<string>).";
        }
        .OLD_set_setting(flag, value);
        line = ("Setting " + flag) + " set to ";
        switch (template[2]) {
            case 'boolean:
                line += (value == 1) ? "+" : "-";
            default:
                line += toliteral(value);
        }
        .tell(line);
    }
};

protected method .settings_on_cmd() {
    arg cmdstr, cmd, prep, ref;
    
    (> .perms(caller(), 'command) <);
    
    // this is a hookneyed way to do it, and wont work out in the long run,
    // but until we get arguments in the parser this will work fine
    if ((ref[2]) == (ref[3]))
        return ._show_settings(ref[3]);
    else
        return ._show_settings_on(ref[3], ref[2]);
};