/
CDC-1.2b/
CDC-1.2b/src/
parent $user_interfaces
object $set_ui

var $root dbref 'set_ui
var $root child_index 0
var $root fertile 1
var $root manager $set_ui
var $root owned [$set_ui]
var $root owners [$]
var $root writable []
var $root readable ['parameters, 'methods, 'code]
var $old_command_environment verb_cache #[]
var $old_command_environment command_cache [["@set *", 'set_cmd], ["@add-setting *", 'add_setting_cmd]]
var $old_command_environment shortcuts_cache []
var $has_commands commands [["@set *", 'set_cmd], ["@add-setting *", 'add_setting_cmd], ["@del-setting * on|from *", 'del_setting_cmd], ["@set-info * on *", 'settings_info_cmd]]
var $has_commands shortcuts []
var $root inited 1

method set_cmd
    arg set, name;
    var pos, obj;
    
    pos = name.rindex(" on ");
    if (pos) {
        obj = .match_env_nice(substr(name, pos + 4));
        name = substr(name, 1, pos - 1);
    } else {
        obj = this();
    }
    return ._set_cmd(obj, name);
.

method add_setting_cmd
    arg com, name;
    var obj, pos, values, key, old_vals, line;
    
    pos = " on " in name;
    if (pos) {
        obj = .match_env_nics(substr(name, pos + 4));
        name = substr(name, pos - 1);
    } else {
        obj = this();
    }
    pos = " " in name;
    if (pos) {
        name = $string.trim(substr(name, 1, pos));
        line = substr(name, pos);
    } else {
        line = "";
    }
    values = (| obj.get_setting_info(name) |) || ($has_settings.default_setting_info());
    if (line) {
        values = dict_add(values, 'check, ['value, tostr(values['check])]);
        values = dict_add(values, 'get, ['value, tostr(values['get])]);
        values = dict_add(values, 'set, ['value, tostr(values['set])]);
        values = dict_add(values, 'del, ['value, tostr(values['del])]);
        values = dict_add(values, 'type, ['value, values['type]]);
        old_vals = #[];
        old_vals = dict_add(old_vals, 'set_args, values['set_args]);
        old_vals = dict_add(old_vals, 'get_args, values['get_args]);
        values = $parse.my_options(line, values);
        line = values[1];
        values = values[2];
        values = dict_add(values, 'check, tosym(values['check]));
        values = dict_add(values, 'get, tosym(values['get]));
        values = dict_add(values, 'set, tosym(values['set]));
        values = dict_add(values, 'del, tosym(values['del]));
        values = dict_add(values, 'get_args, old_vals['get_args]);
        values = dict_add(values, 'set_args, old_vals['set_args]);
    }
    if (obj.add_setting(name, values))
        .tell("Setting added.");
    else
        .tell("Usage: @add-setting <name> <options");
.

method _set_cmd
    arg obj, name;
    var pos, style, value, obj, definer, output, m, matches, info, args, n, o;
    
    // The method to do all the actual work for set_cmd and set_on_cmd
    if (!name)
        name = " ";
    
    //Find out just what the user wants to do.
    switch (name[1]) {
        case "+":
            style = 'boolean;
            value = 1;
            name = substr(name, 2);
        case "-":
            style = 'boolean;
            value = 0;
            name = substr(name, 2);
        default:
            pos = "=" in name;
            if (pos) {
                switch (name[pos - 1]) {
                    case "+":
                        style = 'add;
                        value = substr(name, pos + 1);
                        name = substr(name, 1, pos - 2);
                    case "-":
                        style = 'del;
                        value = substr(name, pos + 1);
                        name = substr(name, 1, pos - 2);
                    default:
                        style = 'set;
                        value = substr(name, pos + 1);
                        name = substr(name, 1, pos - 1);
                }
            } else {
                style = 'get;
                value = "";
            }
    }
    pos = ":" in name;
    if (pos > 1) {
        definer = substr(name, 1, pos - 1);
        name = substr(name, pos + 1);
    } else if (pos == 1) {
        definer = 0;
        name = substr(name, 2);
    } else {
        definer = 0;
    }
    
    // We think we know what the definer is. 
    // Make sure it's in the settings.
    // If not, add that string back on to the name
    if (definer && (!(obj.has_ancestor($object.to_dbref(definer))))) {
        name = (definer + ":") + name;
        definer = 0;
    }
    
    // style may be 'boolean, 'set, 'add, 'del, 'get
    // 'get means we are looking at settings. 
    // others mean we want to change settings. 
    // If we are changing the a setting 'value is what we want to change it to.
    // name will contain whatever is left of the name.
    // Something like:
    //  help-node.evaluator
    //  terminated-tell
    //  .foo 
    // The stuff before the first '.' may be the dbref of the definer.
    //   If it is, that string will be in dict_keys(settings)
    // If the style is 'get, 
    //  we want to show the names and values of all settings that match name.
    if (style == 'get) {
        output = [("Settings on " + (obj.name())) + ":"];
        matches = obj.all_matching_settings(name, [], 1);
    
        //  .debug(matches);
        for m in (matches) {
            o = m[1];
            output = [@output, (o.dbref()) + ":"];
            for n in (m[2]) {
                info = (m[1]).get_setting_info(n);
                output = [@output, (((("  " + n) + " (") + (info['type])) + "): ") + ($data.unparse(obj.get_setting(n, o)))];
            }
        }
        .tell(output);
        return;
    }
    
    // After all that, we know 
    //  what the definer is, 
    //  the actual name of the setting,
    //  The value we wnat to set it to
    //  The style of change we are makeing
    catch ~definernf {
        if (!(.set_setting(name, definer, value, style))) {
            .tell("! That is an invalid entry for that setting.");
            return;
        }
        .tell("Setting set");
    } with handler {
        .tell(("Setting " + name) + " not found.");
        return;
    }
.

method set_on_cmd
    arg set, name, on, obj;
    
    .debug("foo");
    return ._set_cmd(.match_env_nice(obj), name);
.

method set_info_cmd
    arg com, setting, on, definer;
    var pos, part, values, value, v, output;
    
    pos = " is " in definer;
    if (pos) {
        value = substr(definer, pos + 4);
        definer = .match_env_nice(substr(definer, 1, pos - 1));
        setting = setting.to_list(":");
        part = tosym(setting[2]);
        setting = setting[1];
        switch (part) {
            case "set_args", "get_args":
                values = value.to_list(",");
                value = [];
                for v in (values) {
                    v = v.trim();
                    if ((v[1]) == "'")
                        v = tosym(v);
                    value = [@value, v];
                }
            case "check", "get", "set", "del":
                value = tosym(value);
            case "type":
                value = value;
            default:
                .tell("The setting part must be on of set_args, get_args, check, get, set, del, type");
        }
        part = tosym(part);
        definer.add_setting(setting, #[[part, value]]);
        .tell("Setting info changed.");
    } else {
        output = [((("Setting " + setting) + " on ") + definer) + ":"];
        definer = .match_env_nice(definer);
        values = .get_setting_info(setting);
        for value in (dict_keys(values))
            output = [@output, (("  " + tostr(value)) + " = ") + ($data.unparse(values[value]))];
        .tell(output);
    }
.

method settings_info_cmd
    arg com, setting, on, definer;
    var pos, part, values, value, v, output;
    
    pos = " is " in definer;
    if (pos) {
        value = substr(definer, pos + 4);
        definer = .match_env_nice(substr(definer, 1, pos - 1));
        setting = setting.to_list(":");
        part = tosym(setting[2]);
        setting = setting[1];
        switch (part) {
            case 'set_args, 'get_args:
                values = value.to_list(",");
                value = [];
                for v in (values) {
                    v = v.trim();
                    if ((v[1]) == "'")
                        v = tosym(v);
                    value = [@value, v];
                }
            case 'check, 'get, 'set, 'del:
                value = tosym(value);
            case 'type:
                value = value;
            default:
                .tell("The setting part must be on of set_args, get_args, check, get, set, del, type");
        }
        definer.add_setting(setting, #[[part, value]]);
        .tell("Setting info changed.");
    } else {
        output = [((("Setting " + setting) + " on ") + definer) + ":"];
        definer = .match_env_nice(definer);
        if (!(definer.defines_setting(setting)))
            .tell("Object does not define that setting.");
        values = definer.get_setting_info(setting);
        for value in (dict_keys(values))
            output = [@output, (("  " + tostr(value)) + ": ") + ($data.unparse(values[value]))];
        .tell(output);
    }
.

method del_setting_cmd
    arg com, setting, on, obj;
    
    obj = .match_env_nice(obj);
    obj.del_setting(setting);
    .tell("Setting deleted.");
.