new object $registry: $db; var $db database = #[]; var $registry invalid_names = []; var $registry max_char_len = 0; var $registry max_word_len = 0; var $registry min_char_len = 0; var $registry reserved_names = []; var $registry stripped = 0; var $registry stripped_characters = ""; var $root created_on = 796268969; var $root fertile = 1; var $root flags = ['methods, 'code, 'fertile, 'variables, 'core]; var $root inited = 1; var $root managed = [$registry]; var $root manager = $registry; public method .database() { if (!(.has_flag('variables, sender()))) throw(~perm, "Database is not readable by sender."); return (> pass() <); }; public method .exact_match() { arg name; // returns a direct match of the name (if there is one) if (!(.has_flag('variables, sender()))) throw(~perm, "Database is not readable by sender."); name = .strip_key(name); return (> pass(name) <); }; public method .insert() { arg name, obj; // registers obj with obj.name if ((!(.trusts(caller()))) && ((!sender()) == this())) throw(~perm, "Permission denied."); name = .strip_key(name); (> pass(name, obj) <); }; public method .key_changed() { arg old_name, new_name; // adjusts the database for the new name if ((!(.trusts(caller()))) && (sender() != this())) throw(~perm, "Permission denied."); old_name = .strip_key(old_name); new_name = .strip_key(new_name); (> pass(old_name, new_name) <); }; public method .match_begin() { arg name; var matches, obj; // returns a direct match, or partial matches name = .strip_key(name); if (!name) throw(~matchnf, "No entries in the database match that key."); return (> pass(name) <); }; public method .remove() { arg name; // removes the object from the database. // THIS: is what is broken with guests, should fix it. if ((!(.trusts(caller()))) && (sender() != this())) throw(~perm, "Permission denied."); name = .strip_key(name); (> pass(name) <); }; public method .reserved_names() { return reserved_names || []; }; public method .search() { arg name; var tmp; name = .strip_key(name); name || throw(~namenf, "No matches found."); tmp = (| .exact_match(name) |); if (tmp) return tmp; catch any { tmp = (> .match_begin(name) <); } with { switch (error()) { case ~ambig: rethrow(error()); default: throw(~namenf, "No matches found."); } } return tmp; }; public 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; }; public 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; }; public 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; }; public method .strip_key() { arg key; anticipate_assignment(); if (stripped) return key.strip(); return key; }; public method .valid_name() { arg name; var word, sname, matched_obj, m; // returns 1 if the name is valid /// if (!.has_flag('variables,sender())) // throw(~perm, "Database is not readable by sender."); (> .perms(caller(), 'trusts) <); // check name itself first sname = .strip_key(name); if (max_word_len && (listlen(name.explode()) > max_word_len)) throw(~invname, ("Names can only be " + max_word_len) + " words long."); if (min_char_len && (strlen(sname) < min_char_len)) throw(~invname, ("Names must have at least " + min_char_len) + " alpha-numeric characters in them"); if (max_char_len && ((name.length()) > max_char_len)) throw(~invname, ("Names can only be " + max_char_len) + " characters long."); // see if it already exists if ((| (matched_obj = .exact_match(name)) |)) { if (matched_obj != sender()) throw(~invname, ((("The name \"" + name) + "\" conflicts with the existing user \"") + (matched_obj.name())) + "\""); } // check reserved and invalid names if (sname in (.reserved_names())) throw(~invname, ("`" + name) + "' is a reserved name."); if (invalid_names && (m = regexp(sname, invalid_names))) throw(~invname, ("`" + (m[2])) + "' is not allowed as part of a name."); };