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]); };