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.");
.