name integer 45 name file 8788 name parse 44 name buffer 1408 name gender_first_person_plural 2034 name false_lock_class 5 name http_interface 7969 name gender_plural 2036 name finger_daemon 7810 name event_handler 1139 name wrap_filter 1094 name note_editor 747 name logic_class 2485 name heap_class 1165 name connection 7792 name utilities 12 name http_file 8789 name messaged 1178 name user_db 3779 name filters 1093 name no_one 936 name daemon 7794 name place 2679 name exit 26 name body 28 name sys 0 name or 2489 name conference_parser 1432 name base_evaluator 9615 name and_lock_class 7 name or_lock_class 8 name login_watcher 888 name network_root 7791 name has_commands 16 name user_data 4309 name place_db 3778 name mail_db 3777 name world 2742 name false 2487 name user 30 name news 592 name log 2250 name programmer_interface 7459 name slate_connection 9508 name input_parser 2001 name has_settings 9398 name bad_commands 1140 name gender_male 1183 name environment 2786 name code_editor 758 name public 7261 name gender 40 name admin 33 name set 740 name not 2491 name realm_of_creation 2717 name notice_interface 9440 name not_lock_class 9 name generic_editor 1162 name command_parser 2000 name gender_neuter 1182 name verb_parser 2321 name programmer 32 name location 19 name arg_opts 310 name parsers 1431 name network 9153 name builder 31 name web_ui 9291 name login 4348 name guest 134 name note 7248 name http 8019 name dict 46 name code 51 name xor 2490 name db 790 name string 43 name data 7245 name small_first_heap_class 1166 name utility_objects 1170 name command_aliases 922 name contains_lock 2494 name lock_parser 10 name inside_lock 2495 name housekeeper 246 name event_class 1138 name verb_cache 35 name lock_class 3 name foundation 1377 name body_cave 247 name physical 1387 name http_log 8598 name gendered 1179 name editors 1388 name reaper 7232 name object 2451 name robot 5203 name named 2787 name true 2486 name text 1032 name root 1 name motd 4348 name and 2488 name gender_first_person 2032 name true_lock_class 4 name http_root_file 9292 name disk_readable 185 name login_daemon 7799 name display_opts 720 name settings_ui 9399 name interaction 86 name frob_class 2 name has_verbs 15 name dark_time 334 name nothing 984 name places 7523 name thing 24 name list 13 name time 333 name command_aliases_parser 2294 name connection_interface 7801 name located_location 25 name login_interface 7800 name wearable_class 1142 name old_connection 27 name movement_event 5205 name gender_female 1184 name http_daemon 7968 name antisocial 6099 name described 17 name registry 3775 name located 23 name english 48 name finger_interface 7811 name realms_class 1204 name object_lock 6 name null_parser 2622 name epic_filter 1095 name reaper_log 7292 name interfaces 664 name time_root 49 name scheduler 282 name eng_time 333 name creation 140 name channels 465 name nowhere 21 name slate 9552 name notes 522 name input 2337 name heart 5264 name void 22 name misc 675 name user_testperson 9688 object #1 var 1 manager #1 var 1 owners [#47] var 1 writable [#1] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 child_index 3 var 1 fertile 0 var 1 inited 0 var 1 info ["The root object is the ultimate parent of all objects. It defines beahvior of all objects. It controls initialization, deinitialization, creation, destruction, and identification of objects, as well as permission checking, and ownership."] var 1 quota 0 var 1 dbref 'root method init_root (> .perms(caller(), $root) <); child_index = 0; fertile = 0; // for now set all the ownership stuff as this(), it can be reset later. manager = this(); owned = [this()]; owners = [this()]; writable = []; readable = ['parameters, 'methods, 'code]; . method uninit_root var obj, x, objs; (> .perms(caller(), $root) <); objs = []; catch any { for obj in (owned) { if (obj == this()) continue; catch any { if ((obj.manager()) == this()) { for x in (obj.owners()) { if (valid(x) && (x != this())) objs = [@objs, x]; } obj.chown([$reaper, @objs]); obj.set_manager($reaper); } } with handler { // this is getting redundant, but there is a reason for it. (| obj.chown([$reaper]) |); (| obj.del_owner(this()) |); $reaper_log.log(("$root.uninit_root(): Unable to give " + (obj.dbref())) + " an owner."); } } for obj in (owners) (| obj.del_owned_obj(this()) |); } with handler { $brandon.tell("Traceback from $root.uninit_root()"); $brandon.tell_traceback(traceback()); } . method initialize disallow_overrides; var ancestors, ancestor, method_name, pos; if ((caller() != $sys) && (sender() != this())) throw(~perm, "Caller is not $sys and sender is not this."); if (inited) throw(~perm, "Already initialized."); ancestors = ancestors(); for pos in [0 .. listlen(ancestors) - 1] { ancestor = ancestors[listlen(ancestors) - pos]; method_name = tosym("init_" + tostr(ancestor.dbref('symbol))); catch ~methodnf { if (find_method(method_name) != ancestor) throw(~perm, ((("Initialization method for " + (ancestor.namef('ref))) + " in wrong place. Found on ") + (find_method(method_name).namef('ref))) + "."); .(method_name)(); } } inited = 1; . method uninitialize disallow_overrides; var ancestor, owner, obj; .perms(caller(), $root, $sys); for ancestor in (ancestors()) (| .(tosym("uninit_" + tostr(ancestor.dbref('symbol))))() |); . method perms disallow_overrides; arg what, [args]; var obj, flag, second; if (type(what) == 'dbref) what = [what]; if (!args) args = ['writer]; if (type(args[1]) == 'symbol) { for flag in (args) { switch (flag) { case 'this: for obj in (what) { if ((obj != this()) && (!($sys.is_system(obj)))) throw(~perm, ("Permission Denied: " + (obj.dbref())) + " is not this.", obj); } case 'system: for obj in (what) { if (!($sys.is_system(obj))) throw(~perm, ("Permission Denied: " + (obj.dbref())) + " is not of the system.", obj); } case 'manager: for obj in (what) { if (((.manager()) != obj) && (!($sys.is_system(obj)))) throw(~perm, ("Permission Denied: " + (obj.dbref())) + " is not the manager.", obj); } case 'trusts: for obj in (what) { if (!(.trusts(obj))) throw(~perm, ("Permission Denied: " + (obj.dbref())) + " is not a trustee.", obj); } case 'parser: // This should be removed sometime. for obj in (what) { if ((!(obj.has_ancestor($parsers))) && (obj != this())) throw(~perm, ("Permission Denied: " + (obj.dbref())) + " is not a parser.", obj); } default: for obj in (what) { if (!(.is_writable_by(obj))) throw(~perm, ("Permission Denied: " + (obj.dbref())) + " is not a writer.", obj); } } } } else { for obj in (what) { if (!(obj in args)) throw(~perm, ((obj.dbref()) + " is not one of: ") + ($list.to_english($list.map(args, 'namef, 'ref))), obj); } } . method _change_parents disallow_overrides; arg parents; var old, init, uninit, ancestor, pos; (> .perms(caller(), $root) <); if (!parents) throw(~noparents, "Objects must have at least 1 parent"); // Perform the actual change. old = ancestors(); (> $sys.change_sender_parents(parents) <); // Figure out new ancestors to initialize, and old ones to uninitialize. init = []; uninit = old; for ancestor in (ancestors()) { uninit = setremove(uninit, ancestor); if (!(ancestor in old)) init = [@init, ancestor]; } // Initialize the new ancestors. catch any { for ancestor in (init) { catch ~methodnf { .(tosym("init_" + tostr(ancestor.dbref('symbol))))(); } } } with handler { // Initialization error; deinitialize parents we initialized, and fall // back to old parents. pos = ancestor in init; for ancestor in (sublist(init, 1, pos)) (| .(tosym("uninit_" + tostr(ancestor.dbref('symbol))))() |); $sys.change_sender_parents(old); throw(~init, "Failed to initialize new ancestors."); } // Uninitialize the old ancestors. $sys.change_sender_parents(setremove(old, this())); for ancestor in (uninit) (| .(tosym("uninit_" + tostr(ancestor.dbref('symbol))))() |); $sys.change_sender_parents(parents); . method chparents arg parents; var parent; if (!(| .perms(sender(), 'manager) |)) (> .perms(caller(), $root, $sys) <); if (!parents) throw(~noparents, "There must be at least 1 parent for each object."); // Notify parents of impending change. for parent in (parents) (> parent.will_inherit(sender()) <); // Everything's okay, go ahead and try it. ._change_parents(parents); . method will_inherit arg obj; // Throw an error if it's not okay for obj to inherit from us. if ((!fertile) && ((!(.trusts(obj))) && (!(obj.has_ancestor(this()))))) throw(~perm, "Refuse to be parent of prospective child."); . method manager disallow_overrides; return manager; . method owners disallow_overrides; return owners; . method writers disallow_overrides; return writable + [manager, this()]; . method trusted return (trusted ? trusted | []) + [this()]; . method is_writable_by disallow_overrides; arg obj; return (| obj in (.writers()) |) || ($sys.is_system(obj)); . method is_readable_by disallow_overrides; arg obj; // will eventually get this working with lock frobs, for now // ,readable is a simple list of what everyone can read: // 'methods, 'parameters, 'code if (.trusts(obj)) return ['methods, 'parameters, 'code]; else return readable; . method trusts arg obj; return (| obj in (.trusted()) |) || ((.is_writable_by(obj)) || ($sys.is_system(obj))); . method fertile disallow_overrides; return fertile; . method set_fertile arg val; (> .perms(sender(), 'manager) <); fertile = val ? 1 | 0; . method set_manager disallow_overrides; arg obj; (> .perms(sender(), 'manager) <); if (type(obj) != 'dbref) throw(~type, "Managers must be given as a single dbref."); manager = obj; . method set_writable disallow_overrides; arg what; .perms(sender(), 'manager); writable = what; . method add_writer disallow_overrides; arg what; (> .perms(sender(), 'manager) <); writable = [@writable, what]; . method del_writer disallow_overrides; arg what; (> .perms(sender(), 'manager) <); writable = setremove(writable, what); . method set_readable disallow_overrides; arg what; (> .perms(sender(), 'manager) <); readable = what; . method set_trusted disallow_overrides; arg what; (> .perms(sender(), 'manager) <); trusted = what; . method add_trusted disallow_overrides; arg what; (> .perms(sender(), 'manager) <); trusted = [@trusted, what]; . method del_trusted disallow_overrides; arg what; (> .perms(sender(), 'manager) <); trusted = setremove(trusted, what); . method as_this_run arg obj, method, [args]; // run with this()'s perms -- unless they have changed .trusts, // it should just check against writers. if (!(.trusts(sender()))) throw(~perm, "Sender not allowed to gain access to object perms."); return (> obj.(method)(@args) <); . method add_parent arg parent; (> .perms(sender(), 'manager) <); if (parent in (.parents())) throw(~parent, (((.dbref()) + " already has ") + (parent.namef('ref))) + " as a parent"); if (!valid(parent)) throw(~type, "Not a valid parent, must send a dbref or pointer"); .chparents((.parents()) + [parent]); . method del_parent arg parent; var parents; (> .perms(sender(), 'manager) <); if (!valid(parent)) throw(~type, "Not a valid parent, must send a dbref or pointer"); parents = .parents(); if (!(parent in parents)) throw(~parentnf, "No such parent as " + ($data.unparse(parent))); parents = setremove(parents, parent); (> .chparents(parents) <); . method spawn arg [suffix]; var obj, tmp, dbref, owner, mngr, na; // will later adjust this for .is_readable_by() // use this rather than $string.non_alphanumeric because it doesn't // have '_' na = "!@#$%^&*()+-=~`'{}[]|/?\"\\,.<>;: "; if ((!fertile) && (((.is_readable_by(sender())) != ['methods, 'parameters, 'code]) && (!($sys.is_system(sender()))))) throw(~perm, "Not fertile or readable."); owner = sender(); // Figure out the suffix from the arguments and child index. if (!(owner.quota_valid())) throw(~quota, "Sender does not have the available quota"); if (suffix) { suffix = suffix[1]; // so they dont confuse child_index: if ($string.is_numeric(suffix)) throw(~perm, "Can't specify a numeric suffix."); // so we get correct symbols & it is always lowercase: suffix = $string.strip(suffix, na); } else { // make sure it doesn't exist already: dbref = tostr(.dbref('symbol)); tmp = .dbref('symbol); while ((| get_name(tmp) |)) { child_index = child_index + 1; tmp = tosym((dbref + "_") + tostr(child_index)); } suffix = tostr(child_index); } // Ask the system object for a child. obj = $sys.spawn_sender(suffix, owner); return obj; . method destroy disallow_overrides; // This doesn't actually destroy us immediately, but we will go away when // nothing is holding onto us any more. (> .perms(sender(), 'manager) <); (| .uninitialize() |); $sys.destroy_sender(); . method add_parameter arg name, [args]; var tmp, kid; // .add_parameter('name[, default-value, 'inherit]) // Add the given parameter to this object. // if 'default-value' is included, initialize the variable to that value // if 'inherit is given the value is initialized on all descendents (> .perms(sender()) <); (> add_parameter(name) <); // The following code is a kludge as we can't send a default value to the // primitive. if (args) { tmp = tosym((("__set_" + tostr(name)) + "_") + tostr(random(1000))); catch any { compile([((tostr(name) + " = ") + toliteral(args[1])) + ";"], tmp); .(tmp)(); if ((listlen(args) > 1) && ((args[2]) == 'inherit)) { for kid in (.descendants()) kid.(tmp)(); } del_method(tmp); } with handler { del_method(tmp); rethrow(error()); } } . method parameters (> .perms(sender(), 'this) <); return parameters(); . method del_parameter arg name; (> .perms(sender()) <); (> del_parameter(name) <); . method del_method arg name; (> .perms(sender()) <); (> del_method(name) <); . method methods disallow_overrides; if (!('methods in (.is_readable_by(sender())))) throw(~perm, ((sender().dbref()) + " doesn't have permission to find methods on ") + (.dbref())); return methods(); . method parents disallow_overrides; return parents(); . method children disallow_overrides; return children(); . method ancestors disallow_overrides; return ancestors(); . method find_method disallow_overrides; arg name; if (!('methods in (.is_readable_by(sender())))) throw(~perm, ((sender().dbref()) + " doesn't have permission to find methods on ") + (.dbref())); return (> find_method(name) <); . method find_next_method disallow_overrides; arg name, after; if (!('methods in (.is_readable_by(sender())))) throw(~perm, ((sender().dbref()) + " doesn't have permission to find methods on ") + (.dbref())); return (> find_next_method(name, after) <); . method list_method arg [args]; if (!('code in (.is_readable_by(sender())))) throw(~perm, (("Method code on " + (.namef('ref))) + " is not readable by ") + (sender().namef('ref))); return (> list_method(@args) <); . method compile arg code, name; // allow overrides -- may be a problem... (> .perms(sender()) <); return compile(code, name); . method show disallow_overrides; var output, actor, data, parent, readable, m, p, x, line; actor = sender(); readable = .is_readable_by(actor); data = $sys.sender_data(); // the beginning. output = ((("Object: " + (.namef('ref))) + " [") + tostr(.size())) + " bytes]"; output = [output, "Parents: " + ($data.unparse(parents()))]; // Methods if ('methods in readable) { output = output + ["Methods:"]; for m in (.method_info()) output = output + [(((" " + tostr(m[2])) + "(") + (m[3])) + ")"]; } else { output = output + [" ** No permission to list Methods **"]; } // Parameters if ('parameters in readable) { for parent in (data) { // because the server is FKD we have to make sure your params // all have valid parents: if (valid(parent[1])) { output = output + [((parent[1]).namef('xref)) + " Parameters:"]; if ('parameters in ((parent[1]).is_readable_by(actor))) { for p in (parent[2]) { line = ((" " + tostr(p[1])) + ": ") + ($data.unparse(p[2])); output = output + [line]; } } else { output = output + [" ** Permission Denied **"]; } } else { output = output + ["(Invalid parent-object You cannot reference because it's broke) Parameters:"]; for p in (parent[2]) { line = ((" " + tostr(p[1])) + ": ") + ($data.unparse(p[2])); output = output + [line]; } } } } else { output = output + [" ** No permission to list Parameters **"]; } // Return what we've got. return output; . method has_ancestor disallow_overrides; arg obj; return has_ancestor(obj); . method eval disallow_overrides; arg code, [dest]; var errors, result; dest = dest ? dest[1] | this(); (> .perms(sender()) <); // Compile the code. errors = .compile(code, 'tmp_eval); if (errors) return ['errors, errors, 0, 0]; // Evaluate the expression. Be sure to remove it afterwards, so that no // one else can call it. catch any { result = dest.tmp_eval(); } with handler { del_method('tmp_eval); rethrow(~methoderr); } del_method('tmp_eval); return ['result, result]; . method method_info arg [args]; var filter, maxp, anc, ancs, method, methods_found; // lists methods on objects which are ancestors of this and parents of args[1] // method info items are of the form: // [$definer, 'method, "args", "flags", "first comment/return value"] if (!('methods in (.is_readable_by(sender())))) throw(~perm, (("Method code on " + (.namef('ref))) + " is not readable by ") + (sender().namef('ref))); if (args) { maxp = args[1]; args = delete(args, 1); } if (listlen(args) >= 2) { filter = sublist(args, 1, 2); args = delete(delete(args, 1), 1); } else { filter = [$misc, '_null_method_filter]; } methods_found = []; ancs = .ancestors(); if (!(maxp in ancs)) { maxp = this(); ancs = [this()]; } for anc in (ancs) { if (anc.has_ancestor(maxp)) { for method in (anc.methods()) { if ((filter[1]).(filter[2])(anc, method, @args)) methods_found = [@methods_found, ._get_method_info(anc, method)]; } } } return methods_found; . method parameter_info arg [args]; var data, pattern, max_parent, pparams, param; // data() reformated as // [[$parent,'param,val],...] if (!('parameters in (.is_readable_by(sender())))) throw(~perm, (("Parameters on " + (.dbref())) + " are not readable by ") + (sender().dbref())); max_parent = [@args, this()][1]; data = []; for pparams in ($list.reverse($sys.sender_data())) { if (valid(pparams[1]) && ((pparams[1]).has_ancestor(max_parent))) { for param in (pparams[2]) data = [@data, [pparams[1], @param]]; } } return data; . method data var par, data, out; if (!('parameters in (.is_readable_by(sender())))) throw(~perm, ((sender().namef('ref)) + " is not allowed to read parameters on ") + (.namef('ref))); data = $sys.sender_data(); out = #[]; for par in (data) { // if the parent doesn't exist anymore, just let them see the data. if ((!valid(par[1])) || ('parameters in ((par[1]).is_readable_by(sender())))) out = dict_add(out, par[1], par[2]); else out = dict_add(out, par[1], ["*** Permission Denied ***"]); } return out; . method size disallow_overrides; arg [args]; args = [@args, 'int][1]; switch (args) { case 'string: return tostr(size()); case 'english: return $int.to_english(size()); default: return size(); } . method descendants disallow_overrides; var kid, kids; // .descendants() // -> Recursive list of all children of this object -- try not to use kids = children(); for kid in (kids) kids = union(kids, kid.descendants()); return kids; . method get_quota disallow_overrides; return quota; . method owned disallow_overrides; return owned; . method quota_valid disallow_overrides; // if (!.has_ancestor($user) && !$sys.is_admin(this())) // return 0; // will put quota checking in here return 1; . method del_owned_obj disallow_overrides; arg obj; (> .perms(caller(), $root) <); owned = setremove(owned, obj); . method add_owned_obj disallow_overrides; arg obj; (> .perms(caller(), $root, $sys) <); if (obj in owned) throw(~addowned, ((.namef('ref)) + " already owns ") + (obj.namef('ref))); owned = [@owned, obj]; . method match_children arg string; var children, child_names, c; children = .children(); child_names = $list.map(children, 'namef); // direct matches first. for c in (child_names) { if (c == string) return children[c in child_names]; } // ok, try partial matches for c in (child_names) { if (match_begin(c, string)) return children[c in child_names]; } return 0; . method set_info arg text; (> .perms(sender(), 'manager) <); info = text; . method info return info; . method _display_descendants arg [args]; var space, checked, c, anc, biguglylist, id, perms; space = args ? args[1] | ""; checked = (listlen(args) > 1) ? args[2] | []; perms = ""; if (fertile) perms = "F"; for c in (.readable()) perms = perms + (tostr(c)[1]); id = (space + (.namef(['dbref], " (", ['name], ")"))) + (perms ? (" [" + perms) + "]" | perms); for anc in (checked) { if (.has_ancestor(anc)) return [id + " (above)"]; } if (listlen(.parents()) > 1) id = id + " (MI)"; else id = id + ""; biguglylist = [id]; space = space + " "; // check children for c in (.children()) { biguglylist = biguglylist + (c._display_descendants(space, checked)); checked = setadd(checked, c); pause(); } return biguglylist; . method _display_ancestors arg [args]; var space, checked, c, anc, biguglylist, id, perms; space = args ? args[1] | ""; checked = (listlen(args) > 1) ? args[2] | []; perms = ""; if (fertile) perms = "F"; for c in (.readable()) perms = perms + (tostr(c)[1]); id = (space + (.namef('ref))) + (perms ? (" [" + perms) + "]" | perms); for anc in (checked) { if (.has_ancestor(anc)) return [id + " (above)"]; } if (listlen(.parents()) > 1) id = id + " (MI)"; else id = id + ""; biguglylist = [id]; space = space + " "; // check children for c in (.parents()) { biguglylist = biguglylist + (c._display_ancestors(space, checked)); checked = setadd(checked, c); pause(); } return biguglylist; . method _get_method_info disallow_overrides; arg anc, method; var code, lines, dis_flag, meth_args, first_comment; code = anc.list_method(method); lines = listlen(code); if (lines > 5) code = sublist(code, 1, 5); dis_flag = 0; if (code) { if ("disallow_overrides;" == (code[1])) { dis_flag = 1; code = delete(code, 1); } if (code && ((code[1]) && (((code[1])[1]) == "a"))) { meth_args = match_pattern("arg *;", code[1])[1]; code = delete(code, 1); } else { meth_args = ""; } if (code && ((!(code[1])) || (((code[1])[1]) == "v"))) code = delete(code, 1); if (code && ((!(code[1])) || (((code[1])[1]) == "v"))) code = delete(code, 1); first_comment = code ? (code[1]) + " " | " "; first_comment = (((first_comment[1]) == "/") || ((first_comment[1]) == "r")) ? first_comment | ""; } else { meth_args = ""; first_comment = ""; } return [anc, method, meth_args, dis_flag, lines, first_comment]; . method namef arg [args]; var output, type, part; if (!args) args = [['dbref]]; if (((args[1]) == 'ref) || ((args[1]) == 'xref)) args = [['dbref]]; // the actual switch, punctuation is treated oddly (parens specifically) output = ""; for part in (args) { type = type(part); if (type == 'list) output = output + ((| .(part[1])(@sublist(part, 2)) |) || ""); else if (type == 'string) output = output + part; } return output; . method match_descendants arg string; var match, child; match = .match_children(string); if (match) return match; for child in (.children()) { match = child.match_descendants(string); if (match) return match; } return 0; . method readable return readable; . method chown disallow_overrides; arg new_owners; var old_owners, obj, sofar, this; // must be called to add/del/change any ownership. (> .perms(sender(), .manager(), @$sys.system()) <); // make sure the new owners list is legit. if (type(new_owners) != 'list) throw(~type, "New owners must be given as a list of objects"); if (!($sys.is_system(sender()))) { for obj in (new_owners) { if (!(obj.has_ancestor($user))) throw(~perm, (obj.namef('ref)) + " is not a user object."); } } // few basic (re)settings old_owners = $list.flatten(owners); new_owners = $list.flatten(new_owners); owners = []; this = this(); sofar = []; // first make it so nobody owns it. for obj in (old_owners) (| obj.del_owned_obj(this) |); // set all the new owners for obj in (new_owners) { catch any { obj.add_owned_obj(this); } with handler { if (error() == ~addowned) continue; // didn't work out, set it back the way it was. for obj in (sofar) (| obj.del_owned_obj(this) |); for obj in (old_owners) { if ((| obj.add_owned_obj(this) |)) owners = [@owners, obj]; } throw(~chown, "Unable to add %O as an owner, chown unsuccessful.", obj); } sofar = [@sofar, obj]; } owners = new_owners; . method debug arg [stuff]; var x, line, mngr; line = (sender().namef(['id])) + " debug:"; for x in (stuff) line = (line + " ") + ((type(x) == 'string) ? x | ($data.unparse(x))); (| (.manager()).tell(line) |); . method set_quota arg value; (> .perms(caller(), $user, @$sys.system(), $root) <); quota = value; . method dbref arg [args]; args = [@args, 'string][1]; switch (args) { case 'string: return "$" + tostr(dbref); case 'symbol: return dbref; default: throw(~type, "args must be 'string or 'symbol."); } . method set_dbref arg new_dbref; var old_dbref; // Only accept calls from owners or admins. if (!(.is_writable_by(sender()))) throw(~perm, "Sender not an owner."); // Make sure first argument is a symbol. if (type(new_dbref) != 'symbol) throw(~type, "New dbref is not a symbol."); // Do nothing if new_dbref isn't different. if (new_dbref == dbref) return; // Make sure everything is lowercase. new_dbref = tosym(lowercase(tostr(new_dbref))); // Grab the new dbref catch any { $sys.assign_dbref(new_dbref); old_dbref = dbref; dbref = new_dbref; // If we already had a dbref, get rid of the old one. if (old_dbref) $sys.deassign_dbref(old_dbref); } with handler { $brandon.tell_traceback(traceback(), ""); } . method name arg [args]; return .dbref(); . method del_owner disallow_overrides; arg owner; (> .perms(caller(), $root) <); if (listlen(owners) != 1) owners = setremove(owners, owner); else .chown([$no_one]); . method add_owner disallow_overrides; arg owner; (> .perms(caller(), $root) <); owners = [@owners, owner]; . method generate_html arg [args]; var actor, readable, name, out, line, obj, col, colx, objs, x; actor = sender(); readable = .is_readable_by(actor); name = .namef('ref); out = ["<head>", ("<title>" + name) + "</title>", "<center>"]; out = [@out, ("<h1>" + name) + "</h1>", "</center>"]; out = [@out, "<hr width=50% align=middle>", "<body>"]; line = ("<a href=\"/bin/show?" + tostr(.dbref('symbol))) + "\">"; out = [@out, ("<center>" + line) + "show this object.</a></center>"]; line = []; for obj in (.parents()) line = [@line, $http.make_href_string(obj)]; out = [@out, "<P>Parent(s): " + ($list.to_english(line)), "<pre>"]; // duplicate the $code.generate_family_listing code because we // want to put in hrefs. objs = .children(); if (objs) { out = [@out, "Children:"]; col = ((| sender().linelen() |) || 79) / 8; colx = col * 3; line = pad("Name", colx + 2) + pad(" Perms", col - 2); out = [@out, (line + pad("Size ", -col)) + "Manager"]; for obj in (objs) { name = obj.namef('xref); line = $http.make_href_string(obj, pad(name, colx + 2)); line = line + pad($object.see_perms(obj), col - 2); line = line + pad(tostr(obj.size()) + " ", -col); x = obj.manager(); if (!valid(x)) name = pad(("** invalid object *(" + tostr(x)) + ") **", colx); else name = $http.make_href_string(x, pad(x.namef('xref), colx)); line = line + name; out = [@out, line]; } } out = [@out, "</pre>"]; if (info) { if (type(info) == 'frob) out = [@out, info.translate_to("text/html")]; else out = [@out, "<hr width=50% align=middle>", @info]; } return out; . method show_in_html disallow_overrides; var out, actor, data, parent, readable, m, p, x, line; // duplicating code in .show because I want it to be htmlified actor = sender(); readable = .is_readable_by(actor); data = $sys.sender_data(); // the beginning. out = "Object: " + ($http.make_object_href(this(), .namef('ref))); out = ((out + " [") + tostr(.size())) + " bytes]"; line = []; for x in (.parents()) line = [@line, $http.make_object_href(x)]; out = [out, "Parent(s): " + ($list.to_english(line)), "<pre>"]; // Methods if ('methods in readable) { out = out + ["Methods:"]; for m in (.method_info()) out = out + [" " + ($http.make_method_href(m))]; } else { out = out + [" ** No permission to list Methods **"]; } // Parameters if ('parameters in readable) { for parent in (data) { // because the server is FKD we have to make sure your params // all have valid parents: if (valid(parent[1])) { out = out + [((parent[1]).namef('xref)) + " Parameters:"]; if ('parameters in ((parent[1]).is_readable_by(actor))) { for p in (parent[2]) { line = ((" " + tostr(p[1])) + ": ") + (($http.filter_text([$data.unparse(p[2])]))[1]); out = out + [line]; } } else { out = out + [" ** Permission Denied **"]; } } else { out = out + ["(Invalid parent-object You cannot reference because it's broke) Parameters:"]; for p in (parent[2]) { line = ((" " + tostr(p[1])) + ": ") + (($http.filter_text([$data.unparse(p[2])]))[1]); out = out + [line]; } } } } else { out = out + [" ** No permission to list Parameters **"]; } // Return what we've got. return out; . parent #1 object #675 var 1 child_index 16 var 1 owners [#936] var 1 owned [] var 1 fertile 1 var 1 inited 1 var 1 manager #675 var 1 writable [#675] var 1 readable ['parameters, 'methods, 'code] var 1 info ["$misc is the parent for all objects which do not fit anywhere else on the herarchy. It serves as a means of keeping $root from having too many children."] var 1 dbref 'misc method _null_method_filter arg [args]; return 1; . method _display_filter arg anc, method, includes, excludes; var pat, ret, name; name = tostr(method); while (includes) { if (match_pattern(includes[1], name) == 0) return 0; includes = delete(includes, 1); } while (excludes) { if (match_pattern(excludes[1], name) != 0) return 0; excludes = delete(excludes, 1); } return 1; . parent #675 object #7791 var 1 dbref 'network_root var 1 child_index 4 var 1 fertile 0 var 1 manager #7791 var 1 owned [] var 1 owners [#936] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 7791 buffer `[] var 7791 ip "" var 7791 hostname "" var 7791 socket 0 var 7791 port 0 var 7791 active 0 method init_network_root (> .perms(caller(), $root) <); (> .reset_connection() <); . method uninit_network_root (> .perms(caller(), $root) <); (> .reset_connection() <); . method reset_connection // reset parameters to their default values (> .perms(caller(), $network_root) <); disconnect(); buffer = `[]; ip = ""; hostname = ""; port = 0; socket = 0; active = 0; . method failed arg socket; // called by the server when unable to make a connection. if ((sender() != 0) || (sender() != this())) throw(~perm, "Sender is not the server"); .receive("CONNECTION FAILED; socket: " + tostr(socket), 'connection_failed); // we weren't ever connected, but this will reset us. (| .close() |); . method open arg addr, port; // open a connection to <addr> on <port> (> .perms(sender()) <); if (active) throw(~engaged, (.namef('ref)) + " is currently engaged."); // reset for good measure (> .reset_connection() <); // set the active bit. .set_active(1); // set the ip or addr, if children want they can redefine .set_* // to check for hostname() or whatever. if (toint(addr)) .set_ip(addr); else .set_hostname(addr); .set_port(port); // try to open it (> $sys.connect(addr, port, this()) <); . method close // close the connection (> .perms(sender()) <); (> .reset_connection() <); .receive("Connection Closed.", 'connection_closed); . method connect arg [args]; // called by the server when a successful connection is made if (sender() != 0) throw(~perm, "Sender is not the server"); .receive("CONNECTION ESTABLISHED; " + ($data.unparse(args)), 'connection_established); // This is ugly, will be fixed when networking is fixed in the driver if (type(args[1]) == 'integer) { socket = args[1]; } else { ip = args[1]; socket = args[2]; hostname = hostname(ip); } . method disconnect arg [args]; $brandon.debug(this(), args); if ((sender() != 0) || (sender() != this())) throw(~perm, "Sender is not the server"); (> .close() <); . method receive arg line, status; // receive a string, called by .parse() . method parse arg incoming; var lines, line; // called by the server with an incoming buffer if (sender() != 0) throw(~perm, "Sender and caller are not the server"); lines = buffer_to_strings(buffer_append(buffer, incoming)); buffer = lines[listlen(lines)]; lines = sublist(lines, 1, listlen(lines) - 1); for line in (lines) .receive(line, 'external); . method send arg what; var line; // send off a string or list of strings. Calls .echo() if (type(what) == 'list) { for line in (what) .send(line); } else { .echo(what, 'string); } . method echo arg what, type; // send off a string or buffer (> .perms(sender()) <); switch (type) { case 'string: (> echo(buffer_from_strings([what])) <); case 'buffer: (> echo(what) <); } . method bind arg port, receiver; // bind to a port (> .perms(sender(), 'this) <); (> $sys.bind(port, receiver) <); . method unbind arg port; // unbind from a port (> .perms(sender(), 'this) <); (> $sys.unbind(port) <); . method ip (> .perms(sender(), 'trusts) <); return ip; . method hostname (> .perms(sender(), 'trusts) <); return hostname; . method port (> .perms(sender(), 'trusts) <); return port; . method socket (> .perms(sender(), 'trusts) <); return socket; . method active (> .perms(sender(), 'trusts) <); return active; . method set_ip arg str; (> .perms(sender(), 'this) <); ip = str; . method set_hostname arg str; (> .perms(sender(), 'this) <); hostname = str; . method set_port arg int; (> .perms(sender(), 'this) <); port = int; . method set_socket arg int; (> .perms(sender(), 'this) <); socket = int; . method set_active arg bit; (> .perms(sender(), 'this) <); active = bit; . parent #7791 object #9508 var 1 dbref 'slate_connection var 1 child_index 5 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 7791 buffer `[] var 7791 ip "" var 7791 hostname "" var 7791 port 0 var 7791 socket 0 var 7791 active 0 var 1 inited 1 var 9508 receiver 0 method receive arg line, status; if (receiver) receiver.receive(line, status); . method uninit_slate (> .perms(caller(), $root) <); (| receiver.slate_going_away() |); . method init_slate (> .perms(caller(), $root) <); receiver = 0; . method open arg addr, port; (> pass(addr, port) <); receiver = sender(); . method trusts arg obj; if (obj in ($network.valid_slate_callers())) return 1; return pass(obj); . method new_slate_connection var new_obj; (> .perms(caller(), 'trusts) <); new_obj = .spawn(); new_obj.add_writer(sender()); new_obj.chown([sender()]); new_obj.set_manager(sender()); return new_obj; . method close (> pass() <); (| slate.connection_ending() |); (> .destroy() <); . parent #1 object #2 var 1 child_index 8 var 1 owners [#936] var 1 fertile 1 var 1 inited 1 var 1 owned [] var 1 manager #2 var 1 writable [#2] var 1 readable ['parameters, 'methods, 'code] var 1 info ["$frob_class is the root of all frob objects. It defines .unparse, for displaying frobs (.unparse may be overriddent, but defaults to <$class, [rep] | #[rep]>."] var 1 dbref 'frob_class method unparse arg rep; return ((("<" + ($data.unparse(this()))) + ", ") + ($data.unparse(rep))) + ">"; . method new arg value; return <this(), value>; . parent #2 object #2485 var 1 child_index 6 var 1 fertile 0 var 1 manager #2485 var 1 owners [#936] var 1 writable [#2485] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'logic_class method test arg [args]; return 0; . parent #2485 object #3 var 1 owners [#936] var 1 owned [] var 1 manager #3 var 1 writable [#3] var 1 readable ['parameters, 'methods, 'code] var 1 child_index 2 var 1 dbref 'lock_class parent #3 object #2494 var 1 child_index 0 var 1 fertile 0 var 1 manager #2494 var 1 owners [#936] var 1 writable [#2494] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'contains_lock method test arg objlist, testee, [args]; var x; for x in (objlist) { if (testee.contains(x)) return 1; } return 0; . parent #1 object #1170 var 1 child_index 7 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1170 var 1 writable [#1170] var 1 readable ['parameters, 'methods, 'code] var 1 info ["$utility_objects is the parent for all objects which are themsleves utilities, such as $scheduler. It does not define anything."] var 1 dbref 'utility_objects parent #1170 object #8019 var 1 dbref 'http var 1 child_index 0 var 1 fertile 0 var 1 manager #8019 var 1 owned [] var 1 owners [#936] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 8019 errors #[[400, ["<head><title>400 Bad Request</title></head>", "<body>", "<center><h1>400 Bad Request</h1></center>", "%s", "</body>"]], [403, ["<head><title>403 Permission Denied</title></head>", "<body>", "<center><h1>403 Permission Denied</h1></center>", "%s", "</body>"]], [404, ["<head><title>404 Not Found</title></head>", "<center><h1>404 Not Found</h1></center>", "%s", "</body>"]]] method set_error arg error, lines; (> .perms(sender(), 'manager) <); errors = dict_add(errors, error, lines); . method del_error arg error, lines; (> .perms(sender(), 'manager) <); errors = dict_del(errors, error); . method get_error arg error, str; var lines, x; lines = (| errors[error] |) || ["Oops, server just broke."]; for x in [1 .. listlen(lines)] lines = replace(lines, x, strsub(lines[x], "%s", str)); return lines; . method make_href_string arg obj, [name]; var line; if (!name) name = [obj.dbref()]; line = ("<tt><a href=\"/objects/" + tostr(obj.dbref('symbol))) + "/\">"; return (line + (name[1])) + "</a></tt>"; . method bin_show arg [args]; var out, obj; if (!args) return .get_error(400, "Must specify an object"); obj = (| $object.to_dbref(args[1]) |); if (!obj) return .get_error(404, ("Unable to find object \"" + (args[1])) + "\""); return ["<pre>", @obj.show_in_html(), "</pre>"]; . method make_method_href arg m; return ((((((("<a href=\"/bin/list_method?" + ((m[1]).dbref())) + ".") + tostr(m[2])) + "()\">") + tostr(m[2])) + "(") + (m[3])) + ")</a>"; . method make_object_href arg obj, [name]; var line; if (!name) name = [obj.dbref()]; line = ("<tt><a href=\"/objects/" + tostr(obj.dbref('symbol))) + "/\">"; return (line + (name[1])) + "</a></tt>"; . method bin_list_method arg [args]; var ref, str_ref, name, obj, code, anc, out, line, x; if (!args) return .get_error(400, "Must specify a method reference"); catch any { ref = $parse.reference(args[1]); name = tosym(ref[2]); obj = $object.to_dbref(ref[1]); anc = obj.find_method(name); code = anc.list_method(name); code = .filter_text(code); for x in [1 .. listlen(code)] line = " " + (code[x]); str_ref = (((obj.dbref()) + ".") + tostr(name)) + "()"; out = [("<head><title>" + str_ref) + "</title></head>"]; out = [@out, ("<body><center><h1>" + str_ref) + "</h1></center>"]; out = [@out, "<hr>", "<pre><code>", "@program " + str_ref]; out = [@out, @code, ".", "</code></pre>"]; } with handler { switch (error()) { case ~methodnf: line = (((obj.dbref()) + ".") + tostr(name)) + "()"; out = $http.get_error(400, line + " not found."); default: out = $http.get_error(400, (traceback()[1])[2]); } } return out; . method bin_who arg [args]; var out, obj; // will have to spiff this up later. out = ["<head><title>Who is connected to the Cold Dark?</title></head>"]; out = [@out, "<body><pre>", @$code.generate_listing($user_db.connected())]; return out + ["</pre>"]; . method filter_text arg text; var x, line; // embed's characters ('>' becomes '>' etc) for x in [1 .. listlen(text)] { line = strsub(text[x], "&", "&"); line = strsub(line, "<", "<"); line = strsub(line, ">", ">"); text = replace(text, x, line); } return text; . parent #1 object #1377 var 1 child_index 4 var 1 fertile 0 var 1 manager #1377 var 1 owners [#1377] var 1 writable [#1377, #47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 info ["$foundation is the root object of the world building blocks. All 'vr' objects are ultimately derived from the foundation object, as well as some of the non-vr helper objects."] var 1 dbref 'foundation parent #1377 object #1178 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 1 var 1 inited 1 var 1 manager #1178 var 1 writable [#1178] var 1 readable ['parameters, 'methods, 'code] var 1178 messages 0 var 1 info ["$messaged stores messages for various objects. For example, $exit messages such as would be displayed when a being attempts to travers an exit, but fails would be stored in a $messaged parameter, but could be overridden on a particular exit."] var 1 dbref 'messaged method messages .perms(sender(), 'this); return messages || #[]; . method all_messages var msg, all; // For message to call when inheriting, or something .perms(sender(), 'this); all = (| pass() |) || #[]; for msg in (.messages()) { if (msg in dict_keys(all)) all = $dict.replace(all, msg, (.messages())[msg]); else all = dict_add(all, msg, (.messages())[msg]); } return all; . method message arg id; var ret; ret = (| (.all_messages())[id] |); if (type(ret) == 'error) throw(~msgnf, "Message not found."); return ret; . method add_message arg id, msg; .perms(sender()); if (.has_message(id)) throw(~msgexists, "Message already defined."); messages = dict_add(messages, id, msg); . method set_message arg id, msg; .perms(sender()); if (.defines_msg(id)) messages = $dict.replace(messages, id, msg); else .add_message(id, msg); . method has_message arg id; return id in dict_keys(.all_messages()); . method defines_msg arg id; return id in dict_keys(.messages()); . method init_messaged .perms(caller(), $root); messages = #[]; . parent #2 parent #1178 object #1138 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1138 var 1 writable [#1138] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'event_class var 1138 type 'generic var 1178 messages #[] method new arg [args]; .perms(caller(), $event_handler); // we still don't know what we want // if (type(location) != 'dbref) // throw(~type, "The location must be given as a dbref"); // return <this(), #[['actor, sender()], ['action, action], ['what, what], ['where, location], ['direction, direction]]>; return <this(), [sender(), @args]>; . method dispatch arg dict; .has_object_perms($event_handler, caller()); (dict['where]).event(<this(), dict>); . method set_event_type arg newtype; .perms(sender()); if (type(newtype) != 'symbol) throw(~type, "New event types must be symbols."); type = newtype; . method type arg [args]; return type; . parent #1138 object #5205 var 1 dbref 'movement_event var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owned [] var 1 owners [#7232, #1387, #1388] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 1138 type 'movement method exit arg rep; return rep[2]; . method new arg which, who, [args]; (> .perms(caller(), $exit) <); return <this(), [which, who, sender()]>; . method dest arg args; return (args[3]).dest(); . method source arg args; return (args[3]).source(); . parent #1377 object #16 var 16 commands [] var 16 shortcuts [] var 1 child_index 2 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 1 owned [] var 1 manager #16 var 1 writable [#16] var 1 readable ['parameters, 'methods, 'code] var 533 title "untitled" var 533 brief "" var 533 help_name "" var 533 text [] var 533 footnotes [] var 533 references #[] var 533 upnode #534 var 533 subnodes [] var 533 menu 0 var 1 dbref 'has_commands method init_has_commands if (caller() != $root) throw(~perm, "Caller is not $root."); commands = []; shortcuts = []; . method uninit_has_commands if (caller() != $root) throw(~perm, "Caller is not $root."); commands = 0; shortcuts = 0; . method add_command arg template, method; if (!(.is_writable_by(sender()))) throw(~perm, "Sender is not an owner."); if ((type(template) != 'string) || (type(method) != 'symbol)) throw(~type, "Template and method are not a string and symbol."); commands = [@commands, [template, method]]; . method del_command arg match; var command, x; .perms(sender()); // so you can do both template or method if (type(match) == 'symbol) x = 2; else if (type(match) == 'string) x = 1; else throw(~type, "Type must either be a string or symbol (template or method)."); for command in (commands) { if ((command[x]) == match) { commands = setremove(commands, command); return; } } throw(~commandnf, "No command with match " + toliteral(match)); . method add_shortcut arg pattern, method, subs; if (!(.is_writable_by(sender()))) throw(~perm, "Sender is not an owner."); if ((type(pattern) != 'string) || ((type(method) != 'symbol) || (type(subs) != 'list))) throw(~type, "Pattern, method, and subs are not a string, symbol, and list."); shortcuts = [@shortcuts, [pattern, method, subs]]; . method del_shortcut arg method; var shortcut; if (!(.is_writable_by(sender()))) throw(~perm, "Sender is not an owner."); for shortcut in (shortcuts) { if ((shortcut[2]) == method) { shortcuts = setremove(shortcuts, shortcut); return; } } throw(~shortcutnf, "No shortcut with method " + tostr(method)); . method match_command arg str; var shortcut, cmd, fields; // Try shortcuts. for shortcut in (.all_shortcuts()) { fields = match_pattern(shortcut[1], str); if (fields) return [shortcut[2], .sub_shortcut_fields(shortcut[3], fields)]; } // Try commands. for cmd in (.all_commands()) { fields = match_template(cmd[1], str); if (fields) return [cmd[2], fields]; } // Give up. return 0; . method commands return commands; . method all_commands var p, cmdlist, pc; // Collect complete command list from ancestors. Ancestors may not be // command-handling objects, in which case (| p.commands() |) is // ~methodnf. cmdlist = []; for p in (ancestors()) { pc = (| p.commands() |); if (pc) cmdlist = cmdlist + pc; if (p == definer()) break; } return cmdlist; . method shortcuts return shortcuts; . method all_shortcuts var ancestor, list, ancestor_shortcuts; // Collect complete command list from ancestors. Ancestors may not be // command-handling objects, in which case (| p.shortcuts() |) is // ~methodnf. list = []; for ancestor in (ancestors()) { ancestor_shortcuts = (| ancestor.shortcuts() |); if (ancestor_shortcuts) list = list + ancestor_shortcuts; if (ancestor == definer()) break; } return list; . method sub_shortcut_fields arg subs, fields; var subbed_list, elem; subbed_list = []; for elem in (subs) { if (type(elem) == 'string) subbed_list = [@subbed_list, elem]; else if (type(elem) == 'integer) subbed_list = [@subbed_list, (> fields[elem] <)]; else throw(~type, "Substitution element is of wrong type."); } return subbed_list; . parent #16 object #664 var 1 child_index 11 var 1 owners [#936] var 1 owned [] var 1 fertile 1 var 16 commands [] var 16 shortcuts [] var 1 inited 1 var 1 manager #664 var 1 writable [#664] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'interfaces parent #664 object #7801 var 1 dbref 'connection_interface var 1 child_index 3 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [] var 16 shortcuts [] var 1 inited 1 var 7801 connection 0 method timeout // the connection is asking the interface if it should timeout // and close the connection. return 1; . method parse_line arg line; var cmd; // don't use the normal parsing system because it involves // a bit of overhead. catch any { while (line && ((line[1]) == " ")) line = substr(line, 2); if (!line) { return .null_cmd(line); } else { cmd = .match_command(line); if (cmd) return .(cmd[1])(@cmd[2]); else return .invalid_cmd(line); } } with handler { .send($parse.traceback(traceback())); return 'disconnect; } . method init_connection_interface (> .perms(caller(), $root) <); connection = 0; . method uninit_connection_interface (> .perms(caller(), $root) <); connection = 0; . method connection_going_away (> .perms(caller(), $connection) <); (> .perms(sender(), connection) <); (> .destroy() <); . method linelen return 79; . method new_connection arg addr; (> .perms(caller(), $connection) <); connection = sender(); . method send arg what; connection.send(what); . method null_cmd arg line; return 'disconnect; . method invalid_cmd arg line; return 'disconnect; . method connection return connection; . method connection_starting // called by connection.connect() . parent #7801 object #7969 var 1 dbref 'http_interface var 1 child_index 696 var 1 fertile 1 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [["GET *", 'get_cmd]] var 16 shortcuts [] var 7801 connection 0 var 1 inited 1 var 7969 uri "" var 7969 header #[] var 7969 http_version "" var 7969 method "" var 7969 status 0 method init_http_interface (> .perms(caller(), $root) <); status = 0; uri = ""; header = #[]; http_version = ""; method = ""; . method get_cmd arg cmd, line; if (status == 0) { if (!line) { line = "Invalid use of method GET."; .send_response($http.get_error(403, line)); return 'disconnect; } line = explode(line); if (listlen(line) > 1) http_version = line[2]; else http_version = "HTTP/1.0"; uri = line[1]; method = "GET"; status = 1; } else { line = "Method GET already received!"; .send_response($http.get_error(400, line)); return 'disconnect; } . method invalid_cmd arg line; var lines; if (status == 1) { // I had it set to be just ":" but I think spaces should be in them. line = explode(line, ": "); if (listlen(line) == 1) line = [@line, ""]; else if (listlen(line) > 2) line = [line[1], $list.to_string(sublist(line, 2))]; header = $dict.add_elem(header, line[1], line[2]); } else { line = ("Invalid method: \"" + line) + "\"."; .send_response($http.get_error(400, line)); return 'disconnect; } . method send_response arg body, [args]; var types, buffer, c; types = [@args, "text/html"][1]; switch (type(body)) { case 'list: buffer = $list.to_buffer(body); case 'buffer: buffer = body; } c = .connection(); c.send("HTTP/1.0 200 OK"); c.send("Server: ColdWeb/0.1"); c.send("Content-type: " + types); c.send("Content-length: " + tostr(buffer_len(buffer))); c.send(""); c.echo(buffer, 'buffer); .log_request(buffer_len(buffer)); . method error arg error, str; var lines, x; lines = (| errors[error] |) || ["Oops, server just broke."]; for x in (lines) strsub(x, "%s", str).send_response(lines); . method uninit_http_interface (> .perms(caller(), $root) <); uri = ""; header = #[]; http_version = ""; method = ""; . method null_cmd arg line; .process_http_method(); return (> pass(line) <); . method log_request arg content_length; var line, c, agent; // was going to have this be like the standard logfile, but decided // I didn't like that c = .connection(); line = c.address(); agent = (| ((.header())["User-Agent"])[1] |) || ""; line = (((((((line + " \"") + method) + " ") + uri) + " ") + http_version) + "\" ") + agent; $http_log.log(line); . method process_GET var path, output, object, line, bin; (> .perms(sender(), 'this) <); // Ok, we are going to interpret the URI in funky ways. path = explode(uri, "/"); if (!path) { output = ($login.build_html()) + ($http_root_file.retrieve_html()); } else if (((path[1])[1]) == "~") { object = (| $user_db.find(substr(path[1], 2)) |); output = (| object.http_request(method, sublist(path, 2)) |); } else if ((path[1]) == "objects") { object = (| $object.to_dbref(path[2]) |); output = (| object.generate_html(@sublist(path, 3)) |); } else if (match_begin("bin", path[1])) { if (listlen(path) > 2) line = $list.to_string(sublist(path, 3)); if ("?" in (path[2])) { line = substr(path[2], ("?" in (path[2])) + 1) + (line || ""); bin = substr(path[2], 1, ("?" in (path[2])) - 1); } else { bin = path[2]; } output = (| $http.(tosym("bin_" + bin))(line) |); } else { object = $http_root_file.find_file([$http_root_file.filename(), @path]); output = (| object.retrieve_html() |); } if (!output) { line = ("Unable to find " + uri) + "."; output = $http.get_error(404, line); } // intentionally add the tail here, we can slap tCD comments // at the end. output = output + ["<hr size=4><a href=\"/\"><b>the Cold Dark</b></a></body>"]; .send_response(output); . method process_http_method (> .perms(sender(), 'this) <); .(tosym("process_" + method))(); . method header return header; . parent #1377 object #2786 var 1 child_index 0 var 1 fertile 0 var 1 manager #2786 var 1 owned [] var 1 owners [#47] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 1 dbref 'environment method environment return []; . method match_environment arg str; var obj, env, found, match; if (!str) throw(~objnf, "No \"\" in environment.", str); // Handle special cases. if (str == "me") { return this(); } else if ((str[1]) == "$") { obj = (| get_name(tosym(substr(str, 2))) |); if (!valid(obj)) throw(~objnf, "No such object " + str, str); return obj; } else { env = .environment(); found = []; if (str in ["it", "him", "her"]) { match = (| sender().match_context(str) |); if (!match) { for obj in (env) { if ((| obj.gender_context() |) == str) found = [@found, [obj, 1]]; } } else { found = [[match, 1]]; } } else { for obj in (env) { match = obj.match_name(str); if (match) found = found + [[obj, match]]; } if (!found) { for obj in (env) { match = obj.match_name_aliases(str); if (match) found = found + [[obj, match]]; } } } if (!found) throw(~objnf, ("No \"" + str) + "\" in environment.", str); if (listlen(found) == 1) { return (found[1])[1]; } else { match = $list.min(@$list.slice(found, 2)); if (($list.count(match, $list.slice(found, 2))) == 1) return (found[match in ($list.slice(found, 2))])[1]; else throw(~ambig, ("\"" + str) + "\" can match more than one object", [$list.slice(found, 1), str]); } } . method local_to_environment arg obj; return obj in (.environment()); . parent #1 object #12 var 1 child_index 22 var 1 owners [#936] var 1 fertile 1 var 1 inited 1 var 1 owned [#49, #45, #51, #48, #46, #47] var 1 manager #12 var 1 writable [#12] var 1 readable ['parameters, 'methods, 'code] var 1 info ["$utilities is the parent of all utility objects storing classes of data-minimulating methods, such as $string and $list. It does not define anything, but merely serves as the parent to these objects."] var 1 dbref 'utilities parent #12 object #43 var 1 child_index 0 var 1 owners [#43, #0] var 1 fertile 0 var 1 inited 1 var 43 alphabet "abcdefghijklmnopqrstuvwxyz" var 43 numbers "1234567890" var 43 non_alphanumeric "!@#$%^&*()_+-=~`'{}[]|/?\"\\,.<>;: " var 1 owned [#43] var 1 manager #43 var 1 writable [#43] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'string method left arg str, width, [fchar]; // will NOT chop off 'str' if it is longer than width, use pad() for that. if (fchar) return str + ((strlen(str) < width) ? pad("", width - strlen(str), fchar[1]) | ""); else return str + ((strlen(str) < width) ? pad("", width - strlen(str)) | ""); . method fill arg n, [args]; var fill, x; // same as pad("", n, [args]); fill = [@args, " "][1]; return pad("", n, fill); . method center arg text, len, [args]; var lfill, rfill, textlen, padlen; // args[1] == string to center // args[2] == integer of width to center in // args[3] <op> == what to fill the left|right side with. // args[4] <op> == what to fill the right side with. lfill = ((listlen(args) >= 1) && (args[1])) || " "; rfill = (listlen(args) >= 2) ? args[2] | ((lfill == " ") ? "" | lfill); textlen = strlen(text); padlen = (len - textlen) / 2; if (textlen < len) return ((.fill(padlen, lfill)) + text) + (rfill ? .fill(padlen, rfill) | ""); else return (len > 0) ? text | pad(text, len); . method trim arg string, [args]; var rl, chars, type; // remove leading and trailing characters. // if args includes a string, it takes that as the strip string. // args can also include symbols of what edge to trim: 'left 'right (or both) // left and right defaults on. rl = []; while (args) { type = type(args[1]); if (type == 'string) chars = args[1]; else if (type == 'symbol) rl = [@rl, args[1]]; args = sublist(args, 2); } if (!chars) chars = " "; if (!rl) rl = ['left, 'right]; if ('left in rl) { // strip from left while (string && ((string[1]) in chars)) string = substr(string, 2); } if ('right in rl) { // strip from right while (string && ((string[strlen(string)]) in chars)) string = substr(string, 1, strlen(string) - 1); } return string; . method to_list arg str, [sep]; var result, list; // separate a string into a list of strings, breaking wherever 'sep' appears. // if not provided, sep defaults to a comma. // One word of warning. sep should not contain an asterisk. If it does, // this routine will separate the string oddly, most likely losing bits. if (!str) return []; sep = ("*" + (sep ? sep[1] | ",")) + "*"; list = []; while (1) { result = match_pattern(sep, str); if (result) { list = list + [result[1]]; str = result[2]; } else { return list + [str]; } } . method right arg str, width, [fchar]; // will not chop off 'str' if it is longer than width (unlike pad()) if (fchar) return pad("", width - strlen(str), fill_char[1]) + str; else return pad("", width - strlen(str)) + str; . method alphabet return alphabet; . method numbers return numbers; . method capitalize arg string; // Capitalizes the first character of a word. return uppercase(string[1]) + substr(string, 2); . method is_numeric arg string; return toint(string) || (string == "0"); . method a_or_an arg string; if (lowercase(string[1]) in "aeiou") return "an"; return "a"; . method strip arg string, strip; var new_str, char; // strips all of "strip" characters from the string // if "strip" is -1 it will use .non_alphanumeric() if ((type(string) != 'string) || ((type(strip) != 'string) && (strip != (-1)))) throw(~type, "First argument must be a string, second can be -1"); new_str = ""; if (strip == (-1)) new_str = non_alphanumeric; for char in [1 .. strlen(string)] { if (!((string[char]) in strip)) new_str = new_str + (string[char]); } return new_str; . method non_alphanumeric return non_alphanumeric; . method chop arg str, len, [end]; // chops string off strlen(end) characters before len and appends len end = [@end, "..."][1]; if (strlen(str) < len) return str; if (strlen(str) < strlen(end)) return str; return pad(str, len - strlen(end)) + end; . method replace arg string, replace, [char]; var new_str, character; // replaces 'replace' with the character in 'char' // if 'replace' is -1 will use .non_alphanumeric(); if ((type(string) != 'string) || ((type(replace) != 'string) && (strip != (-1)))) throw(~type, "First argument must be a string, second can be -1"); char = [@char, " "][1]; new_str = ""; if (replace == (-1)) new_str = non_alphanumeric; for character in [1 .. strlen(string)] { if (!((string[character]) in replace)) new_str = new_str + (string[character]); else new_str = new_str + char; } return new_str; . method explode_english_list arg line, [opts]; var x, output, tmp; // explodes an english list ("foo, bar and zoo"). line = explode(line, ","); output = []; for x in (line) { x = .trim(x); if ((| substr(x, 1, 3) |) == "and") output = [@output, .trim(substr(x, 4))]; else output = [@output, x]; } // check the last element, if they didn't specify 'noand if (!('noand in opts)) { line = explode(output[listlen(output)]); tmp = ""; for x in [1 .. listlen(line)] { if ((line[x]) == "and") { output = delete(output, listlen(output)); if (tmp) output = [@output, tmp]; tmp = $list.to_string(sublist(line, x + 1)); if (tmp) output = [@output, tmp]; // only bother with the first "and" break; } tmp = (tmp + (tmp ? " " | "")) + (line[x]); } } return output; . method explode_delimited arg str, left, right; var pattern, parsed, matched, match_num, match_result; // parse str looking for anything surrounded by left and right // ;$string.explode_delimited("foo%[bar]baz", "%[", "]") // => [["foo", 1, "baz"], ["bar"]] pattern = ((("*" + left) + "*") + right) + "*"; parsed = []; matched = []; match_num = 0; while (str) { match_result = match_pattern(pattern, str); if (match_result) { match_num = match_num + 1; parsed = [@parsed, match_result[1], match_num]; matched = [@matched, match_result[2]]; str = match_result[3]; } else { parsed = [@parsed, str]; str = ""; } } return [parsed, matched]; . method wrap_line arg string, length, [stuff]; var output, cutoff, firstline, prefix; // takes string and wraps it by words, compared to length, returns a list. prefix = [@stuff, ""][1]; firstline = [@stuff, 0, 0][2]; output = []; length = length - strlen(prefix); if (firstline) string = prefix + string; while (strlen(string) > length) { cutoff = .rindex(substr(string, 1, length), " "); output = [@output, substr(string, 1, cutoff - 1)]; string = prefix + substr(string, cutoff + 1); } return [@output, string]; . method rindex arg string, index; var loc, rest; // returns the first occurance of index starting from the end of the string, // and moving to the beginning. loc = index in string; rest = loc && substr(string, loc + 1); while (loc && (index in rest)) { loc = loc + (index in rest); rest = loc && substr(string, loc + 1); } return loc; . method match_sub_tag arg string, tag; var x, expl, output, match, matches; // matches a string between 'tag' and " " in a larger string against // the sender's environment. If a match is found it subs the match.name // with the string, otherwize it lets it pass through with the tag, ie: // .match_sub_tag("this test #of something #note or other"); // => "this test #of something Note of sorts or other" // where the note is in the sender's environment. expl = .explode_delimited(string + " ", tag, " "); matches = expl[2]; expl = expl[1]; output = ""; for x in (expl) { if (type(x) == 'integer) { match = (| sender().match_environment(matches[x]) |); if (match) output = (output + (match.namef())) + " "; else output = ((output + tag) + (matches[x])) + " "; } else { output = output + x; } } return substr(output, 1, strlen(output) - 1); . method search_pat arg pat, text, [start_at]; var line, match_result, type; line = 1; type = [@start_at, 'pattern, 'pattern][2]; if (start_at) { line = start_at[1]; start_at = [@start_at, 1, 1][2]; if (type == 'pattern) match_result = match_pattern(pat, substr(text[line], line)); else match_result = match_regexp(pat, substr(text[line], line)); if (match_result != 0) { if (type == 'pattern) { pat = $string.pat_sub(pat, match_result); return [line, (start_at + pat) in substr(text[line], start_at)]; } else { return [line, start_at + ((match_result[1])[1])]; } } line = line + 1; } while (line <= listlen(text)) { if (type == 'pattern) match_result = match_pattern(pat, text[line]); else match_result = match_regexp(pat, text[line]); if (match_result != 0) { if (type == 'pattern) { pat = $string.pat_sub(pat, match_result); return [line, pat in (text[line])]; } else { return [line, (match_result[1])[1]]; } } line = line + 1; } throw(~strnf, "String not found in text."); . method pat_sub arg pat, subs; var wc_idx; // wc_idx == wildcard index while (subs) { wc_idx = "*" in pat; if (wc_idx == 1) pat = (subs[1]) + substr(pat, 2); else if (wc_idx == strlen(pat)) pat = substr(pat, 1, wc_idx - 1) + (subs[1]); else pat = (substr(pat, 1, wc_idx - 1) + (subs[1])) + substr(pat, wc_idx + 1); subs = delete(subs, 1); } return pat; . method is_boolean arg str; if (match_begin("yes", str) || (match_begin("true", str) || (str == "1"))) return 1; else if (match_begin("no", str) || (match_begin("false", str) || (str == "0"))) return 0; else return -1; . parent #7791 object #7792 var 1 dbref 'connection var 1 child_index 0 var 1 fertile 1 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 7791 buffer `[] var 7791 ip "" var 7791 hostname "" var 7791 port 0 var 7791 socket 0 var 7791 active 0 var 1 inited 1 var 7792 daemon 0 var 7792 interface 0 var 7792 receive_internal 0 var 7792 timeout 0 method receive arg line, status; (> .perms(sender(), this(), @$sys.system(), daemon) <); if ((status != 'external) && (!receive_internal)) return; if ((interface.parse_line(line)) == 'disconnect) .close(); . method init_inbound_connection (> .perms(caller(), $root) <); daemon = 0; interface = 0; . method uninit_inbound_connection (> .perms(caller(), $root) <); daemon = 0; interface = 0; . method initialize_connection arg interface_parent, seconds; var addr; (> .perms(sender()) <); // spawn this now, if they want to connect to a permanent interface // the spawned one can do that (such as a user object) addr = .address(); daemon = sender(); interface = interface_parent.spawn(); .add_writer(interface); interface.new_connection(addr); interface.set_manager(interface); timeout = seconds; .set_active(1); . method set_interface_object arg obj; // called by an interface object to change interfaces. (> .perms(sender(), 'this) <); interface = obj; . method close (> pass() <); (| daemon.connection_ending() |); (> .destroy() <); . method init_connection (> .perms(caller(), $root) <); timeout = -1; daemon = 0; interface = 0; . method uninit_connection (> .perms(caller(), $root) <); timeout = -1; daemon = 0; (| interface.connection_going_away() |); . method connect arg [args]; (> pass(@args) <); daemon.connection_starting(); interface.connection_starting(); if (timeout >= 0) (| $scheduler.add_task(timeout, 'timeout) |); . method disconnect (> pass() <); daemon.connection_ending(); . method timeout (> .perms(sender(), 'this) <); if (interface.timeout()) { .send(("Timeout (" + tostr(timeout)) + ")."); .close(); } . method address var addr; // return hostname or ip if (!('parameters in (.is_readable_by(sender())))) throw(~perm, "Sender does not have permission to get parameters."); addr = .hostname(); if (!addr) addr = .ip(); return addr; . method change_interface_object arg obj; var old_interface; // called by an interface object to change interfaces. (> .perms(sender(), interface) <); old_interface = interface; interface = obj; old_interface.connection_going_away(); interface.new_connection(.address()); . parent #1377 object #1139 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1139 var 1 writable [#1139] var 1 readable ['parameters, 'methods, 'code] var 17 prose #[] var 15 verbs 0 var 1 dbref 'event_handler method event arg frob; . method announce_event arg frob; var x; for x in (.environment()) (| x.event(frob) |); . parent #1377 object #15 var 15 verbs #[] var 1 child_index 0 var 1 owners [#936] var 1 fertile 1 var 1 inited 1 var 1 owned [] var 1 manager #15 var 1 writable [#15] var 1 readable ['parameters, 'methods, 'code] var 1 info ["$has_verbs defines all the functionality necessary for an object to have verbs, or methods activated by commands typed by a user object which is not this. Verbs are useful for making certain functionality only available when an object is present, and for allowing different objects to have identicle verbs with different internal meanings (turn alarm to 6am vs. turn safe to 10)."] var 1 dbref 'has_verbs method init_has_verbs if (caller() != $root) throw(~perm, "Caller is not $root."); verbs = #[]; . method uninit_has_verbs var template; if (caller() != $root) throw(~perm, "Caller is not $root."); verbs = 0; for template in (dict_keys(verbs)) $verb_cache.object_undefined_verb(template); . method verb_templates return dict_keys(verbs); . method add_verb arg template, method, remote; var words, pos; if (!(.is_writable_by(sender()))) throw(~perm, "Sender is not an owner."); // Check argument types. if (type(template) != 'string) throw(~type, "Template is not a string."); if (type(method) != 'symbol) throw(~type, "Method obj_name is not a symbol."); if ((remote != 'remote) && (remote != 'noremote)) throw(~type, "Remote specifier is neither 'remote nor 'noremote"); // Make sure there's exactly one "%this" in the template, as a word by // itself. words = explode(template); if (((words[1]) == "%this") || (((words[1]) == "*") || ((words[1]) == "*=*"))) throw(~template, "Template begins with wildcard."); pos = "%this" in words; if ((!pos) || ("%this" in sublist(words, pos + 1))) throw(~template, "Template does not contain exactly one \"%this\"."); // Add the verbs to the dictionary, and notify $verb_cache. verbs = dict_add(verbs, template, [method, remote]); if (remote == 'remote) $verb_cache.del_template(template); . method del_verb arg template; var verb_info; if (!(.is_writable_by(sender()))) throw(~perm, "Sender is not an owner."); catch ~keynf { verb_info = verbs[template]; verbs = dict_del(verbs, template); (| $verb_cache.del_template(template) |); } with handler { throw(~verbnf, ("No verb with template " + tostr(template)) + "."); } . method verb_info disallow_overrides; arg template; var verb_info, anc; if (dict_contains(verbs, template)) return verbs[template]; for anc in (ancestors()) { verb_info = (| anc.local_verb_info(template) |); if (verb_info) return verb_info; } throw(~verbnf, "No verb with template " + template); . method local_verb_info disallow_overrides; arg template; catch ~keynf { return verbs[template]; } with handler { throw(~verbnf, "No verb with template " + template); } . method verbs return verbs; . method all_verbs var p, vrblist, pv; vrblist = #[]; for p in (.ancestors()) { pv = (| p.verbs() |); if (pv) vrblist = $dict.union(vrblist, pv); if (p == definer()) break; } return vrblist; . parent #1377 object #2787 var 1 child_index 0 var 1 fertile 1 var 1 manager #2787 var 1 owned [] var 1 owners [#47] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 1 dbref 'named var 2787 name ['uniq, "Named Object"] var 2787 name_aliases 0 method set_name arg new_name, [args]; var proper; // .set_name(new_name, ['proper|'unique]) (default proper). // ['prop, "Name"] => proper, no indefinite/definite articles. // ['uniq, "Name"] => unique, normal indefinite/definite articles. .perms(sender()); if (type(new_name) != 'string) throw(~type, "New name must be given as a string."); // this will not catch them all, but we can try. if ((" a " in new_name) || (" the " in new_name)) throw(~bad_name, "Do not include articles in a name"); // proper = [@args, 'prop][1]; name = [proper, new_name]; . method name_aliases return name_aliases; . method add_name_alias arg alias; .perms(sender()); name_aliases = [@name_aliases, alias]; . method del_name_alias arg alias; .perms(sender()); name_aliases = setremove(name_aliases, alias); . method init_named var dbref; .perms(caller(), $root); dbref = tostr(dbref); name = ['uniq, tostr(dbref)]; name_aliases = []; . method match_name arg str; return match_begin(.name('none), str); . method name arg [article]; article = [@article, 'indef][1]; if ((name[1]) == 'uniq) { switch (article) { case 'indef: return (($string.a_or_an(name[2])) + " ") + (name[2]); case 'def: return "the " + (name[2]); } } return name[2]; . method match_name_aliases arg str; return str in name_aliases; . method namef arg [args]; if (!args) args = [['name, 'def]]; if ((args[1]) == 'ref) { if (.has_ancestor($named)) args = [['name], " (", ['dbref], ")"]; else args = [['dbref]]; } else if ((args[1]) == 'xref) { if (.has_ancestor($named)) args = [['dbref], " (", ['name], ")"]; else args = [['dbref]]; } return pass(@args); . parent #15 parent #2787 object #17 var 17 prose #[] var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 15 verbs #[["l?ook at %this", ['look_vrb, 'noremote]], ["l?ook %this", ['look_vrb, 'noremote]], ["@examine|examine %this", ['examine_vrb, 'remote]]] var 1 inited 1 var 1 owned [] var 1 manager #17 var 1 writable [#17] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'described var 2787 name ['uniq, "Generic Described Object"] var 2787 name_aliases [] method init_described .perms($root, caller()); prose = #[]; . method description arg actor, [exclude]; var out; // similar to MOO's :look_self() // meant to be changed by descendants, if they so desire to. return [.name('def), @.prose('short)]; . method look_vrb arg vrb, [args]; var actor; actor = sender(); actor.tell(.description(actor, actor)); . method prose arg [type]; type = [@type, 'short][1]; switch (type) { case 'literal: return prose; default: return (| prose[type] |) || ((| prose['short] |) || ["You see nothing special."]); } . method descriptionf arg actor, exclude, [args]; var out, part, type; // lists should be ['methodname, args for method] // symbols are shortcuts, to be defined on descendants. out = []; for part in (args) { type = type(part); switch (type) { case 'list: out = out + ((| .(part[1])(@sublist(part, 2)) |) || []); case 'symbol: // ignore them, they should have been dealt with by now. } } return out; . method set_prose arg ptype, new_prose; // ptype should be either 'short or 'long // prose should be a list of strings .perms(sender(), 'manager); if (type(ptype) != 'symbol) throw(~type, "Prose type can be either 'short or 'long."); if (type(new_prose) != 'list) throw(~type, "Prose must be given as a list of strings."); prose = dict_add(prose, ptype, new_prose); . method examine_vrb arg vrb, [args]; var actor; actor = sender(); actor.tell(.name()); actor.tell(.prose('long)); . parent #2787 object #1179 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 15 verbs 0 var 1 inited 1 var 1179 gender 0 var 17 prose #[] var 1 manager #1179 var 1 writable [#1179] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'gendered var 2787 name ['uniq, "The Generic Gendered Object"] var 2787 name_aliases [] method gender_context return gender.pronoun('po); . method init_gendered .perms($root, caller()); gender = $gender_neuter; . method set_gender arg gendr; .perms(sender(), 'manager); if ((type(gendr) != 'dbref) && (!(gendr in ($gender.children())))) throw(~invgender, ($data.unparse(gendr)) + " is not a valid gender object type."); gender = gendr; . method gender return gender; . parent #1178 parent #1139 parent #17 parent #1179 parent #2786 object #1387 var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owners [#7232, #1387] var 1 writable [#1387, #37] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [#1387, #1388, #4309, #4348, #5205, #7245, #7248, #7261] var 15 verbs #[] var 17 prose #[] var 1 inited 1 var 1179 gender #1182 var 1387 visibility 0 var 1 dbref 'physical var 2787 name ['uniq, "Generic Physical Object"] var 2787 name_aliases [] method set_visibility arg val; .perms(sender(), 'manager); if (!(type(val) == 'integer)) throw(~type, "Visibility must be set as a positive or negative integer."); visibility = val; . method visibility return visibility; . parent #1387 parent #16 object #19 var 19 contents [] var 1 child_index 0 var 1 owners [#936] var 1 fertile 1 var 15 verbs #[] var 1 inited 1 var 23 location #22 var 1 owned [] var 1179 gender #1182 var 17 prose #[] var 1 manager #19 var 1 writable [#19] var 1 readable ['parameters, 'methods, 'code] var 16 commands [] var 16 shortcuts [] var 1 dbref 'location var 2787 name ['uniq, "Generic Container Object"] var 2787 name_aliases [] method init_location .perms(caller(), $root); contents = []; . method uninit_location var obj; .perms(caller(), $root); for obj in (contents) obj.move_to($nowhere); . method contents return contents || []; . method contains arg obj; return (obj in (.contents())) ? 1 | 0; . method put arg obj; obj._move_to(this()); . method take arg obj; if (!(obj in contents)) throw(~objnf, ("Object (" + toliteral(obj)) + ") not in contents."); obj._move_to(sender()); . method will_arrive arg old_place; if (caller() != $located) throw(~perm, "Caller is not $located."); . method will_leave arg place; if (caller() != $located) throw(~perm, "Caller is not $located."); . method did_arrive arg place; if (caller() != $located) throw(~perm, "Caller is not $located."); . method did_leave arg place; if (caller() != $located) throw(~perm, "Caller is not $located."); . method add_sender_to_contents disallow_overrides; if (caller() != $located) throw(~perm, "Caller is not $located."); if ((sender().location()) != this()) throw(~location, "Sorry, but you're not here."); contents = setadd(.contents(), sender()); . method del_sender_from_contents disallow_overrides; if (caller() != $located) throw(~perm, "Caller not an agent of located protocol."); contents = setremove(contents, sender()); . method validate_contents var obj, newcont; if (!(.is_writable_by(sender()))) throw(~perm, "Must be an owner to validate contents"); newcont = []; for obj in (contents) { if (valid(obj) && (obj.has_ancestor($located))) newcont = setadd(newcont, obj); } contents = newcont; . method environment return [this()] + contents; . method add_to_contents disallow_overrides; arg what; if (caller() != $located) throw(~perm, "Caller is not $located."); . method contents_accept_mail return 1; . method realm arg [args]; var loc; loc = ""; if ((| .location() |)) loc = (.location()).realm(); return ((loc + "[") + (.namef())) + "]"; . method realm_name return ""; . method local_verb_templates var obj, out; out = []; for obj in (.contents()) { if (obj.has_ancestor($has_verbs)) out = out + dict_keys(obj.all_verbs()); } return out; . parent #675 parent #15 object #7261 var 1 dbref 'public var 1 child_index 0 var 1 fertile 1 var 1 manager #7232 var 1 owned [] var 1 owners [#7232, #1387, #1388] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 7261 public [] var 15 verbs #[["@public on %this is *", ['public_vrb, 'remote]]] method init_public .perms(caller(), $root); public = ['readable]; . method is_publicly arg what; return what in public; . method set_public arg what; var x, valid; if (sender() != this()) .perms(sender(), 'manager); if (type(what) == 'symbol) { if (what in public) return; what = [@public, what]; } if (type(what) != 'list) throw(~type, toliteral(what) + " is an invalid type."); public = what; . method public return public; . method public_vrb arg vrb, on, this, is, args; var x, syn, p, who, opts; .perms(sender(), 'manager); syn = ((vrb + " on ") + this) + " <+/-[r|w]>"; who = sender(); if (!args) $parse.tell_error(["Must specify either readable or writable.", ("Current Public permissions: " + ($list.to_english(public))) + "."], syn, who); opts = #[["r", [1, 0]], ["w", [0, 0]]]; args = $parse.options(args, opts); opts = args[2]; args = args[1]; if ((!((opt["r"])[1])) && ('readable in public)) .set_public(setremove(public, 'readable)); else if (((opt["r"])[1]) && (!('readable in public))) .set_public(public + ['readable]); if ((!((opt["w"])[1])) && ('writable in public)) .set_public(setremove(public, 'writable)); else if (((opt["w"])[1]) && (!('writable in public))) .set_public(public + ['writable]); sender().tell(("Public perms changed to: " + ($list.to_english(public))) + "."); . parent #19 parent #7261 object #2679 var 1 child_index 88 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#47] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 1179 gender #1182 var 17 prose #[] var 15 verbs #[] var 16 commands [["l?ook", 'look_cmd]] var 16 shortcuts [] var 1 dbref 'place var 2787 name ['uniq, "place"] var 2787 name_aliases [] var 2679 realm 0 var 2679 exits 0 var 2679 coordinates 0 var 7261 public ['readable] method init_place .perms($root, caller()); exits = []; realm = $realm_of_creation.new(); coordinates = #[]; .set_public('location); . method uninit_place var x; .perms($root, caller()); for x in (exits) (| x.destroy() |); (| realm.place_destroyed(this()) |); for x in (.area()) (| x.place_destroyed(this()) |); (| $place_db.place_destroyed() |); . method environment return pass() + exits; . method description arg actor, [exclude]; var output, dark; output = pass(actor, exclude); output = output + (._desc_contents(actor, exclude)); output = output + (._desc_exits(actor, exclude)); return output; . method exits return exits; . method add_exit disallow_overrides; arg coord1, coord2; var exit; // coordinates are not standard x/y, but radial/azimuth .perms($exit, caller()); exit = sender(); (> ._add_exit(exit) <); (> ._add_coordinate(exit, coord1, coord2) <); (> ._add_coordinate(exit.dest(), coord1, coord2) <); . method _add_exit disallow_overrides; arg obj; // use .add_exit() .perms(sender(), 'this); exits = [@exits, obj]; . method _del_exit disallow_overrides; arg obj; // use .del_exit() .perms(sender(), 'this); exits = setremove(exits, obj); . method del_exit disallow_overrides; var exit; exit = sender(); .perms(caller(), $exit); (| ._del_exit(exit) |); (| ._del_coordinate(exit) |); (| ._del_coordinate(exit.dest()) |); . method _add_coordinate disallow_overrides; arg obj, coord1, coord2; .perms(sender(), 'this); // should only be called from inside this object. coordinates = dict_add(coordinates, obj, [coord1, coord2]); . method _del_coordinate disallow_overrides; arg obj; .perms(sender(), 'this); // should only be called from inside this object. coordinates = dict_del(coordinates, obj); . method did_connect if ((.visibility()) >= 0) .announce((sender().namef()) + " has connected.", sender()); . method did_disconnect if ((.visibility()) >= 0) .announce((sender().namef()) + " has disconnected.", sender()); . method look_cmd arg cmd; var actor, text; sender().tell(.description(sender(), sender())); . method realm arg [args]; var tmp, r; return realm; . method announce arg str, [except]; var obj; for obj in (.contents()) { if (!(obj in except)) (| obj.tell(str) |); } . method did_housekeep arg who; var message; // catch ~msgnf { catch any { message = .get_message('housekeeper); } with handler { message = "The housekeeper hauls %N away"; } // this will have to do until we get a correct action setup .announce(strsub(message, "%N", who.namef())); . method set_name arg [args]; var old_name; old_name = .name(); (> pass(@args) <); (| $place_db.room_changed_name(old_name) |); . method set_realm arg frob_class, where; .perms(sender()); if (!(frob_class.has_ancestor($frob_class))) throw(~type, "Realm must be submitted as a frob class object."); realm = frob_class.new([where]); . method examine_vrb arg vrb, [args]; var actor, text; actor = sender(); text = .description(actor, [actor], 'desc_name, 'long_description, '_desc_contents, '_desc_long_exits); actor.tell(text); . method _desc_contents arg actor, dont_show; var users, objects, output, obj, line; // called by .description .perms(sender(), 'this); users = []; objects = []; for obj in (.contents()) { if ((!(obj in dont_show)) || (| !(obj.obvious()) |)) { if (obj.has_ancestor($body)) users = [@users, obj.namef('nactivity)]; else objects = [@objects, obj.namef()]; } } output = []; // we will get these both using @options eventually. if (users) { line = ($list.to_english(users)) + " "; line = (line + ((listlen(users) > 1) ? "are" | "is")) + " here."; output = [@output, line]; } if (objects) { line = "You see "; line = (line + ($list.to_english(objects))) + " here."; output = [@output, line]; } return output; . method _desc_exits arg actor, mode; .perms(sender(), 'this); return .visible_exits_formatted(actor, 'verbose); . method visible_exits var obv, exit; obv = []; for exit in (.exits()) { if ((exit.visibility()) >= (.visibility())) obv = [@obv, exit]; } return obv; . method area var out, x; out = []; for x in (dict_keys(coordinates)) { if (x.has_ancestor($place)) out = out + [x]; } return out; . method realm_name return (((realm.name()) + " [") + (.name())) + "]"; . method will_attach arg type, obj; // callable only from the methods on $exit, so don't worry too much. switch (type) { case 'source: .perms(obj); case 'dest: if ((!(.is_publicly('location))) && (!(| .perms(obj) |))) throw(~perm, ("Place refuses to link with " + (obj.namef('ref))) + "."); } . method visible_exits_formatted arg actor, how; var output, ex, exits, line; exits = .visible_exits(); switch (how) { case 'none: return []; case 'brief: if (!exits) return []; return ["Exits: " + ($list.to_english($list.map(exits, 'namef), "none"))]; case 'average: output = []; for ex in (exits) { line = (ex.namef()) + " ("; line = line + ($list.to_english(ex.name_aliases(), "no aliases")); output = [@output, line]; } return output ? ["Exits: " + ($list.to_english(output))] | []; case 'long: output = []; for ex in (exits) output = [@output, (((" " + (ex.namef())) + " to: ") + ((ex.dest()).namef())) + "."]; return output ? ["Exits: ", @$list.lcolumnize(output, actor.linelen())] | []; case 'verbose: output = []; for ex in (exits) output = [@output, ex.description(actor, 'short)]; return output ? [$list.to_string(@output)] | []; } . method place_destroyed arg place; // announces when a place is destroyed .perms(caller(), $place, $realms_class); (| ._del_coordinate(place) |); . parent #2679 object #247 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 16 commands [] var 16 shortcuts [] var 15 verbs #[] var 19 contents [#5203, #7232] var 1 inited 1 var 1231 name_aliases [] var 1 owned [] var 1179 gender #1182 var 17 prose #[] var 1 manager #247 var 1 writable [#247] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'body_cave var 2787 name ['uniq, "Body Cave"] var 2787 name_aliases [] var 2679 exits [] var 2679 realm <#2717, ['interior]> var 2679 coordinates #[] parent #675 object #1093 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1093 var 1 writable [#1093] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'filters method compress arg input; var e, output; // only goes 1 element deep--sorry, anybody sending anything past that will // be shot. output = []; if (type(input) == 'list) { for e in (input) { if (type(e) == 'list) output = [@output, @e]; else output = [@output, e]; } } else { output = [input]; } return output; . parent #1093 object #1095 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1095 var 1 writable [#1095] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'epic_filter method old_filter arg input; var output, x, z, line; // this filter MUST be first in the filters list.. output = []; input = .compress(input); for z in (input) { line = []; z = ($string.explode_delimited(z, "<", ">"))[1]; for x in (z) { if (type(x) == 'string) line = [@line, x]; } output = [@output, $list.to_string(line, "")]; } return output; . method filter arg what; var tags; $jeff.debug('filter, what); if (type(what) != 'frob) return what; if (!(class(what) in [$ctext])) return what; $jeff.debug('frob); what = what.evaluate(sender()); $jeff.debug(what); return what; . parent #664 parent #15 object #4309 var 1 dbref 'user_data var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owned [] var 1 owners [#7232, #1387, #1388] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [["@user-data * my * is|are *", 'data_is_cmd], ["@user-data *", 'data_cmd]] var 16 shortcuts [] var 1 inited 1 var 4309 valid_settings #[["real name", 'real_name], ["email", 'email], ["address", 'address], ["affiliation", 'affiliation], ["position", 'position], ["location", 'location], ["interests", 'interests], ["plan", 'plan], ["projects", 'projects], ["see also", 'see_also]] var 4309 user_data #[] var 15 verbs #[["finger %this", ['finger_vrb, 'remote]]] method init_user_info .perms(caller(), $root); user_data = #[['real_name, [1, "???"]], ['email, [1, "???"]]]; . method data_on arg data; data = (| user_data[data] |); if (data) { if ((data[1]) || (.is_writable_by(sender()))) return data[2]; return "not public."; } else { return "not set."; } . method set_data arg key, value, public; .perms(sender(), 'this); user_data = dict_add(user_data, key, [public, value]); . method init_user_data .perms(caller(), $root); user_data = #[['real_name, [1, "???"]], ['email, [1, "???"]]]; . method valid_settings return valid_settings; . method data_is_cmd arg com, public, me, what, is, value; var valid, kvalid, tmp; .perms(sender(), 'parser); valid = $user_data.valid_settings(); what = (| valid[what] |); if (!what) { tmp = " [+p|+public|-p|-public] my <setting name> is <value>'"; .tell(("! => Syntax: '" + com) + tmp); .tell("! Where setting name can be any of: "); tmp = $string.wrap_line($list.to_english(dict_keys(valid)), .linelen(), "! "); tmp = replace(tmp, 1, "! " + (tmp[1])); .tell(tmp); return; } if ((!public) || (public in ["+p", "+public"])) public = 1; else if (public in ["-p", "-public"]) public = 0; else $parse.tell_error("Invalid public setting (must be +p, +public, -p or -public)"); .set_data(what, value, public); .tell("Value set."); . method data_cmd arg com, who; var valid, line, user; .perms(sender(), 'parser); // if (!who) user = this(); else user = (| .find_object(who, 'environment, 'user, 'grasp) |); if (!user) { .tell(("! No user found by the name \"" + who) + "\"."); .tell("! To set a value use the syntax:"); .tell(("! '" + com) + " [+p|+public|-p|-public] my <parameter> is|are <value>'"); return; } .tell(("Current personal data settings on " + (user.namef())) + ":"); valid = $user_data.valid_settings(); .tell(user.display_data()); .tell("-=-"); . method display_data arg [dont_display]; var x, valid, line, len, pub, actor, data, lines, output; actor = sender(); len = actor.linelen(); valid = $user_data.valid_settings(); output = []; for x in (valid) { if (!((x[2]) in dont_display)) { data = (| user_data[x[2]] |); if (data) { if ((data[1]) || (.is_writable_by(actor))) line = data[2]; else line = "not public."; } else { continue; } pub = (| (user_data[x[2]])[1] |); pub = ((!pub) && (type(pub) != 'error)) ? "*" | " "; if ((len - 20) < strlen(line)) { output = [@output, (pub + ($string.capitalize(x[1]))) + ":"]; lines = $string.wrap_line(line, len, " "); lines = replace(lines, 1, " " + (lines[1])); output = output + lines; } else { output = output + [(pub + pad(($string.capitalize(x[1])) + ": ", 13)) + line]; } } } return output; . method finger_vrb arg [args]; . parent #675 object #1431 var 1 child_index 7 var 1 fertile 0 var 1 manager #1431 var 1 owners [#47] var 1 writable [#47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'parsers method parse arg user, str, next_parser, [other_parsers]; // Minimum parser routine. return next_parser.parse(user, str, @other_parsers); . parent #1431 object #2321 var 1 child_index 0 var 1 fertile 0 var 1 manager #2321 var 1 owners [#47] var 1 writable [#2321] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'verb_parser method match_verb arg str, user; var templates, template, fields, word, obj, verb_info, i, j, output; // Resort to verb cache. templates = $verb_cache.templates(); output = []; catch ~objnf, ~verbnf { for template in (templates) { fields = match_template(strsub(template, "%this", "*"), str); if (!fields) continue; j = 1; for word in (explode(template)) { if (word == "%this") { obj = user.match_env_nice(fields[j]); verb_info = obj.verb_info(template); if (((verb_info[2]) != 'remote) && (!(user.local_to_environment(obj)))) user.tell("! You cannot do that from here."); else obj.(verb_info[1])(@fields); return; } else if (word == "*=*") { j = j + 2; } else { j = j + 1; } } } } with handler { switch (error()) { case ~verbnf: user.tell("! You can't do that to that object."); default: user.tell("! " + ((traceback()[1])[2])); } return; } . method parse arg user, str, next_parser, [other_parsers]; var templates, template, fields, word, obj, verb_info, i, j, output; // Match verbs on objects. // (this is a rather icky system involving the verb cache, etc.. // I'm planning to redo this completely eventually. // Resort to verb cache. templates = ($verb_cache.templates()) + (user.local_verb_templates()); output = []; catch ~objnf, ~verbnf { for template in (templates) { fields = match_template(strsub(template, "%this", "*"), str); if (!fields) continue; j = 1; for word in (explode(template)) { if (word == "%this") { obj = user.match_env_nice(fields[j]); verb_info = obj.verb_info(template); if (((verb_info[2]) != 'remote) && (!(user.local_to_environment(obj)))) return "You cannot do that from here."; else return [obj, verb_info[1], @fields]; } else if (word == "*=*") { j = j + 2; } else { j = j + 1; } } } } with handler { return "You can't do that to that object."; } return next_parser.parse(user, str, @other_parsers); . parent #3 object #4 var 1 owners [#936] var 1 owned [] var 1 manager #4 var 1 writable [#4] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'true_lock_class method new return <this(), []>; . method try arg lock, obj; return 1; . parent #2 object #1165 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1165 var 1 writable [#1165] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'heap_class method new arg list, [key]; var ret_heap; // returns list as a valid heap sorted on key || 1 key = [@key, 1][1]; if (!list) return <this(), #[['key, key], ['data, []]]>; ret_heap = .new([], key); while (list) { ret_heap = ret_heap.add(list[1]); list = delete(list, 1); } return ret_heap; . method data arg self; return self['data]; . method should_swap arg self, element1, element2; // returns true iff data[element2] should appear earlier in the list to maintain // consistent data structure. // re-define in children of $heap_class to adjust sort order return 0; . method swap arg self, a, b; return <this(), $dict.replace(self, 'data, $list.swap(self['data], a, b))>; . method add arg self, element; var swap, cur_element, element_above; // add element to self // tack it on the end and change self from rep (a dict) to heap_class (a frob) self = <this(), $dict.replace(self, 'data, (self['data]) + [element])>; // loop percolates new element up cur_element = self.length(); element_above = cur_element / 2; swap = 1; while (element_above && swap) { if (self.should_swap(element_above, cur_element)) self = self.swap(element_above, cur_element); else swap = 0; cur_element = element_above; element_above = cur_element / 2; } return self; . method del arg self, element; var data, cur_element, next_element, len; // remove element'th element from self // this method works by pushing element down the heap, swapping it with // the element below it that should be on top (of the two). // self rep changed to frob for swapping self = <this(), self>; // data = self['data]; len = self.length(); if ((element > len) || (element < 1)) throw(~range, "Element index out of range."); cur_element = element; next_element = cur_element * 2; while (next_element < len) { if (self.should_swap(next_element, next_element + 1)) next_element = next_element + 1; self = self.swap(cur_element, next_element); cur_element = next_element; next_element = cur_element * 2; } // if it didn't trickle down to the end... if (cur_element != len) { // swap cur w/ last (so we can delete it) self = self.swap(cur_element, len); // tricle swapped element up next_element = cur_element / 2; while (next_element) { if (self.should_swap(next_element, cur_element)) self = self.swap(next_element, cur_element); else next_element = 0; cur_element = next_element; next_element = cur_element / 2; } } self = self._drop_last(); return self; . method _drop_last arg rep; if (!(rep['data])) throw(~range, "Attempt to kill last element of null heap."); return <this(), $dict.replace(rep, 'data, delete(rep['data], listlen(rep['data])))>; . method element arg self, index; return (self['data])[index]; . method length arg self; return listlen(self['data]); . method heaped arg self; var element; // returns true if data structure is consistent if (!(self['data])) return 1; element = 1; // loop through elements while (1) { if ((!(| .should_swap(self, element, element * 2) |)) && (!(| .should_swap(self, element, (element * 2) + 1) |))) element = element + 1; else return 0; if (element >= ((.length(self)) / 2)) return 1; } . parent #1165 object #1166 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1166 var 1 writable [#1166] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'small_first_heap_class method should_swap arg self, element1, element2; // see $heap_class.should_swap for comments if ((element1 < 1) || ((element2 < 1) || ((element1 > (.length(self))) || (element2 > (.length(self)))))) throw(~range, "Element index out of range."); else return (((self['data])[element1])[self['key]]) > (((self['data])[element2])[self['key]]); . parent #664 object #9399 var 1 dbref 'settings_ui var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [["@set?tings *", 'settings_cmd], ["@add-setting-template|@ast * as * on *", 'add_setting_template_cmd], ["@del-setting-template|@dst * from *", 'del_setting_template_cmd]] var 16 shortcuts [] var 1 inited 1 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 list_settings arg how; var templates, settings, setting_templates, t, x, len, line; (> .perms(sender()) <); len = ((.linelen()) - 2) / 2; switch (how) { case 'all: templates = .all_setting_templates(); settings = .settings(); setting_templates = dict_keys(settings); for x in (templates) { .tell(("Settings available on " + ((x[1]).namef('xref))) + ":"); for t in (x[2]) { switch (t[2]) { case 'boolean: line = " " + pad("[+|-]" + (t[1]), len); case 'integer: line = " " + pad((" " + (t[1])) + "=<integer>", len); case 'string: line = " " + pad((" " + (t[1])) + "=<string>", len); } if (!((t[1]) in setting_templates)) { line = line + " is unset"; } else { switch (t[2]) { case 'boolean: line = (line + " is ") + (((settings[t[1]])[2]) ? "+" | "-"); default: line = (line + " is ") + toliteral((settings[t[1]])[2]); } } .tell(line); } } case 'local: settings = .settings(); if (!settings) return .tell("All of your settings are either off or unset."); .tell("Your settings:"); for x in (settings) { switch ((x[2])[1]) { case 'boolean: line = " +" + (x[1]); default: line = ((" " + (x[1])) + "=") + toliteral((x[2])[2]); } .tell(line); } } .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())); . parent #3 object #6 var 1 owners [#936] var 1 owned [] var 1 manager #6 var 1 writable [#6] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'object_lock method new arg obj; if (type(obj) != 'dbref) throw(~perm, "Argument is not a dbref."); return <this(), [obj]>; . method try arg lock, obj; return (lock[1]) == obj; . method test arg testlist, testee, [args]; var x; for x in (testlist) { if (testee == x) return 1; } return 0; . parent #675 object #40 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 40 pronouns 0 var 40 gender 0 var 40 cgender_name 0 var 40 gender_name 0 var 40 person 0 var 40 has 0 var 40 number 0 var 1 manager #40 var 1 writable [#40] var 1 readable ['parameters, 'methods, 'code] var 40 context [] var 1 dbref 'gender method init_gender .perms($root, caller()); cgender_name = ""; gender_name = ""; // these should be inited by hand, later. pronouns = #[['pr, "itself"], ['pp, "its"], ['po, "it"], ['ps, "it"], ['pq, "its"], ['prc, "Itself"], ['ppc, "Its"], ['poc, "It"], ['psc, "It"], ['pqc, "Its"], ['have, "has"]]; . method pronoun arg pronoun; return pronouns[pronoun]; . method gender return gender; . method set_gender_names arg name, cname; .perms(sender()); cgender_name = cname; gender_name = name; . method set_pronouns arg nmbr, ps, po, pp, pq, pr, psc, poc, ppc, pqc, prc; var x; .perms(sender(), 'manager); pronouns = #[['pr, pr], ['pp, pp], ['po, po], ['ps, ps], ['pq, pq], ['prc, prc], ['ppc, ppc], ['poc, poc], ['psc, psc], ['pqc, pqc]]; number = nmbr; context = [ps, po, pp, pq, pr, psc, poc, ppc, pqc, prc]; . method pronouns return pronouns; . method "name(old)" arg [caps]; caps = [@caps, 'null][1]; switch (caps) { case 'caps: return cgender_name; default: return gender_name; } . method context return context; . parent #40 object #2036 var 1 child_index 0 var 1 fertile 0 var 1 manager #2036 var 1 owners [#2036] var 1 writable [#2036, #47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 40 cgender_name "" var 40 gender_name "" var 40 pronouns #[['pr, "themselves"], ['pp, "their"], ['po, "them"], ['ps, "they"], ['pq, "theirs"], ['prc, "Themselves"], ['ppc, "Their"], ['poc, "Them"], ['psc, "They"], ['pqc, "Theirs"]] var 1 inited 1 var 40 number 2 var 40 context ["themselves", "their", "them", "they", "theirs", "Themselves", "Their", "Them", "They", "Theirs"] var 1 dbref 'gender_plural parent #1170 object #5264 var 1 dbref 'heart var 1 child_index 0 var 1 fertile 0 var 1 manager #5264 var 1 owned [#5264] var 1 owners [#5264] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 5264 heart_failures [] var 5264 hearts [] method pulse var robot, h; // send every robot that has a heart a pulse, if needed. for robot in [1 .. listlen(hearts)] { if ((((hearts[robot])[2]) + ((hearts[robot])[3])) < time()) { .debug("pulsing", hearts[robot]); hearts = replace(hearts, robot, [(hearts[robot])[1], time(), (hearts[robot])[3]]); (| ((hearts[robot])[1]).pulse() |); } } . method add_heartbeat arg [delay]; var p; delay = [@delay, 60][1]; for p in [1 .. listlen(hearts)] { if (((hearts[p])[1]) == sender()) { hearts = replace(hearts, p, [sender(), 0, delay]); return; } } hearts = [@hearts, [sender(), 0, delay]]; . method del_heartbeat var h, pos; h = []; for pos in [1 .. listlen(hearts)] { if (((hearts[pos])[1]) == sender()) { if (pos > 1) h = [@s, sublist(hearts, 1, pos - 1)]; if (pos < listlen(hearts)) h = [@h, sublist(hearts, pos + 1)]; hearts = h; return; } } throw(~objnf, ("Sender (" + tostr(sender())) + ") does not have a heartbeat."); . parent #12 object #7245 var 1 dbref 'data var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owned [] var 1 owners [#7232, #1387, #1388] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 method unparse arg data, [full]; var str, element, association, pos; switch (type(data)) { case 'integer: return tostr(data); case 'string: return toliteral(data); case 'symbol: return toliteral(data); case 'error: return toliteral(data); case 'buffer: return toliteral(data); case 'dbref: if (full) return $object.get_name(data, 'namef, ['xref]); else return $object.get_name(data, 'dbref); case 'list: if (!data) return "[]"; str = "["; for element in (sublist(data, 1, listlen(data) - 1)) { str = str + ($data.unparse(element)); str = str + ", "; } str = str + ($data.unparse(data[listlen(data)])); return str + "]"; case 'dictionary: if (!data) return "#[]"; str = "#["; for association in (data) { str = str + ($data.unparse(association)); str = str + ", "; } return substr(str, 1, strlen(str) - 2) + "]"; case 'frob: return data.unparse(); } . method verify_type arg value, type; var elem, type_elem, ok_flag; // returns true if type(value) is type, or in the case // of lists and dicts it checks the elements // // If type is a list or dict, the elements it contains are possible types for value // for example: .verify_value([['foo], 1],['integer, 'list, ['symbol]]) => 1 // To indicate that you don't care what the elements of a dict or list are, // simply use 'list or 'dictionary. if (type(value) == type) return 1; if ((type(type) in ['dictionary, 'list]) && (type(type) == type(value))) { for elem in (value) { ok_flag = 0; for type_elem in (type) { if (.verify_type(elem, type_elem)) { ok_flag = 1; break; } if (!ok_flag) return 0; } } return 1; } // value is not of type, or values elements are not of @type, or etc return 0; . parent #3 object #7 var 1 owners [#936] var 1 owned [] var 1 manager #7 var 1 writable [#7] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'and_lock_class method new arg lhs, rhs; if ((type(lhs) != 'frob) || (type(rhs) != 'frob)) throw(~perm, "Arguments are not both frobs."); return <this(), [lhs, rhs]>; . method try arg lock, obj; return ((lock[1]).try(obj)) && ((lock[2]).try(obj)); . parent #2679 object #22 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 16 commands [] var 16 shortcuts [] var 15 verbs #[] var 19 contents [] var 1 inited 1 var 1231 name_aliases [] var 1 owned [] var 1179 gender #1182 var 17 prose #[['short, ["A place existing for the soul purpose of doing so, when it wishes be."]]] var 1 manager #22 var 1 writable [#22] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'void var 2787 name ['uniq, "Void"] var 2787 name_aliases [] var 2679 exits [] var 2679 realm <#2717, ['interior]> var 2679 coordinates #[] parent #2485 object #2486 var 1 child_index 0 var 1 fertile 0 var 1 manager #2486 var 1 owners [#936] var 1 writable [#2486] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'true method unparse arg dummy; return "1"; . method test arg [args]; return 1; . parent #1387 object #23 var 23 inited 0 var 23 location #21 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 15 verbs #[] var 1 owned [] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 1 manager #23 var 1 writable [#23] var 1 readable [] var 1 dbref 'located var 2787 name ['uniq, "Generic Located Object"] var 2787 name_aliases [] method init_located .perms($root, caller()); location = $nowhere; location.add_sender_to_contents(); obvious = 1; . method uninit if (caller() != $root) throw(~perm, "Caller is not root."); location.del_sender_from_contents(); location = 0; . method environment return [this()] + setremove(location.environment(), this()); . method match_environment arg str; var thing, matches; if (str == "here") { return location; } else if (str in ["everyone", "everybody", "everything"]) { matches = []; if (str in ["everyone", "everybody"]) { for thing in (setremove((.location()).contents(), this())) { if (thing.has_ancestor($user)) matches = [@matches, thing]; } } else { matches = (.location()).contents(); } if (listlen(matches) > 1) throw(~ambig, "Several matches.", matches); else if (matches) return matches[1]; else throw(~objnf, "No matches."); } else { return (> pass(str) <); } . method location disallow_overrides; return location || $void; . method _move_to disallow_overrides; arg place; var old; if (sender() != this()) throw(~perm, "Use .move_to()"); // Don't do anything if we're already here. if (place == location) return; if (!(place.has_ancestor($location))) throw(~type, "Argument isn't a location."); // Notify involved parties of impending move, allowing them to throw // errors. if (!valid(location)) location = $nowhere; (> .will_move(sender(), place) <); (> location.will_leave(place) <); (> place.will_arrive(location) <); // Set location. old = location; location = place; old.del_sender_from_contents(); place.add_sender_to_contents(); // Notify involved parties of completed move, in reverse order. place.did_arrive(old); old.did_leave(place); .did_move(sender(), old); . method will_move arg mover, place; if ((caller() != definer()) || (sender() != this())) throw(~perm, "Invalid call to protected method."); . method did_move arg mover, old_place; if ((caller() != definer()) || (sender() != this())) throw(~perm, "Invalid call to protected method."); . method realm return realm; . method uninit_located if (caller() != $root) throw(~perm, "Caller is not root."); (.location()).del_sender_from_contents(); . method move_to disallow_overrides; arg place; if (.is_writable_by(sender())) { ._move_to(place); } else { // we will have to get some checking and validation in here. ._move_to(place); } . method match_environment_all arg s; if (s == "here") return [location, @(> pass(@args) <)]; else return (> pass(s) <); . method obvious return obvious; . method set_obvious arg obv; .perms(sender()); obvious = obv; . method realm_name return (.location()).realm_name(); . method local_verb_templates var obj, out; return (.location()).local_verb_templates(); . parent #675 object #790 var 1 child_index 2 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #790 var 1 writable [#790] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'db var 790 database #[] var 1 info ["Nothing more than a dictionary of names and objects."] method init_db .perms(caller(), $root); database = #[]; . method database return database; . method value_changed arg key, new_value; // change the value of a key. (> .remove(key) <); (> .insert(key, new_value) <); . method remove arg key; // remove a key/value from the database //THIS: is breaking the user_db (quick comment fix :) // .perms(sender(), 'writer); database = dict_del(database, key); . method exact_match arg key; var match; // get an exact match of a key, return the value match = (| database[key] |); if (match == ~keynf) throw(~matchnf, "No object by that key exists in the database."); return match; . method match_begin arg key; var matches, entry; // use match_begin of the key, return the value matches = [(| .exact_match(key) |)]; if (!(matches[1])) { matches = []; for entry in (database) { if (match_begin(entry[1], key)) matches = [@matches, entry[2]]; } } if (matches) { if (listlen(matches) == 1) return matches[1]; else throw(~ambig, "More than one object matches that key.", matches); } else { throw(~matchnf, "No entries in the database match that key."); } . method insert arg key, value; // insert a key/value to the database // .perms(sender(), 'writer); database = dict_add(database, key, value); . method uninit_db .perms(caller(), $user); database = 0; . method key_changed arg old_key, new_key; var val; // change the value of a key. val = database[old_key]; .remove(old_key); .insert(new_key, val); . parent #790 object #3775 var 1 dbref 'registry var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#47] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 790 database #[] var 1 inited 1 var 3775 stripped_characters "" var 3775 min_char_len 0 var 3775 max_char_len 0 var 3775 max_word_len 0 var 3775 reserved_names [] var 3775 invalid_names [] method init_registry .perms(caller(), $root); .set_trusted(1); . method uninit_registry .perms(caller(), $root); reserved_names = 0; invalid_names = 0; trusted = 0; stripped_characters = 0; . method set_max_word_len arg value; .perms(sender(), 'manager); if (type(value) != 'integer) throw(~type, "Value is not an integer"); max_word_len = value; . method set_max_char_len arg value; .perms(sender(), 'manager); if (type(value) != 'integer) throw(~type, "Value is not an integer"); max_char_len = value; . method set_min_char_len arg value; .perms(sender(), 'manager); if (type(value) != 'integer) throw(~type, "Value is not an integer"); min_char_len = value; . method set_stripped_characters arg string; .perms(sender(), 'manager); if (type(string) != 'string) throw(~type, "Value is not a string."); stripped_characters = string; . method insert arg name, obj; // registers obj with obj.name // .perms(caller(), 'trusts); if (stripped_characters) name = $string.strip(name, stripped_characters); (> pass(name, obj) <); . method remove arg name; // removes the object from the database. // THIS: is what is broken with guests, should fix it. // .perms(caller(), 'trusts); if (stripped_characters) name = $string.strip(name, stripped_characters); (> pass(name) <); . method database if (!('parameters in (.is_readable_by(sender())))) throw(~perm, "Database is not readable by sender."); return (> pass() <); . method exact_match arg name; // returns a direct match of the name (if there is one) if (!('parameters in (.is_readable_by(sender())))) throw(~perm, "Database is not readable by sender."); if (stripped_characters) name = $string.strip(name, stripped_characters); return (> pass(name) <); . method valid_name arg name; var word, sname; // returns 1 if the name is valid /// if (!('parameters in .is_readable_by(sender()))) // throw(~perm, "Database is not readable by sender."); (> .perms(caller(), 'trusts) <); // check name itself first sname = name; if (stripped_characters) sname = $string.strip(name, stripped_characters); if (max_word_len && (listlen(explode(name)) > max_word_len)) throw(~invname, ("Names can only be " + tostr(max_word_len)) + " words long."); if (min_char_len && (strlen(sname) < min_char_len)) throw(~invname, ("Names must have at least " + tostr(min_char_len)) + " alpha-numeric characters in them"); if (max_char_len && (strlen(name) > max_char_len)) throw(~invname, ("Names can only be " + tostr(max_char_len)) + " characters long."); // see if it already exists if ((| .exact_match(name) |)) { if (!(((.database())[sname]) == sender())) throw(~invname, "Name already exists."); } // check reserved and invalid names for word in (explode(name)) { if (reserved_names && (word in reserved_names)) throw(~invname, ("`" + word) + "' is a reserved name."); if (invalid_names) { for word in (invalid_names) { if (match_pattern(("*" + word) + "*", name)) throw(~invname, ("`" + word) + "' is not allowed as part of a name."); } } } . method match_begin arg name; var matches, obj; // returns a direct match, or partial matches if (stripped_characters) name = $string.strip(name, stripped_characters); return (> pass(name) <); . method stripped_characters return stripped_characters; . method key_changed arg old_name, new_name; // adjusts the database for the new name .perms(caller(), 'trusts); if (stripped_characters) { old_name = $string.strip(old_name, stripped_characters); new_name = $string.strip(new_name, stripped_characters); } (> pass(old_name, new_name) <); . method find arg name; var tmp; if (.stripped_characters()) name = $string.strip(name, .stripped_characters()); if (!name) throw(~namenf, "No matches found."); tmp = (| .exact_match(name) |); if (tmp) return tmp; catch any { tmp = (> .match_begin(name) <); } with handler { switch (error()) { case ~ambig: rethrow(error()); default: throw(~namenf, "No matches found."); } } return tmp; . parent #3 object #9 var 1 owners [#936] var 1 owned [] var 1 manager #9 var 1 writable [#9] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'not_lock_class method new arg lock; if (type(lock) != 'frob) throw(~perm, "Argument is not a lock."); return <this(), [lock]>; . method try arg lock; return !((lock[1]).try(obj)); . parent #23 object #24 var 1 child_index 22 var 1 owners [#936] var 1 fertile 1 var 15 verbs #[["take|get %this", ['take_vrb, 'noremote]], ["drop %this", ['drop_vrb, 'noremote]]] var 23 location #21 var 1 inited 1 var 1 owned [] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 1 manager #24 var 1 writable [#24] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'thing var 2787 name ['uniq, "Generic Thing"] var 2787 name_aliases [] method take_vrb arg verb, this; if ((.location()) == sender()) { sender().tell("You already have it."); } else { sender().tell(("You take " + (.namef())) + "."); (sender().location()).announce((((sender().namef()) + " takes ") + (.namef())) + ".", this(), sender()); if ((.location()) != (sender().location())) (.location()).announce((((sender().namef()) + " takes ") + (.namef())) + ".", this(), sender()); .move_to(sender()); } . method drop_vrb arg verb, this; if ((.location()) != sender()) { sender().tell("You don't have that."); } else { sender().tell(("You drop " + (.namef())) + "."); (sender().location()).announce((((sender().namef()) + " drops ") + (.namef())) + ".", this(), sender()); .move_to(sender().location()); } . parent #675 object #1032 var 1 child_index 4 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1032 text 0 var 1 info [] var 1 manager #1032 var 1 writable [#1032] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'text method init_text if (caller() != $root) throw(~perm, "Caller is not $root."); text = []; . method uninit_text if (caller() != $root) throw(~perm, "Caller is not $root."); text = []; . method text // returns text if ((!(.is_writable_by(sender()))) && (sender() != this())) throw(~perm, "Permission Denied."); return text; . method set_text arg txt; // resets ,text to the list sent if ((!(.is_writable_by(sender()))) && (sender() != this())) throw(~perm, "Permission Denied."); text = txt; . method ins_line arg txt, [loc]; // inserts txt at loc (where loc is an integer) if ((!(.is_writable_by(sender()))) && (sender() != this())) throw(~perm, "Permission Denied."); if (!loc) text = [@text, txt]; else text = (> insert(text, loc, txt) <); . method del_text // deletes all text if ((!(.is_writable_by(sender()))) && (sender() != this())) throw(~perm, "Permission Denied."); text = []; . method del_line arg linestr; // deletes "line" where line is the actual line to delete if ((!(.is_writable_by(sender()))) && (sender() != this())) throw(~perm, "Permission Denied."); text = setremove(text, line); . method del_nline arg nline; // deletes nline where nline is an integer reference to a list location if ((!(.is_writable_by(sender()))) && (sender() != this())) throw(~perm, "Permission Denied."); text = (> delete(text, nline) <); . method ins_lines arg lines, loc; var line; // inserts txt at loc (where loc is an integer) if ((!(.is_writable_by(sender()))) && (sender() != this())) throw(~perm, "Permission Denied."); if (type(lines) != 'list) throw(~type, "Lines should be passed as a list of strings."); for line in (lines) { text = (> insert(text, loc, line) <); loc = loc + 1; } . parent #24 parent #1032 parent #7261 object #7248 var 1 dbref 'note var 1 child_index 11 var 1 fertile 1 var 1 manager #7232 var 1 owned [] var 1 owners [#7232, #1387, #1388] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1032 text [] var 1 inited 1 var 23 location #21 var 23 obvious 1 var 1178 messages #[] var 17 prose #[] var 15 verbs #[["erase %this", ['erase_vrb, 'remote]], ["read|nread %this", ['read_vrb, 'remote]], ["write on %this", ['write_vrb, 'remote]], ["write at * on %this", ['write_at_vrb, 'remote]], ["write * on %this", ['write_str_vrb, 'remote]], ["copy from %this to *", ['copy_vrb, 'remote]], ["erase * on|from %this", ['erase_on_vrb, 'remote]]] var 1179 gender #1182 var 2787 name ['uniq, "Generic Note"] var 2787 name_aliases ["note"] var 7248 seperator 0 var 7261 public [] var 1 info ["Generic Note", "============", "", "For basic editing and saving of text.", "", "Descendant of $text", "", "Commands:", "", " \"erase * on %this\" rmt 'erase_on_vrb", " \"erase %this\" rmt 'erase_vrb", " \"read|nread %this\" rmt 'read_vrb", " \"write on %this\" rmt 'write_vrb", " \"write at * on %this\" rmt 'write_at_vrb", " \"write * on %this\" rmt 'write_str_vrb", " \"copy from %this to *\" rmt 'copy_vrb", "", "erase", "-----", "", "Erases all or part of the text. \"erase %this\" and \"erase all on %this\" erases all text from the note. \"erase <line(s)> on %this\" erases a line or lines from the note, example: \"erase 2-5 on %this\".", "", "read|nread", "----------", "", "Read the text. \"nread\" will read the text and prepend each line with it's relative number.", "", "write", "-----", "", "Write on the note using this command. \"write on %this\" will accept text after the command line and append it to the end. \"write <line> on %this\" will add the line to the end of the note. \"write at <line> on %this\" will accept text after the command line and place it in the text beginning at <line>.", "", "copy", "----", "", "Used to copy the text from the note to either another descendant of $note or if a method is specified it sends to that method instead.", "", "Maintenance", "===========", "", "As an owner of the note object you can set it as publicly writable or readable. The Note is a child of the generic public object, so you can do this by using the \"@public\" command (Syntax: `@public on note <+|-[w?ritable|r?eadable]>`). Writers following the system permissions scheme are also allowed to write on the note.", "", "The seperator can be changed using eval on the .set_seperator() method. This is not a command as most people don't change it."] method read_vrb arg vrb, [args]; var who, text, prose; who = sender(); if ((!(.is_publicly('readable))) && (!(.trusts(who)))) return who.tell((.name('def)) + " is not publicly readable!"); who.tell(.name('def)); prose = .prose('literal); if (prose) who.tell((| prose['short] |) || []); who.tell(.seperator()); text = .text(); if ((vrb == "nread") && text) text = $list.numbered_text(text); who.tell(text ? text | ["", "(nothing)", ""]); who.tell(.seperator()); who.tell(("You finish reading " + (.name('def))) + "."); . method write_vrb arg write, [args]; var who, line; who = sender(); if ((!(.is_publicly('writable))) && (!(.is_writable_by(who)))) return who.tell((.namef()) + " is not publicly writable!"); // because I'm odd lets do this all 1 one command. if (listlen(args) == 2) { line = "Now writing on " + (.name('def)); line = line + ", enter \".\" to finish and \"@abort\" to abort."; who.tell(line); who.read('add_text, sender()); } else { args = explode(args[1]); who.debug(args); } . method erase_on_vrb arg erase, str, prep, this; var line, nline, who, len, oldline; who = sender(); if ((!(.is_publicly('writable))) && (!(.is_writable_by(who)))) return who.tell((.namef()) + " is not publicly writable!"); if (!str) return who.tell("You must erase either a line, line number, or all"); catch any { if (match_begin("all", str)) { .del_text(); // if erase is null, this method was called by an editor if (erase) who.tell(("All text cleared from " + (.name('def))) + "."); } else { if (listlen(explode(str)) > 1) nline = toint(explode(str)[2]); else nline = toint(str); oldline = (.text())[nline]; .del_nline(nline); line = ("Line " + tostr(nline)) + " (\""; len = (who.linelen()) - (25 + strlen(.name('def))); line = line + ($string.chop(oldline, len)); line = (line + "\") erased from ") + (.name('def)); who.tell(line); } } with handler { switch (error()) { case ~range: who.tell("There are not that many lines in the text."); default: who.tell("Oops: " + ((traceback()[1])[2])); } } . method erase_vrb arg erase, this; var line, nline, len; if ((!(.is_publicly('writable))) && (!(.is_writable_by(sender())))) return sender().tell((.namef()) + " is not publicly writable!"); .del_text(); // if erase is null, this method was called by an editor originally. if (erase) sender().tell(("All text cleared from " + (.name('def))) + "."); . method add_text arg ntext, who, [args]; // called by .read() // if at they should be an int defining where to insert. if ((!(.is_publicly('writable))) && (!(.is_writable_by(who)))) throw(~perm, "Permission Denied."); if (ntext) { if (args) { if (!(| .ins_lines(ntext, args[1]) |)) who.tell(("There are not that many lines in " + (.name('ref))) + "."); } else { .set_text((.text()) + ntext); } who.tell(((("Line" + ((listlen(ntext) == 1) ? "" | "s")) + " added to ") + (.name('def))) + "."); } else { who.tell("Text not added."); } . method seperator return (type(seperator) == 'string) ? seperator | "---"; . method write_str_vrb arg write, str, prep, this; var who, line; who = sender(); if ((!(.is_publicly('writable))) && (!(.is_writable_by(who)))) return who.tell((.namef()) + " is not publicly writable!"); if (!str) return .tell(("Nothing to write on " + (.name('def))) + "!"); .add_text([str], sender()); . method write_at_vrb arg write, at, str, prep, this; var who, line, lines, syn; who = sender(); if ((!(.is_publicly('writable))) && (!(.is_writable_by(who)))) return who.tell((.namef()) + " is not publicly writable!"); syn = ((("`" + write) + " at [line] <line number> on ") + this) + "`"; str = explode(str); if ((str[1]) == "line") str = delete(str, 1); line = $string.is_numeric(str[1]); if (!at) $parse.tell_error(("Unknown line \"" + (str[1])) + "\".", syn, who); lines = listlen(.text()); if (line > (lines + 1)) $parse.tell_error(("There are only " + tostr(lines)) + " lines!", syn, who); str = "Now writing on " + (.name('def)); str = str + ", enter \".\" to finish and \"@abort\" to abort."; who.tell(str); who.read('add_text, sender(), line); . method copy_vrb arg com, from, this, prep, where; var obj, what; // this method is outdated, needs to be rewritten. // it probably doesn't even work. if ((!(.is_writable_by(sender()))) && (!(.is_publicly_readable()))) return sender().tell(("You cannot read the text on " + (.namef('ref))) + "."); if ("." in where) { where = $parse.reference(where); what = 1; } else { where = $parse.reference(where, ","); } obj = sender().match_env_nice(where[1]); if (!(obj.is_writable_by(sender()))) return .tell(("! " + (obj.namef('ref))) + " is not owned by you."); if ((obj.has_ancestor($note)) && (!(where[2]))) obj.add_text(text, sender()); // they want a method ref if (where[2]) { catch any { where = tosym(where[2]); if (what) { obj.(where)(text, sender()); sender().tell(((("Text copied to " + ($data.unparse(obj))) + ".") + tostr(where)) + "()."); } else { if (!(where in (obj.parameters()))) return .tell(("! parameter '" + tostr(where)) + " not found"); obj.eval([(tostr(where) + " = ") + ($data.unparse(.text()))]); } } with handler { $brandon.tell_traceback(traceback()); $parse.tell_error((traceback()[1])[2], ("`" + com) + " <obj>[.,<destination]`", sender()); } } sender().tell("Text copied from " + (.namef())); . method init_note .perms(caller(), $root); .set_readable(['methods, 'code]); . method init_for_core .perms(caller(), $sys); . method set_seperator arg newsep; .perms(sender(), 'manager); seperator = newsep; . parent #7248 object #2250 var 1 child_index 2 var 1 fertile 1 var 1 manager #2250 var 1 owners [#936] var 1 writable [#2250] var 1 readable ['methods, 'code] var 1 trusted [] var 1 owned [] var 15 verbs #[["read * on %this", ['read_cmd, 'remote]]] var 17 prose #[['short, ["the place that Ye administrators should be logging somewhat impacting changes that others would like to know about."]]] var 1179 gender #1182 var 23 location #21 var 23 obvious 1 var 1 inited 1 var 1 dbref 'log var 2787 name ['uniq, "Generic Log"] var 2787 name_aliases ["log", "changes", "log"] var 1032 text ["9-28-94/22:33:17> foo"] var 7261 public ['readable] method read_cmd arg [args]; var loglen, text; if (0) { // later on i'll adjust this so you can 'read from line 12 on log' return; } else { text = .text(); loglen = listlen(text); sender().tell(["---", (((((.namef()) + ", entries ") + tostr(loglen - 10)) + " to ") + tostr(loglen)) + " (last 10 lines).", "---"]); sender().tell(sublist(text, loglen - 10)); sender().tell("---"); } . method log arg line; .perms(caller(), 'trusts); .ins_line((($time.time_stamp()) + "> ") + line); . parent #2250 object #8598 var 1 dbref 'http_log var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [#8019, #7969] var 1 readable ['methods, 'code] var 15 verbs #[] var 7261 public ['readable] var 1032 text ["11-10-94/23:26:47> 129.123.1.155 \"GET /bin/list_method?$root.generate_html() HTTP/1.0\" Mozilla/0.9 beta (X11; OSF1 V2.0 alpha)", "11-11-94/02:57:08> topaz.cm.cf.ac.uk \"GET / HTTP/1.0\" Mozilla/0.9 beta (X11; SunOS 4.1.3 sun4c)", "11-11-94/11:51:04> millville.declab.usu.edu \"GET / HTTP/1.0\" NCSA Mosaic for the X Window System/2.5b2 libwww/2.12 modified", "11-11-94/11:51:23> millville.declab.usu.edu \"GET /history.html HTTP/1.0\" NCSA Mosaic for the X Window System/2.5b2 libwww/2.12 modified", "11-11-94/11:51:41> millville.declab.usu.edu \"GET /current.html HTTP/1.0\" NCSA Mosaic for the X Window System/2.5b2 libwww/2.12 modified", "11-11-94/14:13:16> bolero.rahul.net \"GET /VESP.html HTTP/1.0\" Lynx/2.3 BETA libwww/2.14", "11-11-94/14:13:27> avon.declab.usu.edu \"GET /VESP.html HTTP/1.0\" Lynx/2.3 BETA libwww/2.14", "11-11-94/14:18:55> avon.declab.usu.edu \"GET /VESP.html HTTP/1.0\" Lynx/2.3 BETA libwww/2.14"] var 2787 name ['prop, "HTTP Log"] var 2787 name_aliases [] var 1179 gender #1182 var 17 prose #[] var 1178 messages #[] var 23 location #21 var 23 obvious 1 var 1 inited 1 parent #664 object #9291 var 1 dbref 'web_ui var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [] var 16 shortcuts [] var 1 inited 1 var 9291 http_file_root 0 method http_request arg method, path; var page; if (http_file_root) { page = http_file_root.find_file([http_file_root.filename(), @path]); if (page) return page.retrieve_html(); } return 0; . method set_http_file_root arg obj; (> .perms(sender(), 'manager) <); http_file_root = obj; . method http_file_root return http_file_root; . parent #1431 object #2622 var 1 child_index 0 var 1 fertile 0 var 1 manager #2622 var 1 owned [#2622] var 1 owners [#2622] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 1 dbref 'null_parser method parse arg user, str, [anything_else]; var i; for i in [1 .. strlen(str)] { if ((str[i]) != " ") return 'failed; } return 'ok; . parent #1170 object #9153 var 1 dbref 'network var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 9153 valid_slate_callers [#4707] method valid_slate_callers return valid_slate_callers; . method add_slate_caller arg obj; (> .perms(sender(), 'manager) <); valid_slate_callers = setadd(valid_slate_callers, obj); . method del_slate_caller arg obj; (> .perms(sender(), 'manager) <); valid_slate_callers = setremove(valid_slate_callers, obj); . parent #24 parent #19 object #25 var 1 child_index 0 var 1 owners [#936] var 1 fertile 1 var 15 verbs #[] var 19 contents [] var 23 location #21 var 1 inited 1 var 1 owned [] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 1 manager #25 var 1 writable [#25] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'located_location var 2787 name ['uniq, "Generic Located Location"] var 2787 name_aliases [] method environment return pass() + (.contents()); . method local_verb_templates var obj, out; // get redundant so we don't hit an endless loop out = []; for obj in (.contents()) { if (obj.has_ancestor($has_verbs)) out = out + dict_keys(obj.all_verbs()); } return pass() + out; . parent #25 object #28 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 15 verbs #[] var 19 contents [] var 23 location #21 var 1 inited 1 var 1 owned [] var 28 body_parts #[] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 1 manager #28 var 1 writable [#28] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'body var 2787 name ['uniq, "Generic Body"] var 2787 name_aliases [] method tell // . method set_body_part arg part, frob, param; if (sender().has_ancestor($wearable_class)) throw(~perm, "Sender must be $wearable_class."); body_parts = dict_add(body_parts, frob.new(part, param)); . method init_body if (caller() != $root) throw(~perm, "Sender is not $root"); body_parts = #[]; . method body_parts return body_parts; . method namef arg [args]; if (!args) args = [['name]]; if (((args[1]) == 'nactivity) || ((args[1]) == 'titled)) args = sublist(args, 2); return pass(@args); . parent #664 object #86 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 16 commands [["wh?isper * to *", 'whisper_cmd], ["@register-ch?annel|@reg-ch?annel *", 'register_channel_cmd], ["@delete-ch?annel|@del-ch?annel *", 'delete_channel_cmd], ["say *", 'say_cmd], ["to * say *", 'say_to_cmd], ["@paste *", 'paste_cmd], ["page * with *", 'page_cmd], ["emote *", 'emote_cmd], ["strip *", 'strip_cmd], ["@tuned|@ch?annels *", 'channels_cmd], ["repeat *", 'repeat_cmd], ["@tune in|out *", 'tune_channel_cmd], ["on * say *", 'on_subj_cmd], ["vowel?ize *", 'late_vowels_cmd], ["epage * with *", 'page_emote_cmd]] var 16 shortcuts [["|*", '_interact, ["|", 1]], ["<*", '_interact, ["<", 1]], [">*", '_interact, [">", 1]], ["[*", '_interact, ["[", 1]], ["]*", 'right_bracket_cmd, [1]], ["think *", 'think_cmd, [1]], ["%*", 'think_cmd, [1]], ["#*", 'channel_cmd, ["#", 1]], ["\"*", 'say_cmd, ["", 1]], [":*", 'emote_cmd, ["", 1]], [")* *", 'on_subj_cmd, ["on", 1, "say", 2]], ["!*", 'polite_spoof_cmd, [1]], ["''*", 'say_to_cmd, ["to", "", "say", 1]], ["'* *", 'say_to_cmd, ["to", 1, "say", 2]], ["--*", 'page_cmd, ["page", "", "with", 1]], ["-* *", 'page_cmd, ["page", 1, "with", 2]], ["++*", 'page_emote_cmd, ["epage", "", "with", 1]], ["+* *", 'page_emote_cmd, ["epage", 1, "with", 2]]] var 1 inited 1 var 86 stage #[[">", " -> "], ["<", " <- "], ["[", " ["], ["|", " | "]] var 86 last_interacted_with 0 var 1 owned [] var 1 manager #86 var 1 writable [#86] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'interaction var 1 info [" ] [Lynx text] | Lynx | text", " [ Lynx [text]: < Lynx <- text", " ) (Lynx text) > Lynx -> text", " ( Lynx (text): ! text -- Lynx", " % Lynx . o O ( text ) \" Lynx says, \"text\"", " ' Lynx to who, \"text\" '' Lynx [to who]: text", " ` Lynx [to who]: text `` Lynx [to who]: text", " - Lynx pages: text -- Lynx pages: text", " + (from...) Lynx text ++ (from...) Lynx text", " , Lynx jumps, \"text\" ,, Lynx jumps, \"text\"", " : Lynx text :: Lynxtext", " . Lynx text (pose) ; ;eval", " # <Channel - Lynx> text", "Unused: ~ $ & * =", "Dont use: ?"] method page_cmd arg com, who, prep, message; var user, recipient, targets; .perms(sender(), 'parser); who = $string.explode_english_list(who); if (!who) { if (last_interacted_with) who = last_interacted_with[2]; else $parse.tell_error("You must specify somebody or something to speak to."); } targets = who; for recipient in (who) { if (type(recipient) == 'dbref) { user = recipient; } else { user = (| $user_db.match_begin(recipient) |); if (!user) user = (| .match_environment(recipient) |); } if (user && ((user.has_ancestor($user)) && (user.connected()))) { user.tell(((.namef()) + " pages: ") + message); who = replace(who, recipient in who, user.namef()); targets = replace(targets, recipient in targets, user); } else { .tell(("! " + ($data.unparse(recipient))) + " is either not connected, not a user, or misspelled."); who = setremove(who, recipient); targets = setremove(targets, recipient); } } if (targets) { last_interacted_with = [time(), targets]; .tell(((("You page \"" + message) + "\" to ") + ($list.to_english(who, 'namef))) + "."); } . method wall_cmd arg what; .perms(sender(), 'parser); ._interact("|", what); . method right_bracket_cmd arg what; var space; .perms(sender(), 'parser); space = " "; if (what && (substr(what, 1, 1) == "]")) { what = substr(what, 2); space = ""; } (.location()).announce(((("[" + (.namef())) + space) + what) + "]"); . method polite_spoof_cmd arg what; var name; .perms(sender(), 'parser); // Polite spoof: Send what unmarred if it contains " "+.namef()+" ", // otherwise, tack on " -- "+.namef() name = .namef(); if (!(((name + " ") in what) || ((" " + name) in what))) what = (what + " -- ") + name; (.location()).announce(what); . method say_to_cmd arg com, who, prep, msg; var thing, x, recipient, tmp, targets, errargs; .perms(sender(), 'parser); who = $string.explode_english_list(who); if (!who) { if (last_interacted_with) who = last_interacted_with[2]; else $parse.tell_error("You must specify somebody or something to speak to."); } targets = who; for x in [1 .. listlen(who)] { recipient = who[x]; if (type(recipient) == 'dbref) { thing = recipient; } else { catch ~ambig { thing = .match_env_nice(recipient); } with handler { eargs = (traceback[1])[3]; tmp = $list.map(errags, 'namef); who = (sublist(who, 1, x - 1) + tmp) + sublist(who, x + 1); targets = (sublist(who, 1, x - 1) + errargs) + sublist(who, x + 1); } } if (thing) { who = replace(who, x, thing.namef()); targets = replace(targets, recipient in targets, thing); } } last_interacted_with = [time(), targets]; (.location()).announce(((((.namef()) + " [to ") + ($list.to_english(who))) + "]: ") + msg); . method whisper_cmd arg com, what, prep, who; var loc; .perms(sender(), 'parser); who = .match_env_nice(who); loc = .location(); if ((who.location()) != loc) { .tell("You must be in the same room as a person, to whisper to them."); return; } who.tell((((.namef()) + " whispers, \"") + what) + "\""); .tell(((("You whisper, \"" + what) + "\" to ") + (who.namef())) + "."); loc.announce((((.namef()) + " whispers to ") + (who.namef())) + ".", who, this()); . method wiz_cmd arg what; if (sender() != this()) throw(~perm, "Sender not this."); $comm_tuner.channel_announce('wiz, what); . method _interact arg verb, what; var stage; .perms(sender(), 'parser); stage = $interaction.get_stage(); // echo .namef()+stage[verb]+what to the room if (verb in dict_keys(stage)) (.location()).announce(((.namef()) + (stage[verb])) + what); else throw(~unknownverb, ("Unknown verb '" + verb) + "'"); . method get_stage return stage; . method think_cmd arg what; .perms(sender(), 'parser); (.location()).announce((((.namef()) + " . o O ( ") + what) + " )"); . method channel_cmd arg com, what; var channel, text, syntax, sep_loc; syntax = "`#<channel> <text>'"; if (sender() != this()) throw(~perm, "Sender not this."); catch any { sep_loc = " " in what; channel = $channels.match_channel(substr(what, 1, sep_loc - 1)); if (!channel) $parse.tell_error("That channel does not exist.", syntax); if (listlen(channel) > 1) $parse.tell_error(("Which channel? That could refer to any of these: " + ($data.unparse(channel))) + ".", syntax); channel = channel[1]; text = substr(what, sep_loc + 1); $channels.announce(channel, text); } with handler { switch (error()) { case ~range: $parse.tell_error("You must specify some text to send", syntax); default: $parse.tell_error((traceback()[1])[2], syntax); } } . method tune_channel_cmd arg com, inout, channel; var syn; .perms(sender(), 'parser); syn = ("\"" + com) + " '<channel>\""; catch any { switch (inout) { case "in": channel = $channels.validate_channel(channel); $channels.tune_in(channel); case "out": channel = $channels.validate_channel(channel); $channels.tune_out(channel); default: $parse.tell_error("You must tune a channel \"in\", or \"out\".", syn); } } with handler { $parse.tell_error((traceback()[1])[2], ("`" + com) + " <channel>'"); } .tell(((("Channel '" + tostr(channel)) + " tuned ") + inout) + "."); . method channels_cmd arg com, who; .perms(sender(), 'parser); if (!who) who = this(); else who = .match_env_nice(who); .tell("Communication Channels:"); .tell($list.lcolumnize(who.get_channels(), .linelen())); . method register_channel_cmd arg com, what; var syn, name, tunable, senders; if (sender() != this()) throw(~perm, "Sender is not this"); syn = [("Syntax: `" + com) + " <name> [<tunable> <senders>]'", "<tunable> and <senders> can be either 1, 0, or a list of users"]; what = explode(what); name = [@what, "BAD NAME"][1]; tunable = [@what, 1, 1][2]; senders = [@what, 1, 1, 1][3]; catch any { $channels.new_channel(name, tunable, senders, sender(), [sender()]); } with handler { $parse.tell_error(syn + [(traceback()[1])[2]]); } .tell(("New channel registered with the name `" + tostr(name)) + "'."); . method delete_channel_cmd arg com, name; var syn; if (sender() != this()) throw(~perm, "Sender is not this"); syn = ("`" + com) + " <name>'"; catch any { $channels.del_channel($channels.validate_channel(name)); } with handler { $parse.tell_error((traceback()[1])[2], syn); } .tell("Channel deleted"); . method emote_cmd arg com, what; if (what && ((what[1]) == ":")) (.location()).announce((.namef()) + ($string.match_sub_tag(substr(what, 2), "^"))); else (.location()).announce(((.namef()) + " ") + ($string.match_sub_tag(what, "^"))); . method late_vowels_cmd arg what; var output, letter, index; if (sender() != this()) throw(~perm, "Sender not this."); output = ["", ""]; while (what) { letter = what[1]; what = substr(what, 2); if (letter in ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"]) output = [output[1], (output[2]) + letter]; else if (letter != " ") output = [(output[1]) + letter, output[2]]; else output = [(output[1]) + letter, (output[2]) + letter]; } (.location()).announce(((.namef()) + " ") + (output[1])); $scheduler.add_task(1, 'emote_cmd, "", output[2]); . method say_cmd arg say, what; var type, how, idx; .perms(sender(), 'parser); // .location().announce(pad(.name(), -9) + "->ALL " + what); // return; idx = strlen(what); if (what) { switch (what[idx]) { case "!": how = "exclaim"; case "?": how = "ask"; case ")": if (((what[idx - 1]) == ":") || ((what[idx - 1]) == "8")) how = "grin"; else how = "say"; default: how = "say"; } } else { how = "say"; } (.location()).announce((((((.name()) + " ") + how) + "s, \"") + what) + "\""); . method pose_cmd arg dummy1, str; var actor; actor = sender(); if (str && ((str[1]) == ":")) (.location()).announce((actor.namef()) + substr(str, 2)); else (.location()).announce(((actor.namef()) + " ") + str); . method paste_cmd arg com, [who]; var obj; .perms(sender(), 'parser); who = [@who, 0][1]; if (who) { who = $list.to_string(sublist(explode(who), 2)); obj = (| .find_object(who, 'environment, 'environment, 'grasp) |); if (!obj) $parse.tell_error(("No user found by the name \"" + who) + "\".", "Syntax: '@paste [to <user>]'"); } .tell("Enter text to paste, terminated by \".\" on a line by itself. (Or \"@abort\" by itself)"); .read('paste_done, obj); . method paste_done arg text, who; var padlen; if (sender() != this()) throw(~perm, "Sender not this."); padlen = 79; text = [$string.center((" " + (.namef())) + " (@paste's) ", padlen, "-"), @text, $string.center(" + Finis + ", padlen, "-")]; if (who) { who.tell(text); .tell(("Text pasted to " + (who.namef())) + "."); } else { (.location()).announce(text); } . method strip_cmd arg com, str; str = ((.namef()) + " ") + str; (.location()).announce($string.strip(str, str[random(strlen(str))])); . method get_channels var ch, chs, entry, new_chs, len, public, subscribed; .perms(sender()); chs = $channels.channels(); new_chs = []; public = $channels.all_tuners(); // pick a random dictionary to get the name list from len = $list.element_maxlength(chs); for ch in (chs) { subscribed = $channels.listeners(ch); entry = ((this() in subscribed) ? "+" | "") + tostr(ch); entry = pad(entry, -(len + 2)); entry = entry + (((public[ch]) == 1) ? " - Public " | " - Private"); new_chs = [@new_chs, entry]; } return new_chs; . method repeat_cmd arg com, [args]; var syntax, x, times, line, out, repeat, other; syntax = ("`" + com) + " [+times|+t=<times>] <what>'"; args = explode(args ? args[1] | ""); if (!args) $parse.tell_error("You must specify something to repeat antisocially.", syntax); if (match_begin(args[1], "+t")) { x = (| explode(args[1], "=")[2] |); if (!x) $parse.tell_error("You must define repeat times as +times=* to something.", syntax); times = toint(x); args = sublist(args, 2); if (!args) $parse.tell_error("You must specify something to repeat antisocially.", syntax); } if (!times) times = 3; repeat = args[1]; other = (| sublist(args, 2) |) || []; // line = ""; for x in [1 .. times] line = line + repeat; args = sublist(args, 2); // .emote_cmd("emote", $list.to_string([line] + other)); . method page_emote_cmd arg com, who, prep, message; var user, recipient, targets, name; .perms(sender(), 'parser); who = $string.explode_english_list(who); if (!who) { if (last_interacted_with) who = last_interacted_with[2]; else $parse.tell_error("You must specify somebody or something to speak to."); } targets = who; name = (.namef()) + " "; for recipient in (who) { if (type(recipient) == 'dbref) { user = recipient; } else { user = (| $user_db.match_begin(recipient) |); if (!user) user = (| .match_environment(recipient) |); } if (user && ((user.has_ancestor($user)) && (user.connected()))) { user.tell(((("[from " + ((.location()).namef())) + "] ") + name) + message); who = replace(who, recipient in who, user.namef()); targets = replace(targets, recipient in targets, user); } else { .tell(("! " + ($data.unparse(recipient))) + " is either not connected, not a user, or misspelled."); who = setremove(who, recipient); targets = setremove(targets, recipient); } } if (targets) { last_interacted_with = [time(), targets]; .tell(("You epage " + ($list.to_english(who, 'namef))) + "."); } . method on_subj_cmd arg com, subj, says, what; .perms(sender(), 'parser); (.location()).announce(((((.namef()) + " (on ") + subj) + "): ") + what); . parent #1377 object #2337 var 1 child_index 0 var 1 fertile 1 var 1 manager #2337 var 1 owners [#47] var 1 writable [#47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 2337 receiving 0 var 2337 input 0 var 1 dbref 'input method finish_receiving var oreceiving, oinput; // called by $input_parser.parse when one is finished. .perms(sender(), 'parser); // we have to reset the parameter before we run it's values. oreceiving = receiving; oinput = input; .reset_input(); (oreceiving[2]).(oreceiving[3])(oinput, @sublist(oreceiving, 4)); . method start_receiving arg lines, obj, method, [args]; // called by this().read() or this().read_line() .perms(sender(), 'this); receiving = [lines, obj, method, @args]; input = []; .add_parser($input_parser, 'first); . method reset_input // resets values, for aborting or other emergency reset. .perms(sender(), 'parser); receiving = 0; input = 0; .del_parser($input_parser); . method new_line arg line; // called by $input_parser.parse with a new string to be added. .perms(sender(), 'parser); input = [@input, line]; . method lines // returns how many lines the user wishes to read. return receiving[1]; . method read arg method, [args]; // read input lines from the user. // returns sender().method(["input", "lines"], @args); if (receiving) throw(~wait, "User is currently receiving input."); if (type(method) != 'symbol) throw(~type, "Method reference must be given as a symbol."); // looks ok. .start_receiving('terminated, sender(), method, @args); . method prompt arg prompt, method, [args]; .read_line(method, @args); // .tell(prompt); .non_terminated_tell(prompt); . method read_line arg method, [args]; // read input lines from the user. // returns sender().method(["input", "lines"], @args); if (receiving) throw(~wait, "User is currently receiving input."); if (type(method) != 'symbol) throw(~type, "Method reference must be given as a symbol."); // looks ok. .start_receiving('one, sender(), method, @args); . parent #664 object #922 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 16 commands [] var 16 shortcuts [] var 1 inited 1 var 922 command_aliases [] var 1 manager #922 var 1 writable [#922] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'command_aliases method init_command_aliases if (caller() != $root) throw(~perm, "Caller is not $root."); command_aliases = []; . method uninit_command_aliases if (caller() != $root) throw(~perm, "Caller is not $root."); command_aliases = []; . method command_aliases return command_aliases; . method all_command_aliases var user, aliases, userc; // Collect complete command alias list from ancestors. aliases = []; for user in (.ancestors()) { userc = (| user.command_aliases() |); if (userc) aliases = aliases + userc; if (user == definer()) break; } return aliases; . method match_command_aliases arg str; var alias, argf, match, newstr; // attempts to rebuild the string for an alias. if (sender() != this()) throw(~perm, "Sender is not this."); for alias in (.all_command_aliases()) { match = match_pattern(alias[1], str); if (match != 0) { newstr = alias[2]; for argf in [1 .. listlen(match)] newstr = strsub(newstr, "%" + tostr(argf), match[argf]); return newstr; } } return str; . method add_command_alias arg alias, actual; var index, a; (> .perms(sender()) <); if ((type(alias) != 'string) || (type(actual) != 'string)) throw(~type, "alias and actual are not strings."); while ("%" in alias) { alias = strsub(alias, "%" + tostr(index), "*"); index = index + 1; } // have it 'replace' the old alias (if one exists) by first removing // the old one, and adding the new one later. for a in (command_aliases) { if ((a[1]) == alias) command_aliases = setremove(command_aliases, a); } command_aliases = [@command_aliases, [alias, actual]]; . method del_command_alias arg alias; var ca; (> .perms(sender()) <); if (type(alias) != 'string) throw(~type, "alias is not a string."); for ca in (command_aliases) { if ((ca[1]) == alias) { command_aliases = setremove(command_aliases, ca); return; } } throw(~aliasnf, ("alias `" + alias) + "' is not found"); . parent #664 object #1140 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 16 commands [["quit", 'old_command_cmd], ["WHO", 'old_command_cmd], ["@create *", 'old_command_cmd], ["@dig *", 'old_command_cmd]] var 16 shortcuts [] var 1 inited 1 var 1140 non_supported_cmds #[["quit", "@quit"], ["WHO", "@who"], ["@create", "@spawn"], ["@dig", "@build"]] var 1 manager #1140 var 1 writable [#1140] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'bad_commands method mangled_command arg str; . method add_old_cmd_reference arg oldcmd, [newcmd]; .perms(sender(), 'admin); if (this() != $bad_commands) throw(~perm, "Only define bad commands on $bad_commands"); if (newcmd) non_supported_cmds = dict_add(non_supported_cmds, oldcmd, newcmd[1]); .add_command(oldcmd, 'old_command_cmd); . method del_old_cmd_reference . method old_command_cmd arg com, [args]; var line, equiv; equiv = (| ($bad_commands.non_supported_cmds())[com] |); line = ("Oops, `" + com) + "` is not supported here. Use `help commands` for"; sender().tell("! " + line); line = "an explanation on the differences in commands."; sender().tell(("! " + line) + (equiv ? (" Try: `" + equiv) + "`" | "")); . method non_supported_cmds return non_supported_cmds; . parent #675 object #9398 var 1 dbref 'has_settings var 1 child_index 0 var 1 fertile 1 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 9398 settings #[] var 9398 setting_templates #[] method setting_templates (> .perms(sender()) <); return setting_templates || #[]; . method all_setting_templates var obj, tmpl, out; (> .perms(sender()) <); out = #[]; for obj in (.ancestors()) { tmpl = (| obj.setting_templates() |); if (tmpl) out = dict_add(out, obj, tmpl); if (obj == definer()) break; } return out; . method add_setting_template arg template, type; (> .perms(sender()) <); if (!setting_templates) setting_templates = #[]; if (type(template) != 'string) throw(~type, "Setting templates must be strings."); if (type(type) != 'symbol) throw(~type, "Setting data types must be symbols."); setting_templates = dict_add(setting_templates, template, type); . method del_setting_template arg template; (> .perms(sender()) <); if (setting_templates) { if (template in dict_keys(setting_templates)) setting_templates = dict_del(setting_templates, template); } . method set_setting arg flag, value; var template, objects, x, y, type; (> .perms(sender()) <); // is it a valid template? template = (| .setting_template(flag) |); if (!template) throw(~setting, ("Unknown setting \"" + flag) + "\"."); // make sure the value is submitted correctly. type = template[2]; switch (type) { case 'boolean: if (!(value in [1, 0])) throw(~type, ("Value must be boolean (+/-" + flag) + ")."); case 'integer: if (type(value) != 'integer) throw(~type, ("Value must be an integer (" + flag) + "=<integer>)."); case 'string: if (type(value) != 'string) throw(~type, ("Value must be a string (" + flag) + "=<string>)."); default: throw(~type, "Setting has an unknown type definition, IT'S BROKE."); } // incase they weren't initialized, initialize settings. if (!settings) settings = #[]; // Ok, set it... // for space concerns, if value is null remove the setting. if (((type == 'boolean) && (value == 0)) || ((type == 'string) && (value == ""))) { if ((| settings[template[1]] |)) return .unset_setting(template[1]); } settings = dict_add(settings, template[1], [type, value]); . method unset_setting arg template; (> .perms(sender()) <); if ((| settings[template] |)) settings = dict_del(settings, template); . method settings (> .perms(sender()) <); return settings || #[]; . method setting arg template; return (| (settings[template])[2] |) || 0; . method setting_template arg template; var templates, t, obj; (> .perms(sender()) <); for obj in (.ancestors()) { templates = (| obj.setting_templates() |); if (templates) { t = (| templates[template] |); if (t) return [template, t]; } if (obj == definer()) break; } return 0; . parent #28 parent #86 parent #2337 parent #922 parent #1140 parent #4309 parent #9398 parent #9399 object #30 var 1 child_index 47 var 1 owners [#936] var 1 fertile 0 var 16 commands [["@quit", 'quit_cmd], ["i?nventory", 'inventory_cmd], ["@title *", 'title_cmd], ["@aliases *", 'aliases_cmd], ["@add-name-alias|@ana *", 'add_name_alias_cmd], ["@del-name-alias|@dna *", 'del_name_alias_cmd], ["@rename * to *", 'rename_cmd], ["@time *", 'time_cmd], ["@audit *", 'audit_cmd], ["@who *", 'who_cmd], ["@who-s?hort|@whos?hort", 'who_short_cmd], ["news", 'news_cmd], ["@del-command-a?lias|@dca?lias *", 'del_command_alias_cmd], ["@command-a?liases|@ca?liases *", 'command_aliases_cmd], ["@wrap *", 'wrap_cmd], ["@prompt *", 'prompt_cmd], ["@password *", 'password_cmd], ["@idle", 'idle_cmd], ["@who-a?dmins|@whoa?dmins *", 'who_admins_cmd], ["@add-command-a?lias|@aca?lias *", 'add_command_alias_cmd], ["@who-c?ount|@whoc?ount", 'who_count_cmd], ["@who-p?rogrammers|@whop?rogrammers *", 'who_progs_cmd], ["@login-watch *", 'watch_logins_cmd], ["@com?mands *", 'commands_cmd], ["@age *", 'age_cmd], ["@spawn|@create *", 'spawn_cmd], ["@prose|@describe *", 'prose_cmd], ["@status", 'status_cmd]] var 16 shortcuts [] var 15 verbs #[] var 19 contents [] var 23 location #21 var 1 inited 1 var 30 password "$HexDY0MZCuK2" var 30 connected_at 0 var 30 last_command_at 0 var 30 connections [] var 30 linelen 0 var 30 title 0 var 30 email 0 var 30 action 0 var 30 creation_time 0 var 30 home 0 var 30 pagelen 0 var 30 activity 0 var 30 parsers [] var 30 filters [] var 30 watch_logins 0 var 30 tell_traceback 0 var 30 last_name 0 var 1 dbref 'user var 30 prompt "" var 1 owned [] var 922 command_aliases [] var 682 letters #[] var 682 letters_index #[] var 682 senders 1 var 682 readers [#47] var 682 notify [#47] var 682 last_letter 0 var 679 subscribed #[[#30, 0]] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 1 manager #30 var 1 writable [#30] var 1 readable ['parameters, 'methods, 'code] var 666 current_help #534 var 666 help_dict #[["*", #534], ["help", #547], ["**", #535]] var 30 context 0 var 2787 name ['uniq, "Generic User Object"] var 2787 name_aliases [] var 4309 user_data #[['real_name, [1, "???"]], ['email, [1, "???"]]] var 9398 setting_templates #[["terminated-tell", 'boolean], ["Content-type", 'string]] method init_user .perms(caller(), $root); password = "*"; connected_at = 0; last_command_at = 0; connections = []; creation_time = time(); parsers = [$command_parser, $verb_parser]; filters = []; action = ""; prompt = ""; context = #[]; .set_quota($sys.user_starting_quota()); $user_db.insert(.namef(), this()); .set_readable([]); .move_to($body_cave); . method uninit_user var conn; (> .perms(caller(), $root) <); if (.connected()) (| (.location()).did_disconnect() |); // and incase any are lying about for conn in (connections) (| conn.user_going_away() |); password = 0; connections = 0; (| $user_db.remove(.name()) |); . method trusted return pass() + ($parsers.children()); . method will_move arg mover, place; (> pass(mover, place) <); //if (!place.has_ancestor($room)) // throw(~perm, "Players can only move into rooms."); . method watch_logins return watch_logins; . method connected_at return connected_at; . method last_command_at return last_command_at; . method tell arg what; var f; if (filters) { for f in (filters) what = f.filter(what); } ._tell(what); . method set_password arg str; var x, num; .perms(sender(), 'manager); if (strlen(str) < 5) throw(~badpasswd, "Passwords must be at least 5 characters long."); // this is assuming they have alphabetic characters as well (shrug). // for x in [1 .. strlen(str)] { // if (str[x] in "1234567890") // num = num + 1; // } // if (num < 2) // throw(~badpasswd, "Passwords must contain at least 2 numeric characters."); password = crypt(str); . method check_password arg str; return crypt(str, substr(password, 1, 2)) == password; . method did_move arg [args]; var loc; (> pass(@args) <); loc = .location(); (| loc.look_cmd("look") |); . method parsers .perms(sender(), 'trusts); return parsers; . method add_parser arg parser, [position]; // adds a new $parser at 'position. .perms(sender(), 'parser); // do this in three steps, first make sure the posistion is valid, // then check for it already, then figure its insert position. position = [@position, 'first][1]; if (!(position in ['last, 'first])) throw(~type, "Posistion types must be one of: 'last, 'first."); // does it exist? If so remove it. if (parser in parsers) parsers = setremove(parsers, parser); // figure position if (position == 'last) position = listlen(parsers) + 1; else if (position == 'first) position = 1; parsers = insert(parsers, position, parser); . method del_parser arg parser; var keepers; // removes a parser. Cannot remove $command_parser or $verb_parser keepers = [$command_parser, $verb_parser]; if (!(parser in parsers)) throw(~parsernf, ($data.unparse(parser)) + " is not in the parser list."); if (parser in keepers) throw(~twink, ("You must always have " + ($list.map_to_english(keepers, 'namef))) + "."); parsers = setremove(parsers, parser); . method parse_line arg line; var result; .perms(caller(), $old_connection); last_command_at = time(); catch any { result = parsers ? (parsers[1]).parse(this(), line, @sublist(parsers, 2), $null_parser) | 'failed; if (type(result) == 'list) return (result[1]).(result[2])(@sublist(result, 3)); switch (result) { case 'failed: .tell(("I don't understand \"" + ($string.chop(line, (.linelen()) - 22))) + "\"."); case 'ok: default: .tell(tostr(result)); } } with handler { if (((traceback()[1])[3]) != 'no_traceback) .tell_traceback(traceback(), line, 0, error()); } return 0; . method connection_logged_in arg addr, port; var line; if (caller() != $old_connection) throw(~perm, "Caller is not $old_connection."); connections = connections + [sender()]; if (listlen(connections) == 1) .login(sender()); else .login_again(sender()); line = ("CONNECT " + tostr(sender() in connections)) + ": "; line = (((line + (.dbref())) + " <") + (sender().addr())) + "> "; $sys.log(line); . method connection_logged_out arg addr, port; var con, line; if (caller() != $old_connection) throw(~perm, "Caller is not $old_connection."); con = sender() in connections; connections = setremove(connections, sender()); if (!connections) .logout(sender()); else .logout_connection(sender()); connections = setremove(connections, sender()); line = ("DISCONNECT " + tostr(sender() in connections)) + ": "; line = (((line + (.dbref())) + " <") + (sender().addr())) + "> "; $sys.log(line); . method login arg connection; var loc; if ((sender() != this()) || (definer() != caller())) throw(~perm, "Invalid access to private method."); .tell(("* * * Login successful (" + (connection.addr())) + ") * * *"); connected_at = time(); last_command_at = time(); // loc = .location(); if (loc == $body_cave) { if ((.home()) != $body_cave) (| .move_to(.home()) |); else (| .move_to($places.place('starting)) |); } else if ((loc == (.home())) || (loc != $body_cave)) { (| loc.look_cmd("look") |); } else { (| .move_to(.home()) |); } (| (.location()).did_connect() |); (| .login_notify() |); (| $login_watcher.did_connect() |); (| $user_db.did_connect() |); . method login_again arg connection; if ((sender() != this()) || (definer() != caller())) throw(~perm, "Invalid access to private method."); last_command_at = time(); .tell(((("* * * " + ($integer.n_to_nth(connection in (.connections())))) + " Login successful (") + (connection.addr())) + ") * * *"); . method logout arg connection; if ((sender() != this()) || (definer() != caller())) throw(~perm, "Invalid access to private method."); (| (.location()).did_disconnect() |); // user specific things if (!($guest in (.parents()))) { (| $housekeeper.did_disconnect() |); (| $user_db.last_log_disconnect(this()) |); } else { (| $user_db.last_log_disconnect($guest) |); } (| $user_db.did_disconnect() |); (| $login_watcher.did_disconnect() |); . method connections return connections; . method connected disallow_overrides; return connections ? 1 | 0; . method who_cmd arg com, [args]; var who, x, person, where, meths, header; // just the basic who listing .perms(sender(), 'parser); who = []; if (!(args[1])) { who = $user_db.connected(); // looks like they want who in a room. } else if (((args[1])[1]) == "@") { where = $room.match_descendants(substr(args[1], 2)); if (!where) $parse.tell_error(("I do not know where \"" + substr(args[1], 2)) + "\" is."); for x in (where.contents()) { if (x.has_ancestor($user)) who = [@who, x]; } if (!who) $parse.tell_error(("Nobody is in " + (where.namef())) + "."); meths = [['namef, 'titled, " (", 'activity, ")"], ['time_poll]]; header = ["Name", "Times (idle)"]; .tell($code.generate_listing(who, "Users in " + (where.namef()), meths, header, [1, 1])); return; } else { // // user, or list of users for x in ($string.explode_english_list(@args)) { catch any { person = $user_db.find(x); } with handler { switch (error()) { case ~ambig: .tell(((("The name \"" + x) + "\" can match any of: ") + ($list.to_english($list.map((traceback()[1])[3], 'namef)))) + "."); default: .tell(("I don't know who \"" + x) + "\" is."); } continue; } who = [@who, person]; } if (!who) return; } .tell($code.generate_listing(who)); . method email return email || "**no email address**"; . method quit_cmd arg dummy; .perms(sender(), 'parser); return 'disconnect; . method inventory_cmd arg dummy; var i; .perms(sender(), 'parser); if (.contents()) { .tell("Carrying:"); for i in (.contents()) .tell(" " + (i.namef())); } else { .tell("You are empty-handed."); } . method match_env_nice arg name, [syntax]; var obj, args, line; // calls .match_environment() returns nice errors. as well as stopping if it // breaks. No returns neccessary syntax = [@syntax, ""][1]; catch any { obj = .match_environment(name); } with handler { switch (error()) { case ~ambig: args = (traceback()[1])[3]; line = ("\"" + (args[listlen(args)])) + "\" can match any of: "; line = line + ($list.map_to_english(args[1], 'namef)); (> $parse.tell_error(line, syntax) <); case ~objnf: line = ("Nothing found by the name \"" + ((traceback()[1])[3])) + "\"."; (> $parse.tell_error(line, syntax) <); default: line = (traceback()[1])[2]; (> $parse.tell_error(line, syntax) <); } } return obj; . method linelen return linelen || 79; . method idle_seconds return time() - last_command_at; . method who_short_cmd arg com; var user, tmp, who, namestr, total; if (sender() != this()) throw(~perm, "Sender not this."); who = []; total = listlen($user_db.connected()); .tell((("Currently connected users (total of " + tostr(total)) + ((total == 1) ? " person" | " people")) + "):"); for user in ($user_db.connected()) { namestr = (((((" " + (user.namef())) + " (") + ($time.elapsed(user.connected_at()))) + " ") + ($time.dhms(user.idle_seconds()))) + ")"; who = [@who, namestr]; if (tmp < (strlen(namestr) + 2)) tmp = strlen(namestr) + 2; } .tell($list.columnize(who, (.linelen()) / (tmp + 1), " ", .linelen())); . method who_admins_cmd arg com, [who]; var admins, admin, title; who = who[1]; // everybody, connected or not if (who == "all") { admins = $sys.admins(); title = "All Admins"; // ok, just the connected ones then } else if (who == "") { title = "All Connected Admins"; admins = []; for admin in ($sys.admins()) { if (admin.connected()) admins = [@admins, admin]; } // hrm, possibly somebody specific } else { admins = [.match_object_nice(who, $admin, 'children)]; } .tell($code.generate_listing(admins, title)); . method who_progs_cmd arg com, [args]; var progs, all_progs, x, title; args = args[1]; if (args) { if (match_begin(args, "all")) { progs = $programmer.descendants(); title = "All Programmers"; } else { title = "Programmer"; progs = [.find_object_nice(args, 'environment, 'user, 'grasp)]; } } else { progs = []; title = "Connected Programmers"; for x in ($programmer.descendants()) { if (x.connected()) progs = [@progs, x]; } } .tell($code.generate_listing(progs, title)); . method who_count_cmd arg com; var len, rz, pz; .perms(sender(), 'parser); len = listlen($user_db.connected()); if (len == 1) { rz = "is"; pz = "person"; } else { rz = "are"; pz = "people"; } .tell(((((("There " + rz) + " currently ") + tostr(len)) + " ") + pz) + " connected."); .tell("Lag is <lag meter will eventually go here>"); . method title return title || ""; . method action // different from activity, returns a more accurate second to second action if (.connected()) return action || ""; else return "(asleep)"; . method time_poll arg [args]; var idle; if (!(.connected())) return "Last On: " + substr(ctime(last_command_at), 1, 10); if (!args) idle = ((.idle_seconds()) > 10) ? $time.dhms(.idle_seconds(), 'long) | ""; else idle = ((.idle_seconds()) > 10) ? $time.dhms(.idle_seconds()) | ""; return ($time.elapsed(.connected_at())) + (idle ? " " + idle | ""); . method title_cmd arg com, str; .perms(sender(), 'parser); .tell("Temporary until the real title setup is working"); catch any { .set_title(str); } with handler { $parse.tell_error((traceback()[1])[2]); } .tell(("Title Set as: \"" + str) + "\""); . method commands_cmd arg cmd, args; var obj, coms, c, len, lcoms, scoms, ulen, l, what, a, opts, lines; // returns all commands in a nice format. .perms(sender(), 'parser); args = explode(args); if (!args) { what = .ancestors(); .tell("All commands: (prepare to be spammed)"); } else { what = [.match_env_nice(args[1])]; .tell("Commands on " + ((what[1]).namef('ref))); } ulen = .linelen(); for obj in (what) { if (!((obj.has_ancestor($has_commands)) || (obj.has_ancestor($has_verbs)))) continue; coms = []; coms = coms + ((| $list.slice(obj.shortcuts(), 1) |) || []); coms = coms + ((| $list.slice(obj.commands(), 1) |) || []); coms = coms + ((| obj.verb_templates() |) || []); if (coms) { scoms = []; lcoms = []; for c in (coms) { len = strlen(c) + 2; if (len > (ulen / 3)) lcoms = [@lcoms, " " + c]; else scoms = [@scoms, " " + c]; } lines = ($list.lcolumnize(scoms, ulen)) + ($list.lcolumnize(lcoms, ulen)); for l in (lines) .tell($string.trim(l, 'right)); .tell(" -=-"); } if (obj == $has_commands) break; } . method tell_commands arg p, ps, pc, space; var x, a, c; // called by $builder.commands_cmd .tell(((((space + "Commands on ") + (p.namef('ref))) + " (") + toliteral(p)) + ")"); pc = ps + pc; if (!pc) { .tell(space + " None"); return; } for x in [1 .. listlen(pc)] { a = pad(tostr((pc[x])[1]), 30) + " "; c = pad(toliteral((pc[x])[2]), 20) + " "; .tell(((space + " ") + a) + c); } . method set_email arg email_str; var syn, email, host; if (!(.is_writable_by(sender()))) throw(~perm, "Sender is not an owner."); // kludgy way to check for semi valid email addresses: email = explode(email_str, "@"); if (listlen(email) < 2) throw(~invemail, "Invalid email: " + email_str); // check hostname for at least 1 subnet and a machine name. host = explode(email[2], "."); if (listlen(host) < 2) throw(~invemail, "Invalid hostname: " + (host[1])); // email is purposefully constructed this way, as at one point it will // be able to automatically tack on your host, if you do not provide it. set_var('email, ((email[1]) + "@") + (email[2])); . method set_watch_logins arg value; // either have a single reference, or: 'none|'all .perms(sender()); watch_logins = value; . method echo_file arg str; var con; for con in (connections) con.echo_file(str); . method set_home arg obj; // if (!obj.is_writable_by(sender())) // return .tell("You do not own " + obj.namef() + "."); home = obj; . method pagelen return pagelen || 24; . method set_pagelen arg len; if (!(.is_writable_by(sender()))) throw(~perm, "Sender not an owner."); if (type(len) != 'integer) throw(~type, "pagelength must be an integer"); pagelen = len; . method set_linelen arg len; if (!(.is_writable_by(sender()))) throw(~perm, "Sender not an owner."); if (type(len) != 'integer) throw(~type, "Linelength must be an integer"); linelen = len; . method aliases_cmd arg com, [obj]; if (!(.is_writable_by(sender()))) throw(~perm, "Sender not owner."); obj = .match_env_nice((obj[1]) ? obj[1] | (.dbref())); if (!(obj.has_ancestor($named))) { .tell(("Object `" + (obj.dbref())) + "' is not a named object."); throw(~stop, "", 'no_traceback); } .tell((("Aliases for " + (obj.namef())) + ": ") + ($list.to_english(obj.name_aliases(), "none"))); . method activity var idle; // different from action, returns a broader version of your doings if (!(.connected())) return "asleep"; if (activity) return activity; idle = .idle_seconds(); if (idle < 180) return ""; if (idle < 300) return "daydreaming"; if (idle < 900) return "zoned"; else return "long gone"; . method add_name_alias_cmd arg com, [args]; var syn, obj, what; if (!(.is_writable_by(sender()))) throw(~perm, "Sender not this"); syn = ("`" + com) + " <alias> to <object>' (to <object> is optional)"; args = explode(args[1]); what = args[1]; obj = .match_env_nice([@args, .dbref(), .dbref()][3]); if (!what) $parse.tell_error("You must name an alias.", syn); if (what in (.name_aliases())) $parse.tell_error(("You already have the name alias `" + what) + "'"); catch any { obj.add_name_alias(what); } with handler { switch (error()) { case ~methodnf: $parse.tell_error((obj.namef('ref)) + " is not a descendant of $xxxxxxxxx", syn); default: $parse.tell_error((traceback()[1])[2], syn); } } .tell(((("Name Alias `" + what) + "' added to ") + (obj.namef())) + "."); . method modes return modes; . method del_name_alias_cmd arg com, [args]; var syn, obj, what; if (!(.is_writable_by(sender()))) throw(~perm, "Sender not this"); syn = ("`" + com) + " <alias> from <object>' (from <object> is optional)"; args = explode(args[1]); what = args[1]; obj = .match_env_nice([@args, .dbref(), .dbref()][3]); if (!what) $parse.tell_error("You must name an alias to delete.", syn); if (!(what in (.name_aliases()))) $parse.tell_error((((obj.namef('ref)) + " doesn't have the name alias `") + what) + "'"); catch any { obj.del_name_alias(what); } with handler { switch (error()) { case ~methodnf: $parse.tell_error((obj.namef('ref)) + " is not a descendant of $matchable", syn); default: $parse.tell_error((traceback()[1])[2], syn); } } .tell(((((("Name Alias `" + what) + "' deleted from ") + (obj.namef())) + ", aliases are now: ") + ($list.to_english(.name_aliases()))) + "."); . method home return home || $body_cave; . method set_dbref arg new_dbref; if ((caller() != $user) && (!(sender() in ($sys.system())))) throw(~perm, "User dbrefs can only be changed by $user."); (> pass(new_dbref) <); . method rename_cmd arg com, what, prep, line; var syn, x, article, name; if (sender() != this()) throw(~perm, "Sender is not this"); syn = ((("`" + com) + " <object> ") + prep) + " <newname>'"; what = .match_env_nice(what); if (!(what.has_ancestor($named))) $parse.tell_error(("Object `" + ($data.unparse(what))) + "' is not descended from $named.", syn); line = explode(line); article = 'uniq; for x in [1 .. listlen(line)] { if (((line[x]) == "-prop") || (((line[x]) == "-p") || ((line[x]) == "-proper"))) { article = 'prop; line = delete(line, x); break; } if (((line[x]) == "-uniq") || (((line[x]) == "-u") || ((line[x]) == "-unique"))) { article = 'uniq; line = delete(line, x); break; } } name = $list.to_string(line); catch any { what.set_name(name, article); } with handler { $parse.tell_error((traceback()[1])[2], syn); } .tell("Name is now: " + (what.name())); . method time_cmd arg command, [args]; var rtime, itime, ptime; .perms(sender(), 'parser); // rtime = "Terran Time: " + $time.ltime('12hr, 'ampm) + " " + $time.ltime(); rtime = "Terran Time: " + ctime(); itime = (("Ilraitheen Time: " + ($dark_time.ilraitheen_time())) + " day ") + tostr($dark_time.day()); ptime = "Paradisical Time: " + ($dark_time.paradise_time()); .tell([rtime, itime, ptime]); . method audit_cmd arg com, [args]; var owner, obj, col, total, line, syntax, loc, size; if (sender() != this()) throw(~perm, "Sender not this."); syntax = ""; owner = (args[1]) ? args[1] | "me"; owner = .match_env_nice(owner, syntax); if (!(owner.owned())) { .tell(" None"); } else { col = (.linelen()) / 2; line = ("Objects owned by " + (owner.namef('ref))) + ":"; .tell((pad(line, col) + pad("bytes", -10)) + " Location"); for obj in (owner.owned()) { if (!valid(obj)) { .tell((" ** invalid object (" + toliteral(obj)) + ") **"); continue; } line = pad(" " + (obj.namef('ref)), col); size = $integer.to_english(obj.size()); line = (line + pad(size, -((strlen(size) > 10) ? strlen(size) | 10))) + " "; loc = (obj.has_ancestor($located)) ? ("[" + ((obj.location()).namef())) + "]" | ""; .tell(pad(line + loc, .linelen())); total = total + (obj.size()); } } .tell(("Total usage: " + ($integer.to_english(total))) + " bytes"); size = owner.get_quota(); line = ("Total quota: " + ($integer.to_english(size))) + " bytes "; line = ((line + "Remaining: ") + ($integer.to_english(size - total))) + " bytes"; .tell(line); . method login_notify // called by .login, set items here that will 'notify' a user of varous // different things, such as new mail, news, etc. if ($news.new()) .tell("There is new News (use `news' to read it)."); if (.unread()) .tell("You have new mail (use `@Mm?ail on me' to list it)."); .mmail_lists_cmd("", "subscribed"); . method _set_watch_logins arg value; if (sender() != this()) throw(~perm, "Invalid call to private method"); watch_logins = value; . method get_mode arg mode; // returns the variable for the mode if (mode in dict_keys(modes)) return modes[mode]; throw(~modenf, ("Mode \"'" + tostr(mode)) + "\" is not found in the users dictionary"); . method add_mode arg mode, setting; if (!(.is_writable_by(sender()))) throw(~perm, "Sender is not an owner."); if (type(mode) != 'symbol) throw(~type, "Modes must be a symbol"); modes = dict_add(modes, mode, setting); . method news_cmd arg [args]; (> .perms(sender(), 'parser) <); $news.read_vrb("read", "news"); . method del_mode arg mode; if (!(.is_writable_by(sender()))) throw(~perm, "Sender is not an owner."); if (mode in dict_keys(modes)) { modes = dict_del(modes, mode); return; } throw(~modenf, "Mode is not in users modes dictionary"); . method add_command_alias_cmd arg com, input; var syn, alias, actual, tmpalias, tmpactual, num; if (sender() != this()) throw(~perm, "Sender is not this"); input = explode(input, "\""); // hell, i'll be nice and check for a few possibilities: syn = com + " \"<alias>\" [to] \"<actual command>\""; if (listlen(input) < 2) $parse.tell_error("Not enough arguments (enclose each alias in quotes)", syn); if (listlen(input) > 3) $parse.tell_error("Too many arguments (enclose each alias in quotes)", syn); // sort and get the alias and actual if (listlen(input) == 3) input = delete(input, 2); alias = input[1]; actual = input[2]; // make sure the %foo's match up tmpalias = alias; tmpactual = actual; while ("%" in tmpalias) { num = tmpalias[("%" in tmpalias) + 1]; if (!toint(num)) $parse.tell_error("referece cards must be integers", syn); num = "%" + num; if (!(num in tmpactual)) $parse.tell_error("reference cards to not match up", syn); tmpalias = strsub(tmpalias, num, ""); tmpactual = strsub(tmpactual, num, ""); } if ("%" in tmpactual) $parse.tell_error("reference cards do not match up", syn); .add_command_alias(alias, actual); .tell(((("New command alias \"" + alias) + "\" => \"") + actual) + "\" added."); . method del_command_alias_cmd arg com, template; if (sender() != this()) throw(~perm, "Sender is not this"); template = explode(template, "\"")[1]; catch ~aliasnf { .del_command_alias(template); } with handler { $parse.tell_error(("No command alias is found matching the template \"" + template) + "\"."); } .tell(("Command alias \"" + template) + "\" deleted."); . method command_aliases_cmd arg com, what; var aliases, a, line; if (!what) what = this(); else what = .match_env_nice(what); if ((what != this()) && (!(what.is_writable_by(this())))) $parse.tell_error("You are not allowed to read the command aliases on " + (what.namef())); .tell(("--- Command aliases on " + (what.namef('xref))) + ":"); aliases = what.command_aliases(); if (aliases) { for a in (aliases) { line = " " + pad(("\"" + (a[1])) + "\"", ((.linelen()) - 10) / 2); .tell(((line + " => \"") + (a[2])) + "\""); } } else { .tell(" <none>"); } .tell("---"); . method _tell arg what; var conn, line; .perms(sender(), 'this); if (type(what) == 'list) { for line in (what) ._tell(line); } else { for conn in (connections) conn.tell(what); } . method add_filter arg filter, [position]; if ((!(sender().has_ancestor($filters))) && (!(.is_writable_by(sender())))) throw(~perms, "%O does not have permission to remove filters.", sender()); // do this in three steps, first make sure the posistion is valid, // then check for it already, then figure its insert position. position = [@position, 'first][1]; if (!(position in ['last, 'first])) throw(~type, "Posistion types must be one of: 'last, 'first."); // does it exist? If so remove it. if (filter in filters) filters = setremove(filters, filter); // figure position if (position == 'last) position = listlen(filters) + 1; else if (position == 'first) position = 1; filters = insert(filters, position, filter); . method del_filter arg filter; if ((!(sender().has_ancestor($filters))) && (!(.is_writable_by(sender())))) throw(~perms, "%O does not have permission to remove filters.", sender()); if (filters) { filters = setremove(filters, filter); return; } else { throw(~nofilters, "You do not have any tell filters."); } . method wrap_cmd arg com, how; var filters; .perms(sender(), 'this); if (!(how in ["on", "off"])) return .tell("! You can either turn line wrapping `on' or `off'"); filters = .filters(); if (how == "on") { if (filters && ($wrap_filter in filters)) return .tell("! You already have line wrapping on.."); .add_filter($wrap_filter); return .tell("Line wrapping turned on."); } else { if (filters && (!($wrap_filter in filters))) return .tell("! You dont have line wrapping turned on."); .del_filter($wrap_filter); return .tell("Line wrapping turned off."); } . method filters .perms(sender()); return filters; . method tell_traceback arg traceback, [args]; var tt, name, eargs, error, str; // tt = tell_traceback || ['verbose, 0, "! "]; str = [@args, ""][1]; eargs = [@args, 0, 0][2]; error = [@args, 0, 0, 0][3]; tt = ['verbose, -1, "! "]; switch (tt[1]) { case 'verbose: traceback = $parse.traceback(traceback, tt[2], tt[3], error); if (args) name = (| $list.to_english($list.map(args, 'namef, 'ref)) |); if (!name) name = "Object"; .tell(strsub(traceback[1], "%O", name)); .tell(sublist(traceback, 2)); default: .tell(("! Internal error processing \"" + str) + "\", contact an administrator."); } . method set_tell_traceback arg which, [lines]; .perms(sender(), 'manager); if (!(which in ['verbose, 'brief, 'none])) throw(~type, "Which style must either be 'verbose, 'brief, or 'none."); if (lines && (type(lines[1]) != 'integer)) throw(~type, "You must specify the max lines as an integer."); if (!lines) lines = 0; else lines = lines[1]; tell_traceback = [which, lines]; . method namef arg [args]; if (!args) args = [['name]]; // first check for shortcuts, if so re-call this method correctly. if ((args[1]) == 'nactivity) { if (.activity()) args = [['name], " (", ['activity], ")"] + sublist(args, 2); else args = [['name]] + sublist(args, 2); } if ((args[1]) == 'titled) { if (.title()) args = [['name], ", ", ['title]] + sublist(args, 2); else args = [['name]] + sublist(args, 2); } return pass(@args); . method get_prompt return prompt; . method set_prompt arg what; .perms(sender(), 'this); prompt = what; . method prompt_cmd arg com, [args]; .perms(sender(), 'this); if (!args) args = [""]; .set_prompt(args[1]); .tell(("Prompt set as \"" + (args[1])) + "\""); . method password_cmd arg com, [args]; var syn; .perms(sender(), 'parser); syn = ("`" + com) + " <old password> <new password>'"; args = explode(@args); if ((listlen(args) < 2) || (listlen(args) > 2)) $parse.tell_error("Not enough arguments specified (note: passwords cannot contain spaces).", syn); if (!(.check_password(args[1]))) $parse.tell_error("Old password does not match up.", syn); catch any { .set_password(args[2]); } with handler { $parse.tell_error((traceback()[1])[2], syn); } .tell("Password changed."); . method set_title arg str; .perms(sender(), 'manager); if (strlen(str) > 30) throw(~type, "Titles must be under 30 characters."); title = str; . method watch_logins_cmd arg com, args; args = explode(args); if (!args) return .tell("You must specify someone to watch (logging in/out)."); if ((args[1]) in ["all", "everybody", "everyone"]) { .set_watch_logins(1); .tell("You are now listening to login messages from everybody."); } else if ((args[1]) in ["none", "noone"]) { .set_watch_logins(0); .tell("You are now ignoring login messages."); } else { .tell("nothing else on this command is progged yet."); } . method delimited_tell arg text; var conn; // will adjust perms etc later. for conn in (.connections()) conn.enh_tell([text]); . method match_context arg str; return context[str]; . method context return context; . method match_environment arg str; var match, gend; match = (> pass(str) <); gend = (| match.gender() |); if (gend) context = dict_add(context, gend.pronoun('po), match); return match; . method non_terminated_tell arg text; var conn; if (.setting("terminated-tell")) { for conn in (.connections()) conn.enh_tell([text]); } else { .tell(text); } . method set_name arg new_name, [ignore]; var old_name, part, sname; .perms(sender(), 'manager); // so it doesnt bomb on .set_dbref if ((.namef()) == new_name) return; if ($user_db.valid_name(new_name)) old_name = .namef(); sname = $string.strip(new_name, $user_db.stripped_characters()); catch any { pass(new_name); $user_db.key_changed(old_name, new_name); .set_dbref(tosym("user_" + sname)); } with handler { (| pass(old_name) |); rethrow(error()); } . method find_object_nice arg str, [args]; var match; catch any { match = .find_object(str, @args); } with handler { .tell("! " + ((traceback()[1])[2])); throw(~stop, "", 'no_traceback); } return match; . method find_object arg str, [args]; var trace, match; // comprehensive matching method. // args define what to match. if (!args) args = ['environment]; while (args) { switch (args[1]) { case 'environment: match = (| .match_environment(str) |); case 'user: match = (| $user_db.find(str) |); case 'grasp: match = (| $object.to_dbref(str) |); } if (match) return match; args = delete(args, 1); } throw(~objnf, ("No object found by the reference \"" + str) + "\"."); . method creation_time return creation_time; . method age_cmd arg com, user; var person, time; .perms(sender(), 'parser); person = (| $user_db.find(user) |); if (!person) { person = (| .match_environment(user) |); if (!person) return .tell(("No person can be found by the name \"" + user) + "\"."); } time = person.creation_time(); .tell(((person.namef()) + " was created on ") + ($time.ldate(time))); .tell(((((person.gender()).pronoun('psc)) + " is ") + ($time.elapsed(time() - time, 'long))) + " old."); . method spawn_cmd arg com, args; var syn, new_obj, moved, name, parent, builder; if (sender() != this()) throw(~perm, "Sender not this."); syn = ("`" + com) + " <parent> [named|called] <new object name>'"; args = explode(args); builder = !($user in (.parents())); if ((!args) || (((listlen(args) < 1) && builder) || (listlen(args) < 2))) $parse.tell_error("Not enough arguments specified.", syn); args = [@args, ""]; parent = args[1]; parent = .match_env_nice(parent, syn); // users shouldn't be creating non VR objs. if ((!(parent.has_ancestor($thing))) && (!builder)) $parse.tell_error("Parent is not a descendant of a Generic Thing ($thing)."); if (match_begin("named", args[2]) || match_begin("called", args[2])) args = delete(args, 2); name = $list.to_string(sublist(args, 2)); catch any { new_obj = parent.spawn(); if (name) { if (!(new_obj.has_ancestor($named))) .tell("Object is not descended from $named."); else (> new_obj.set_name(name) <); } moved = (| new_obj.move_to(this()) |); .tell(((("Object " + (new_obj.namef('ref))) + " spawned from ") + (parent.namef('ref))) + "."); } with handler { $parse.tell_error((traceback()[1])[2], syn); } . method _prose_done arg text, obj, which; .perms(sender(), 'this); (> obj.set_prose(which, text) <); which = tostr(which); .tell(((($string.capitalize(which)) + " prose description for ") + (obj.namef('ref))) + " set."); . method prose_cmd arg cmd, args; var syn, which, obj; .perms(sender()); syn = ("`" + cmd) + " <object> [long|short]`"; args = explode(args); obj = [@args, ""][1]; which = [@args, "short", "short"][2]; if (!(which in ["short", "long"])) $parse.tell_error("Must either be \"short\" or \"long\" for the prose type.", syn); which = tosym(which); if (!obj) $parse.tell_error("No object specified.", syn); obj = .match_env_nice(obj); if (!(obj.has_ancestor($described))) $parse.tell_error((obj.namef('ref)) + " is not a describeable object!", syn); if (!(| obj.perms(this()) |)) $parse.tell_error(("You do not have permission to write the prose description for " + (obj.namef('ref))) + ".", syn); if (which == 'short) { .prompt("Enter line: ", '_prose_done, obj, which); } else { .tell("Enter text for prose (end with a period or abort with `@abort`):"); .read('_prose_done, obj, which); } . method status_cmd arg com, [args]; var line; (> .perms(sender(), 'this) <); .tell(((($motd.server_name()) + ", ") + ($motd.server_title())) + "."); .tell("Startup time: " + ($time.date($sys.startup_time()))); .tell((" (" + ($time.to_english($sys.uptime()))) + ")"); .tell("Last backup time: " + ($time.date($sys.last_backup()))); .tell("Driver: ColdMUD " + ($sys.version('driver))); .tell("Core: the Cold Dark Core " + ($sys.version('core))); . method del_command_alias arg alias; (> .perms(sender()) <); (> pass(alias) <); if ((!(.command_aliases())) && ($command_aliases_parser in (.parsers()))) { .tell("Removing $command_aliases_parser from your list of parsers."); .del_parser($command_aliases_parser); } . method add_command_alias arg alias, actual; (> .perms(sender()) <); (> pass(alias, actual) <); if ((.command_aliases()) && (!($command_aliases_parser in (.parsers())))) { .tell("Adding $command_aliases_parser to your list of parsers.."); .add_parser($command_aliases_parser, 'first); } . method logout_connection arg connection; if ((sender() != this()) || (definer() != caller())) throw(~perm, "Invalid access to private method."); .tell(("* * * " + ($integer.n_to_nth(listlen(.connections()) + 1))) + " Logout sucessful * * *"); . method tell_ctext arg ctext, originator; var output, type; type = (.setting("content-type")) || "text/plain"; output = ctext.translate_to(type); .tell(output); . parent #30 object #936 var 1 child_index 0 var 1 owners [#936] var 1 owned [#675, #1170, #2, #12, #0, #7791, #40, #1093, #10, #790, #1032, #7794, #7968, #1182, #1184, #1183, #1095, #1094, #247, #22, #21, #140, #2250, #592, #185, #30, #31, #7232, #936, #32, #33, #37, #16, #1178, #15, #1139, #35, #664, #19, #27, #86, #922, #1140, #25, #28, #1162, #758, #747, #1138, #23, #26, #24, #984, #17, #1179, #1204, #8019, #282, #465, #888, #2485, #1165, #1142, #3, #2490, #2489, #2488, #2486, #2487, #2491, #2494, #6, #4, #5, #9, #7, #2495, #1166, #310, #49, #51, #46, #44, #13, #740, #45, #720, #334, #333] var 1 fertile 0 var 16 commands [] var 16 shortcuts [] var 922 command_aliases [] var 15 verbs #[] var 19 contents [] var 23 location #21 var 30 password "*" var 30 connected_at 0 var 30 last_command_at 0 var 30 connections [] var 30 creation_time 759878010 var 30 action "" var 1 inited 1 var 30 modes #[] var 682 letters #[] var 682 letters_index #[] var 682 senders 1 var 682 readers [#37] var 682 notify [#37] var 682 last_letter 0 var 679 subscribed #[[#936, 0]] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 30 prompt "" var 1 manager #936 var 1 writable [#936] var 1 readable ['parameters, 'methods, 'code] var 30 parsers [#2000, #2321] var 30 tell_traceback ['brief, 0] var 30 context #[] var 1 quota 75000 var 1 dbref 'no_one var 2787 name ['prop, "No One"] var 2787 name_aliases ["No", "One"] var 4309 user_data #[['real_name, [1, "???"]], ['email, [1, "???"]]] parent #16 object #27 var 27 user 0 var 27 addr 0 var 27 port 0 var 27 buffer `[] var 27 connect_help ["Connection HELP", "===============", "", "Connecting as a guest: 'connect guest <name> <email>'", " Example: 'connect guest John Doe johnd@site.usa.com'", "", "Connecting as a user: 'connect <name> <password>'", " Example: 'connect John Doe mypassword'", "", "Quitting (this screen): '@quit' or 'quit'", "", "Connected User's Listing: '@who' or 'who'", "Connection HELP", "===============", "", "Connecting as a guest: 'connect guest <name> <email>'", " Example: 'connect guest John Doe johnd@site.usa.com'", "", "Connecting as a user: 'connect <name> <password>'", " Example: 'connect John Doe mypassword'", "", "Quitting (this screen): 'quit' or '@quit'", "", "Connected User's Listing: 'who' or '@who'"] var 27 connect_notes [] var 16 commands [["@quit|QUIT", 'quit_cmd], ["h?elp", 'help_cmd], ["@who|WHO", 'who_cmd], ["c?onnect guest *", 'connect_guest_cmd], ["c?onnect *", 'connect_cmd], ["m?otd", 'motd_cmd], ["c?reate *", 'create_cmd]] var 16 shortcuts [] var 1 inited 1 var 1 child_index 5479 var 1 owners [#936] var 1 fertile 1 var 1 owned [] var 1 manager #27 var 1 writable [#27] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'old_connection var 27 ip 0 method init_old_connection .perms(caller(), $root); user = 0; addr = 0; port = 0; ip = 0; buffer = `[]; . method uninit_old_connection .perms(caller(), $root); user.connection_logged_out(addr, port); . method tell arg what, [format]; var l; // Crag: added caller() != $parse so I can use $parse.tell_error(). // sigh... if ((sender() != this()) && ((sender() != user) && (caller() != $parse))) throw(~perm, "Sender not this or the user."); // if (user) // .prompt(user.get_prompt(), 1); echo(buffer_from_strings([what])); // if (user) // .prompt(user.get_prompt(), 0); . method connect arg [args]; var x, addr_arg, port_arg; if (sender() != 0) throw(~perm, "Sender not the server."); addr_arg = args[1]; port_arg = args[2]; addr = hostname(addr_arg); ip = addr_arg; port = port_arg; if (!(| .motd() |)) { .tell("Error displaying the Message of the Day, hit enter once, if this problem"); .tell("continues email: " + ($sys.get_system_email('login))); } $sys.connection_starting(); (| $scheduler.add_task(300, 'timeout) |); . method disconnect if (sender() != 0) throw(~perm, "Sender not the server."); .tell("Goodbye."); .destroy(); . method parse arg incoming; var lines, line, loc; if ((sender() != 0) && (caller() != 0)) throw(~perm, "Sender and caller are not the server"); lines = buffer_to_strings(buffer_append(buffer, incoming)); buffer = lines[listlen(lines)]; for line in (sublist(lines, 1, listlen(lines) - 1)) (| .parse_line(line) |); . method parse_line arg str; var cmd, x, coms; if ((caller() != definer()) || (sender() != this())) throw(~perm, "Invalid access to private method."); // send it to the user object, otherwize they are at the MOTD if (user) { if ((user.parse_line(str)) == 'disconnect) disconnect(); return; } // they are at the MOTD // Display tracebacks, even though user may be clueless catch any { cmd = .match_command(str); if (cmd) { .(cmd[1])(@cmd[2]); } else { .tell(""); if (str) .tell(("I don't understand \"" + ($string.chop(str, 57))) + "\"."); .tell("Try: help, quit, who, motd, create, connect, or connect guest."); } } with handler { if (((traceback()[1])[3]) != 'no_traceback) { for str in (traceback()) .tell(str); } } if (!user) .enh_tell(["", "> "]); . method user return user; . method addr return addr; . method port return port; . method connect_cmd arg com, words; var words, u, password, salt, syn, name, passwd; .perms(sender(), 'this); // arrg, this is kludgy, but its the best we can do on $old_connection syn = "`connect <name> <pass>' (last word is taken as the password)"; // Get user name and password--sort accordingly words = explode(words); if (listlen(words) < 2) $parse.tell_error(syn); passwd = words[listlen(words)]; name = $list.to_string(sublist(words, 1, listlen(words) - 1)); // Look for a user with the given name. catch ~namenf { u = $user_db.find(name); } with handler { $parse.tell_error("Either that user does not exist or has a different password.", syn); } // Check if the password is correct. if (!(u.check_password(passwd))) $parse.tell_error("Either that user does not exist or has a different password.", syn); // Log the user in. user = u; user.connection_logged_in(addr, port); . method create_cmd arg com, words; var words, syn; syn = "! Usage: `create <name> <password> <email@host>'"; if (sender() != this()) throw(~perm, "Sender is not this."); // Get user name, password, and email. words = explode(words); if (listlen(words) != 3) return .tell(syn); // Create a new user object. catch any { user = $sys.create_user(words[1], words[2], words[3]); } with handler { .tell(syn); switch (error()) { case ~duplicate: .tell(("! The user " + toliteral(words[1])) + " already exists."); default: .tell("! There was a problem creating you:"); .tell("! => " + ((traceback()[1])[2])); .tell("! If there is a problem contact: " + ($sys.get_system_email('login))); // $sys.log(traceback()); } if (user) { (| user.destroy() |); user = 0; } return; } // Log the user in. user.connection_logged_in(addr, port); . method quit_cmd arg dummy; if (sender() != this()) throw(~perm, "Sender is not this."); .tell("Goodbye."); disconnect(); . method user_going_away if (caller() != $user) throw(~perm, "Caller is not $user."); disconnect(); . method connect_guest_cmd arg com, com2, words; var syn, email, name, result; .perms(sender(), 'this); syn = "=> Syntax: 'connect guest <name> <email>' (type 'help' for more help)"; // Get user name and password. words = explode(words); if (listlen(words) < 2) return .tell(syn); name = $list.to_string(sublist(words, 1, listlen(words) - 1)); email = words[listlen(words)]; result = $code.valid_email(email); if ((result[1]) != 'valid) { switch (result[1]) { case 'invalid: .tell("! The given email address is not a legitimate address."); .tell("! Specify both username and hostname (do not use brackets)."); return; case 'invip, 'invhostname: .echo($string.wrap_line(((("The hostname \"" + (result[3])) + "\" is invalid, when in actuality you are connecting from \"") + ((addr == "-1") ? ip | addr)) + "\". The server is not currently locking out invalid email addresses, although your connection has been noted (We do realize that some hosts may not function normally).", 79, "! ", 1)); $channels.announce('System, ((((((("Invalid Connection Email: " + email) + " <") + addr) + ":") + ip) + "> (") + name) + ")"); } } catch any { user = $sys.create_user(name, 0, email, 'anonymous_class); } with handler { .tell(syn); switch (error()) { case ~duplicate: .tell(("! The name " + toliteral(words[1])) + " is already in use."); default: .tell("! There was a problem creating you:"); .tell("! => " + ((traceback()[1])[2])); .tell("! If there is a problem contact: " + ($sys.get_system_email('login))); } $brandon.tell_traceback(traceback()); // $sys.log(traceback()); return; } // Log the user in. $sys.log((("GUEST: " + (words[1])) + " ") + (words[2])); user.connection_logged_in(addr, port); . method echo_file arg what; if ((sender() != this()) && (sender() != user)) throw(~perm, "Sender not this or the user."); echo_file(what); . method spiffy_quote return $code.random_theme_quote(); . method connect_help return connect_help; . method who_cmd arg com; var l; for l in ($code.generate_listing($user_db.connected())) .tell(l); . method motd var line, stuff; // a slightly cooler in-db welcome message if ((sender() != this()) || (caller() != definer())) throw(~perm, "Invalid access to private method."); .echo($login.build('default)); .tell(""); .echo(" ** Use 'H?elp' for a list of commands **", 'center); .tell(""); . method enh_tell arg what; var elem, out; // Echo list consisting of buffers and strings. // if (!$sys.is_system(sender()) && (caller() != $user || sender() != this())) // throw(~perm, "Permission Denied: Invalid call to a private method."); for elem in (what) { if (type(elem) == 'string) echo(buffer_truncate(buffer_from_strings([elem]), strlen(elem))); else echo(elem); } . method enh_tell_move arg X, Y; // Move cursor on most ANSI and VT terminals to X,Y .enh_tell([`[27], ((("[" + tostr(Y)) + ";") + tostr(X)) + "H"]); . method help_cmd arg com; var l; .perms(sender(), 'this); for l in ($old_connection.connect_help()) .tell(l); . method connect_notes return connect_notes; . method prompt arg prompt, [erase]; var buf; buf = buffer_from_strings([prompt]); buf = buffer_truncate(buf, buffer_len(buf) - 2); erase = erase && (erase[1]); if (erase) { buf = buffer_len(buf); while (buf) { echo(`[8]); buf = buf - 1; } } else { echo(buf); if (prompt) echo(`[255, 249]); } . method echo arg what, [format]; var l; // the difference being that this one is designed for non-connected conns if ((sender() != this()) && (sender() != user)) throw(~perm, "Sender not this or the user."); format = [@format, 'none][1]; if (type(what) == 'list) { for l in (what) .echo(l, format); } else { switch (format) { case 'center: what = $string.center(what, 79); } echo(buffer_from_strings([what])); } . method motd_cmd arg [args]; .perms(sender(), 'this); .motd(); . method timeout .perms(sender(), 'this); if (!user) { .tell("Timeout (5 minutes)."); disconnect(); } . parent #12 object #13 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 1 owned [] var 1 manager #13 var 1 writable [#13] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'list method to_string arg list, [sep]; var str, part; // uses $data.unparse() rather than tostr() if (!list) return ""; sep = [@sep, " "][1]; str = tostr(list[1]); for part in (delete(list, 1)) str = (str + sep) + tostr(part); return str; . method to_english arg list, [options]; var empty, and, sep; // uses $data.unparse() rather than tostr() empty = [@options, "nothing"][1]; switch (listlen(list)) { case 0: return empty; case 1: return tostr(list[1]); } and = [@options, " and ", " and "][2]; sep = [@options, ", ", ", ", ", "][3]; return ((.to_string(delete(list, listlen(list)), sep)) + and) + tostr(list[listlen(list)]); . method map arg list, method, [args]; var out, x; // call 'method on each object, return results. out = []; for x in (list) out = [@out, x.(method)(@args)]; return out; . method filter arg list, method, [args]; var out, x; // similar to .map, but returns a list of objects which returned a // true value from 'method. out = []; for x in (list) { if (x.(method)(@args)) out = [@out, x]; } return out; . method sort arg list, [sortby]; // calls ._sort(). Does not set an element to sort by yet, but should // eventually will have to fix. return ._sort(list, 1, listlen(list)); . method _sort arg lst, x, y; var p, i, j; switch ((y - x) + 1) { case 0, 1: return lst; case 2: if ((lst[x]) <= (lst[y])) return lst; p = lst[x]; lst = replace(lst, x, lst[y]); lst = replace(lst, y, p); return lst; case 3: if ((lst[x]) <= (lst[x + 1])) { if ((lst[x + 1]) <= (lst[y])) { } else if ((lst[x]) <= (lst[y])) { p = lst[x + 1]; lst = replace(lst, x + 1, lst[y]); lst = replace(lst, y, p); } else { p = lst[x]; lst = replace(lst, x, lst[y]); lst = replace(lst, y, lst[x + 1]); lst = replace(lst, x + 1, p); } } else if ((lst[x]) <= (lst[y])) { p = lst[x]; lst = replace(lst, x, lst[x + 1]); lst = replace(lst, x + 1, p); } else if ((lst[x + 1]) <= (lst[y])) { p = lst[x]; lst = replace(lst, x, lst[x + 1]); lst = replace(lst, x + 1, lst[y]); lst = replace(lst, y, p); } else { p = lst[x]; lst = replace(lst, x, lst[y]); lst = replace(lst, y, p); } return lst; } p = lst[x]; i = x; j = y; while (1) { while ((i < j) && (p <= (lst[j]))) j = j - 1; if (i == j) break; lst = replace(lst, i, lst[j]); i = i + 1; while ((i < j) && (p >= (lst[i]))) i = i + 1; if (i == j) break; lst = replace(lst, j, lst[i]); j = j - 1; } lst = replace(lst, i, p); lst = ._sort(lst, x, i - 1); lst = ._sort(lst, i + 1, y); return lst; . method columnize arg list, cols, [rest]; var width, lines, line, separator, linelength, curcol; // turn [...] into ". . ." // rest[1]==separator; rest[2]==linelength separator = [@rest, " "][1]; linelength = [@rest, 78, 78][2]; width = (linelength / cols) - strlen(separator); lines = []; while (list) { line = pad(list[1], width); list = sublist(list, 2); for curcol in [2 .. cols] { if (list) { line = (line + separator) + pad(list[1], width); list = sublist(list, 2); } } lines = [@lines, line]; } return lines; . method reverse arg list; var elm, reversed; // .reverse(list) // -> list with its elements reversed reversed = []; for elm in (list) reversed = [elm, @reversed]; return reversed; . method compress arg list; var out, last, x; // [a,a,b,b,c,c,d,d] => [a,b,c,d] // removes duplicate entries in a list last = list[1]; out = [last]; for x in (delete(list, 1)) { if (x != last) { out = [@out, x]; last = x; } } return out; . method last arg list; return list[listlen(list)]; . method count arg elem, list; var count; // count of elem in list while (elem in list) { count = count + 1; list = sublist(list, (elem in list) + 1); } return count; . method element_maxlength arg list; var elm, max, len; // Returns tostr(element) string in list. if (type(list) != 'list) throw(~type, "Second argument is not a list"); max = 0; for elm in (list) { len = strlen(tostr(elm)); max = (len > max) ? len | max; } return max; . method nth_element_maxlength arg lists, element; var list, max, len; // Returns longest string whose index is element in one of the lists in lists. if (type(element) != 'integer) throw(~type, "First argument is not an integer"); if (type(lists) != 'list) throw(~type, "Second argument is not a list"); max = 0; for list in (lists) { len = strlen(tostr(list[element])); if (len > max) max = len; } return max; . method numbered_text arg text; var line; // receives a list of strings, returns that list with line numbers pre-pended for line in [1 .. listlen(text)] text = replace(text, line, ((((line < 10) ? " " | "") + tostr(line)) + ": ") + (text[line])); return text; . method slice arg big_list, element; var list, ret_list; // Return elementh' element of all lists in big_list // No type or length checking done for speed purposes. ret_list = []; for list in (big_list) ret_list = [@ret_list, list[element]]; return ret_list; . method swap arg list, a, b; var holder; // swap elements at indexes a and b holder = (> list[a] <); list = (> replace(list, a, list[b]) <); list = replace(list, b, holder); return list; . method max arg [list]; // return greatest element of list (no type checking performed) // if list is [], returns 0 while (listlen(list) > 1) { if ((list[1]) > (list[2])) list = delete(list, 2); else list = delete(list, 1); } return [@list, 0][1]; . method min arg [list]; // return least element of list (no type checking performed) // if list is [], returns 0 while (listlen(list) > 1) { if ((list[1]) < (list[2])) list = delete(list, 2); else list = delete(list, 1); } return [@list, 0][1]; . method lcolumnize arg list, linelen, [seperator]; var lines, mlen, cols, width, c, line; // var width, lines, line, separator, linelength, curcol; // turn [...] into ". . ." // this one just fits the columns into the linelen seperator = [@seperator, " "][1]; lines = []; mlen = (.element_maxlength(list)) + 1; cols = (linelen > mlen) ? linelen / mlen | 1; width = linelen / cols; while (list) { line = pad(list[1], width); list = sublist(list, 2); for c in [2 .. cols] { if (list) { line = (line + seperator) + pad(list[1], width); list = sublist(list, 2); } } lines = [@lines, line]; } return lines; . method swapsort arg list, [sort_by]; var bot_elem, cur_elem, elem, compare; // note: iterative implementation allows sorts of extra-long lists elem = [@sort_by, 1]; compare = [@sort_by, 'gt, 'lt][2]; for bot_elem in [1 .. listlen(list)] { for cur_elem in [bot_elem + 1 .. listlen(list)] { if (._swap_compare(list[bot_elem], list[cur_elem], compare, elem)) list = $list.swap(list, bot_elem, cur_elem); } } return list; . method _swap_compare arg elem1, elem2, compare, [elem]; elem = [@elem, 1][1]; switch (compare) { case 'lt: return (elem1[elem]) < (elem2[elem]); case 'gt: return (elem1[elem]) > (elem2[elem]); default: return 0; } . method heapsort arg list, [sort_by]; var heap, sort_type, sort_elem; sort_elem = [@sort_by, 1][1]; sort_type = [@sort_by, 'gt, 'gt][2]; switch (sort_type) { case 'gt: heap = $small_first_heap_class.new(list, sort_elem); default: return list; } list = []; while (heap.length()) { list = heap.element(1); heap = heap.del(1); } return list; . method map_to_english arg list, method, [args]; // because I (Lynx) am lazy return .to_english(.map(list, method, @args)); . method map_to_string arg list, method, [args]; // because I (Lynx) am lazy return .to_string(.map(list, method, @args)); . method flatten arg list; var toret, elem; // [[[x], x], x] => [x, x, x] toret = []; for elem in (list) { if (type(elem) == 'list) toret = toret + (.flatten(elem)); else toret = toret + [elem]; } return toret; . method sum arg ints; var ret; // returns a sum of each integer in the list. ret = 0; while (ints) { ret = ret + (ints[1]); ints = delete(ints, 1); } return ret; . method non_alphanumeric // returns nun-alphanumeric in a list of characters return ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", "-", "=", "~", "`", "'", "{", "}", "[", "]", "|", "/", "?", "\"", "\\", ",", ".", "<", ">", ";", ":", " "]; . method numbers // returns a list of numbers return ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; . method alphabet //returns the alphabet in a list return ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]; . method center_lines arg lines, width, [args]; var output, line; output = []; for line in (lines) output = [@output, $string.center(line, width, @args)]; return output; . method to_buffer arg list; // assumes this is a list of strings (for now) return buffer_from_strings(list); . parent #7791 object #7794 var 1 dbref 'daemon var 1 child_index 5 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#936] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 7791 buffer `[] var 7791 ip "" var 7791 hostname "" var 7791 port 0 var 7791 socket 0 var 7791 active 0 var 1 inited 1 var 7794 current_receiver 0 var 7794 connections [] var 7794 interface 0 var 7794 timeout 0 var 7794 default_port 0 method new_connection var num, tmp; // we have a new connection. if ((sender() != this()) || (caller() != definer())) throw(~perm, "Invalid call to private method."); catch any { // Get a good dbref num = listlen(connections); tmp = (tostr(.dbref('symbol)) + "_") + tostr(num); while ((| get_name(tosym("connection_" + tmp)) |)) { num = num + 1; tmp = (tostr(.dbref('symbol)) + "_") + tostr(num); } // Create a new receiver current_receiver = $connection.spawn(tmp); current_receiver.add_writer(this()); current_receiver.set_manager(current_receiver); current_receiver.initialize_connection(interface, timeout); // bind it (> .bind(.port(), current_receiver) <); // add it to the list connections = setadd(connections, current_receiver); } with handler { // switch (error()) { // case ~bind: (| current_receiver.close() |); (| .stop_listening() |); rethrow(error()); // } } . method connection_starting // called by $connection.connect() (> .perms(caller(), $connection) <); (> .new_connection() <); . method connection_ending // called by $connection.disconnect() (> .perms(caller(), $connection) <); (> .old_connection(sender()) <); . method old_connection arg obj; // called by $daemon.connection_ending (> .perms(sender(), 'this) <); connections = setremove(connections, obj); . method uninit_daemon (> .perms(caller(), $root) <); (> .reset_daemon() <); (| current_receiver.daemon_reset() |); interface = 0; current_receiver = 0; connections = []; timeout = -1; default_port = 0; . method init_daemon (> .perms(caller(), $root) <); interface = 0; current_receiver = 0; connections = []; timeout = -1; default_port = 0; . method reset_daemon arg [args]; var c, cons; (> .perms(sender(), 'this) <); args = [@args, 'continue][1]; cons = connections + (current_receiver ? [current_receiver] | []); for c in (cons) { (| c.receive("DAEMON RESET", 'daemon_reset) |); (| c.close() |); } current_receiver = 0; connections = []; if (args == 'continue) (> .new_connection() <); . method set_interface arg obj; (> .perms(sender(), 'manager) <); interface = obj; . method start_listening arg [port]; (> .perms(sender(), 'manager) <); port = [@port, default_port][1]; .set_port(port); .new_connection(); . method stop_listening (> .perms(sender(), 'manager) <); (| .set_port(0) |); (| current_receiver.close() |); (| .reset_daemon('stop) |); (| .unbind(.port()) |); . method set_timeout arg seconds; (> .perms(sender(), 'manager) <); timeout = seconds; . method default_port return default_port; . method set_default_port arg port; (> .perms(sender(), 'manager) <); if (type(port) != 'integer) throw(~type, "Port must be submitted as an integer."); default_port = port; . method connections return connections; . method startup arg [args]; var name, opt, port; (> .perms(caller(), $sys) <); name = tostr(.dbref('symbol)); name = "-p" + substr(name, 1, ("_" in name) - 1); opt = name in args; port = (| toint(args[opt + 1]) |); (| .stop_listening() |); .start_listening(port || default_port); . parent #7794 object #7968 var 1 dbref 'http_daemon var 1 child_index 0 var 1 fertile 0 var 1 manager #7968 var 1 owned [#9658] var 1 owners [#936] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 7791 buffer `[] var 7791 ip "" var 7791 hostname "" var 7791 port 1180 var 7791 socket 0 var 7791 active 0 var 7794 interface #7969 var 7794 current_receiver #9670 var 7794 connections [#9670] var 7794 timeout 0 var 1 inited 1 var 7794 default_port 1180 parent #2 parent #2787 object #1204 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1204 var 1 writable [#1204] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'realms_class var 2787 name ['uniq, "Generic Realms Class Frob"] var 2787 name_aliases [] var 1204 local #[[#7671, ['interior]], [#7672, ['interior]], [#7675, ['interior]], [#7692, ['interior]], [#7696, ['interior]], [#7703, ['interior]], [#7704, ['interior]]] method new arg [args]; args = [@args, ['interior]][1]; (> $places.is_place(sender()) <); local = dict_add(local, sender(), args); return <this(), args>; . method destroyed arg frob; . method init_realms_class .perms(caller(), $root); local = #[]; . method uninit_realms_class var x; .perms(caller(), $root); for x in (local) (x[1]).set_realm($realm_of_creation, 'interior); . method place_destroyed arg place; var x; local = dict_del(local, place); for x in (dict_keys(local)) (| x.place_destroyed(place) |); . method local return local; . parent #30 object #7232 var 1 dbref 'reaper var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owned [#6099, #4578, #9443, #9445, #9417, #9420, #9300, #9615, #1387, #1388, #4309, #4348, #5205, #7245, #7248, #7261] var 1 owners [#936] var 1 writable [] var 1 readable [] var 16 commands [] var 16 shortcuts [] var 15 verbs #[] var 4309 user_data #[['real_name, [1, "???"]], ['email, [1, "???"]]] var 666 current_help #534 var 666 help_dict #[["*", #534], ["help", #547], ["**", #535]] var 922 command_aliases [] var 2787 name ['prop, "Reaper"] var 2787 name_aliases [] var 1179 gender #1182 var 17 prose #[] var 1178 messages #[] var 19 contents [] var 23 location #247 var 23 obvious 1 var 28 body_parts #[] var 30 password "*" var 30 connected_at 0 var 30 last_command_at 0 var 30 connections [] var 30 creation_time 780375877 var 30 parsers [#2000, #2321] var 30 filters [] var 30 action "" var 30 prompt "" var 30 context #[] var 1 quota 75000 var 1 inited 1 parent #1170 object #246 var 1 child_index 0 var 1 owners [#246] var 1 fertile 0 var 16 commands [] var 16 shortcuts [] var 15 verbs #[] var 19 contents [] var 23 location #22 var 30 password "*" var 30 connected_at 0 var 30 last_command_at 0 var 30 connections [] var 30 creation_time 758252662 var 30 action "" var 1 inited 1 var 1 owned [#246] var 1 manager #246 var 1 writable [#246] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'housekeeper method did_disconnect var task_queue, task; if (caller() != $user) throw(~perm, "Permission denied"); // because of guests if (valid(sender())) $scheduler.add_task(300, 'move_user_home, sender()); . method _move_user_home arg who; var home, curloc; .perms(caller(), 'this); if (who.connected()) return; curloc = who.location(); home = who.home(); if (curloc == home) return; curloc.sending_user_home(who); who.move_to(home); . method move_user_home arg who; var home, curloc; .perms(sender(), 'system); if (who.connected()) return; curloc = who.location(); home = who.home(); if (curloc == home) return; who.move_to(home); curloc.did_housekeep(who); . parent #30 object #134 var 1 child_index 44 var 1 owners [#134, [#0]] var 1 fertile 0 var 16 commands [] var 16 shortcuts [] var 15 verbs #[] var 19 contents [] var 23 location #21 var 30 password "*" var 30 connected_at 0 var 30 last_command_at 0 var 30 connections [] var 1 inited 1 var 1 owned [#134] var 922 command_aliases [] var 30 modes #[] var 682 letters #[] var 682 letters_index #[] var 682 senders 1 var 682 readers 1 var 682 notify [#47] var 682 last_letter 0 var 679 subscribed #[[#134, 0]] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 30 prompt "" var 1 manager #134 var 1 writable [#134] var 1 readable ['parameters, 'methods, 'code] var 30 parsers [#2000, #2321] var 30 tell_traceback ['brief, 0] var 30 context #[] var 1 quota 75000 var 1 dbref 'guest var 2787 name ['uniq, "Generic Guest Object"] var 2787 name_aliases [] var 4309 user_data #[['real_name, [1, "???"]], ['email, [1, "???"]]] method init_guest .perms(caller(), $root); .add_filter($wrap_filter); .set_title("a guest"); . method logout arg connection; (| pass(connection) |); .destroy(); . method title_cmd arg com, str; .perms(sender(), 'parser); .tell("Guests are not allowed to change their titles."); . parent #1170 object #282 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 282 task_index 2 var 282 task_queue [[2, 300, 784609082, #9686, #27, 'timeout, ['system], []]] var 30 password 0 var 30 connected_at 0 var 30 last_command_at 0 var 30 connections [] var 30 creation_time 758802496 var 30 action "" var 1 owned [] var 1 info [] var 1 manager #282 var 1 writable [#282] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'scheduler var 282 sub_schedulers [#5264] method remove_first_task var len, i, min; // sender must be an agent, or admin catch any { if (caller() != this()) throw(~perm, "Invalid call to private method"); len = listlen(task_queue); i = 1; while (i != len) { min = len; if (((i * 2) < len) && (((task_queue[i * 2])[2]) < ((task_queue[min])[2]))) min = i * 2; if ((((i * 2) + 1) < len) && (((task_queue[(i * 2) + 1])[2]) < ((task_queue[min])[2]))) min = (i * 2) + 1; task_queue = replace(task_queue, i, task_queue[min]); i = min; } task_queue = sublist(task_queue, 1, len - 1); } with handler { // $sys.log(traceback()); } if (!task_queue) task_index = 1; . method task_queue // sender must be system, for now .perms(sender(), 'system); return task_queue; . method del_task arg tid; var task; // sender must be system, for now. .perms(sender(), 'system); if (type(tid) != 'integer) throw(~type, "Task Identification must be an integer"); for task in (task_queue) { if ((task[1]) == tid) { task_queue = delete(task_queue, task in task_queue); return 1; } } throw(~tasknf, "No task found by that TID"); . method add_task arg time, method, [args]; var task, i, tid, flags; // use `@info $scheduler' for more information. // [tid, time, time(), sender(), caller(), method, flags, args] // time is seconds from insertion time that it will be run (ie 300 == 5 mins) // if ((type(time) != 'integer) || ((type(method) != 'symbol) || (type(args) != 'list))) throw(~type, "Arguments are not an integer, symbol, and list."); if (time < 1) throw(~time, "Time is negative."); if (time > 31536000) throw(~time, "Try to schedule a task LESS than a year from now?"); // task_index = task_index + 1; tid = task_index; // flags can be set in a system only add_task, for now set them as 'system flags = ['system]; task = [tid, time, time(), sender(), caller(), method, flags, args]; task_queue = task_queue + [task]; i = listlen(task_queue); // while ((i > 1) && ((task[2]) < (((task_queue[i / 2])[2]) + ((task_queue[i / 2])[3])))) { task_queue = replace(task_queue, i, task_queue[i / 2]); i = i / 2; } task_queue = replace(task_queue, i, task); . method pulse var task, sub; // called by $sys.heartbeat if (caller() != $sys) throw(~perm, "Sender is not system"); while (task_queue && (time() > (((task_queue[1])[2]) + ((task_queue[1])[3])))) { task = task_queue[1]; ._run_task(task); .remove_first_task(); } // call sub schedulers for sub in (sub_schedulers) (| sub.pulse() |); . method _run_task arg task; var code, args, a; // called by $scheduler only if (caller() != this()) throw(~perm, "Caller is not this"); catch any { // setup the args by hand, becuase we use eval and it expects a string args = task[8]; if (args) { for a in [1 .. listlen(args)] args = replace(args, a, $data.unparse(args[a])); args = $list.to_string(args, ","); } else { args = ""; } code = ((("." + tostr(task[6])) + "(") + args) + ");"; // run it through eval as the sender(): (task[5]).eval([code], task[4]); } with handler { // bounce the errors to the person, or to the system board if it's 'system catch any { (task[4]).tell(["SCHEDULER ERROR: ", @traceback()]); } with handler { if ('system in (task[7])) { $channels.announce('System, traceback()[1]); $channels.announce('System, "task: " + ($data.unparse(task))); } } } . method sys_add_task arg time, method, sender, caller, flags, [args]; var task, i, tid; // use `@info $scheduler' for more information. // [tid, time, time(), sender(), caller(), method, flags, args] // if (!($sys.is_agent(sender()))) throw(~perm, "Sender is not an agent or admin, use .add_task()"); if ((type(time) != 'integer) || ((type(method) != 'symbol) || (type(args) != 'list))) throw(~type, "Arguments are not an integer, symbol, and list."); if (time < 1) throw(~time, "Time is negative."); if (time > 31536000) throw(~time, "Try to schedule a task LESS than a year from now?"); if (!valid(sender)) throw(~type, "The argument for sender is not a valid object"); if (!valid(caller)) throw(~type, "The argument for caller is not a valid object"); if (type(flags) != 'list) throw(~type, "Send flags as a list of symbols"); // task_index = task_index + 1; tid = task_index; // flags can be set in a system only add_task, for now set them as 'system task = [tid, time, time(), sender, caller, method, flags, args]; task_queue = task_queue + [task]; // i = listlen(task_queue); while ((i > 1) && ((task[2]) < (((task_queue[i / 2])[2]) + ((task_queue[i / 2])[3])))) { task_queue = replace(task_queue, i, task_queue[i / 2]); i = i / 2; } task_queue = replace(task_queue, i, task); . method add_sub_scheduler arg object; if (!($sys.is_admin(sender()))) throw(~perm, "Only admins may add sub schedulers."); if (type(object) != 'dbref) throw(~type, "Object must be a dbref."); sub_schedulers = [@sub_schedulers, object]; . method del_sub_scheduler arg object; var pos, s; if (!($sys.is_admin(sender()))) throw(~perm, "Only admins may delete sub schedulers."); if (type(object) != 'dbref) throw(~type, "Object must be a dbref."); pos = object in sub_schedulers; if (!pos) throw(~objnf, "Object not a sub schedulers."); s = []; if (pos > 1) s = [@s, sublist(sub_schedulers, 1, pos - 1)]; if (s < listlen(sub_schedulers)) s = [@s, sublist(sub_schedulers, pos + 1)]; sub_schedulers = s; . parent #28 object #5203 var 1 dbref 'robot var 1 child_index 0 var 1 fertile 0 var 1 manager #5203 var 1 owned [#5203] var 1 owners [#5203] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 2787 name ['uniq, "Robot"] var 2787 name_aliases [] var 1179 gender #1182 var 15 verbs #[] var 17 prose #[['short, "A giant hungry rat. His red eyes glare at you malevontly."]] var 23 location #247 var 23 obvious 1 var 1 inited 1 var 5203 tell_filters [["* says, \"<this>, list commands\"", 'commands]] var 28 body_parts #[] var 19 contents [] var 16 commands [] var 16 shortcuts [] method tell arg text; var t, p; for t in (.tell_filters()) { p = t[1]; p = strsub(p, "<this>", .namef()); if (match_pattern(p, text)) $scheduler.add_task(1, t[2], text); } . method add_tell_filter arg mask, method; .perms(sender()); if ((type(mask) != 'string) || (type(method) != 'symbol)) throw(~type, "Args must be a string and a symbol."); tell_filters = [@tell_filters, [mask, method]]; . method del_tell_filter arg mask; var t, tf; .perms(sender()); if (type(mask) != 'string) throw("Argument must be a string"); tf = []; for t in [1 .. listlen(tell_filters)] { if (((tell_filters[t])[1]) == mask) { if (t > 1) tf = [@tf, @sublist(tell_filters, 1, t - 1)]; if (t < listlen(tell_filters)) tf = [@tf, @sublist(tell_filters, t + 1)]; tell_filters = tf; return; } } throw(~tell_nf, "Mask not found."); . method tell_filters var t; catch ~methodnf { t = pass(); } with handler { t = []; } return [@tell_filters, @t]; . method good_morning arg text; text = $string.to_list(text, " "); .say("Good morning, " + (text[1])); . method say arg what; (.location()).announce((((.namef()) + " says, \"") + what) + "\""); . method commands arg text; var o, who, t; //"* says, \"<this>, list commands\"" text = $string.to_list(text, " "); who = $object.to_dbref(text[1]); o = [(who.namef()) + ", my commands are:"]; for t in (.tell_filters()) o = [@o, ((" \"" + (t[1])) + "\" which calls ") + tostr(t[2])]; .lsay(o); . method lsay arg what; what = [((.namef()) + " says, \"") + (what[1]), @sublist(what, 2)]; (.location()).announce(what); . method follow arg who; if (type(who) == 'string) who = $object.to_dbref(who); if (type(who) != 'dbref) throw(~objnf, ("Object (" + who) + ") unknown."); following = who; . method event arg frob; if (class(frob) != $movement_event) return; (frob.exit()).go_through(); . parent #1093 object #1094 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1094 var 1 writable [#1094] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'wrap_filter method filter arg input; var len, output, e, line; len = sender().linelen(); output = []; input = .compress(input); for e in (input) { e = $string.wrap_line(e, len); output = [@output, e[1]]; for line in (sublist(e, 2)) output = [@output, " " + line]; } return output; . parent #675 object #8788 var 1 dbref 'file var 1 child_index 1 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 8788 content_type "" var 8788 data 0 var 8788 header 0 var 8788 filename "Generic File" method init_file (> .perms(caller(), $root) <); data = 0; header = 0; content_type = "text/plain"; . method uninit_file (> .perms(caller(), $root) <); data = 0; header = 0; content_type = "text/plain"; . method set_header arg new_header; var type, valid_types; (> .perms(sender()) <); if (type(new_header) != 'list) throw(~type, "Header must be a list of strings."); header = new_header; . method set_data arg new_data; var type, valid_types; (> .perms(sender()) <); type = type(new_data); valid_types = ['list, 'buffer]; if (!(type in valid_types)) throw(~type, "Data must be one of: " + ($data.unparse(valid_types))); data = new_data; . method data if (!('parameters in (.is_readable_by(sender())))) throw(~perm, ((sender().namef('xref)) + " does not have permission to see parameters on ") + (.namef('xref))); return data; . method header if (!('parameter in (.is_readable_by(sender())))) throw(~perm, ((sender().namef('xref)) + " does not have permission to see parameters on ") + (.namef('xref))); return header; . method content_type if (!('parameter in (.is_readable_by(sender())))) throw(~perm, ((sender().namef('xref)) + " does not have permission to see parameters on ") + (.namef('xref))); return content_type; . method set_content_type arg type; (> .perms(sender()) <); if (type(type) != 'string) throw(~type, "Content-type must be sent as a string."); content_type = type; . method filename arg [args]; if (!args) return filename; else if ((args[1]) == 'full) return ((filename + " (") + (.dbref())) + ")"; . method set_filename arg fname; var x; (> .perms(sender()) <); if (type(fname) != 'string) throw(~type, ("Filename for " + (.namef('xref))) + " must be submitted as a string."); for x in [1 .. strlen(fname)] { if ((fname[x]) in "!@#$%^&*()+-=~`'{}[]|/?\"\\,<>;: ") throw(~type, "Filenames cannot contain any of: !@#$%^&*()+-=~`'{}[]|/?\"\\,<>;: "); } filename = fname; . method find_file arg path; var child, found; if ((!('parameters in (.is_readable_by(sender())))) && (!(sender() in (.parents())))) throw(~perm, ((sender().dbref()) + " does not have permission to see the filesystem from ") + (.filename())); if (type(path) != 'list) path = explode(path, "/"); if (!path) return 0; if ((listlen(path) == 1) && ((path[1]) == (.filename()))) return; for child in (.children()) { found = child.find_file(sublist(path, 2)); if (found) return found; } return 0; . method generate_html arg [args]; var out; out = []; if ('parameters in (.is_readable_by(sender()))) { out = .data(); if (out && (type(out) != 'buffer)) out = ["<hr width=50% align=center>", ("<center><b>Filename: " + (.filename())) + "</b></center><P>", @out]; } return (> pass(@args) <) + (out || []); . parent #8788 object #8789 var 1 dbref 'http_file var 1 child_index 7 var 1 fertile 1 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 8788 data 0 var 8788 header 0 var 8788 content_type "text/plain" var 1 inited 1 var 8788 filename "generic_http_file" method retrieve_html if (!('parameters in (.is_readable_by(sender())))) throw(~perm, ((sender().namef('xref)) + " does not have permission to get html from ") + (.namef('xref))); return .data(); . method set_filename arg fname; if (fname in ["bin", "objects"]) throw(~invalid, "HTTP Filenames cannot be \"bin\" or \"objects\""); (> pass(fname) <); . parent #8789 object #9292 var 1 dbref 'http_root_file var 1 child_index 1 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 8788 data ["<hr width=50% align=center>", "This is running ColdWeb 0.1, an experimental web server in ColdC. You can browse objects with the path of <tt>/objects/</tt>, where anything following the slash is an object reference (either with or without the $). Such as <tt>/objects/$root</tt>.", "<p>", "The Gatways are available in <tt>/bin/</tt>. Currently we have a <a href=\"/bin/who\">Who Gateway</a>, a <a href=\"/bin/list_method?$http.bin_list_method()\">List Method</a> Gateway, and a <a href=\"/bin/show?$http\">Show Object</a> Gateway.", "<hr width=50% align=center>", "<center> <a href=\"/history.html\"><b>History</b></a> |", " <a href=\"/current.html\"><b>Current</b></a>", "</center>"] var 8788 header 0 var 8788 content_type "text/plain" var 1 inited 1 var 8788 filename "htroot" parent #2485 object #2489 var 1 child_index 0 var 1 fertile 0 var 1 manager #2489 var 1 owners [#936] var 1 writable [#2489] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'or method unparse arg orlist; var str, x; str = ""; for x in (orlist) { catch any { str = (str + (x.unparse())) + " || "; } with handler { str = (str + tostr(x)) + " || "; } } return ("(" + (str && substr(str, 1, strlen(str) - 4))) + ")"; . method test arg orlist, [args]; var val, x; val = 0; for x in (orlist) { catch ~type, ~methodnf { val = x.test(@args); } with handler { val = x; } if (val) break; } return val; . parent #3 object #5 var 1 owners [#936] var 1 owned [] var 1 manager #5 var 1 writable [#5] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'false_lock_class method new return <this(), []>; . method try arg lock, obj; return 0; . parent #2485 object #2490 var 1 child_index 0 var 1 fertile 0 var 1 manager #2490 var 1 owners [#936] var 1 writable [#2490] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'xor method unparse arg xorlist; var str, x; str = ""; for x in (xorlist) { catch any { str = (str + (x.unparse())) + " ^^ "; } with handler { str = (str + tostr(x)) + " ^^ "; } } return ("(" + (str && substr(str, 1, strlen(str) - 4))) + ")"; . method test arg xorlist, [args]; var val, x; val = 0; for x in (xorlist) { catch ~type, ~methodnf { val = val ? !(x.test(@args)) | (x.test(@args)); } with handler { val = val ? !x | x; } } return val; . parent #3775 object #3779 var 1 dbref 'user_db var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#47] var 1 writable [#3779] var 1 readable ['methods, 'code] var 790 database #[] var 1 trusted [#30] var 1 inited 1 var 3779 connected [] var 3775 stripped_characters "!@#$%^&*()_+-=~`'{}[]|/?\"\\,.<>;: " var 3779 invalid_chars "$#@!^&%~" var 3775 reserved_names ["user", "builder", "programmer", "admin", "housekeeper", "Reaper", "noone", "guest", "the", "a", "i", "an", "your", "you'r", "me", "god"] var 3775 invalid_names ["ass", "cunt", "fuck", "shit", "damn"] method users return dict_keys(.database()); . method connected var x; for x in (connected) { if ((!valid(x)) || (| !(x.connections()) |)) connected = setremove(connected, x); } return connected; . method did_connect .perms(caller(), $user); connected = [@connected, sender()]; . method did_disconnect .perms(caller(), $user); connected = setremove(connected, sender()); . method valid_name arg name; if (strlen($string.strip(name, invalid_chars)) < strlen(name)) throw(~invname, ("Names cannot contain any of '" + invalid_chars) + "'."); return (> pass(name) <); . method match arg name; return (> .find(name) <); . parent #1431 parent #2 object #2001 var 1 child_index 0 var 1 fertile 0 var 1 manager #2001 var 1 owners [#47] var 1 writable [#47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'input_parser method parse arg user, str, next_parser, [other_parsers]; var line, result; // checks the incoming line to see if its a keeper, or a command. line = user.lines(); if (line == 'one) { user.new_line(str); user.finish_receiving(); return 'ok; } else { result = .parse_line(str); switch (result[1]) { case 'abort: user.reset_input(); return "** Aborted ** Text thrown away."; case 'not_done: user.new_line(result[2]); case 'done: user.finish_receiving(); case 'pass_command: return next_parser.parse(user, result[2], @other_parsers); } return 'ok; } . method parse_line arg str; var cmd; // do this for blank strings => "" if (!str) { return ['not_done, str]; } else if ((str == ".") || (str == "done")) { return ['done]; // } else if (str[1] == ">") { // return ['pass_command, substr(str, 2, strlen(str) - 1)]; } else if ((str == "abort") || (str == "@abort")) { return ['abort]; } else { return ['not_done, str]; } . parent #12 object #310 var 1 child_index 0 var 1 owners [#936] var 1 fertile 1 var 1 inited 1 var 1 owned [] var 310 opt_rec [] var 1 manager #310 var 1 writable [#310] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'arg_opts method from_str arg opt_str, [subs]; var opts_given, opt_ret, opt, prefix, colon_pos, opt_val, match_opt, opt_type, opt_default, opt_trans_dict, opt_id; opts_given = explode(opt_str); opt_ret = #[]; for opt in (opts_given) { switch (opt[1]) { case "!", "-": prefix = 'minus; case "+": prefix = 'plus; default: prefix = 'none; } if (prefix != 'none) opt = substr(opt, 2); colon_pos = ":" in opt; opt_val = prefix; if (colon_pos) { opt_val = substr(opt, colon_pos + 1); opt = substr(opt, 1, colon_pos - 1); } opt_id = 0; for match_opt in (opt_rec) { if (match_template(match_opt[2], opt)) { opt_type = match_opt[3]; opt_default = match_opt[4]; opt_trans_dict = match_opt[5]; opt_id = match_opt[1]; break; // out of for loop } } if (!opt_id) break; opt_val = ._get_opt_val(opt_val, opt_type, opt_default, opt_trans_dict, prefix); opt_val = ._val_subs(opt_val, opt_default, subs); // may throw duplicate key (which is ok) catch any { opt_ret = dict_add(opt_ret, opt_id, opt_val); } } // account for missing options: for match_opt in (opt_rec) { opt_id = match_opt[1]; if (!(opt_id in dict_keys(opt_ret))) { opt_type = match_opt[3]; opt_default = match_opt[4]; if (opt_type == 'check_presence) opt_val = ['val, 0]; else opt_val = opt_default; opt_val = ._val_subs(opt_val, opt_default, subs); opt_ret = dict_add(opt_ret, opt_id, opt_val); } } return opt_ret; . method _get_opt_val arg opt_val, opt_type, opt_default, opt_trans_dict, prefix; switch (opt_type) { case 'check_presence: opt_val = ['val, 1]; case 'on_off_dict: opt_val = opt_trans_dict[prefix]; case 'obj: if (opt_val) opt_val = ['val, (| get_name(tosym(substr(opt_val, 2))) |)]; else opt_val = opt_default; case 'num: if (opt_val) opt_val = ['val, toint(opt_val)]; else opt_val = opt_default; case 'obj_or_dict: if ((opt_val[1]) == "$") { // may throw namenf opt_val = (| get_name(tosym(substr(opt_val, 2))) |); opt_val = opt_val ? ['val, opt_val] | opt_default; } else { // may throw keynf opt_val = (| opt_trans_dict[opt_val] |) || opt_default; } default: opt_val = opt_default; } return opt_val; . method _val_subs arg opt_val, opt_default, subs; switch (opt_val[1]) { case 'sub: if (type(opt_val[2]) == 'integer) { if (((opt_val[2]) <= listlen(subs)) && ((opt_val[2]) > 0)) opt_val = subs[opt_val[2]]; else throw(~range, "Sub index out of range."); } else if (((opt_default[1]) != 'sub) || (type(opt_default[2]) == 'integer)) { opt_val = ((opt_default[1]) in ['sub, 'val]) ? ._val_subs(opt_default, opt_default, subs) | (opt_default[2]); } case 'val: opt_val = opt_val[2]; default: opt_val = ((opt_default[1]) in ['sub, 'val]) ? ._val_subs(opt_default, opt_default, subs) | (opt_default[2]); } return opt_val; . parent #2679 object #21 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 16 commands [] var 16 shortcuts [] var 15 verbs #[] var 19 contents [#25, #28, #30, #31, #32, #33, #134, #185, #936, #24, #7292, #2250, #8598, #7248, #9552] var 1 inited 1 var 1 owned [] var 1179 gender #1182 var 17 prose #[] var 1 manager #21 var 1 writable [#21] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'nowhere var 2787 name ['prop, "Nowhere"] var 2787 name_aliases [] var 2679 exits [] var 2679 realm <#2717, ['interior]> var 2679 coordinates #[] parent #12 object #2451 var 1 child_index 0 var 1 fertile 0 var 1 manager #2451 var 1 owners [#47] var 1 writable [#47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'object method to_dbref arg obj; var type, dbref; type = type(obj); switch (type) { case 'string: dbref = (| get_name(tosym(substr(obj, 2))) |); if (!dbref) dbref = (> get_name(tosym(lowercase(strsub(obj, " ", "_")))) <); return dbref; case 'dbref: return obj; default: return (> get_name(obj) <); } . method get_name arg obj, [args]; var meth; // get_name(obj, 'method, [args]) (3rd arg must be a list) if (!valid(obj)) return ("** invalid object (" + tostr(obj)) + ") **"; meth = [@args, 'name][1]; args = [@args, [], []][2]; return obj.(meth)(@args); . method see_perms arg obj; var str, x; str = "["; if (obj.fertile()) str = str + "F"; for x in (obj.readable()) str = str + (tostr(x)[1]); return str + "]"; . parent #3 object #8 var 1 owners [] var 1 owned [] var 1 manager #8 var 1 writable [#8] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'or_lock_class method new arg lhs, rhs; if ((type(lhs) != 'frob) || (type(rhs) != 'frob)) throw(~perm, "Arguments are not both frobs."); return <this(), [lhs, rhs]>; . method try arg lock, obj; return ((lock[1]).try(obj)) || ((lock[2]).try(obj)); . parent #40 object #1184 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 40 cgender_name "Female" var 40 gender_name "female" var 40 pronouns #[['pr, "herself"], ['pp, "her"], ['po, "her"], ['ps, "she"], ['pq, "hers"], ['prc, "Herself"], ['ppc, "Her"], ['poc, "Her"], ['psc, "She"], ['pqc, "Hers"]] var 40 number 'singular var 1 manager #1184 var 1 writable [#1184] var 1 readable ['parameters, 'methods, 'code] var 40 context ["herself", "her", "her", "she", "hers", "Herself", "Her", "Her", "She", "Hers"] var 1 dbref 'gender_female parent #7801 object #9440 var 1 dbref 'notice_interface var 1 child_index 22 var 1 fertile 1 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [] var 16 shortcuts [] var 7801 connection 0 var 1 inited 1 method connection_starting (> .perms(sender(), .connection()) <); .send("The Cold Dark has switched to port 1138, sorry for any inconvienience."); (.connection()).close(); . parent #9440 object #9445 var 1 dbref 'notice_interface_2 var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owned [] var 1 owners [#7232] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [] var 16 shortcuts [] var 7801 connection #9444 var 1 inited 1 parent #12 object #45 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 1 owned [] var 1 manager #45 var 1 writable [#45] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'integer method n_to_nth arg number; var tens_digit_is_1, ones_digit, single_digit; if (type(number) != 'integer) throw(~type, "Must receive an integer"); ones_digit = abs(number) % 10; tens_digit_is_1 = ((abs(number) / 10) % 10) == 1; single_digit = abs(number) < 10; if ((ones_digit in [1, 2, 3]) && (!tens_digit_is_1)) { switch (ones_digit) { case 1: return tostr(number) + "st"; case 2: return tostr(number) + "nd"; case 3: return tostr(number) + "rd"; } } else { return tostr(number) + "th"; } . method parse_range arg range_str; var r1, r2; // ("1-5") => (1, 5) -- 1, 5 // ("1-$") => (1, 'end) -- 1, 'end (end number) // (".-3") => ('cur, 3) -- 'cur (current number), 3 // ("#-3") => ('bgn, 3) -- 'bgn (beginning number), 3 range_str = $parse.reference(range_str, "-"); r1 = range_str[1]; r2 = range_str[2]; // if (!r2) r2 = r1; if (!toint(r1)) { if (r1 == ".") r1 = 'cur; else if (r1 == "#") r1 = 'bgn; else throw(~type, "Beginning range invalid."); } else { r1 = toint(r1); } // if (!toint(r2)) { if (r2 == "$") r2 = 'end; else throw(~type, "Ending range invalid."); } else { r2 = toint(r2); } return [r1, r2]; . method to_english arg num; var num_str, sign; // 12500 => "12,500" // if (abs(num) < 9999) // return tostr(num); sign = num ? abs(num) / num | 1; num = abs(num); num_str = ""; while (num > 999) { num_str = ("," + substr(tostr(1000 + (num % 1000)), 2)) + num_str; num = num / 1000; } num_str = tostr(num) + num_str; return ((sign == 1) ? "" | "-") + num_str; . method range arg x, y; var list, element; // creates a list of every number between x and y list = []; for element in [x .. y] list = list + [element]; return list; . parent #3 object #2495 var 1 child_index 0 var 1 fertile 0 var 1 manager #2495 var 1 owners [#936] var 1 writable [#2495] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'inside_lock method test arg objlist, testee, [args]; var x; for x in (objlist) { if (x.contains(testee)) return 1; } return 0; . parent #1431 object #1432 var 1 child_index 0 var 1 fertile 0 var 1 manager #1432 var 1 owners [#47] var 1 writable [#47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'conference_parser method parse arg user, str, next_parser, [other_parsers]; if (str && ((str[1]) == ">")) str = substr(str, 2); else str = "say " + str; return next_parser.parse(user, str, @other_parsers); . parent #40 object #2034 var 1 child_index 0 var 1 fertile 0 var 1 manager #2034 var 1 owners [#2034] var 1 writable [#2034, #47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 40 cgender_name "" var 40 gender_name "" var 40 pronouns #[['pr, "yourselves"], ['pp, "your"], ['po, "you"], ['ps, "you"], ['pq, "yours"], ['prc, "Yourselves"], ['ppc, "Your"], ['poc, "You"], ['psc, "You"], ['pqc, "Yours"]] var 1 inited 1 var 40 number 2 var 40 context ["yourselves", "your", "you", "you", "yours", "Yourselves", "Your", "You", "You", "Yours"] var 1 dbref 'gender_first_person_plural parent #3775 object #3777 var 1 dbref 'mail_db var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#47] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 790 database #[] var 1 trusted [] var 1 inited 1 method valid_recipient arg recip; if (recip.has_ancestor($mail_list)) return 1; return 0; . method mail_name arg obj; return "*" + (obj.namef()); . parent #1170 object #7523 var 1 dbref 'places var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 7523 default_place #21 var 7523 exit_starting_place #22 var 1 info ["Utility object for all 'Places' and items relating to places (such as exits)"] var 7523 starting_place #140 var 7523 default_new_place #2679 var 7523 coordinate_shortcuts #[["n?orth", [0, 0]], ["s?outh", [180, 0]], ["e?ast", [90, 0]], ["w?est", [270, 0]], ["ne|northeast", [45, 0]], ["se|southeast", [135, 0]], ["nw|northwest", [225, 0]], ["sw|southwest", [315, 0]], ["up", [-1, 90]], ["d?own", [-1, -90]]] method place arg which; which = tosym(tostr(which) + "_place"); return (> get_var(which) <); . method is_place arg obj; return 1; if (!(obj.has_ancestor($place))) throw(~place, ("Object \"" + (obj.dbref())) + "\" is not a place."); . method set_place arg which, obj; .perms(sender(), 'manager); (> .is_place(obj) <); if (!(which in (.parameters()))) throw(~place, (toliteral(which) + " is not a valid entry try one of: ") + toliteral(.parameters())); set_var(which, obj); . method coordinates arg str; var x; for x in (coordinate_shortcuts) { if (match_template(x[1], str)) return x[2]; } throw(~coordnf, ("Unable to find coordinate shortcut for \"" + str) + "\"."); . method coordinate_shortcuts return coordinate_shortcuts; . method valid_coordinates arg radial, azimuth; if ((radial > 360) || (radial < (-1))) throw(~invcoord, "Radial coordinate must be from -1 to 360 degrees."); if ((azimuth > 90) || (azimuth < (-90))) throw(~invcoord, "Azimuth coordinate must be from 90 to -90 degrees."); . method invert_coordinates arg radial, azimuth; radial = radial + 180; if (radial > 360) radial = radial - 360; if (azimuth > 0) azimuth = -azimuth; else azimuth = abs(azimuth); return [radial, azimuth]; . parent #12 object #740 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #740 var 1 writable [#740] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'set method difference arg [args]; var set, list, element; // Usage: diff(set 1, set 2, ..., set n) // Returns all elements of set 1 that are not in sets 2..n if (!args) return []; set = args[1]; for list in (delete(args, 1)) { for element in (list) set = setremove(set, element); } return set; . method contains arg [args]; var super, list, element; // True if the first list given is a superset of all subsequent lists. // False otherwise. [] is a superset of [] and nothing else; anything is // a superset of []. If only one list is given, return true. super = args ? args[1] | []; for list in (delete(args, 1)) { for element in (list) { if (!(element in super)) return 0; } } return 1; . method equal arg set1, set2; var element; // True if the two lists given contain the same elements. // False otherwise. while (set1) { element = set1[1]; if ((!element) in set2) return 0; while (element in set2) set2 = setremove(set2, element); while (element in set1) set1 = setremove(set1, element); } return set2 == []; . parent #3775 object #3778 var 1 dbref 'place_db var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#47] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 790 database #[] var 1 trusted 1 var 1 inited 1 method place_destroyed // called in $place.uninit_place (incase the place is in the db) . parent #1170 object #888 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #888 var 1 writable [#888] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'login_watcher method notify arg who, msg; var watch, user, lcont, prefix; .perms(sender(), 'this); prefix = "[login watcher] -> "; lcont = (who.location()).contents(); who = who.namef('titled); for user in ($user_db.connected()) { if (!(user in lcont)) { watch = (| user.watch_logins() |); if (watch && ((watch == 1) || ((type(watch) == 'list) && (who in watch)))) user.tell((((prefix + who) + " has ") + msg) + "."); } } . method did_connect .perms($user, caller()); .notify(sender(), "connected"); . method did_disconnect .perms($user, caller()); .notify(sender(), "disconnected"); . parent #664 object #6099 var 1 dbref 'antisocial var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owned [] var 1 owners [#7232] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [] var 16 shortcuts [] var 1 inited 1 method basic_antisocial_vrb . parent #16 object #1388 var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owners [#7232, #1387, #1388] var 1 writable [#1388, #37] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [#1388, #4309, #4348, #5205, #7245, #7248, #7261] var 16 commands [] var 16 shortcuts [] var 1 inited 1 var 1 dbref 'editors parent #1388 object #1162 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 16 commands [["@abort|abort", 'abort_cmd], ["quit|@quit", 'quit_cmd], ["list|nlist *", 'list_cmd], ["ins?ert *", 'insert_cmd], ["del?ete *", 'del_line_cmd], ["join *", 'join_cmd], ["enter", 'enter_cmd], ["help", 'help_screen]] var 16 shortcuts [["\"*", 'add_line_cmd, [1]], ["s/*/*", 'sub_cmd, ["", 1, 2]], ["fill * @*", 'fill_cmd, ["", 1, 2]], ["fill *", 'fill_cmd, ["", 1, ""]]] var 922 command_aliases [] var 1 inited 1 var 1162 pass_through 0 var 1 manager #1162 var 1 writable [#1162] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'generic_editor method start_editing arg what; // called by user.edit_cmd sender().tell([("The selected editor, " + (.namef('id))) + "must define .start_editing()."]); return 0; . method parse_command arg str; var cmd, loc, result, i, j, templates, template, word, fields, obj, verb_info, subbed_str; // This method works like $user.parse_command // The difference is that the permissions have changed, and after checking aliases and // commands, and nothing was found, resorting to sender().match_command() is an option. if (((sender().editor()) != this()) || (caller() != $user_input)) throw(~perm, "Invalid access to parse_command."); // remove leading spaces, abort on blank line subbed_str = str; while (subbed_str && ((subbed_str[1]) == " ")) subbed_str = substr(subbed_str, 2); if (!subbed_str) return sender().editing(); // sub the string through command aliases first subbed_str = .match_command_aliases(subbed_str); // Check commands on this. cmd = .match_command(subbed_str); if (cmd) return .(cmd[1])(sender().editing(), @cmd[2]); // if we're passing unknowns on to user.parse_command()... if (pass_through) { sender().tell("(Still editing.)"); sender().run_with_users_perms(sender(), 'parse_command, str); } else { sender().tell("I don't understand that."); } return sender().editing(); . method abort_cmd arg editing, com; .perms(sender(), 'parser); if (type(editing) == 'dict) { if (editing['changed]) (editing['user]).tell("Threw away changes and cleared editor variables."); else (editing['user]).tell("No changes to throw away. Cleared editor variables."); } else { (| $admin_2.tell(((.namef('id)) + ": editing corrupeted, == ") + ($data.unparse(editing))) |); } return 0; . method quit_cmd arg editing, com; .perms(sender(), 'parser); if (editing['changed]) { (editing['user]).tell("Changes have been made. Save first, or abort to cancel."); return editing; } else { (editing['user]).tell("Quiting editor."); return 0; } . method adjust arg text, [how]; var line; for line in [1 .. listlen(text)] { if ('spaces in how) text = replace(text, line, " " + (text[line])); if ('numbers in how) text = replace(text, line, (($string.right(tostr(line), 3)) + " :") + (text[line])); } return text; . method list_cmd arg editing, com, rest; var line, text; .perms(sender(), 'parser); if (com == "list") { (editing['user]).tell(editing['text]); } else { text = $generic_editor.adjust(editing['text], 'numbers); for line in [1 .. listlen(text)] { if (line == ((editing['cur_line]) - 1)) (editing['user]).tell((strsub($string.right(tostr(line), 3), " ", "_") + "_:") + ((editing['text])[line])); else if (line == (editing['cur_line])) (editing['user]).tell((strsub($string.right(tostr(line), 3), " ", "^") + "^:") + ((editing['text])[line])); else (editing['user]).tell(text[line]); } } return editing; . method insert_cmd arg editing, com, [args]; var line, text; // re-position and (eventually/optionally) add text .perms(sender(), 'parser); line = [@args, ""][1]; text = [@args, "", ""][2]; if (!line) { (editing['user]).tell(["Syntax: ins*ert line [text]", "! You must supply a line number."]); return editing; } if (line != "$") line = toint(line); else line = listlen(editing['text]) + 1; if (!line) { (editing['user]).tell(["Syntax: ins*ert line [text]", "! You must supply a line number greater than or equal to 1."]); return editing; } if (line > (listlen(editing['text]) + 1)) line = listlen(editing['text]) + 1; editing = $dict.replace(editing, 'cur_line, line); ._show_line(editing); return editing; . method _show_line arg editing; var line; line = (editing['cur_line]) - 1; if (line) (editing['user]).tell((strsub($string.right(tostr(line), 3), " ", "_") + "_:") + ((editing['text])[line])); else (editing['user]).tell("____"); line = line + 1; if (line <= listlen(editing['text])) (editing['user]).tell((strsub($string.right(tostr(line), 3), " ", "^") + "^:") + ((editing['text])[line])); else (editing['user]).tell("^^^^"); return editing; . method insert_line arg editing, line; // insert line at editing['cur_line] // assumes editing['cur_line] is within 1 .. listlen(editing['text]) .perms(sender(), 'this); editing = $dict.replace(editing, 'text, insert(editing['text], editing['cur_line], line)); editing = $dict.replace(editing, 'cur_line, (editing['cur_line]) + 1); editing = $dict.replace(editing, 'changed, 1); return editing; . method add_line_cmd arg editing, line; // "* .perms(sender(), 'parser); editing = .insert_line(editing, line); // ._show_line(editing); (editing['user]).tell(("Added line " + tostr((editing['cur_line]) - 1)) + "."); return editing; . method delete_line arg editing; // delete line at editing['cur_line] // assumes editing['cur_line] is within 1 .. listlen(editing['text]) .perms(sender(), 'this); editing = $dict.replace(editing, 'text, delete(editing['text], editing['cur_line])); editing = $dict.replace(editing, 'changed, 1); editing = $dict.replace(editing, 'cur_line, $list.min(editing['cur_line], listlen(editing['text]))); return editing; . method del_line_cmd arg editing, com, line; // del?ete line_num .perms(sender(), 'parser); line = toint(line) || (editing['cur_line]); if (line <= (editing['cur_line])) { editing = $dict.replace(editing, 'cur_line, line); (editing['user]).tell(((("Removed line " + tostr(editing['cur_line])) + ": \"") + ((editing['text])[line])) + "\"."); editing = .delete_line(editing); } else { (editing['user]).tell("Line number out of range."); } //._show_line(editing); return editing; . method sub_cmd arg editing, com, was, is; // s/from/to/ editing = $dict.replace(editing, 'text, replace(editing['text], (editing['cur_line]) - 1, strsub((editing['text])[(editing['cur_line]) - 1], was, is))); ._show_line(editing); return editing; . method fill_cmd arg editing, com, range, [col]; var start, current, stop, new_text, idx; col = toint([@col, "75"][1]) || 75; if ("-" in range) { start = toint(range); if (!start) { (editing['user]).tell("Must supply a valid range, such as 10, 2-3, or 1-$."); return editing; } range = substr(range, strlen(tostr(start)) + 2); if ((!range) || (range == "$")) stop = listlen(editing['text]); else stop = toint(range); } else { if (!range) start = editing['cur_line]; else start = toint(range); if (!start) { (editing['user]).tell("Must supply a valid range, such as 10, 2-3, or 1-$."); return editing; } stop = start; } // actual change: new_text = editing['text]; current = start; while (current <= stop) { if (strlen(new_text[current]) > col) { idx = col; while (idx && (((new_text[current])[idx]) != " ")) idx = idx - 1; if (!idx) { idx = col + 1; while ((idx < strlen(new_text[current])) && (((new_text[current])[idx]) != " ")) idx = idx + 1; if (idx == strlen(new_text[current])) idx = col; } new_text = insert(new_text, current + 1, substr(new_text[current], idx + 1)); new_text = replace(new_text, current, substr(new_text[current], 1, idx)); stop = stop + 1; } current = current + 1; } editing = $dict.replace(editing, 'text, new_text); editing = $dict.replace(editing, 'cur_line, stop + 1); new_text = $generic_editor.adjust(editing['text], 'numbers); for current in [start .. stop - 1] (editing['user]).tell(new_text[current]); ._show_line(editing); return editing; . method join_cmd arg editing, com, range; var start, stop, current, new_text; new_text = editing['text]; start = toint(range); range = substr(range, strlen(tostr(start)) + 2); stop = toint(range); if (range == "$") stop = listlen(new_text); if ((!start) || (!stop)) { (editing['user]).tell("Syntax: join <range>"); (editing['user]).tell("! You must supply a range of lines to join, such as 3-4 or 1-$"); return editing; } stop = $list.min(stop, listlen(new_text)); // actual change: while (start < stop) { new_text = replace(new_text, start, (new_text[start]) + (new_text[start + 1])); new_text = delete(new_text, start + 1); stop = stop - 1; } editing = $dict.replace(editing, 'text, new_text); editing = $dict.replace(editing, 'cur_line, stop + 1); ._show_line(editing); return editing; . method enter_cmd arg editing, com; (editing['user]).read('done_entering, editing); return editing; . method done_entering arg text, editing; if (sender() != (editing['user])) throw(~perm, "Invalid access to done_entering."); if (listlen(text)) { if (listlen(text) > 1) (editing['user]).tell(((("Added lines " + tostr(editing['cur_line])) + " .. ") + tostr(((editing['cur_line]) + listlen(text)) - 1)) + "."); else (editing['user]).tell(("Added line " + tostr(editing['cur_line])) + "."); while (text) { editing = $dict.replace(editing, 'text, insert(editing['text], text[1], editing['cur_line])); editing = $dict.replace(editing, 'cur_line, (editing['cur_line]) + 1); text = delete(test, 1); } } . method help_msg var msg; msg = []; msg = msg + [" ins?ert * set line number"]; msg = msg + [" del?ete * delete line"]; msg = msg + [" \"* insert text"]; msg = msg + [" abort cancel changes and exit editor"]; msg = msg + [" quit exit if no changes made since last save"]; msg = msg + [" list|nlist list text without|with numbers"]; msg = msg + [" s/*/* str sub: replace first with second in current line."]; msg = msg + [" fill * [@*] wrap lines (@ col, def: 75)"]; msg = msg + [" join * concatonates a range of lines"]; return msg; . method help_screen arg editing, com; // l?ook .perms(sender(), 'this); (editing['user]).tell(.help_msg()); . parent #1162 object #758 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 16 commands [["compile", 'compile_cmd], ["refresh", 'refresh_cmd]] var 16 shortcuts [] var 1 inited 1 var 922 command_aliases [] var 1 manager #758 var 1 writable [#758] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'code_editor method start_editing arg what; var ref, obj, method, code; // called by $user_input.edit_cmd ref = $parse.reference(what); obj = (| sender().match_environment(ref[1]) |); if (!obj) { sender().tell(what + " does not describe an editable method."); return 0; } method = tosym(ref[2]); catch any { code = sender().run_with_users_perms(obj, 'list_method, method, 2); } with handler { if (error() == ~methodnf) { code = []; } else { sender().tell(("You cannot edit " + what) + "."); sender().tell("Error: " + ((traceback()[1])[2])); return 0; } } sender().tell(("Now editing " + what) + "."); code = $generic_editor.adjust(code, 'spaces); // user doing editing, obj to be programmed, method to be programmed, code, current line // number, changes made return #[['user, sender()], ['obj, obj], ['method, method], ['text, code], ['cur_line, 1], ['changed, 0]]; . method compile_cmd arg editing, cmd; var errors, last_edit; .perms(sender(), 'parser); catch any { last_edit = (" // Edited: " + ($time.ldate('mdy, 'dash))) + "/"; last_edit = (last_edit + ($time.ltime('12hr, '_ampm))) + " "; last_edit = (last_edit + "by: ") + ((editing['user]).namef('ref)); errors = (editing['user]).run_with_users_perms(editing['obj], 'compile, (editing['text]) + [last_edit], editing['method]); if (errors) { (editing['user]).tell(errors); } else { (editing['user]).tell("Method compiled."); // clear modified flag editing = $dict.replace(editing, 'changed, 0); } } with handler { (editing['user]).tell("An error occurred attempting to compile."); (editing['user]).tell("The error was " + ((traceback()[1])[2])); } return editing; . method refresh_cmd arg editing, com; var code; // re-loads method if not changed .perms(sender(), 'parser); if (editing['changed]) { (editing['user]).tell("Changes have been made. Compile first to refresh."); } else { catch any { code = (editing['user]).run_with_users_perms(editing['obj], 'list_method, editing['method], 2); } with handler { (editing['user]).tell("Unable to list method into buffer, error was " + ((traceback()[1])[2])); return editing; } editing = $dict.replace(editing, 'text, code); (editing['user]).tell("Done."); } return editing; . method help_msg var msg; msg = []; msg = msg + ["The code editor allows you to modify and re-compile methods."]; msg = msg + ["It includes these commands it inherits from the generic editor:"]; msg = msg + pass(); msg = msg + [""]; msg = msg + ["And adds the following:"]; msg = msg + [" compile compile and store current text"]; msg = msg + [" refresh re-load compiled method"]; msg = msg + [""]; return msg; . parent #7794 object #7810 var 1 dbref 'finger_daemon var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 7791 buffer `[] var 7791 ip "" var 7791 hostname "" var 7791 port 1179 var 7791 socket 0 var 7791 active 0 var 7794 interface #7811 var 7794 current_receiver #9532 var 7794 connections [#9226, #9532] var 7794 timeout 0 var 1 inited 1 parent #1170 object #2742 var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#47] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 1 dbref 'world method daylight // should eventually return something like 'day 'night 'dusk 'dawn return 'day; . parent #2 object #1142 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 1 manager #1142 var 1 writable [#1142] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'wearable_class method new arg name, desc; if (type(name) != 'string) throw(~test, "test reason."); . parent #12 object #51 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 1 owned [] var 1 manager #51 var 1 writable [#51] var 1 readable ['parameters, 'methods, 'code] var 51 quotes [["\"Abandon all hope, ye who enter here.\""], ["\"Pull out Wedge, your not doing any more good back there.\"", " - Luke Skywalker, StarWars"], ["\"God is in the details.\""], ["\"I don't practice what I preach because I'm not the type of person", "I'm preaching to.\"", " - Bob Dobbs"], ["\"I haven't shaved for six years. I seem to be cursed with a thin", "beard.\"", " - Calvin, Age 6 (of Calvin & Hobbes)"], ["\"I may be a Dreamer, but I'm not the only one.\"", " - John Lennon"], ["\"C code. C code run. Run, Code, Run! Please!?\"", " - Anonymous C hacker."], ["\"They who dream by day are cognizant of many things which escape", "those who dream only by night.\"", " - Edgar Allan Poe"], ["\"The good die first, and they whose hearts are dry as a summer dust", "burn to the socket.\"", " - William Wordsworth"], ["\"Banning guns to prevent murder is like banning word processors to", "prevent libel.\"", " - Unknown"]] var 1 dbref 'code method set_obj_param arg obj, param, val; var set_code; // set param on obj to val if (!((sender() == $root) || ($sys.is_admin(sender())))) throw(~perm, "Sender not admin or $root"); if (!valid(obj)) throw(~objnf, ("Object " + ($data.unparse(obj))) + " is not a valid object."); if (!(param in (obj.parameters()))) throw(~parmnf, ((("Parameter " + ($data.unparse(param))) + " is not a parmater on ") + ($data.unparse(obj))) + "."); if ('__set_any in ($obj.methods())) throw(~methexist, "Method '__set_any already defined on target object."); // Copy _set_any to obj set_code = .list_method('_set_var); obj.compile(set_code, '__set_var); // Set and delete method catch any { obj.__set_var(param, val); obj.del_method('__set_var); } with handler { obj.del_method('__set_var); rethrow(error()); } . method _set_var arg param, val; if (sender() != $code) throw(~perm, "Sender not $code"); return set_var(param, val); . method quotes return quotes; . method add_random_quote arg quote, [from]; if (!($sys.is_admin(sender()))) throw(~perm, "Sender is not an owner"); if (type(quote) != 'string) throw(~type, "Quote must be given as a string."); quote = ("\"" + quote) + "\""; quote = $string.wrap_line(quote, 70); quote = from ? [@quote, " - " + (from[1])] | quote; quotes = quotes + [quote]; . method generate_listing arg who, [args]; var meths, methval, input, output, element, header, title, cols, x, z, len, line, linea; // called by one of the who_cmds, does all the grunge work. title = [@args, "Connected Users"][1]; meths = [@args, [['namef, 'titled], ['time_poll], ['realm_name]], [['namef, 'titled], ['time_poll], ['realm_name]]][2]; header = [@args, ["Name", "Times", "Location"], ["Name", "Times", "Location"], ["Name", "Times", "Location"]][3]; cols = [@args, [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]][4]; // get values using $list.map element = $list.map(who, (meths[1])[1], @sublist(meths[1], 2)); input = []; for x in (element) { input = [@input, [x]]; if (strlen(x) > (cols[1])) cols = replace(cols, 1, strlen(x)); } for x in [2 .. listlen(meths)] { methval = $list.map(who, (meths[x])[1], @sublist(meths[x], 2)); for z in [1 .. listlen(methval)] { if (strlen(methval[z]) > (cols[x])) cols = replace(cols, x, strlen(methval[z])); input = replace(input, z, [@input[z], methval[z]]); } } // the header. len = (| sender().linelen() |) || 79; line = ""; linea = ""; for x in [1 .. listlen(cols)] { line = line + pad(header[x], (cols[x]) + 2); linea = linea + pad(pad("", strlen(header[x]), "-"), (cols[x]) + 2); } output = [((("--- " + title) + " (") + tostr(listlen(input))) + ") ---"]; output = [@output, $string.trim(pad(line, len))]; output = [@output, $string.trim(pad(linea, len))]; // tell the rest: for x in (input) { line = ""; for z in [1 .. listlen(cols)] line = line + pad(x[z], (cols[z]) + 2); output = [@output, pad(line, len)]; } return [@output]; . method random_quote var which; which = random(listlen(quotes)); if (which) return quotes[which]; return []; . method valid_email arg email; var host, user, ip, tmp; email = explode(email, "@"); if (listlen(email) != 2) return ['invalid, email, ""]; // if we want we can do something overly extensive with this, but we will not user = email[1]; host = email[2]; if (toint(host[1])) { tmp = hostname(host); if (tmp == "-1") return ['invip, user, host]; } else { tmp = ip(host); if (tmp == "-1") return ['invhostname, user, host]; } return ['valid, user, host]; . method unparse_command arg command; var x, line; // command should be passed as a list, and can either be a command // or shortcut. This will return a string. if (listlen(command) == 2) return toliteral(command[1]); line = ""; for x in (command[3]) { if (type(x) == 'string) line = (line + (line ? " " | "")) + x; else line = ((line + (line ? " " | "")) + "%") + tostr(x); } return ((("\"" + (command[1])) + "\" => \"") + line) + "\""; . method parse_name arg name; // used to parse $named names and aliases. name = explode(name, ","); if (!name) throw(~name, "Emtpy name."); return [name[1], sublist(name, 2)]; . method generate_family_listing arg obj, [type]; var line, obj, colx, col, family, x, out; type = [@type, 'children][1]; family = obj.(type)(); if (!family) { out = ["** None **"]; } else { col = ((| sender().linelen() |) || 79) / 8; colx = col * 3; line = pad(" Name", colx + 2) + pad(" Perms", col - 2); out = [(line + pad("Size ", -col)) + "Manager"]; for obj in (family) { line = " " + (obj.namef('xref)); line = pad(line, colx + 2); line = line + pad(" " + ($object.see_perms(obj)), col - 2); line = line + pad(tostr(obj.size()) + " ", -col); line = line + pad($object.get_name(obj.manager(), 'namef, ['xref]), colx); out = [@out, line]; } } return out; . parent #30 object #31 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 16 commands [["@par?ents *", 'parents_cmd], ["@dest?roy *", 'destroy_cmd], ["@child?ren|@kids *", 'children_cmd], ["@build *", 'build_cmd]] var 16 shortcuts [] var 15 verbs #[] var 19 contents [] var 23 location #21 var 30 password "*" var 30 connected_at 0 var 30 last_command_at 0 var 30 connections [] var 1 inited 1 var 1 owned [] var 922 command_aliases [] var 30 modes #[] var 682 letters #[] var 682 letters_index #[] var 682 senders 1 var 682 readers [#47] var 682 notify [#47] var 682 last_letter 0 var 679 subscribed #[[#31, 0]] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 30 prompt "" var 1 manager #31 var 1 writable [#31] var 1 readable ['parameters, 'methods, 'code] var 30 parsers [#2000, #2321] var 30 tell_traceback ['brief, 0] var 30 context #[] var 1 quota 75000 var 1 dbref 'builder var 2787 name ['uniq, "Generic Builder"] var 2787 name_aliases [] var 4309 user_data #[['real_name, [1, "???"]], ['email, [1, "???"]]] method dig_cmd arg com, exitname, prep, roomname; var egoing, ecoming, exits, here, there; here = .location(); there = $nowhere; if (roomname && ((roomname[1]) == "$")) { // later check the $room_db setup there = (| $object.to_dbref(roomname) |); if (!there) $parse.tell_error(("No room found by the name \"" + roomname) + "\"."); } else { there = ($room_utils.default_type()).spawn(); there.set_name(roomname); .tell(("Created new room \"" + (there.namef('ref))) + "\"."); } // exits = explode(exitname, "|"); if (listlen(exits) == 0) $parse.tell_error("No exits specified!"); if (listlen(exits) > 1) { if (listlen(exits) > 2) $parse.tell_error("Invalid format, too many exits specified"); ecoming = $exit.spawn(); ecoming.set_name(exits[2]); catch any { ecoming.attach(there); ecoming.link(here); .tell(((("Linked " + (here.namef('ref))) + " to ") + (there.namef('ref))) + "."); } with handler { ecoming.destroy(); .tell("Could not make exit from there to here: " + ((traceback()[1])[2])); } } egoing = $exit.spawn(); egoing.set_name(exits[1]); catch any { egoing.attach(here); egoing.link(there); .tell(((("Linked " + (there.namef('ref))) + " to ") + (here.namef('ref))) + "."); } with handler { egoing.destroy(); .tell("Couldn't make exit from here to there: " + ((traceback()[1])[2])); return; } .tell("Place successfully Created and Linked."); . method children_cmd arg verb, what; var line, kid, colx, col, kids, x; what = .match_env_nice(what); kids = what.children(); if (!kids) { .tell(("Children of " + (what.namef('xref))) + ": ** None **"); } else { col = (.linelen()) / 8; colx = col * 3; line = (listlen(kids) > 1) ? "Children" | "Child"; .tell(((line + " of ") + (what.namef('ref))) + ":"); line = pad(" Name", colx + 2) + pad(" Perms", col - 2); .tell((line + pad("Size ", -col)) + "Manager"); for kid in (kids) { line = " " + (kid.namef('xref)); line = pad(line, colx + 2); line = line + pad(" " + ($object.see_perms(kid)), col - 2); line = line + pad(tostr(kid.size()) + " ", -col); line = line + pad($object.get_name(kid.manager(), 'namef, ['xref]), colx); .tell(line); } } . method parents_cmd arg verb, what; var line, par, colx, col, parents, x; what = .match_env_nice(what); parents = what.parents(); col = (.linelen()) / 8; colx = col * 3; line = "Parent" + ((listlen(parents) > 1) ? "s" | ""); .tell(((line + " of ") + (what.namef('ref))) + ":"); line = pad(" Name", colx + 2) + pad(" Perms", col - 2); .tell((line + pad("Size ", -col)) + "Manager"); for par in (parents) { line = " " + (par.namef('xref)); line = pad(line, colx + 2); line = line + pad(" " + ($object.see_perms(par)), col - 2); line = line + pad(tostr(par.size()) + " ", -col); line = line + pad($object.get_name(par.manager(), 'namef, ['xref]), colx); .tell(line); } . method destroy_cmd arg destroy, what; var syntax; if (sender() != this()) throw(~perm, "Sender not this."); syntax = "@destroy <object>"; what = .match_env_nice(what, syntax); catch any { what.destroy(); .tell("Destroyed."); } with handler { $parse.tell_error((traceback()[1])[2], syntax); } . method _build_ask_roomname arg name, there; var x, exit; .perms(sender(), 'this); name = (| $code.parse_name(@name) |); if (!name) { .tell("Invalid room name."); $builder._build_destroy_stuff(there, []); } else { there = ['new, ($places.place('default_new)).spawn()]; (there[2]).set_name(name[1]); for x in (name[2]) (there[2]).add_name_alias(x); .tell((" Created place " + ((there[2]).namef('ref))) + "."); .prompt("Exit name: ", '_build_ask_exitname, there, []); } . method build_cmd arg cmd, str; var there, exit, x; .perms(sender(), 'this); if (!str) { .prompt("Name of new room: ", '_build_ask_roomname, []); } else if ("-aliases" in str) { .tell("Radial/Azimuth Coordinate shortcuts:"); .tell(" Shortcut Radial Azimuth"); for x in ($places.coordinate_shortcuts()) .tell(((" " + pad(x[1], 20)) + pad(tostr((x[2])[1]), 7)) + tostr((x[2])[2])); } else { str = explode(str); there = .match_env_nice(str[listlen(str)]); catch any { $places.is_place(there); } with handler { return .tell((traceback()[1])[2]); } .prompt("Exit Name: ", '_build_ask_exitname, ['old, there], []); } . method _build_destroy_stuff arg there, exits; var success, x; .perms(sender(), 'this); if (there && ((there[1]) == 'new)) { success = (| (there[2]).destroy() |); if (success) .tell("Destination room sucessfully destroyed."); else .tell("Unable to destroy destination room: " + ($data.unparse(there[2]))); } for x in [1 .. listlen(exits)] { success = (| (exits[x]).destroy() |); if (success) .tell(("Exit " + tostr(x)) + " sucessfully destroyed."); else .tell("Unable to destroy exit: " + ($data.unparse(exits[x]))); } . method _build_ask_exitname arg name, there, exits; var x, y; name = (| $code.parse_name(@name) |); if ((!name) && (!exits)) { .tell("Invalid exit name."); ._build_destroy_stuff(there, exits); return; } else if (name) { exits = [@exits, $exit.spawn()]; y = listlen(exits); (exits[y]).set_name(name[1]); for x in (name[2]) (exits[y]).set_name_alias(x); .tell((" Created exit " + ((exits[y]).namef('ref))) + "."); if (y < 2) .prompt("Returning exit name: ", '_build_ask_exitname, there, exits); else .prompt("Coordinates (radial,azimuth): ", '_build_ask_coordinates, there, exits); } else { .prompt("Coordinates (radial,azimuth): ", '_build_ask_coordinates, there, exits); } . method _build_ask_coordinates arg coord, there, exits; var err, radial, azimuth; .perms(sender(), 'this); err = "Invalid coordinates. You must use either radial/azimuth coordinates or use coordinate aliases (use @build -aliases to get a listing of aliases)."; coord = coord[1]; if (!coord) { .tell(err); ._build_destroy_stuff(there, exits); return; } else { catch ~coordnf, ~invcoord { if ($string.is_numeric(coord)) { coord = explode(coord, ","); if (listlen(coord) != 2) { .tell(err + " Seperate actual radial/azimuth coordinates by a comma."); ._build_destroy_stuff(there, exits); return; } radial = toint(coord[1]); azimuth = toint(coord[2]); } else { coord = $places.coordinates(coord); radial = coord[1]; azimuth = coord[2]; } $places.valid_coordinates(radial, azimuth); } with handler { .tell((traceback()[1])[2]); ._build_destroy_stuff(there, exits); return; } .tell((((" Using coordinates: Radial: " + tostr(radial)) + " Azimuth: ") + tostr(azimuth)) + "."); } ._build_done(there, exits, [radial, azimuth]); . method _build_done arg there, exits, coord; var here, x; .perms(sender(), 'this); here = .location(); catch any { (exits[1]).attach(here, there[2], @coord); } with handler { .tell("Unable to attach exit because: "); .tell((traceback()[1])[2]); ._build_destroy_stuff(there, exits); } // second exit if (listlen(exits) == 2) { catch any { (exits[2]).attach(there[2], here, @$places.invert_coordinates(@coord)); } with handler { .tell("Unable to attach return exit because: "); .tell((traceback()[1])[2]); ._build_destroy_stuff([], [exits[2]]); } } .tell("Finished building extension."); .tell("Use `@prose` to set long and short prose descriptions."); . parent #675 object #10 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 1 owned [] var 1 manager #10 var 1 writable [#10] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'lock_parser method parse arg s, env; var stack, lock, n, m, obj, len; stack = []; while (1) { // Look for valid prefixes. while (1) { while (s && ((s[1]) == " ")) s = substr(s, 2); if (!s) throw(~parse, "String ends unexpectedly."); if ((s[1]) == "(") { stack = stack + ['open]; s = substr(s, 2); } else if ((s[1]) == "!") { stack = stack + ['not]; s = substr(s, 2); } else { break; } } // Look for an object obj_name. for n in [1 .. strlen(s)] { if ((s[n]) in ")&|") { n = n - 1; break; } } m = n; while (m && ((s[m]) == " ")) m = m - 1; if (!m) throw(~parse, "Null object obj_name."); obj = (> env.match_environment(substr(s, 1, m)) <); lock = $object_lock_class.new(obj); stack = stack + [lock]; s = substr(s, n + 1); // Loop until no more reduction to be done. while (1) { // Process negations, ands, ors. while (1) { len = listlen(stack); if (len < 2) break; if ((stack[len - 1]) == 'not) { lock = $not_lock_class.new(stack[len]); stack = sublist(stack, 1, len - 2) + [lock]; } else if ((stack[len - 1]) == 'and) { lock = $and_lock_class.new(stack[len - 2], stack[len]); stack = sublist(stack, 1, len - 3) + [lock]; } else if ((stack[len - 1]) == 'or) { lock = $or_lock_class.new(stack[len - 2], stack[len]); stack = sublist(stack, 1, len - 3) + [lock]; } else { break; } } // Close parens, if necessary; otherwise stop. if ((!s) || ((s[1]) != ")")) break; while (s && ((s[1]) == ")")) { len = listlen(stack); if ((len < 2) || ((stack[len - 1]) != 'open)) throw(~parse, "Misplaced right parenthesis."); stack = sublist(stack, 1, len - 2) + [stack[len]]; s = substr(s, 2); while (s && ((s[1]) == " ")) s = substr(s, 2); } } // Are we done? if (!s) { if (listlen(stack) > 1) throw(~parse, "Unmatched left parentheses."); return stack[1]; } // No, we're at a conjunction. if ((s[1]) == "&") { stack = stack + ['and]; s = substr(s, 2); } else if ((s[1]) == "|") { stack = stack + ['or]; s = substr(s, 2); } else { throw(~parse, "Illegal character following right parenthesis."); } } . parent #31 object #32 var 1 child_index 33 var 1 owners [#936] var 1 fertile 0 var 16 commands [["@show *", 'show_cmd], ["@list|@nlist *", 'list_cmd], ["@program *", 'program_cmd], ["@d?isplay *", 'display_cmd], ["@dump *", 'dump_cmd], ["@id *", 'id_cmd], ["@go *", 'go_cmd], ["@mcom?mands *", 'mcommands_cmd], ["@info *", 'info_cmd], ["@descend?ants *", 'descendants_cmd], ["@which *", 'which_cmd], ["@mv|@move|@cp|@copy *", 'copy_move_cmd], ["@del-m?ethod|@delm?ethod|@dm *", 'del_method_cmd], ["@add-m?ethod|@addm?ethod|@am *", 'add_method_cmd], ["@teval *", 'tick_eval_cmd], ["@eval *", 'eval_cmd], ["@ancestor?s|@ascend *", 'ancestors_cmd], ["@add-c?ommand|@ac *", 'add_command_cmd], ["@del-c?ommand|@dc *", 'del_command_cmd], ["@as * eval *", 'eval_as_cmd], ["@def?iner * this|as * eval *", 'eval_as_to_cmd]] var 16 shortcuts [[";*", 'eval_cmd, ["eval", 1]]] var 15 verbs #[] var 19 contents [] var 23 location #21 var 30 password "*" var 30 connected_at 0 var 30 last_command_at 0 var 30 connections [] var 1 inited 1 var 1 owned [] var 32 eval_prefix 0 var 922 command_aliases [] var 30 modes #[] var 682 letters #[] var 682 letters_index #[] var 682 senders 1 var 682 readers [#47] var 682 notify [#47] var 682 last_letter 0 var 679 subscribed #[[#32, 0]] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 30 prompt "" var 1 manager #32 var 1 writable [#32] var 1 readable ['parameters, 'methods, 'code] var 30 parsers [#2000, #2321] var 30 tell_traceback ['brief, 0] var 30 context #[] var 1 quota 75000 var 1 dbref 'programmer var 2787 name ['uniq, "Generic Programmer"] var 2787 name_aliases [] var 4309 user_data #[['real_name, [1, "???"]], ['email, [1, "???"]]] var 9398 setting_templates #[["@list-options", 'string]] var 32 eval_tick_offset 0 method init_programmer .perms(caller(), $root); .set_tell_traceback('verbose, 4); . method uninit_programmer .perms(caller(), $root); . method eval_cmd arg com, str; var result, vars, pkeys, v, evalp, adjust, ticks, time; .perms(sender(), 'this); evalp = .eval_prefix(); pkeys = dict_keys(evalp); adjust = !str; vars = ("var " + ($list.to_string(pkeys, ", "))) + "; "; for v in (pkeys) vars = (vars + (evalp[v])) + "; "; // perform escape substitution str = .eval_subs(str); // Evaluate the line. if (str && ((str[1]) == ";")) str = substr(str, 2); else str = ((vars + " return ") + str) + ";"; time = time(); ticks = tick(); result = .eval([str]); ticks = (tick() - ticks) - eval_tick_offset; time = time() - time; if (adjust && ((result[1]) != 'errors)) { eval_tick_offset = eval_tick_offset + ticks; .tell(("Eval tick offset adjusted by " + tostr(ticks)) + " ticks."); return; } // Display the errors, or the result. if ((result[1]) == 'errors) { .tell(result[2]); } else { .tell("=> " + ($data.unparse(result[2], 'full))); .tell(((("[ ticks: " + tostr(ticks)) + " seconds: ") + tostr(time)) + " ]"); } . method program_cmd arg com, [args]; var syntax, obj, ref, add_hist, why, x; .perms(sender(), 'this); syntax = "Syntax: `@program <obj>.<method>`"; args = explode(args[1]); if (!args) $parse.tell_error("You must give an object and method to program", syntax); ref = $parse.reference(args[1]); obj = .match_env_nice(ref[1], syntax); ref = (ref[2]) || ($parse.tell_error("No method name given.", syntax)); why = ""; add_hist = 1; for x in [2 .. listlen(args)] { if (match_begin("-edited", args[x])) { if (!($sys.is_admin(this()))) .tell("! Only administrators can compile without history comments."); else add_hist = 0; } else { why = (why + " ") + (args[x]); } } args = ['compile, obj, tosym(ref), add_hist, why]; if (!(obj.is_writable_by(this()))) { .tell("! You cannot program that object; ignoring code."); args = replace(args, 1, 'ignore); } .read('programming_done, @args); .tell(((("-- Enter text for " + (obj.dbref())) + ".") + ref) + " --"); . method show_cmd arg com, name; var obj; .perms(sender(), 'this); if (!name) $parse.tell_error("Must specify an object to show.", com + " <object>"); obj = .match_env_nice(name); if (!(| .tell(obj.show()) |)) .tell("Permission denied."); . method _move_method arg syn, ref1, ref2, [opts]; var line, code; .perms(sender(), 'this); catch any { ref1 = $parse.reference(ref1); ref2 = $parse.reference(ref2); if ((!(ref1[2])) || (!(ref2[2]))) $parse.tell_error("You must define both a method to be copied from, and one to be copied to.", syn); ref1 = replace(ref1, 1, .match_env_nice(ref1[1])); ref1 = replace(ref1, 2, tosym(ref1[2])); ref2 = replace(ref2, 1, .match_env_nice(ref2[1])); ref2 = replace(ref2, 2, tosym(ref2[2])); code = (ref1[1]).list_method(ref1[2]); // Parse Options if (opts && ("-edited" in ($list.to_string(opts[1])))) { if (!($sys.is_system(sender()))) .tell("! Sorry, only admins can turn off the edited messages."); } else { line = (" // " + ($time.ldate('mdy, 'dash))) + "/"; line = ((line + ($time.ltime('24hr))) + " ") + (.namef('ref)); line = (((line + ", moved from ") + ((ref1[1]).dbref())) + ".") + tostr(ref1[2]); code = [@code, line]; } // delete the old method, compile the new one. (ref1[1]).del_method(ref1[2]); (ref2[1]).compile(code, ref2[2]); // cool, we made it. line = ((("Method " + ((ref1[1]).dbref())) + ".") + tostr(ref1[2])) + " moved to "; line = (((line + ((ref2[1]).dbref())) + ".") + tostr(ref2[2])) + "."; .tell(line); } with handler { switch (error()) { case ~methodnf: line = (traceback()[1])[2]; line = substr(line, 1, strlen(line) - 1); $parse.tell_error(((line + " on ") + ((ref1[1]).namef('ref))) + ".", syn); case ~perm: $parse.tell_error("You cannot write on that object.", syn); case ~stop: rethrow(error()); default: // they are men, they can deal with the tracebacks $parse.tell_error([(traceback()[1])[2], traceback()[2], traceback()[3]], syn); } } . method del_method_cmd arg com, what; var syntax, obj, ref, res; .perms(sender(), 'this); syntax = ("Syntax: `" + com) + " <obj>.<method>`"; what = explode(what); if (!what) $parse.tell_error("You must give an object and a method to delete", syntax); ref = $parse.reference(what[1]); obj = .match_env_nice(ref[1], syntax); ref = (ref[2]) || ($parse.tell_error("No method name given.", syntax)); res = (| obj.del_method(tosym(ref)) |); if (type(res) == 'error) { switch (res) { case ~methodnf: .tell("! No such method"); default: .tell("! You do not have the perms to modify that object"); } } else { .tell("Method removed."); } . method move_cmd arg com, [args]; var syn; .perms(sender(), 'this); syn = ("`" + com) + " [from] <$obj.ref> [to] <$obj.ref>`"; // figure up args args = explode(@args); if (args && ((args[1]) == "from")) args = delete(args, 1); if ((listlen(args) > 1) && ((args[2]) == "to")) args = delete(args, 2); if (listlen(args) < 2) $parse.tell_error("Not enough arguments sent.", syn); // what type is it (method/parameter) if (("." in (args[1])) && ("." in (args[2]))) return ._move_method(syn, @args); else if (("," in (args[1])) && ("," in (args[2]))) return ._move_parameter(syn, @args); else $parse.tell_error("You must define both methods, or both parameters.", syn); . method list_cmd arg com, str; var code, nums, line, ref, syntax, ancestor, opt; .perms(sender(), 'this); nums = com == "@nlist"; syntax = com + " <object>.<method>"; // figure out the object/reference catch any { ref = $parse.full_reference(str); if ((ref[1]) != 'method) $parse.tell_error("You must submit an object.method() reference", syntax); ancestor = (ref[2]).find_method(ref[3]); code = ancestor.list_method(ref[3]); if (nums) { code = $list.numbered_text(code); } else { for line in [1 .. listlen(code)] code = replace(code, line, " " + (code[line])); } } with handler { switch (error()) { case ~methodnf: line = ((((ref[2]).dbref()) + ".") + tostr(ref[3])) + "()"; $parse.tell_error(line + " not found.", syntax); default: $parse.tell_error((traceback()[1])[2], syntax); } $parse.tell_error((traceback()[1])[2], syntax); } opt = (.setting("@list-options")) || ""; line = ((((ancestor.dbref()) + ".") + tostr(ref[3])) + " ") + opt; if (nums) .tell("--- Method " + line); else .tell("@program " + line); .tell(code); .tell("."); . method copy_move_cmd arg com, [args]; var syn, how, line; .perms(sender(), 'this); syn = ("`" + com) + " [from] <$obj.ref> [to] <$obj.ref>`"; // figure up args args = explode(@args); args = [@args, ""]; args = setremove(args, "from"); args = setremove(args, "to"); if (listlen(args) != 3) $parse.tell_error("Send two object references.", syn); how = (com in ["@mv", "@move"]) ? 'move | 'copy; catch ~namenf { args = [$parse.full_reference(args[1], sender()), args[2], args[3]]; args = [args[1], $parse.full_reference(args[2], sender()), args[3]]; if ((((args[1])[1]) != ((args[2])[1])) && (((args[2])[1]) != 'unknown)) $parse.tell_error(((((("Cannot " + tostr(how)) + ((((args[1])[1]) == 'unknown) ? " an object" | ("from a " + tostr((args[1])[1])))) + " to ") + "a ") + tostr((args[2])[1])) + ".", syn); else if (((args[1])[1]) == 'method) ._copy_move_method(syn, how, @args); else if (((args[1])[1]) == 'parameter) .tell("Parameters are currently unsupported, sorry!"); else $parse.tell("You must specify a full reference for the source object.", syn); } with handler { $parse.tell_error((traceback()[1])[2], syn); } . method display_cmd arg com, disp_ref; var to_show; // display method/parameter info for an object // to_show is a list as follows: // [$object, 'param | 'meth | 'none, "pattern", [opts]] .perms(sender(), 'this); to_show = ._parse_disp_ref(disp_ref); if (to_show) { if ((to_show[4])['header]) ._disp_obj_header(to_show[1], to_show[4]); ._disp_obj_detail(@to_show); .tell($string.center(" + Finis + ", .linelen(), "-")); } . method id_cmd arg verb, obj; .perms(sender(), 'this); obj = .match_env_nice(obj); .tell((((((((obj.namef('xref)) + " ") + ($object.see_perms(obj))) + " ") + ($data.unparse(obj.parents()))) + " ") + tostr(obj.size())) + " bytes"); . method dump_cmd arg com, args; var opts, obj, dbref, x, pdbref, par, data, readable, me, code, syn, tail; .perms(sender(), 'this); syn = [["Options can be:", " +/-n -- nice formatting", " +/-t -- textdump formatting", " +/-m -- show/don't show methods", " +/-p -- show/don't show parameters", "Flags default to \"-n +m +p\""], com + " [options] <object>"]; opts = #[["n", [0, 0]], ["t", [1, 0]], ["m", [1, 0]], ["p", [1, 0]], ["e", [0, 0]]]; args = $parse.options(args, opts); if (!(args[1])) $parse.tell_error(@syn); obj = .match_env_nice((args[1])[1]); me = this(); dbref = obj.dbref(); opts = args[2]; readable = obj.is_readable_by(me); data = (| obj.data() |); if ((opts["p"])[1]) { if (!data) { .tell(" *** Parameters are unreadable by you ***"); } else { if ((opts["n"])[1]) { .tell("Object: " + (obj.namef('ref))); .tell("Parents: " + ($list.to_english($list.map(obj.parents(), 'namef)))); .tell(("Size: " + tostr(obj.size())) + " bytes"); } else { // I'm not sure how the latest drivers handle dbrefs vs objnums for x in (obj.parents()) .tell("parent " + (x.dbref())); .tell("object " + dbref); .tell(""); } for par in (data) { if (type(par[2]) == 'string) { .tell((" *** " + ((par[1]).dbref())) + "'s parameters are unreadable by you ***"); } else { pdbref = (| (par[1]).dbref() |) || toliteral(par[1]); for x in (par[2]) .tell((((("var " + pdbref) + " ") + tostr(x[1])) + " ") + ($data.unparse(x[2]))); } } } } if ((opts["m"])[1]) { .tell(""); if (!('code in readable)) { .tell((" *** " + dbref) + "'s methods are unreadable by you ***"); } else { if ((opts["e"])[1]) tail = " -edited"; else tail = ""; for x in (obj.methods()) { code = obj.list_method(x); if ((opts["n"])[1]) .tell(((("@program " + dbref) + ".") + tostr(x)) + tail); else .tell("method " + tostr(x)); for x in [1 .. listlen(code)] code = replace(code, x, " " + (code[x])); .tell(code); .tell([".", ""]); // this can get long pause(); } } } . method add_method_cmd arg com, what; var syntax, obj, ref, res; .perms(sender(), 'this); syntax = "Syntax: `@add-method <obj>.<method>`"; what = explode(what); if (!what) $parse.tell_error("You must give an object and a method to add", syntax); ref = $parse.reference(what[1]); obj = .match_env_nice(ref[1], syntax); ref = (ref[2]) || ($parse.tell_error("No method name given.", syntax)); res = (| obj.compile([""], tosym(ref)) |); if (res != []) .tell("! You do not have the perms to modify that object"); else .tell("Method added."); . method descendants_cmd arg verb, what; var thing; thing = .match_env_nice(what); if (!thing) return; .tell(("Descendants of " + (thing.namef('ref))) + ":"); .tell(thing._display_descendants()); .tell("---"); . method ancestors_cmd arg verb, what; var thing; thing = .match_env_nice(what); if (!thing) return; .tell(("Ancestors of " + (thing.namef('ref))) + ":"); .tell(thing._display_ancestors()); .tell("---"); . method _parse_disp_ref arg disp_ref; var sep_pos, sep, obj, obj_name, to_show, opts, ref, pattern, which_det; opts = explode(disp_ref); if (!opts) return []; ref = opts[1]; opts = $list.to_string(sublist(opts, 2)); sep_pos = (":" in ref) || (("." in ref) || ((";" in ref) || ("," in ref))); if (sep_pos) { obj_name = substr(ref, 1, sep_pos - 1) || (.namef('ref)); sep = substr(ref, sep_pos, 1); pattern = substr(ref, sep_pos + 1) || "*"; obj = .match_env_nice(obj_name); if (sep in [";", ":"]) { opts = ($string.trim(opts)) + " anc:"; if ((opts[1]) == "$") { opts = opts + (explode(opts)[1]); opts = substr(opts, strlen(explode(opts)[1]) + 1); } else { opts = opts + ","; } } if ((pattern[1]) == "_") opts = "pri" + opts; which_det = #[[":", 'meth], [".", 'meth], [";", 'param], [",", 'param]][sep]; opts = $display_opts.from_str(opts, obj, $list.last(obj.ancestors())); return [obj, which_det, pattern, opts]; } else { obj = .match_env_nice(ref); opts = $display_opts.from_str(opts, obj, $list.last(obj.ancestors())); return [obj, 'none, "", opts]; } . method _disp_obj_detail arg obj, which_det, pattern, opts; var details, info, detail, len, show_private, param; .perms(sender(), 'this); len = .linelen(); if (which_det == 'meth) { info = obj.method_info(opts['max_parent], $misc, '_display_filter, [pattern], (opts['show_private]) ? [] | ["_*"]); details = [["Methods:", ""], ["Lines $parent.method(args)", "First comment or return value"]]; for detail in (info) details = [@details, [(((((((((detail[4]) ? "+" | " ") + ($string.right(tostr(detail[5]), 4))) + " ") + (((detail[1]) != obj) ? (detail[1]).id() | "")) + ".") + tostr(detail[2])) + "(") + (detail[3])) + ")", detail[6]]]; for detail in (details) .tell(pad((pad(detail[1], len / 2) + " ") + (detail[2]), len)); } else if (which_det == 'param) { info = obj.parameter_info(opts['max_parent]); details = ["Parameter(s)"]; for detail in (info) { param = tostr(detail[2]); if (match_pattern(pattern, param) != 0) { detail = ((((" " + (((detail[1]) != obj) ? (detail[1]).namef('id) | "")) + ",") + param) + ": ") + ($data.unparse(detail[3])); if ((opts['chop_props]) && (strlen(detail) > (len - 1))) detail = $string.chop(detail, len); details = [@details, detail]; } } .tell(details); } . method mcommands_cmd arg cmd, what; var obj, coms, c, len, line, emote, opts; // returns all commands in a nice format. // god this is getting ugly. .perms(sender(), 'this); // options opts = explode(what); what = opts[1]; opts = sublist(opts, 2); if (opts && match_begin("-emote", "-e")) emote = 1; // if (what == "") what = .ancestors(); else what = [.match_env_nice(what)]; for obj in (what) { if ((obj.has_ancestor($has_commands)) || (obj.has_ancestor($has_verbs))) { .tell(("Commands on " + (obj.namef('ref))) + ":"); coms = []; coms = coms + ((| obj.shortcuts() |) || []); coms = coms + ((| obj.commands() |) || []); len = ((.linelen()) - 5) / 2; if (!emote) { for c in (coms) { line = (" " + ($string.left(("\"" + (c[1])) + "\"", len))) + " "; .tell(line + ($data.unparse(c[2]))); } } else { for c in (coms) { // they aren't always a _cmd but fk. .tell((((";" + (.dbref())) + ".del_command(") + ($data.unparse(c[2]))) + ")"); line = (((";" + (.dbref())) + ".add_command(\"") + (c[1])) + "\", "; .tell((line + ($data.unparse(c[2]))) + ")"); } } if ((| obj.verbs() |)) { for c in ($dict.to_list(obj.verbs())) { line = (" " + ($string.left(("\"" + (c[1])) + "\"", len))) + " "; line = line + ((((c[2])[2]) == 'remote) ? "rmt " | " "); line = line + ($data.unparse((c[2])[1])); .tell(line); } } if (obj == $has_commands) break; } else { .tell(("Object " + (obj.namef('ref))) + " has no commands."); } } . method _disp_obj_header arg obj, opts; var line, lines, objs, line_len, extra_str; // Display header info for obj .perms(sender(), 'this); line_len = .linelen(); // Object: line = "Object: " + (obj.namef('ref)); if (obj.fertile()) line = line + " (Fertile)"; .tell(line); // Owners: if (opts['header]) { objs = obj.owners(); line = $list.to_english($list.map(objs, 'namef, 'ref)); .tell(("Owner" + ((listlen(objs) > 1) ? "s: " | ": ")) + line); .tell(("Size: " + ($integer.to_english(obj.size()))) + " bytes"); // Parents: [parents] objs = obj.parents(); if (objs) { line = $list.to_english($list.map(objs, 'namef, 'ref)); if (!(opts['chop_head_data])) line = $string.chop(line, line_len - 9); .tell(("Parent" + ((listlen(objs) > 1) ? "s: " | ": ")) + line); } objs = obj.children(); if (objs) { line = $list.to_english($list.map(objs, 'namef, 'ref)); if (!(opts['chop_head_data])) line = $string.chop(line, line_len - 10); .tell(((listlen(objs) > 1) ? "Children: " | "Child: ") + line); } if (obj.has_ancestor($located)) .tell("Location: " + ((obj.location()).namef('ref))); } . method go_cmd arg com, where; var loc, r; if (sender() != this()) throw(~perm, "Sender not this"); loc = (| .match_environment(where) |); if (!loc) { catch any { loc = $room_db.match_room(where); } with handler { switch (error()) { case ~ambig: // check aliases for the hell of it for r in ((traceback()[1])[3]) { if (r.name_match(where)) { loc = r; break; } } if (!loc) $parse.tell_error("Several rooms match that name: " + ($list.to_english($list.map((traceback()[1])[3], 'namef)))); default: $parse.tell_error((traceback()[1])[2]); } } } (.location()).announce((.namef()) + " @go'd elsewhere", this()); .move_to(loc); (.location()).announce((.namef()) + " @go'd here", this()); .tell("You @go'd"); . method info_cmd arg com, obj; var info; .perms(sender(), 'this); obj = .match_env_nice(obj); info = obj.info(); if (!info) return .tell("No information about " + (obj.namef('ref))); .tell("-----"); .tell(info); .tell("-----"); . method eval_subs arg code; var idx, ret_code, sub; ret_code = ""; while (code) { idx = "^" in code; if (!idx) { return ret_code + code; } else if ((idx == strlen(code)) || (substr(code, idx + 1, 1) == "^")) { ret_code = ret_code + substr(code, 1, idx); code = substr(code, idx + 1); if (code && ((code[1]) == "^")) code = substr(code, 2); } else { if (idx > 1) { ret_code = ret_code + substr(code, 1, idx - 1); code = substr(code, idx + 1); } else { code = substr(code, 2); } idx = 1; while ((idx <= strlen(code)) && (!((code[idx]) in " =.()[]=<>?|&!*+-/';\""))) idx = idx + 1; sub = .match_env_nice(substr(code, 1, idx - 1)); ret_code = ret_code + (sub.dbref()); code = substr(code, idx); } } return ret_code; . method eval_prefix .perms(sender(), 'this); return $dict.union(#[["me", "me = this();"], ["here", "here = me.location()"]], eval_prefix || #[]); . method del_command_cmd arg cmd, str; var syn, cmdref, ref; .perms(sender(), 'this); syn = ("`" + cmd) + " <command reference> [from] <object>`"; if (!str) $parse.tell_error("No arguments specified.", syn); if ((str[1]) == "\"") { str = substr(str, 2); cmdref = substr(str, 1, ("\"" in str) - 1); str = explode(substr(str, ("\"" in str) + 1)); } else if ((str[1]) == "'") { str = explode(str); cmdref = tosym(substr(str[1], 2)); } if (!cmdref) $parse.tell_error("Command references can either be templates or symbols.", syn); if (!str) $parse.tell_error("Invalid object reference.", syn); ref = .match_env_nice(str[listlen(str)]); catch any { ref.del_command(cmdref); } with handler { switch (error()) { case ~perm: $parse.tell_error(strsub((traceback()[1])[2], "%O", ((traceback()[1])[3]).namef('xref)), syn); default: $parse.tell_error((traceback()[1])[2], syn); } } .tell(((("Command " + ((type(cmdref) == 'symbol) ? "for method " | "with template ")) + toliteral(cmdref)) + " deleted from ") + (ref.namef('xref))); . method programming_done arg code, status, obj, meth, hist, why; var last_edit, errors; .perms(caller(), $input); if (status == 'ignore) return .tell("Finished ignoring input."); if (hist) { last_edit = (" // " + ($time.ldate('mdy, 'dash))) + "/"; last_edit = (last_edit + ($time.ltime('24hr))) + " "; last_edit = last_edit + (.namef('ref)); if (why) last_edit = (last_edit + ":") + why; code = code + [last_edit]; } catch any { errors = obj.compile(code, meth); if (errors) .tell(errors); else .tell("Method compiled."); } with handler { switch (error()) { case ~perm: $parse.tell_error("! You cannot program that object."); default: $parse.tell_error("! " + ((traceback()[1])[2])); } } . method tick_eval_cmd arg com, str; .eval_cmd(com, (";var ticks,x,y,z; ticks = ticks_left(); " + str) + " ; return ticks-ticks_left()-4;"); . method which_cmd arg which, cmdstr; var cmd, cmds, parent, pcmds, matches, smatches, template, syn, len, line; // searches all commands for str and returns obj.method for said command .perms(sender(), 'this); syn = ("`" + which) + " <template>`"; if (!cmdstr) $parse.tell_error("No template given.", syn); matches = []; smatches = []; template = explode(cmdstr)[1]; for parent in (.ancestors()) { pcmds = (| parent.commands() |); if (pcmds) { for cmd in (pcmds) { if (cmdstr in ($string.strip(cmd[1], "?"))) matches = [@matches, [cmd[1], parent, cmd[2]]]; // else if (match_begin(cmd[1], template)) // matches = [@matches, [cmd[1], parent, cmd[2]]]; } } // do shortcuts seperately so we can note the difference pcmds = (| parent.shortcuts() |); if (pcmds) { for cmd in (pcmds) { if (cmdstr in ($string.strip(cmd[1], "?"))) smatches = [@smatches, [cmd[1], parent, cmd[2], cmd[3]]]; // else if (match_begin(cmd[1], template)) // smatches = [@smatches, [cmd[1], parent, cmd[2], cmd[3]]]; } } if (parent == $has_commands) break; } if ((!matches) && (!smatches)) { .tell(("No commands found matching the template \"" + cmdstr) + "\"."); return; } len = (.linelen()) / 2; .tell(("Commands matching the template \"" + cmdstr) + "\":"); for cmd in (matches) { line = (" " + pad($code.unparse_command(delete(cmd, 2)), len)) + " "; .tell((((line + ((cmd[2]).dbref())) + ".") + tostr(cmd[3])) + "()"); } for cmd in (smatches) { line = (" " + pad($code.unparse_command(delete(cmd, 2)), len)) + " "; .tell((((line + ((cmd[2]).dbref())) + ".") + tostr(cmd[3])) + "()"); } . method _copy_move_method arg syn, how, ref1, ref2, opts; var line, code, type; .perms(sender(), 'this); catch any { code = (ref1[2]).list_method(ref1[3]); if (opts && ("-edited" in opts)) { if (!($sys.is_system(sender()))) .tell("! Only admins can turn off the edited messages."); } else { line = (" // " + ($time.ldate('mdy, 'dash))) + "/"; line = ((line + ($time.ltime('24hr))) + " ") + (.namef('ref)); line = (((line + ", moved from ") + ((ref1[2]).dbref())) + ".") + tostr(ref1[3]); code = [@code, line]; } if (how == 'move) (ref1[2]).del_method(ref1[3]); (ref2[2]).compile(code, ref2[3]); line = ($string.capitalize(tostr(ref1[1]))) + " "; line = (((line + ((ref1[2]).dbref())) + ".") + tostr(ref1[3])) + " "; line = (line + ((how == 'move) ? "moved" | "copied")) + " "; line = (((line + ((ref2[2]).dbref())) + ".") + tostr(ref2[3])) + "."; .tell(line); } with handler { switch (error()) { case ~methodnf: line = (traceback()[1])[2]; line = substr(line, 1, strlen(line) - 1); $parse.tell_error(((line + " on ") + ((ref1[1]).namef('ref))) + ".", syn); case ~perm: $parse.tell_error("You cannot write on that object.", syn); case ~stop: rethrow(error()); default: // they are men, they can deal with the tracebacks .tell("Error encountered:"); .tell_traceback(traceback()); } } . method add_command_cmd arg cmd, str; var syn, sref, ref, template; .perms(sender(), 'this); syn = ("`" + cmd) + " <template> [for] <object.method>`"; if (!str) $parse.tell_error("No arguments specified.", syn); if ((str[1]) != "\"") $parse.tell_error("No template given (must be enclosed in quotes).", syn); str = substr(str, 2); sref = explode(substr(str, ("\"" in str) + 1)); template = substr(str, 1, ("\"" in str) - 1); sref = sref[listlen(sref)]; ref = (| $parse.full_reference(sref, this()) |); if (!ref) $parse.tell_error(("\"" + sref) + "\" is an invalid object.method() reference.", syn); if (!(ref[3])) $parse.tell_error(("No method specified on " + ((ref[2]).dbref())) + ".", syn); if (!template) $parse.tell_error("No template specified.", syn); catch any { (ref[2]).add_command(template, ref[3]); } with handler { .tell_traceback(traceback()); switch (error()) { case ~perm: $parse.tell_error(strsub((traceback()[1])[2], "%O", ((traceback()[1])[3]).namef('xref)), syn); default: $parse.tell_error((traceback()[1])[2], syn); } } .tell(((((("Command " + template) + " added for the method ") + toliteral(ref[3])) + " on ") + ((ref[2]).namef('xref))) + "."); . method eval_as_cmd arg cmd, objname, prep, line; var obj, result; (> .perms(sender(), 'this) <); line = line + ";"; obj = .match_env_nice(objname); result = obj.eval([line]); if ((result[1]) == 'errors) .tell(result[2]); else .tell((("eval as " + (obj.dbref())) + " => ") + ($data.unparse(result[2]))); . method eval_as_to_cmd arg cmd, objname, this, targetname, eval, line; var obj, target, result; (> .perms(sender(), 'this) <); line = line + ";"; obj = .match_env_nice(objname); target = .match_env_nice(targetname); result = obj.eval([line], target); if ((result[1]) == 'errors) .tell(result[2]); else .tell((((((((cmd + " ") + objname) + " ") + this) + " ") + targetname) + " eval => ") + ($data.unparse(result[2]))); . parent #1387 object #26 var 26 source #22 var 26 dest #22 var 26 lock <#4, []> var 1 child_index 119 var 1 owners [#936] var 1 fertile 1 var 15 verbs #[["@lock %this with *", ['lock_vrb, 'remote]]] var 1 inited 1 var 1 owned [] var 1179 gender #1182 var 17 prose #[] var 1 manager #26 var 1 writable [#26] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'exit var 2787 name ['uniq, "Generic Exit"] var 2787 name_aliases [] method init_exit .perms($root, caller()); source = $places.place('default); dest = source; source.add_exit(0, 0); lock = $true_lock_class.new(); . method uninit_exit .perms(caller(), $root); (| source.del_exit() |); (| source.did_detach() |); (| dest.did_detach() |); source = 0; dest = 0; lock = 0; . method environment return [this()] + setremove(source.environment(), this()); . method invoke var actor, here; if (!valid(.dest())) $parse.tell_error((((.name()) + " has an invalid destination, notify the manager (") + ((.manager()).namef('ref))) + ").", "", actor); if (lock.try(sender())) sender().move_to(.dest()); else sender().tell((.name()) + " is locked."); // Send an event (.source()).announce_event($movement_event.new('departure, sender())); (.dest()).announce_event($movement_event.new('arrival, sender())); . method lock_vrb arg cmd, this, prep, str; .perms(sender()); catch ~objnf, ~parse { lock = $lock.parse(str, sender()); sender().tell("Locked."); } with handler { switch (error()) { case ~objnf: sender().tell("Object not found in lock string."); case ~parse: sender().tell("Invalid lock string."); } } . method attach disallow_overrides; arg source_place, dest_place, radial, azimuth; // radial/azimuth coordinates. .perms(sender()); (> $places.is_place(source_place) <); (> $places.is_place(dest_place) <); if (source_place == source) return; (> source_place.will_attach('source, sender()) <); (> dest_place.will_attach('dest, sender()) <); (| source.del_exit() |); source = source_place; dest = dest_place; source_place.add_exit(radial, azimuth); (| source_place.did_attach('source, sender()) |); (| dest_place.did_attach('dest, sender()) |); . method dest return dest; . method source return source; . method place_destroyed arg place; .perms(caller(), $place); .destroy(); . parent #12 object #49 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 49 secs_per_year 31536000 var 49 mins_per_hour 60 var 49 secs_per_week 604800 var 49 secs_per_day 86400 var 49 created_on 758611955 var 49 hours_per_day 24 var 49 days_per_year 365 var 49 year_begin 0 var 49 secs_per_min 60 var 49 days [""] var 49 months #[["Jan", "January"], ["Feb", "February"], ["Mar", "March"], ["Apr", "April"], ["May", "May"], ["Jun", "June"], ["Jul", "July"], ["Aug", "August"], ["Sep", "September"], ["Oct", "October"], ["Nov", "November"], ["Dec", "December"]] var 49 standard 0 var 49 secs_per_hour 3600 var 1 owned [] var 1 manager #49 var 1 writable [#49] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'time_root method init_time .perms(caller(), $root); secs_per_min = 60; secs_per_hour = 3600; secs_per_day = 86400; secs_per_week = 604800; secs_per_year = 31536000; created_on = 0; mins_per_hour = 60; hours_per_day = 24; days_per_year = 365; year_begin = 0; days = [""]; months = [""]; standard = 0; . method time return .convert(); . method ctime arg [time]; time = [@time, .time()][1]; if (!standard) return "still working on this"; else return ctime(time); . method hr_min_sec arg [time]; // returns a list: ["hh", "mm", "ss"] return [tostr(.hour()), tostr(.minute()), tostr(.second())]; . method hour arg [time]; // either send a pre-converted time, or nothing. time = time ? time[1] | (standard ? time() | (.convert())); return ((time % secs_per_year) % secs_per_day) / secs_per_hour; . method convert arg [time]; // converts time into whatever time based off created_on return ([@time, time()][1]) - created_on; . method minute arg [time]; // either send a pre-converted time, or nothing. time = time ? time[1] | (standard ? time() | (.convert())); return (((time % secs_per_year) % secs_per_day) % secs_per_hour) / secs_per_min; . method second arg [time]; // either send a pre-converted time, or nothing. time = time ? time[1] | (standard ? time() | (.convert())); return (((time % secs_per_year) % secs_per_day) % secs_per_hour) % secs_per_min; . method year arg [time]; // either send a pre-converted time, or nothing. // returns years since 'created_on; // prolly not right. time = time ? time[1] | (standard ? time() | (.convert())); return (time / secs_per_year) + year_begin; . method day arg [time]; // either send a pre-converted time, or nothing. // returns days since 'created_on; // prolly not right. time = time ? time[1] | (standard ? time() | (.convert())); return time / secs_per_day; . method minute_str arg [args]; // will call $integer.int_to_name return 'null; . method hour_str arg [args]; // will call $integer.int_to_name return 'null; . method second_str arg [args]; // will call $integer.int_to_name return 'null; . method day_str arg [time]; time = [@time, .time()][1]; return tostr(.day()); . method months return months; . method days return days; . method secs_per_min return secs_per_min; . method secs_per_hour return secs_per_hour; . method secs_per_day return secs_per_day; . method secs_per_week return secs_per_week; . method secs_per_year return secs_per_year; . parent #49 object #334 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 49 created_on 695533749 var 49 hours_per_day 21 var 49 days_per_year 345 var 49 year_begin 425 var 49 secs_per_min 60 var 49 secs_per_hour 4320 var 49 secs_per_day 90720 var 49 secs_per_week 453600 var 49 secs_per_year 41731200 var 49 mins_per_hour 72 var 49 standard 0 var 1 owned [] var 1 manager #334 var 1 writable [#334] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'dark_time method paradise_time arg [args]; var time, hour, mde; // args: terran time() == output of server builtin. // 'seconds == with seconds // 'no_mde == with morning/day/evening hour pre-pension if (args && (type(args[1]) == 'integer)) { time = .convert(args[1]); args = delete(args, 1); } else { time = .time(); } hour = .hour(time); mde = (hour > 7) ? (hour > 14) ? "eh " | "dh " | "mh "; if (args && ('no_mde in args)) mde = ""; hour = hour % 7; hour = (hour == 0) ? 7 | hour; if (args && ('seconds in args)) return ((((mde + tostr(hour)) + ":") + pad(tostr(.minute(time)), 2, "0")) + ":") + pad(tostr(.second(time)), 2, "0"); else return ((mde + tostr(hour)) + ":") + pad(tostr(.minute(time)), 2, "0"); . method ilraitheen_time arg [args]; var time; // args: terran time() == output of server builtin. // 'seconds == with seconds if (args && (type(args[1]) == 'integer)) { time = .convert(args[1]); args = delete(args, 1); } else { time = .time(); } if (args && (type(args[1]) == 'symbol)) return (((tostr(.hour(time)) + ":") + pad(tostr(.minute(time)), 2, "0")) + ":") + pad(tostr(.second(time)), 2, "0"); else return (tostr(.hour(time)) + ":") + pad(tostr(.minute(time)), 2, "0"); . parent #310 object #720 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 310 opt_rec [['max_parent, "anc", 'obj_or_dict, ['sub, 1], #[["^", ['sub, 1]], [",", ['sub, 2]]]], ['show_private, "pri?vate", 'on_off_dict, ['val, 0], #[['plus, ['val, 1]], ['minus, ['val, 0]], ['none, ['val, 1]]]], ['header, "head?er", 'on_off_dict, ['val, 1], #[['plus, ['val, 1]], ['minus, ['val, 0]], ['none, ['val, 1]]]], ['chop_head_data, "hchop", 'on_off_dict, ['val, 0], #[['plus, ['val, 1]], ['minus, ['val, 0]], ['none, ['val, 1]]]], ['chop_props, "pchop", 'on_off_dict, ['val, 1]], ['chop_props, "pchop", 'on_off_dict, ['val, 1], #[['plus, ['val, 1]], ['minus, ['val, 0]], ['none, ['val, 1]]]]] var 1 manager #720 var 1 writable [#720] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'display_opts method set_opts // opt rec format: // ['id,"template",type,default,#[translation_dictionary]] // opt types: // 'check_presence, 'on_off_dict, 'obj, 'num, 'obj_or_dict // sub2 = $list.last(obj.ancestors()) opt_rec = []; opt_rec = opt_rec + [['max_parent, "anc", 'obj_or_dict, ['sub, 1], #[["^", ['sub, 1]], [",", ['sub, 2]]]]]; opt_rec = opt_rec + [['chop_head_data, "chop", 'on_off_dict, ['val, 0], #[['plus, 1], ['minus, 0], ['none, 1]]]]; opt_rec = opt_rec + [['show_private, "pri?vate", 'on_off_dict, ['val, 0], #[['plus, 1], ['minus, 0], ['none, 1]]]]; opt_rec = opt_rec + [['header, "head?er", 'on_off_dict, ['val, 1], #[['plus, 1], ['minus, 0], ['none, 1]]]]; . parent #1204 object #2717 var 1 child_index 0 var 1 fertile 0 var 1 manager #2717 var 1 owned [] var 1 owners [#47] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 1 dbref 'realm_of_creation var 2787 name ['prop, "<Creation>"] var 1204 local #[] parent #7794 object #7799 var 1 dbref 'login_daemon var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 7791 buffer `[] var 7791 ip "" var 7791 hostname "" var 7791 port 0 var 7791 socket 0 var 7791 active 0 var 7794 interface #7800 var 7794 current_receiver 0 var 7794 connections [] var 1 inited 1 var 7794 default_port 1138 parent #40 object #2032 var 1 child_index 0 var 1 fertile 0 var 1 manager #2032 var 1 owners [#2032] var 1 writable [#2032, #47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 40 cgender_name "" var 40 gender_name "" var 40 pronouns #[['pr, "yourself"], ['pp, "your"], ['po, "you"], ['ps, "you"], ['pq, "yours"], ['prc, "Yourself"], ['ppc, "Your"], ['poc, "You"], ['psc, "You"], ['pqc, "Yours"]] var 1 inited 1 var 40 number 1 var 40 context ["yourself", "your", "you", "you", "yours", "Yourself", "Your", "You", "You", "Yours"] var 1 dbref 'gender_first_person parent #2485 object #2487 var 1 child_index 0 var 1 fertile 0 var 1 manager #2487 var 1 owners [#936] var 1 writable [#2487] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'false method unparse arg dummy; return "0"; . method test arg [args]; return 0; . parent #1170 object #465 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 465 channels ['all, 'chatter, 'Darkurthe, 'System, 'Admins, 'Logins] var 1 blessed [#86] var 465 tuners #[['all, 0], ['chatter, 1], ['Darkurthe, 1], ['System, 1], ['Admins, 1], ['Logins, 1]] var 465 senders #[['all, 'admins], ['chatter, 1], ['Darkurthe, 1], ['System, 'admins], ['Admins, 1], ['Logins, 1]] var 465 owners #[[#47, 5]] var 465 channel_owner #[['all, #47], ['chatter, #37], ['Darkurthe, #37], ['System, #47], ['Admins, #37], ['Logins, #47]] var 465 listeners #[['all, 'connected], ['chatter, [#37, #2084, #2277, #4312, #5427, #5507, #7474]], ['Darkurthe, [#37, #2005, #2389, #4312]], ['System, [#2008, #2116, #2084, #2277, #2537, #2652, #4312, #4562, #5507, #7275, #7474, #7756, #37]], ['Admins, [#2008, #2116, #2005, #2277, #37, #4312, #2015]], ['Logins, [#37, #2116, #2277, #2015]]] var 465 max_channels_owned 3 var 1 owned [] var 1 manager #465 var 1 writable [#465] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [#246] var 1 dbref 'channels method __admins return $sys.system(); . method del_channel arg channel; var c; if ((sender() != (channel_owner[channel])) && (!(.is_writable_by(sender())))) throw(~perm, "Sender is not the owner of the channel"); ._del_channel(channel); c = owners[sender()]; if (c == 1) owners = dict_del(owners, sender()); else owners = dict_add(owners, sender(), c - 1); . method validate_channel arg channel, [rest]; var x, chars; // receives a string, returns a symbol if valid chars = $string.strip($string.non_alphanumeric(), "-_"); for x in [1 .. strlen(chars)] { if ((chars[x]) in channel) throw(~type, "Channel name can only contain alphanumeric characters"); } if (!channel) throw(~type, "Channel cannot be blank"); if (!rest) { channel = .match_channel(channel); if (!channel) throw(~channenf, "Channel does not exist"); if (listlen(channel) > 1) throw(~ambig, "Channel matches all of: " + ($data.unparse(channel))); channel = channel[1]; } else { channel = tosym(channel); } return channel; . method all_owners if (!(.is_writable_by(sender()))) throw(~perm, "Sender not an owner"); return owners; . method all_listeners if (!(.is_writable_by(sender()))) throw(~perm, "Sender not an owner"); return listeners; . method all_senders if (!(.is_writable_by(sender()))) throw(~perm, "Sender not an owner"); return senders; . method listeners arg channel; var ret; // if (!.is_writable_by(sender())) // throw(~perm, "Sender not an owner"); if (type(listeners[channel]) == 'symbol) ret = .(tosym("__" + tostr(listeners[channel])))(); else ret = listeners[channel]; if (!((sender() == this()) || (sender() in ret))) return []; else return ret; . method senders arg channel; if (sender() != this()) throw(~perm, "Sender not an owner"); if (type(senders[channel]) == 'symbol) return .(tosym("__" + tostr(senders[channel])))(); return senders[channel]; . method match_channel arg channel_name; var channel_matches, channel; channel_matches = []; channel = tosym(channel_name) in channels; if (channel) return [channels[channel]]; for channel in (channels) { if (match_begin(tostr(channel), channel_name)) channel_matches = [@channel_matches, channel]; } return channel_matches; . method allow_send_to arg channel, who, [caller]; var senders; senders = .senders(channel); if (senders == 0) throw(~locked, "Channel is locked"); if (senders == 1) return 1; if (type(senders) == 'list) { if (who in senders) return 1; } if (who == (channel_owner[channel])) return 1; if ((channel == 'System) && caller) return (caller[1]) in senders; return 0; . method allow_tune_in arg channel, who; if ((.senders(channel)) == 0) throw(~locked, "Channel is locked"); if ((tuners[channel]) == 1) return 1; if (type(tuners[channel]) == 'list) { if (who in (tuners[channel])) return 1; } if (who == (channel_owner[channel])) return 1; return 0; . method channels return channels; . method set_channel arg channel_str, [args]; var channel, allowed, senders, listeners; // args: channel_str, allowed, senders, listeners // channel setup: #[['namef, [[allowed], [senders], owner, [listeners]]]]; channel = .validate_channel(channel_str); // basic checks if (!(channel in channels)) throw(~perm, "That channel doesn't exist"); if ((sender() != (channel_owner[channel])) && (!(.is_writable_by(sender())))) throw(~perm, "You are not the owner of the channel"); // get the settings allowed = [@args, 1][1]; senders = [@args, 1, 1][2]; listeners = [@args, [sender()], [sender()], [sender()]][3]; if ((type(senders) == 'symbol) || (type(listeners) == 'symbol)) throw(~type, "Cannot use symbols"); // send it off ._set_channel(channel, allowed, senders, sender(), listeners); . method _del_user_from_channel arg channel, who; var data; if (sender() != this()) throw(~perm, "Sender is not this"); listeners = dict_add(listeners, channel, setremove(listeners[channel], who)); . method _add_user_to_channel arg channel, who; var data; if (sender() != this()) throw(~perm, "Sender is not this"); listeners = dict_add(listeners, channel, (listeners[channel]) + [who]); . method tune_out arg channel; if (!(sender() in (listeners[channel]))) throw(~putz, "You are not tuned into that channel."); ._del_user_from_channel(channel, sender()); . method tune_in arg channel; if (!(channel in channels)) throw(~chnlnf, "Channel is not available, create it first"); if (!(.allow_tune_in(channel, sender()))) throw(~perm, "That is a restricted channel."); if (sender() in (listeners[channel])) throw(~putz, "You are already tuned into that channel"); ._add_user_to_channel(channel, sender()); . method __connected return $user_db.connected(); . method _del_channel arg channel; if (sender() != this()) throw(~perm, "Sender is not this"); tuners = dict_del(tuners, channel); channels = setremove(channels, channel); senders = dict_del(senders, channel); channel_owner = dict_del(channel_owner, channel); listeners = dict_del(listeners, channel); . method new_channel arg channel, allowed, senders, owner, listeners; var c; if (!(.is_writable_by(caller()))) throw(~perm, "Sender not an owner"); // send channel as a string channel = .validate_channel(channel, 'no_search); if (channel in channels) throw(~perm, "That channel already exists"); if (((| owners[sender()] |) == max_channels_owned) && (!(.is_writable_by(sender())))) throw(~perm, ("You can only have " + tostr(max_channels_owned)) + " channels at a time."); ._set_channel(channel, allowed, senders, owner, listeners); // increment ownership c = (owner in dict_keys(owners)) ? (owners[owner]) + 1 | c; owners = dict_add(owners, owner, c); . method init_channels if (sender() != $root) throw(~perm, "Sender is not $root."); tuners = #[['sys, 1], ['all, 0], ['wiz, 1]]; channels = ['sys, 'all, 'wiz]; senders = #[['sys, 'admins], ['all, 'admins], ['wiz, 1]]; owners = #[[$core, 3]]; channel_owner = #[['sys, $core], ['all, $core], ['wiz, $core]]; listeners = #[['sys, []], ['all, 'connected], ['wiz, []]]; max_channels_owned = 3; . method valid_channel arg channel; channel = .validate_channel(channel); if (!(channel in channels)) throw(~chnlnf, "Channel doesn't exist"); return 1; . method all_tuners return tuners; . method _set_channel arg name, tune, send, owner, who; if (sender() != this()) throw(~perm, "Sender is not this"); channels = [@channels, name]; tuners = dict_add(tuners, name, tune); senders = dict_add(senders, name, send); channel_owner = dict_add(channel_owner, name, owner); listeners = dict_add(listeners, name, who); . method announce arg channel, text; var status, who, person, id, x; if (type(channel) == 'string) channel = .validate_channel(channel); if (!(channel in channels)) throw(~chnlnf, "Channel doesn't exist"); if (!(.allow_send_to(channel, sender(), caller()))) throw(~perm, "Sender is not allowed to send to that channel."); for person in (.listeners(channel)) { id = (("<" + tostr(channel)) + " - ") + (sender().namef()); id = (id + ((sender() in (.listeners(channel))) ? "" | ((!(sender().has_ancestor($user))) ? "" | " (tuned out)"))) + "> "; (| person.tell(id + text) |); } . parent #49 object #333 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 49 secs_per_min 60 var 49 secs_per_hour 3600 var 49 secs_per_day 86400 var 49 secs_per_week 604800 var 49 secs_per_year 31536000 var 49 created_on 0 var 49 mins_per_hour 60 var 49 hours_per_day 24 var 49 days_per_year 365 var 49 year_begin 0 var 49 days ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] var 49 months #[["Jan", ["January", 1, 31]], ["Feb", ["February", 2, 28]], ["Mar", ["March", 3, 31]], ["Apr", ["April", 4, 30]], ["May", ["May", 5, 31]], ["Jun", ["June", 6, 30]], ["Jul", ["July", 7, 31]], ["Aug", ["August", 8, 31]], ["Sep", ["September", 9, 30]], ["Oct", ["October", 10, 31]], ["Nov", ["November", 11, 30]], ["Dec", ["December", 12, 31]]] var 49 standard 1 var 1 owned [] var 1 manager #333 var 1 writable [#333] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'time method elapsed arg time, [flags]; var str, t; // compares args[1] with time() and returns hh:mm elapsed // will eventually make flags do things like 'long etc. For now its // just your own time, rather than time(). flags = [@flags, 'time_unparsed][1]; str = ""; switch (flags) { case 'long: return .to_english(time); case 'time_parsed: time = time % 356400; str = str + pad(tostr(time / 3600), -2, "0"); str = (str + ":") + pad(tostr((time % 3600) / 60), -2, "0"); return str; default: time = (time() - time) % 356400; str = str + pad(tostr(time / 3600), -2, "0"); str = (str + ":") + pad(tostr((time % 3600) / 60), -2, "0"); return str; } . method dhms arg secs, [long]; var ret_str, x; if (long) long = 1; if (secs > 86400) { x = secs / 86400; ret_str = tostr(x) + (long ? " day" + ((x < 2) ? "" | "s") | "d"); } else if (secs > 3600) { x = secs / 3600; ret_str = tostr(x) + (long ? " hr" + ((x < 2) ? "" | "s") | "h"); } else if (secs > 60) { x = secs / 60; ret_str = tostr(x) + (long ? " min" + ((x < 2) ? "" | "s") | "m"); } else { ret_str = tostr(secs) + (long ? " sec" + ((secs < 2) ? "" | "s") | "s"); } return ret_str; . method month_str arg [args]; var month, m, time, option; // args[1] = time (opt); args[2] == 'num, 'long, 'short; if (args && (type(args[1]) != 'integer)) { time = time(); option = [@args, 'long][1]; } else { time = [@args, time()][1]; option = [@args, 'long, 'long][2]; } if (type(time) == 'integer) month = substr(ctime(time), 5, 3); else month = substr(time, 5, 3); // special case: switch (option) { case 'short: return month; case 'num: return tostr(((.months())[month])[2]); default: return ((.months())[month])[1]; } . method year_str arg [time]; var how; // (time, how) time defaults to time(), how defaults to long how = [@time, 'long, 'long][2]; time = [@time, .time()][1]; if (how == 'long) return substr(ctime(time), 21); return substr(ctime(time), 23); . method ldate arg [args]; var time, ctime, how, options, sep, hrs, mins, secs; // takes a bunch of numbers and returns info depending upon what the symbol is // time is optional, so is how for that matter. // options are listed to the right of the descriptions. // How: 'long -- Monday, January 10th, 1994 (default) // 'short -- Mon, Jan 10, 94 // 'dmy -- 10/01/94 (ie: DD/MM/YY) ['slash | 'dash] // 'mdy -- 01/10/94 (ie: MM/DD/YY) ['slash | 'dash] // 'ymd -- 94/10/01 (ie: YY/MM/DD) ['slash | 'dash] args = [@args, 'long]; if (type(args[1]) != 'integer) { time = time(); how = args[1]; args = delete(args, 1); } else { time = args[1]; how = args[2]; args = sublist(args, 3); } // figure options first options = [@args, 0][1]; sep = "/"; if (options) { switch (options) { case 'dash: sep = "-"; case 'slash: sep = "/"; } } // figure actual time switch (how) { case 'long: return ((((((.day_str(time)) + ", ") + (.month_str(time))) + " ") + (.month_day_str(time, 'num))) + ", ") + (.year_str(time)); case 'noyear: return ((((.day_str(time)) + ", ") + (.month_str(time))) + " ") + (.month_day_str(time, 'num)); case 'short: ctime = ctime(time); return (((pad(ctime, 3) + ",") + pad(substr(ctime, 4), 7)) + ", `") + (.year_str(time, 'short)); case 'dmy: return (((tostr(.month_day_str(time)) + sep) + (.month_str(time, 'num))) + sep) + (.year_str(time, 'short)); case 'mdy: return (((tostr(.month_str(time, 'num)) + sep) + tostr(.month_day_str(time))) + sep) + (.year_str(time, 'short)); case 'ymd: return ((((.year_str(time, 'short)) + sep) + tostr(.month_str(time, 'num))) + sep) + tostr(.month_day_str(time, 'num)); } . method ltime arg [args]; var time, ctime, how, options, sep1, sep2, ampm, hrs, mins, secs; // takes a bunch of numbers and returns info depending upon what the symbol is // time is optional, so is how for that matter. Uses '12hr '_ampm for default // options are listed after the descriptions. // '24hr -- 24:00 ['a_m_p_m|'ampm|'_ampm|'ap|'no_ampm] // '12hr -- 12:00 ['a_m_p_m|'ampm|'_ampm|'ap|'no_ampm] // '24hr_sec -- 24:00:00 ['a_m_p_m|'ampm|'_ampm|'ap|'no_ampm] // '12hr_sec -- 12:00:00 ['a_m_p_m|'ampm|'_ampm|'ap|'no_ampm] // 'long -- twelve thirty four pm['a_m_p_m|'ampm|'_ampm|'no_ampm] // 'hour -- Twelve o'clock // BTW, incase your wondering, ltime stands for Lynx Time; i'm a bastard 8b args = [@args, '12hr]; if (type(args[1]) != 'integer) { time = time(); how = args[1]; args = delete(args, 1); } else { time = args[1]; how = args[2]; args = sublist(args, 3); } // figure options first options = [@args, '_ampm][1]; sep1 = "/"; sep2 = ":"; ampm = ["", ""]; if (options) { switch (options) { case 'dash: sep1 = "-"; case 'slash: sep1 = "/"; case 'a_m_p_m: ampm = [" a.m.", " p.m."]; case 'ampm: ampm = ["am", "pm"]; case '_ampm: ampm = [" am", " pm"]; case 'ap: ampm = ["a", "p"]; case 'no_ampm: ampm = ["", ""]; } } // figure actual time switch (how) { case '24hr: return substr(.ctime(time), 12, 5); case '24hr_sec: return substr(.ctime(time), 12, 8); case '12hr: time = .hr_min_sec(time); hrs = toint(time[1]); ampm = (hrs < 12) ? ampm[1] | (ampm[2]); hrs = hrs % 12; hrs = (hrs == 0) ? 12 | hrs; return ((tostr(abs(hrs)) + sep2) + (time[2])) + ampm; case '12hr_sec: time = .hr_min_sec(time); hrs = toint(time[1]); ampm = (hrs < 12) ? ampm[1] | (ampm[2]); hrs = hrs % 12; hrs = (hrs == 0) ? 12 | hrs; return ((((tostr(hrs) + sep2) + (time[2])) + sep2) + (time[3])) + ampm; } . method day_str arg [args]; var day, days, d, time, option; if (args && (type(args[1]) != 'integer)) { time = time(); option = [@args, 'long][1]; } else { time = [@args, time()][1]; option = [@args, 'long, 'long][2]; } if (type(time) == 'integer) day = explode(ctime(time))[1]; else day = explode(time)[1]; days = .days(); switch (option) { case 'num: return .month_day_str(); case 'short: return day; default: for d in (days) { if (match_begin(d, day)) return d; } } . method month_day_str arg [time]; time = .ctime([@time, .time()][1]); return substr(time, 9, 2); . method hr_min_sec arg [time]; var ctime; ctime = .ctime(@time); return [substr(ctime, 12, 2), substr(ctime, 15, 2), substr(ctime, 18, 2)]; . method time_stamp return ((.ldate('mdy, 'dash)) + "/") + ($time.ltime('24hr_sec)); . method to_english arg time, [reftime]; var times, words, x, seconds, ctime, months, month, year, days, out; // most of this was stolen from MOO (und ve are evil) if (time < 1) return "0 seconds"; reftime = reftime || time(); ctime = (type(reftime) == 'integer) ? ctime(reftime) | reftime; words = ["year", "month", "day", "hour", "minute", "second"]; times = []; seconds = [60, 60, 24]; for x in (seconds) { times = [time % x, @times]; time = time / x; } months = 0; month = ((.months())[substr(ctime, 5, 3)])[2]; year = toint(.year_str(reftime)); days = ((.months())[substr(ctime, 5, 3)])[3]; while (time >= (days + ((month == 2) && (((year % 4) == 0) && (!((year % 400) in [100, 200, 300])))))) { time = time - days; months = months + 1; month = month + 1; if (month > 12) { year = year + 1; month = 1; } } times = [months / 12, months % 12, time, @times]; out = []; for x in [1 .. listlen(words)] { if ((times[x]) > 0) out = [@out, ((tostr(times[x]) + " ") + (words[x])) + (((times[x]) == 1) ? "" | "s")]; } return $list.to_english(out); . method date arg [args]; var time, opt; time = [@args, time()][1]; opt = [@args, 'long, 'long][2]; if (type(time) != 'integer) throw(~type, "Time must be submitted as an integer."); switch (opt) { case 'short: return ctime(time); default: return ((.ltime(time)) + ", ") + (.ldate(time)); } . parent #664 object #7459 var 1 dbref 'programmer_interface var 1 child_index 0 var 1 fertile 0 var 1 manager #7459 var 1 owned [] var 1 owners [#47] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [] var 16 shortcuts [] var 1 inited 1 parent #32 object #33 var 1 child_index 11 var 1 owners [#936] var 1 fertile 0 var 16 commands [["@copy * to *", 'copy_cmd], ["@task?s", 'tasks_cmd], ["@del-t?ask|@kill *", 'del_task_cmd], ["@backup", 'backup_cmd], ["@shutdown *", 'shutdown_cmd], ["@grep from * for *", 'grep_cmd], ["@egrep from * for *", 'grep_cmd], ["@adjust user|att?itude * to *", 'adjust_user_cmd], ["@log *", 'log_cmd]] var 16 shortcuts [] var 15 verbs #[] var 19 contents [] var 23 location #21 var 30 password "*" var 30 connected_at 0 var 30 last_command_at 0 var 30 connections [] var 1 inited 1 var 1 owned [] var 32 eval_prefix #[["me", "me = this()"], ["here", "here = this().location()"]] var 33 shutdown_started 0 var 922 command_aliases [] var 30 modes #[] var 682 letters #[] var 682 letters_index #[] var 682 senders 1 var 682 readers [#47] var 682 notify [#47] var 682 last_letter 0 var 679 subscribed #[[#33, 0]] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 30 prompt "" var 1 manager #33 var 1 writable [#33] var 1 readable ['parameters, 'methods, 'code] var 30 parsers [#2000, #2321] var 30 tell_traceback ['verbose, 4] var 30 context #[] var 1 quota 75000 var 1 dbref 'admin var 2787 name ['uniq, "Generic Admin"] var 2787 name_aliases [] var 4309 user_data #[['real_name, [1, "???"]], ['email, [1, "???"]]] method init_admin if (caller() != $root) throw(~perm, "Caller is not $root."); $sys.new_admin(); . method uninit_admin if (caller() != $root) throw(~perm, "Caller is not $root."); $sys.admin_going_away(); . method copy_cmd arg sspec, tspec; var mode, parsed, sobj, smtd, code, tobj, tmtd, errors; // @copy dbref.method to dbref[.method] if (!(.is_writable_by(sender()))) throw(~perm, "Sender is not an owner."); // 'mode will hold the copy mode, for possible copying of commands and verbs. // currently only handles methods. mode = 'method; parsed = explode(sspec, "."); if (listlen(parsed) != 2) { .tell(("! \"" + sspec) + "\" is not a reference to the source method."); return; } sobj = $parse.object_match(parsed[1]); if (!sobj) return; smtd = tosym(parsed[2]); catch ~methodnf, ~perm { code = sobj.list_method(smtd); } with handler { switch (error()) { case ~methodnf: .tell(((("! " + (sobj.id())) + " does not define a method ") + toliteral(smtd)) + "."); case ~perm: .tell(("! " + (sobj.id())) + " is not readable by you."); } return; } parsed = explode(tspec, "."); if (listlen(parsed) != 2) tmtd = smtd; else tmtd = tosym(parsed[2]); tobj = $parse.object_match(parsed[1]); if (!tobj) return; catch ~perm { errors = tobj.compile(code, tmtd); if (errors) { // This should never happen. .tell(errors); } else { .tell((((((toliteral(smtd) + " successfully copied from ") + (sobj.id())) + " to ") + (tobj.id())) + ((smtd != tmtd) ? " as " + toliteral(tmtd) | "")) + "."); } } with handler { .tell(((("! Permission denied to @copy " + tostr('mode)) + " to ") + (tobj.id())) + "."); } . method del_task_cmd arg com, task; var syn; .perms(sender(), 'parser); syn = ("`" + com) + " <TID>' (use @tasks to get a TID)"; task = toint(task); if (!task) $parse.tell_error("Tasks must be given as an integer", syn); catch any { $scheduler.del_task(task); } with handler { $parse.tell_error((traceback()[1])[2], syn); } .tell(("Task number " + tostr(task)) + " deleted."); . method tasks_cmd arg com; var output, task, task_queue, line, len_c1, time, args; .perms(sender(), 'parser); task_queue = $scheduler.task_queue(); len_c1 = $list.nth_element_maxlength(1, task_queue); len_c1 = (len_c1 > 5) ? len_c1 + 1 | 5; output = []; time = (($time.ltime('12hr_sec, 'ampm)) + " ") + ($time.ldate('long)); .tell("=====[ Queued Tasks at: " + time); .tell((pad("TID", len_c1) + pad("Exec Time", 20)) + "Task"); .tell((pad("---", len_c1) + pad("---------", 20)) + "----"); if (task_queue) { for task in (task_queue) { // this is broken down like this, because I HATE wrapped lines. line = pad(tostr(task[1]), len_c1); time = (task[2]) + (task[3]); time = (($time.ldate(time, 'dmy, 'dash)) + " ") + ($time.ltime(time, '12hr_sec, 'ampm)); line = line + pad(time, 20); line = (((line + ($data.unparse(task[4]))) + ".") + tostr(task[6])) + "("; args = $data.unparse(task[8]); line = (line + substr(args, 2, strlen(args) - 2)) + ")"; .tell($string.chop(line, .linelen())); } } else { .tell("*** NO QUEUED TASKS ****"); } . method backup_cmd arg com; .perms(sender(), 'parser); .tell("Starting backup."); $sys.do_backup(this()); .tell("Done."); . method shutdown_cmd arg com, [why]; var time; .perms(sender(), 'parser); why = why[1]; time = toint(why); if (time || (why && ((why[1]) == "0"))) why = $list.to_string(sublist(explode(why), 2)); else time = 5; if (why) { .tell([(("Shutdown the server in " + tostr(time)) + " minutes because: ") + why, "[yes|no]"]); .read_line('_shutdown_ask, why, time); } else { .tell("Why do you want to shutdown the server?"); .read_line('_shutdown_why, time); } . method _shutdown_why arg str, time; if (sender() != this()) throw(~perm, "Sender is not this."); if (!str) return .tell("I guess you just don't want to shutdown..."); .tell([(("Shutdown the server in " + tostr(time)) + " minutes because: ") + (str[1]), "[yes|no]"]); .read_line('_shutdown_ask, @str, time); . method _shutdown_ask arg str, why, time; str = str[1]; if (sender() != this()) throw(~perm, "Sender is not this."); if (match_begin("no", str)) return .tell("I didn't think so..."); .tell("Ok..."); if (time) shutdown_started = time * 60; ._shutdown(why); . method _shutdown arg why; var line1, line2; if (sender() != this()) throw(~perm, "Sender is not this"); // if (shutdown_started >= 120) shutdown_started = shutdown_started - 120; else if (shutdown_started >= 60) shutdown_started = shutdown_started - 60; else shutdown_started = 0; // if (shutdown_started > 0) { line1 = " *** SERVER WILL BE SHUTDOWN IN "; line1 = line1 + uppercase($time.elapsed(shutdown_started, 'long)); if (why) line1 = line1 + " because:"; line2 = (" *** " + why) + " ***"; $channels.announce('all, line1 + " ***"); if (why) $channels.announce('all, line2); $scheduler.add_task(120, '_shutdown, why); } else { $sys.shutdown(why); } . method _grep arg what, obj, [type]; var method, found, findings, what; findings = []; for method in (obj.methods()) { found = (| $string.search_pat(what, obj.list_method(method), 1, @type) |); if (found) findings = findings + [[obj, method, found]]; pause(); } return findings; . method adjust_user_cmd arg com, com, who, com, what; var promos, wp, name, kpromos; .perms(sender(), 'parser); what = explode(what); what = what[listlen(what)]; promos = #[["user", ['user, $user]], ["builder", ['builder, $builder]], ["programmer", ['programmer, $programmer]], ["admin", ['admin, $admin]]]; kpromos = dict_keys(promos); who = .match_env_nice(who); wp = who.parents(); if (!(what in kpromos)) $parse.tell_error(("Promote to any of: " + ($list.to_english(kpromos))) + "."); (| who.chparents([(promos[what])[2]]) |); who.tell((((((.namef()) + " has made you ") + ($string.a_or_an(what))) + " ") + what) + "."); if ($guest in wp) { who.set_password("password"); (| who.del_filter($wrap_filter) |); who.tell("! Your password is currently \"password\". "); who.tell("! Please change it immediately with the @password command."); who.tell("! Characters with unchanged passwords before they disconnect will be destroyed."); who.set_title(""); } if (what == "admin") (| who.set_dbref(tosym(who.namef())) |); .tell((((((who.namef()) + " is now ") + ($string.a_or_an(what))) + " ") + what) + "."); . method grep_cmd arg com, prep_from, from, prep_for, what; var found, x; .perms(sender(), 'parser); .tell("Searching..."); if (com == "@grep") { if (("^" in what) != 1) what = "*" + what; if (what && (("$" in what) != strlen(what))) what = what + "*"; } from = .match_env_nice(from); found = .grep(what, from, @(com == "@grep") ? [] | ['regexp]); for x in (found) .tell((((((x[1]).dbref()) + ".") + tostr(x[2])) + " : ") + tostr((x[3])[1])); .tell("--- + Finis + ---"); . method egrep_cmd arg what; var found, x; .perms(sender(), 'parser); .tell("Searching..."); found = .grep(what, 'regexp); for x in (found) .tell((((((x[1]).name_str()) + ".") + tostr(x[2])) + " : ") + tostr((x[3])[1])); .tell("--- + Finis + ---"); . method grep arg what, from, [type]; var object, method, found, findings, count, total; findings = []; count = 0; total = 0; for object in ([from, @from.descendants()]) { found = ._grep(what, object, @type); if (found) findings = findings + [@found]; count = count + 1; total = total + 1; if (count == 50) { .tell(tostr(total) + " Objects Searched..."); count = 0; } pause(); } // fix later .tell(tostr(total) + " Objects Searched."); return findings; . method log_cmd arg com, [line]; .perms(sender(), 'parser); if (!(line[1])) { return $changes_log.read_cmd("", ""); } else { line = line[1]; line = (($time.ldate('mdy, 'dash)) + "]: ") + line; line = ((((.namef()) + " [") + ($time.ltime('24hr))) + "/") + line; $changes_log.add_text([line], this(), 'dont_even_think_it); .tell("Thank you for your donation."); } . parent #1431 object #2000 var 1 child_index 0 var 1 fertile 0 var 1 manager #2000 var 1 owners [#47] var 1 writable [#47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'command_parser method parse arg user, str, next_parser, [other_parsers]; var loc, cmdstr, cmd, obj; // Match commands on user/room. loc = user.location(); // trim the string cmdstr = str; while (cmdstr && ((cmdstr[1]) == " ")) cmdstr = substr(cmdstr, 2); if (str) { // Check commands on this. cmd = user.match_command(cmdstr); if (cmd) return [user, cmd[1], @cmd[2]]; // Check commands on location. cmd = loc.match_command(cmdstr); if (cmd) return [loc, cmd[1], @cmd[2]]; // Try exit names. for obj in (loc.exits()) { if ((obj.match_name(str)) || (obj.match_name_aliases(str))) return [obj, 'invoke]; } } // no luck. return next_parser.parse(user, str, @other_parsers); . parent #1431 object #2294 var 1 child_index 0 var 1 fertile 0 var 1 manager #2294 var 1 owners [#47] var 1 writable [#47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'command_aliases_parser method parse arg user, str, next_parser, [other_parsers]; var alias, match, i, result; for alias in (user.command_aliases()) { match = match_pattern(alias[1], str); if (match != 0) { str = alias[2]; for i in [1 .. listlen(match)] str = strsub(str, "%" + tostr(i), match[i]); break; } } result = next_parser.parse(user, str, @other_parsers); if ((match != 0) && (result == 'failed)) return ("Command converted to \"" + str) + "\" but not understood."; return result; . parent #2250 object #7292 var 1 dbref 'reaper_log var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['methods, 'code] var 7261 public ['readable] var 1032 text [] var 2787 name ['prop, "Reaper Logfile"] var 2787 name_aliases [] var 1179 gender #1182 var 15 verbs #[] var 17 prose #[] var 1178 messages #[] var 23 location #21 var 23 obvious 1 var 1 inited 1 parent #1 object #0 var 0 admins [] var 0 new_user_class #33 var 0 starting_room #140 var 0 exit_starting_room #22 var 0 server_port 1138 var 0 current_receiver #9687 var 0 backup_interval 3600 var 0 last_backup 784609118 var 0 startup_time 784609072 var 1 child_index 1 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 0 startup_objects [] var 0 agents [#246, #0, #282, #27, #1, #7794] var 0 default_heartbeat_interval 5 var 0 default_port 1138 var 1 owned [#9686, #9687] var 0 user_starting_quota 75000 var 0 server_address #[['ip, ""], ['hostname, "somewhere"]] var 1 manager #0 var 1 writable [#0] var 1 readable ['parameters, 'methods, 'code] var 0 anonymous_class #134 var 1 info ["The system object has special server-granted permissions, and performs tasks which require these permisions. It receives the 'heartbeat message, as well as being pivitol in such tasks as generating new connections and creating objects."] var 1 dbref 'sys var 0 system_email_addresses #[['default, "somebody@somewhere"]] var 0 core_version "1.0" method startup arg args; var opt, str, obj; args = sublist(args, 3); catch any { if (sender() != 0) throw(~perm, "Sender is not the server."); // Get rid of any lingering connection objects. for obj in ($old_connection.children()) { catch any { obj.destroy(); } with handler { .log($parse.traceback(traceback(), -1, "")); } } // Look for a port specification -- this will go away opt = "-p" in args; if (opt) { server_port = opt ? (| toint(args[ind + 1]) |) | default_port; args = (| delete(args, opt) |); args = (| delete(args, opt) |); } // Bind to the port. catch ~socket, ~bind { bind(server_port, $sys); } with handler { .log(("Can't bind to port " + tostr(server_port)) + ", exiting..."); shutdown(); } // Initialize variables and log startup message. .new_connection(); log((("Server starting on port " + tostr(server_port)) + " ") + ($time.date())); // Set up five-second heartbeat. set_heartbeat_freq(default_heartbeat_interval); // set the startup time. startup_time = time(); // tell objects who should know, that we are up. for obj in (startup_objects) { .log(("Calling " + (obj.dbref())) + ".startup()"); (| obj.startup(@args) |); } } with handler { .log(("Startup ERROR at " + ctime()) + ":"); .log($parse.traceback(traceback(), -1, "")); } . method uptime return time() - startup_time; . method startup_time return startup_time; . method new_connection // will move this to the new network heirarchy if ((sender() != this()) || (caller() != definer())) throw(~perm, "Invalid call to private method."); current_receiver = $old_connection.spawn(); current_receiver.set_manager(current_receiver); bind(server_port, current_receiver); . method new_user_class return new_user_class; . method set_new_user_class arg obj; if (!(.is_admin(sender()))) throw(~perm, "Sender not an admin."); if (!(obj.has_ancestor($user))) throw(~type, "Argument is not a user object."); new_user_class = obj; . method create_user arg name, password, email, [type]; var user; if ((!(| .perms(caller(), $old_connection) |)) && (!(| .perms(sender(), 'system) |))) throw(~perm, "caller and sender are not allowed to call this method."); type = [@type, 'new_user_class][1]; catch any { user = .(type)().spawn(name); user.set_name(name); if (type == 'new_user_class) user.set_password(password); else user.set_password(crypt(substr(crypt("", substr(name, 1, 2)), 1, random(13))) + "12"); user.set_manager(user); user.set_email(email); user.chown([user]); } with handler { // Failed to initialize the child; destroy it. if (!(| user.destroy() |)) { (| user.uninitialize() |); (| del_name(user.dbref('symbol)) |); (| del_name(tosym(name)) |); (| destroy(user) |); } rethrow(error()); } return user; . method connection_starting // will move this to the new network heirarchy if (caller() != $old_connection) throw(~perm, "Caller is not $old_connection."); .new_connection(); . method admins return admins; . method is_admin arg obj; return (obj == $sys) || (obj in admins); . method binary_dump if (!($sys.is_admin(sender()))) throw(~perm, "Sender is not an admin."); return binary_dump(); . method shutdown arg [why]; var line1, line2; if ((!($sys.is_admin(sender()))) || (definer() != this())) throw(~perm, "Sender is not an admin."); why = [@why, ""][1]; // tell everybody everything line1 = "*** SHUTDOWN called by " + (sender().namef('ref)); if (why) { line1 = line1 + " because:"; line2 = ("*** " + why) + " ***"; } .log(line1 + " ***"); $channels.announce('all, line1 + " ***"); if (why) { .log(line2); $channels.announce('all, line2); } return shutdown(); . method change_sender_parents arg parents; var p; if (caller() != $root) throw(~perm, "Caller is not $root."); (> chparents(sender(), parents) <); . method spawn_sender arg suffix, manager, [owners]; var namestr; (> .perms(caller(), $root, $sys) <); if (!owners) owners = [manager]; namestr = (tostr(sender().dbref('symbol)) + "_") + suffix; return .create([sender()], tosym(namestr), manager, owners); . method assign_dbref arg name; var keepers, x; (> .perms(caller(), $root, $sys) <); if (type(name) != 'symbol) throw(~type, "Name must be given as a symbol."); // don't run this for now--tosym is fucked. if (0) { // yeah, we change it to a string, but they don't have to know that. name = tostr(name); // lowercase all names: name = lowercase(name); // If it isn't a keeper toss the good old error keepers = "abcdefghijklmnopqrstuvwxyz1234567890_"; for x in [1 .. strlen(name)] { if (!((name[x]) in keepers)) throw(~type, "Name has one or more non-alphanumeric characters."); } name = tosym(name); } // make sure nobody has it yet if ((| get_name(name) |) != ~namenf) throw(~perm, "Name already assigned to " + (get_name(name).namef('ref))); // woo woo, i'm filled with joy, lets give them the name. set_name(name, sender()); . method destroy_sender (> .perms(caller(), $root) <); del_name(sender().dbref('symbol)); destroy(sender()); . method is_system arg obj; return (obj in admins) || (obj in agents); . method log arg text; var l; if ((!(| .perms(sender(), 'system) |)) && (!(| .perms(caller(), 'system) |))) throw(~perm, "NOT"); if (type(text) == 'list) { for l in (text) .log(l); } else { log((($time.time_stamp()) + "> ") + text); } . method connect arg [args]; (> .perms(caller(), $network_root) <); (> connect(@args) <); . method heartbeat if (sender() != 0) throw(~perm, "Sender is not the server."); // personally I prefer more granularity, so changed it. // if (time() / backup_interval > last_backup / backup_interval) if (time() > (last_backup + backup_interval)) .do_backup(this()); $scheduler.pulse(); . method do_backup arg who; var line, name; .perms(sender(), 'system); catch any { name = who.namef('ref); .log(("BACKUP (" + name) + ") "); line = (("It is: " + ($time.ltime())) + " -- BACKUP -- called by ") + name; $channels.announce('System, line); } last_backup = time(); pause(); pause(); .text_dump(); . method backup_interval return backup_interval; . method set_backup_interval arg val; if (!(.is_admin(sender()))) throw(~perm, "Sender not an admin"); backup_interval = val; . method sender_data var output, i; if (caller() != $root) throw(~perm, "Caller is not $root."); return data(sender()); . method get_system_email arg what; var email; // email directory for system services, such as arch admins. email = (| system_email_addresses[what] |); if (!email) email = (| system_email_addresses['default] |) || "<no email set>"; return email; . method new_admin if (caller() != $admin) throw(~perm, "Caller is not $admin."); admins = setadd(admins, sender()); . method admin_going_away if (caller != $admin) throw(~perm, "Caller is not $admin."); admins = setremove(admins, sender()); . method add_startup_object arg obj; (> .perms(sender(), 'manager) <); startup_objects = setadd(startup_objects, obj); . method agents return agents; . method text_dump .perms(sender(), 'this); pause(); return text_dump(); . method del_startup_object arg obj; (> .perms(sender(), 'manager) <); startup_objects = setremove(startup_objects, obj); . method server_address arg [type]; type = [@type, 'hostname][1]; return server_address[type]; . method user_starting_quota return user_starting_quota; . method execute arg script, args, [background]; (> .perms(sender(), @admins) <); (> run_script(script, args, @background) <); . method anonymous_class return anonymous_class; . method create arg parents, name, manager, [owners]; var new; .perms(sender(), 'system); new = create(parents); catch any { new.set_dbref(name); new.initialize(); new.set_manager(manager); new.chown([@owners, [new]][1]); } with handler { // Failed to initialize the child; destroy it. if (!(| new.destroy() |)) { (| new.uninitialize() |); (| del_name(new.dbref('symbol)) |); (| del_name(tosym(name)) |); (| destroy(new) |); } rethrow(error()); } return new; . method system return admins + agents; . method run_script arg script, args, [background]; .perms(sender(), @admins); (> run_script(script, args, @background) <); . method bind arg port, obj; (> .perms(caller(), $network_root) <); (> bind(port, obj) <); . method deassign_dbref arg name; if (caller() != $root) throw(~perm, "Caller is not $root."); del_name(name); . method del_system_email arg key; (> .perms(sender(), 'manager) <); system_email_addresses = dict_del(system_email_addresses, key); . method add_system_email arg key, email; (> .perms(sender(), 'manager) <); if (type(key) != 'symbol) throw(~type, "Key is not a symbol."); if (type(email) != 'string) throw(~type, "Email address is not a string."); system_email_addresses = dict_add(system_email_addresses, key, email); . method compile arg code, name; var line; (> .perms(sender()) <); line = ("SYSTEM: ." + tostr(name)) + "() MODIFIED"; line = (line + " by ") + (sender().namef('ref)); .log(line); return (> pass(code, name) <); . method unbind arg port, obj; (> .perms(caller(), $network_root) <); (> unbind(port) <); . method version arg [args]; var ver; args = [@args, 'driver][1]; switch (args) { case 'driver: ver = version(); return (((tostr(ver[1]) + ".") + tostr(ver[2])) + "-") + tostr(ver[3]); case 'core: return core_version; } . method startup_objects return startup_objects; . method last_backup return last_backup; . method foobar .do_backup(); .shutdown(); . parent #9440 object #9443 var 1 dbref 'notice_interface_1 var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owned [] var 1 owners [#7232] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [] var 16 shortcuts [] var 7801 connection #9442 var 1 inited 1 parent #12 object #44 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 1 owned [] var 44 boolean_strs [["yes", "true", "1", "on"], ["no", "false", "0", "off"]] var 1 manager #44 var 1 writable [#44] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'parse method reference arg string, [sep]; var middle, ref; // receives: "<object><seperator><method/param>" // returns ["<object>", "<method/param>"] // seperator defaults to a period. sep = [@sep, "."][1]; middle = sep in string; if (!middle) ref = [string, ""]; else if (middle == 1) ref = [sender().namef(['dbref]), substr(string, 2)]; else ref = [substr(string, 1, middle - 1), substr(string, middle + 1)]; // assumes "()" will appear at the end of the reference if at all, // and strips it off if present if ("()" in (ref[2])) ref = [ref[1], substr(ref[2], 1, ("()" in (ref[2])) - 1)]; return ref; . method object_match arg name, [who]; var msg; // .object_match("name"[, who]) // -> 0 name was the empty string // -> ~objnf nothing matched name // -> ~ambig more than one object matched name // Attempt to match an object name with who.match_environment(). If one is found, return it. Else, print a message and return one of the above false values. // 'who' defaults to sender(). who = who ? who[1] | sender(); if (!name) { (| who.tell("You must give the name of something.") |); return 0; } catch ~objnf, ~ambig { return who.match_environment(name); } with handler { switch (error()) { case ~objnf: msg = ("I don't see any \"" + name) + "\" here."; case ~ambig: msg = ("I don't know which \"" + name) + "\" you mean."; } (| who.tell(msg) |); return error(); } . method tell_error arg problem, [args]; var who, syntax, line; // arg 1 == error // arg 2 (opt) == syntax // arg 3 (opt) == who // arg 4 (opt) == subbing object (in place of 'Object') -- string. syntax = [@args, 0][1]; who = [@args, sender(), sender()][2]; if (syntax) who.tell(("=> Syntax: `" + syntax) + "`"); if (problem) { if (type(problem) == 'string) { problem = $string.wrap_line(problem, (| who.linelen() |) || 79, "! ", 1); } else { for line in [1 .. listlen(problem)] problem = replace(problem, line, "! " + (problem[line])); } who.tell(problem); } throw(~stop, "", 'no_traceback); . method usage arg method, [dbref]; var code, extracted; // .usage(method[, dbref]) // Extract initial comments from the given method, returning them as a list of strings. // Throw ~methodnf if dbref does not define method. // dbref defaults to sender. dbref = dbref ? dbref[1] | sender(); dbref = dbref.find_method(method); code = dbref.list_method(method); extracted = []; if ((code[1]) == "disallow_overrides;") code = delete(code, 1); if (("arg " in (code[1])) == 1) code = delete(code, 1); if (("var " in (code[1])) == 1) code = delete(code, 1); while (!(code[1])) code = delete(code, 1); while (("//" in (code[1])) == 1) { extracted = [@extracted, strsub(code[1], "//", "")]; code = delete(code, 1); } return extracted; . method match arg string; var loc, obj; // called by $user.match_* methods, simply parses up the basic me/here/$* if (string == "me") return sender(); if (string == "here") return sender().location(); if (string && ((string[1]) == "$")) { obj = todbref(substr(string, 2)); if (!valid(obj)) throw(~objnf, "No such object " + string); return obj; } else { return 0; } . method boolean arg str; if (str in (boolean_strs[1])) return 1; else if (str in (boolean_strs[2])) return 0; else throw(~unknown, "Boolean flag not recognized."); . method full_reference arg str, [args]; var sep, defobj, middle, ref, type; defobj = [@args, sender()][1]; if ("()" in str) str = substr(str, 2, ("()" in str) - 1); if ("." in str) { type = 'method; sep = "."; } else if ("," in str) { type = 'parameter; sep = ","; } else { type = 'unknown; sep = "."; } middle = sep in str; if (!middle) ref = [(> $object.to_dbref(str) <), ""]; else if (middle == 1) ref = [defobj, substr(str, 2)]; else ref = [(> $object.to_dbref(substr(str, 1, middle - 1)) <), substr(str, middle + 1)]; return [type, ref[1], (ref[2]) ? tosym(ref[2]) | 0]; . method traceback arg traceback, [args]; var line, out, pre, lines, cur, x, error; // $parse.traceback(traceback(), lines, pre); // -1 lines represents the full error // pre is set to "! " unless otherwise specified. lines = [@args, -1][1]; pre = [@args, "! ", "! "][2]; error = [@args, 0, 0, 0][3]; // out = [(pre + "=> ") + ((traceback[1])[2])]; pre = pre + " "; // if (error == 0) out = [@out, (pre + "Thrown by ") + (._traceback(@sublist(traceback[2], 2)))]; else out = [@out, (((pre + "Error ") + toliteral(error)) + " thrown by ") + (._traceback(@sublist(traceback[2], 2)))]; // for x in [1 .. listlen(traceback) - 2] { if ((x <= lines) || (lines == (-1))) { line = ($data.unparse((traceback[x + 2])[1])) + ": "; line = line + (._traceback(@sublist(traceback[x + 2], 2))); out = [@out, pre + line]; } } return out; . method _traceback arg what, [more]; var line; if (more) return (((((($data.unparse(more[1])) + ".") + tostr(what)) + "() (") + ($data.unparse(more[2]))) + ") line ") + tostr(more[3]); else return tostr(what); . method options arg line, [defaults]; var loc, opt, x, out, defs; // this will not pay attention to groupings with quotes, should add // the functionality in later. // templates: #[["opt", [0/1, 0/1]]]; / #[['opt, [bool, value]]]; defaults = [@defaults, #[]][1]; if (!(("-" in line) || ("+" in line))) return [explode(line), defaults]; line = explode(line); out = line; for x in [1 .. listlen(line)] { if (((line[x])[1]) in ["-", "+"]) { out = setremove(out, line[x]); opt = substr(line[x], 2); defs = (| defaults[opt] |) || [0, ""]; defs = [((line[x])[1]) in ["+"], defs[2]]; if (defs[2]) { if (listlen(line) >= (x + 1)) { defs = [defs[1], line[x + 1]]; out = setremove(out, line[x + 1]); } } defaults = dict_add(defaults, opt, defs); } } return [out, defaults]; . parent #2485 object #2488 var 1 child_index 0 var 1 fertile 0 var 1 manager #2488 var 1 owners [#936] var 1 writable [#2488] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'and method unparse arg andlist; var str, x; str = ""; for x in (andlist) { catch any { str = (str + (x.unparse())) + " && "; } with handler { str = (str + tostr(x)) + " && "; } } return ("(" + (str && substr(str, 1, strlen(str) - 4))) + ")"; . method test arg andlist, [args]; var val, x; val = 0; for x in (andlist) { catch ~type, ~methodnf { val = x.test(@args); } with handler { val = x; } if (!val) break; } return val; . parent #12 object #46 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 1 owned [] var 1 manager #46 var 1 writable [#46] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'dict method map_method arg ls, what; var x, dict; // args[1] == list of objects // args[2] == symbol for method on objects // it will create a dictionary out of the two. dict = #[]; // Get list's method(whatever) and add it to the dictionary for x in [1 .. listlen(ls)] dict = dict_add(dict, ls[x], (ls[x]).(what)()); return dict; . method merge arg [args]; var x, dict, z, tule, dz, axz, keys; // merges all dictionaries into a single one, if they have the same key's -- // basing off of args[1] (this should be the longest list (i know, bad Lynx). dict = args[1]; keys = dict_keys(args[1]); for x in [2 .. listlen(args)] { for z in (keys) { dz = dict[z]; axz = (args[x])[z]; if (type(dict[z]) == 'list) tule = dz; else tule = [dz]; tule = [@tule, axz]; dict = dict_add(dict, z, tule); } } return dict; . method to_list arg dict; var list, x, k; // merges into an associated list. k = dict_keys(dict); list = []; for x in (k) list = [@list, [x, dict[x]]]; return list; . method merge_to_list arg [args]; var x, dict, z, tule, dz, axz, keys, list; // merges all dictionaries into a single list, where each related key // is merged with all it's other values as a sublist // basing off of args[1] (this should be the longest list (i know, bad Lynx). dict = .merge(@args); list = []; for z in (dict_keys(dict)) list = [@list, dict[z]]; return list; . method union arg dict1, dict2; var key; // like union() but for dictionaries. adds any keys from dict2 that don't // already exist in dict1 to dict1 and returns the result. Order of keys in // result is not guaranteed. for key in (dict1) dict2 = dict_add(dict2, key[1], key[2]); return dict2; . method values arg dict; var list, x, k; // returns values same as dict_keys() returns keys. k = dict_keys(dict); list = []; for x in (k) list = [@list, dict[x]]; return list; . method replace arg dict, key, value; dict = (> dict_del(dict, key) <); dict = (> dict_add(dict, key, value) <); return dict; . method apply arg tdict, list; var x; // Apply a translation-dict to a list for x in [1 .. listlen(list)] { catch ~keynf { list = replace(list, x, tdict[list[x]]); } } return list; . method apply_to_keys arg tdict, dict; var x, newdict; // Apply a t-dict to the keys of a dict newdict = #[]; for x in (dict) { catch ~keynf { x = replace(x, 1, tdict[x[1]]); } newdict = dict_add(newdict, @x); } return newdict; . method apply_to_values arg tdict, dict; var x, newdict; // Apply a t-dict to the values of a dict newdict = #[]; for x in (dict) { catch ~keynf { x = replace(x, 2, tdict[x[2]]); } newdict = dict_add(newdict, @x); } return newdict; . method invert arg dict; var inverted, x; // Invert a dict (keys<->values) inverted = #[]; for x in (dict_keys(dict)) inverted = dict_add(inverted, dict[x], x); return inverted; . method add_elem arg dict, key, elem; var value; // same as old dict_add_elem value = (| dict[key] |); if ((type(value) != 'list) && (type(value) != 'error)) throw(~type, ((("Value for key " + ($data.unparse(key))) + " (") + ($data.unparse(value))) + ") is not a list."); if (value) value = [@value, elem]; else value = [elem]; return dict_add(dict, key, value); . parent #24 object #984 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 15 verbs #[] var 23 location #840 var 1 inited 1 var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 1 manager #984 var 1 writable [#984] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'nothing var 2787 name ['prop, "nothing whatsoever"] var 2787 name_aliases [] parent #12 object #9615 var 1 dbref 'base_evaluator var 1 child_index 0 var 1 fertile 0 var 1 manager #9615 var 1 owned [] var 1 owners [#2277] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 parent #40 object #1182 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 40 cgender_name "Neuter" var 40 gender_name "neuter" var 40 pronouns #[['pr, "itself"], ['pp, "its"], ['po, "it"], ['ps, "it"], ['pq, "its"], ['prc, "Itself"], ['ppc, "Its"], ['poc, "It"], ['psc, "It"], ['pqc, "Its"]] var 40 number 'singular var 1 manager #1182 var 1 writable [#1182] var 1 readable ['parameters, 'methods, 'code] var 40 context ["itself", "its", "it", "it", "its", "Itself", "Its", "It", "It", "Its"] var 1 dbref 'gender_neuter parent #2679 object #140 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 16 commands [] var 16 shortcuts [] var 15 verbs #[] var 19 contents [#592] var 1 inited 1 var 169 messages #[['housekeeper, #[['public, 1], ['text, "%N is absorbed by one of the couches"]]]] var 1 owned [] var 1179 gender #1182 var 17 prose #[['short, ["The quiet bood warm void of creation surrounds you."]]] var 1 manager #140 var 1 writable [#140] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'creation var 2787 name ['prop, "Creation"] var 2787 name_aliases [] var 2679 exits [] var 2679 realm <#2717, ['interior]> var 2679 coordinates #[] parent #1377 object #35 var 35 templates #[["l?ook at %this", [#17]], ["l?ook %this", [#17]], ["take|get %this", [#24]], ["drop %this", [#24]], ["erase * on|from %this", [#7248]], ["erase %this", [#7248]], ["read|nread %this", [#7248]], ["write on %this", [#7248]], ["write at * on %this", [#7248]], ["write * on %this", [#7248]], ["copy from %this to *", [#7248]], ["@public on %this is *", [#7261]]] var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 1 inited 1 var 1 owned [] var 1 manager #35 var 1 writable [#35] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'verb_cache method add_template arg template; if (caller() != $has_verbs) throw(~perm, "Caller is not $has_verbs."); templates = $dict.add_elem(templates, template, sender()); . method del_template arg template; if (caller() != $has_verbs) throw(~perm, "Caller is not $has_verbs."); templates = $dict.del_elem(templates, template, sender()); . method templates return dict_keys(templates); . parent #40 object #1183 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 1 inited 1 var 40 cgender_name "Male" var 40 gender_name "male" var 40 pronouns #[['pr, "himself"], ['pp, "his"], ['po, "him"], ['ps, "he"], ['pq, "his"], ['prc, "Himself"], ['ppc, "His"], ['poc, "Him"], ['psc, "He"], ['pqc, "His"]] var 40 number 'singular var 1 manager #1183 var 1 writable [#1183] var 1 readable ['parameters, 'methods, 'code] var 40 context ["himself", "his", "him", "he", "his", "Himself", "His", "Him", "He", "His"] var 1 dbref 'gender_male parent #1170 object #4348 var 1 dbref 'motd var 1 child_index 0 var 1 fertile 0 var 1 manager #7232 var 1 owned [] var 1 owners [#7232, #1387, #1388] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 1 info ["The Message of the Day object. Called by $old_connection and $fingerd.", "This builds a motd from different parameters, called by $motd.build().", "Parameters can be:", "", " 'long -- long title.", " 'short -- short title.", " 'title -- server title.", " 'name -- server name.", " 'notes -- connection notes.", " 'quote -- random quote.", " 'admins -- list of admins.", " 'connected -- currently connected users.", " 'version -- ColdMUD driver version."] var 4348 server_name "a Cold Dark Core World" var 4348 notes [] var 4348 server_title "Virtual Environment Server" method build arg [args]; var output, out; output = []; if (!args) args = ['long, 'quote]; if ((args[1]) == 'default) args = ['name, "", 'title, "", "", 'quote, "", 'notes, "", 'admins, 'connected, 'version]; while (args) { if (type(args[1]) == 'string) { output = output + [""]; } else { switch (args[1]) { case 'long: args = insert(args, ((args[1]) in args) + 1, 'title); args = replace(args, (args[1]) in args, 'long_name); continue; case 'short: args = insert(args, ((args[1]) in args) + 1, 'title); args = replace(args, (args[1]) in args, 'name); continue; case 'title: out = $string.center(server_title, 79); output = output + [out]; case 'name: out = $string.center(("+ " + server_name) + " +", 79); output = output + [out]; case 'notes: out = $list.center_lines(notes, 79); output = output + out; case 'quote: out = $list.center_lines($code.random_quote(), 79); output = output + out; case 'admins: out = $list.to_english($list.map($sys.admins(), 'namef)); out = $string.center("Administrators: " + out, 79); output = output + [out]; case 'connected: out = "Currently Connected users: "; out = out + tostr(listlen($user_db.connected())); out = $string.center(out, 79); output = output + [out]; case 'version: out = "ColdMUD Version " + ($sys.version()); out = $string.center(out, 79); output = output + [out]; } } args = delete(args, 1); } return output; . method set_motd arg what, value; .perms(sender()); if (!(what in (.parameters()))) throw(~motd, (toliteral(what) + " is not a valid motd parameter, try one of: ") + toliteral(.parameters())); if (!(type(value) in ['string, 'list])) throw(~motd, "Value must be sent as a string or a list of strings."); set_var(what, value); . method build_html arg [args]; var output, out; output = [("<head><title>" + server_name) + "</title></head>", "<body>"]; if (!args) args = ['name, 'title, 'quote, "", 'notes, 'admins, 'connected, 'version, 'help]; while (args) { if (type(args[1]) == 'string) { output = output + ["<br>"]; } else { switch (args[1]) { case 'title: output = output + ["<h3>", @server_title, "</h3>"]; case 'name: // output = output + ["<h1>" + server_name + "</h1>"]; output = output + ["<img src=\"http://sticky.usu.edu/~brandon/tCD.gif\" alt=\"The Cold Dark\">"]; case 'notes: output = (output + notes) + ["<br>"]; case 'quote: output = output + ["<tt>", @$code.random_quote(), "</tt>"]; case 'admins: out = $list.to_english($list.map($sys.admins(), 'namef)); output = output + [("Administrators: " + out) + "<br>"]; case 'connected: out = "<a href=\"/bin/who\">Currently Connected users</a>: "; out = out + tostr(listlen($user_db.connected())); output = output + [out + "<br>"]; case 'version: out = "<a href=\"http://www.declab.usu.edu:8080/ColdMUD/\">ColdMUD</a> Version " + ($list.to_string(version(), ".")); output = output + [out + "<br>"]; case 'help: out = "</center><hr width=50% align=center><center>Click <a href=\"telnet://recumbent.declab.usu.edu:1138\"><b>here</b></a> to enter <a href=\"telnet://recumbent.declab.usu.edu:1138\">the Cold Dark</a>."; output = output + [out]; } } args = delete(args, 1); } return ["<center>", @output, "</center>", "</body>"]; . method server_name return server_name; . method server_title return server_title; . parent #12 object #1408 var 1 child_index 0 var 1 fertile 0 var 1 manager #1408 var 1 owners [#1408] var 1 writable [#1408, #47] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'buffer method to_list arg buf; var idx, list; list = []; for idx in [1 .. buffer_len(buf)] list = list + [buffer_retrieve(buf, idx)]; return list; . method from_list arg list; var buf, x; buf = `[]; for x in [1 .. listlen(list)] buf = buffer_add(buf, list[x]); return buf; . parent #7801 object #7800 var 1 dbref 'login_interface var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [["@quit|QUIT", 'quit_cmd], ["h?elp", 'quit_cmd], ["@who|WHO", 'quit_cmd], ["c?onnect guest *", 'quit_cmd], ["c?onnect *", 'quit_cmd], ["m?otd", 'quit_cmd]] var 16 shortcuts [] var 1 inited 1 method connect_cmd arg com, words; var words, u, password, salt, syn, name, passwd, line; (> .perms(sender(), 'this) <); // syn = "`connect <name> <pass>' (last word is taken as the password)"; // parse name / password words = explode(words); if (listlen(words) < 2) $parse.tell_error(syn); passwd = words[listlen(words)]; name = $list.to_string(sublist(words, 1, listlen(words) - 1)); // find name in the db catch ~namenf { user = $user_db.find(name); } with handler { line = "Either that user does not exist or has a different password."; $parse.tell_error(line, syn); } // validate password if (!(user.check_password(passwd))) { line = "Either that user does not exist or has a different password."; $parse.tell_error(line, syn); } // change connection objects connection.change_interface_object(user); user.connection_logged_in(addr, port); // this is redundant, as .change_interface_object will shut us down .close(); . method create_cmd arg com, words; var words, syn; syn = "! Usage: `create <name> <password> <email@host>'"; if (sender() != this()) throw(~perm, "Sender is not this."); // Get user name, password, and email. words = explode(words); if (listlen(words) != 3) return .tell(syn); // Create a new user object. catch any { user = $sys.create_user(words[1], words[2], words[3]); } with handler { .tell(syn); switch (error()) { case ~duplicate: .tell(("! The user " + toliteral(words[1])) + " already exists."); default: .tell("! There was a problem creating you:"); .tell("! => " + ((traceback()[1])[2])); .tell("! If there is a problem contact: " + ($sys.get_system_email('login))); // $sys.log(traceback()); } if (user) { (| user.destroy() |); user = 0; } return; } // Log the user in. user.connection_logged_in(addr, port); . method quit_cmd arg dummy; if (sender() != this()) throw(~perm, "Sender is not this."); .tell("Goodbye."); disconnect(); . method connect_guest_cmd arg com, com2, words; var syn, email, name, result; .perms(sender(), 'this); syn = "=> Syntax: 'connect guest <name> <email>' (type 'help' for more help)"; // Get user name and password. words = explode(words); if (listlen(words) < 2) return .tell(syn); name = $list.to_string(sublist(words, 1, listlen(words) - 1)); email = words[listlen(words)]; result = $code.valid_email(email); if ((result[1]) != 'valid) { switch (result[1]) { case 'invalid: .tell("! The given email address is not a legitimate address."); .tell("! Specify both username and hostname (do not use brackets)."); return; case 'invip, 'invhostname: .echo($string.wrap_line(((("The hostname \"" + (result[3])) + "\" is invalid, when in actuality you are connecting from \"") + ((addr == "-1") ? ip | addr)) + "\". The server is not currently locking out invalid email addresses, although your connection has been noted (We do realize that some hosts may not function normally).", 79, "! ", 1)); $channels.announce('System, ((((((("Invalid Connection Email: " + email) + " <") + addr) + ":") + ip) + "> (") + name) + ")"); } } catch any { user = $sys.create_user(name, 0, email, 'anonymous_class); } with handler { .tell(syn); switch (error()) { case ~duplicate: .tell(("! The name " + toliteral(words[1])) + " is already in use."); default: .tell("! There was a problem creating you:"); .tell("! => " + ((traceback()[1])[2])); .tell("! If there is a problem contact: " + ($sys.get_system_email('login))); } $brandon.tell_traceback(traceback()); // $sys.log(traceback()); return; } // Log the user in. $sys.log((("GUEST: " + (words[1])) + " ") + (words[2])); user.connection_logged_in(addr, port); . method who_cmd arg com; var l; for l in ($code.generate_listing($user_db.connected())) .tell(l); . method help_cmd arg com; var l; .perms(sender(), 'this); for l in ($login_interface.connect_help()) .tell(l); . parent #7248 object #185 var 1 child_index 5 var 1 owners [#936] var 1 fertile 1 var 15 verbs #[] var 23 location #21 var 1 inited 1 var 185 disk_text "" var 184 seperator 0 var 1 owned [] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[] var 1 manager #185 var 1 writable [#185] var 1 readable ['methods, 'code] var 1 dbref 'disk_readable var 2787 name ['uniq, "Generic Disk Readable Object"] var 2787 name_aliases [] var 1032 text [] var 7261 public ['readable] method read_cmd arg [args]; var actor; actor = sender(); actor.tell(.description(actor, 'namef)); actor.tell(.seperator()); actor.echo_file(disk_text); . method init_disk_readable if (caller() != $root) throw(~perm, "Caller is not $root"); disk_text = ""; . method set_disk_text arg filename; if (!(.is_writable_by(sender()))) throw(~perm, "Sender not an owner"); disk_text = filename; . parent #7248 object #592 var 1 child_index 0 var 1 owners [#936] var 1 fertile 0 var 15 verbs #[] var 23 location #140 var 184 seperator 0 var 1 inited 1 var 1 owned [] var 592 last_write_time 771406285 var 592 readers #[[#37, 784587776], [#9197, 784220792], [#7275, 784587686], [#9499, 784435106], [#9507, 784436408], [#9555, 784477535], [#2277, 784529497], [#9039, 784536040], [#9663, 784597987]] var 1179 gender #1182 var 23 obvious 1 var 17 prose #[['short, ["The latest comments from your local admins (woo, are we devoted or what). Last written on at: %time."]]] var 1 manager #592 var 1 writable [#592] var 1 readable ['methods, 'code] var 1 dbref 'news var 2787 name ['uniq, "News"] var 2787 name_aliases ["news"] var 1032 text ["There is a Cold Dark mailing list. Subscribe/Unsubscribe to it by sending a message to 'tcd-request@tiny.mcs.usu.edu' with a mail body of 'subscribe' or 'unsubscribe'. Send to the list via 'tcd@tiny.mcs.usu.edu'."] var 7261 public ['readable] method read_vrb arg [args]; pass(@args); readers = dict_add(readers, sender(), time()); . method write_cmd arg [args]; pass(@args); last_write_time = time(); . method new // returns true if the sender has not read recent news // first see if they have even read the news if (!(sender() in dict_keys(readers))) return 1; if ((readers[sender()]) < last_write_time) return 1; return 0; . method short_description arg [args]; var text, x; text = pass(@args); for x in [1 .. listlen(text)] text = replace(text, x, strsub(text[x], "%time", $time.ldate(last_write_time))); return text; . method validate_readers var x, new; .perms(sender(), 'system); new = #[]; for x in (readers) { if (valid(x[1])) new = dict_add(new, x[1], x[2]); } readers = new; . method prose arg [args]; var prose, x, lines; prose = (> pass(@args) <); if (type(prose) == 'dictionary) lines = (| prose['short] |); else lines = prose; if (lines) { for x in [1 .. listlen(lines)] lines = replace(lines, x, strsub(lines[x], "%time", $time.date(last_write_time))); } if (type(prose) == 'dictionary) return dict_add(prose, 'short, lines); else return lines; . method last_updated_on arg type; switch (type) { case 'string: return $time.date(last_write_time); case 'integer: return last_write_time; } . parent #24 parent #15 object #9552 var 1 dbref 'slate var 1 child_index 0 var 1 fertile 0 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 1 inited 1 var 9552 connection 0 var 9552 remote_host "" var 9552 remote_port 0 var 9552 request_method "" var 9552 received_text [] var 15 verbs #[] var 23 location #21 var 23 obvious 1 var 1178 messages #[] var 17 prose #[] var 1179 gender #1182 var 2787 name ['uniq, "Generic Slate"] var 2787 name_aliases [] method init_slate (> .perms(caller(), $root) <); connection = 0; remote_host = ""; remote_port = 0; request_method = ""; received_text = []; . method uninit_slate (> .perms(caller(), $root) <); connection = 0; remote_host = ""; remote_port = 0; request_method = ""; received_text = []; . method received_text (> .perms(sender(), 'this) <); return received_text; . method connection (> .perms(sender(), 'this) <); return connection; . method remote_host (> .perms(sender(), 'this) <); return remote_host; . method remote_port (> .perms(sender(), 'this) <); return remote_port; . method "request_method;" (> .perms(sender(), 'this) <); return request_method; . method send arg line; (> .perms(sender(), 'this) <); connection.send(line); . method connection_ending . parent #1162 object #747 var 1 child_index 0 var 1 owners [#936] var 1 owned [] var 1 fertile 0 var 16 commands [["save", 'save_cmd]] var 16 shortcuts [] var 1 inited 1 var 922 command_aliases [] var 1 manager #747 var 1 writable [#747] var 1 readable ['parameters, 'methods, 'code] var 1 dbref 'note_editor method start_editing arg what; var obj, text; // called by $user_input.edit_cmd obj = (| sender().match_environment(what) |); if ((!obj) || (!(| obj.writeable_by(sender()) |))) { sender().tell(("I don't see a note around here called " + what) + " that you can edit."); return 0; } catch any { text = sender().run_with_users_perms(obj, 'text); } with handler { sender().tell(("You cannot edit " + what) + "."); sender().tell("Error: " + ((traceback()[1])[2])); return 0; } sender().tell(("Now editing " + what) + "."); // user doing editing, obj edited, text, current line number, changes made return #[['user, sender()], ['obj, obj], ['text, text], ['cur_line, 1], ['changed, 0]]; . method help_msg var msg; msg = []; msg = msg + ["The note editor allows you to write on notes interactively."]; msg = msg + ["It includes these commands it inherits from the generic editor:"]; msg = msg + pass(); msg = msg + [""]; msg = msg + ["And adds the following:"]; msg = msg + [" save store text to note"]; msg = msg + [""]; return msg; . method save_cmd arg editing, cmd; var error; .perms(sender(), 'parser); catch any { (editing['user]).run_with_users_perms(editing['obj], 'erase_cmd, "", "all", "", ""); (editing['user]).run_with_users_perms(editing['obj], 'add_text, editing['text], $user); (editing['user]).tell("Done."); // clear modified flag editing = $dict.replace(editing, 'changed, 0); } with handler { (editing['user]).tell("An error occurred attempting to save."); (editing['user]).tell("The error was " + ((traceback()[1])[2])); } return editing; . parent #2485 object #2491 var 1 child_index 0 var 1 fertile 0 var 1 manager #2491 var 1 owners [#936] var 1 writable [#2491] var 1 readable ['parameters, 'methods, 'code] var 1 trusted [] var 1 owned [] var 1 inited 1 var 1 dbref 'not method unparse arg notlist; catch any { catch ~type, ~methodnf { return "!" + ((notlist[1]).unparse()); } with handler { return "!" + tostr(notlist[1]); } } with handler { return "!()"; } . method test arg notlist, [args]; var val; catch ~range { catch ~type, ~methodnf { return !((notlist[1]).test(@args)); } with handler { return !(notlist[1]); } } with handler { return 1; } . parent #7801 object #7811 var 1 dbref 'finger_interface var 1 child_index 98 var 1 fertile 1 var 1 manager #37 var 1 owned [] var 1 owners [#37] var 1 writable [] var 1 readable ['parameters, 'methods, 'code] var 16 commands [["help", 'help_cmd], ["uptime", 'uptime_cmd], ["all", 'all_cmd], ["who", 'who_cmd], ["*", 'unknown_cmd]] var 16 shortcuts [] var 1 inited 1 var 7801 connection #7856 method parse_line arg line; var cmd; while (line && ((line[1]) == " ")) line = substr(line, 2); if (!line) { .motd(); } else if ((line[1]) == ".") { line = substr(line, 2); // if (!line) { // .send("Unknown option, try \".help\"."); // } else { cmd = .match_command(line); if (cmd) .(cmd[1])(@cmd[2]); // } } else { .send(.finger_user(line)); } return 'disconnect; . method motd .perms(sender(), 'this); .send($login.build('default)); .send($string.center("Email: " + ($sys.get_system_email('finger)), 79)); .send($string.center("For more information, finger .help", 79)); . method finger_user arg str; var user, line, lines, idle, desc; .perms(sender(), 'this); user = (| $user_db.find(str) |); if (!user) return [("Sorry, no user found by the name of \"" + str) + "\", try \".help\"."]; line = pad(" Name: " + (user.namef()), 37); line = (line + " In real life: ") + (user.data_on('real_name)); lines = [line]; line = " Last Login: "; if (user.connected()) { if ((user.idle_seconds()) > 10) { idle = ", " + ($time.dhms(user.idle_seconds(), 'long)); idle = idle + " idle."; } else { idle = ""; } line = " On since: " + ($time.ltime(user.connected_at())); line = (line + " (Mountain)") + idle; } else { line = " Last Login: " + ctime(user.last_command_at()); } lines = [@lines, line]; line = user.display_data('real_name, 'affiliation, 'position, 'location); lines = [@lines, @line]; desc = $list.to_string(user.prose('short)); if (strlen(desc) < 60) { lines = [@lines, " Description: " + desc]; } else { lines = [@lines, " Description:"]; desc = $string.wrap_line(desc, 79, " "); desc = replace(desc, 1, " " + (desc[1])); lines = [@lines, @desc]; } return lines; . method help_cmd arg cmd; .send("If you are trying to find a user, do not prepend \".\"."); .send(["", "Options available:", ""]); .send(" .all Show all users connected."); .send(" .uptime Uptime other server information"); .send(["", "If there are any problems, please email " + ($sys.email('fingerd)), ""]); . method uptime_cmd arg cmd; var line; line = $time.elapsed($sys.uptime(), 'long); .send("Server has been up for: " + line); .send("Currently Connected users: " + tostr(listlen($user_db.connected()))); .send("ColdMUD Version " + ($list.to_string(version(), "."))); . method all_cmd arg cmd; var x, line; (> .perms(sender(), 'this) <); // .send($code.generate_listing($user_db.connected())); .send(pad("USER", 40) + "TIME (IDLE) LOCATION"); for x in ($user_db.connected()) { line = pad(x.namef('titled), 40); line = line + pad(x.time_poll(), 17); line = line + (x.realm_name()); .send(line); } . method unknown_cmd arg cmd; .send(("Unknown command \"" + cmd) + "\", try \".help\"."); . method who_cmd arg cmd; (> .perms(sender(), 'this) <); .send($code.generate_listing($user_db.connected())); .