//domain.c // This is the domain daemon for the TMI-2 mudlib. // It's loosely based on some earlier code written by Sulam (April 12, 1992) and later // modified by Jubal for multiguilding (Apr12/92). // The present incarnation, as a daemon, was done by Buddha@TMI-2 on 1/14/93 // 93-08-04 Grendel@tmi-2 Cleaned up a bit, and added separate wizard default // 19-Dec 94 Leto added some copy()'s #include <uid.h> #include <domains.h> #include <daemons.h> #include <mudlib.h> inherit DAEMON; // the default levels for players and wizards string player, wizard; // okay, this can be called with several intentions: // 1. pass just an object to it, and it will assume the object is a link, and tell you the // primary domain of that object. // 2. add a second string arguement to either method 1 or 2, and it will tell you if the // player is a member of the domain specified by the second arguement. // The return value, will be either 0, or the name of the domain the user is a // member of. varargs string query_domain(object link, string domain) { mapping domains, entry; string level; if(!link || !objectp(link)) return 0; domains = link->query("domains"); if (!domains || !keys(domains)) return 0; // default case, for a player if(!domain) domain = domains["primary"]; if(domain) entry = domains[domain]; if(entry) level = entry["level"]; if(!level) return 0; return copy(domain); } varargs string query_domain_sponsor(object link, string domain) { mapping domains, entry; domains = link->query("domains"); if( !domains || !keys(domains)) return 0; if(!domain) domain = domains["primary"]; if( member_array( domain, DOMAIN_LIST ) < 0) return 0; entry = domains[domain]; return copy( ( entry ? entry["sponsor"] : 0 ) ); } varargs string query_domain_level(object link, string domain) { mapping domains, entry; if(!link) return player; domains = (mapping)link->query("domains"); if (!domains || !keys(domains)) return (int)link->query("wizard") ? wizard : player; if (!domain) domain = domains["primary"]; entry = domains[domain]; // assume if they have a domain entry they are a wizard return copy ((entry ? entry["level"] : wizard)); } nomask int set_domain(object link, string domain, string lev, string sponsor ) { mapping domains, rec; if (getuid(previous_object() ) != ROOT_UID) return 0; domains = link->query("domains"); if (nullp(domains) || !keys(domains)) domains = ([ ]); if (member_array(domain, DOMAIN_LIST ) < 0) return 0; if (member_array( lev, LEVEL_LIST ) < 0) return 0; // This is cargo-cult programming and I know it, but I think the // daemon is losing its EUID and that's causing a Heisenbug that // makes promotion/demotion fail. So, I'm setting the EUID by hand. If // I'm wrong, it should not cost anything. seteuid(getuid()) ; /* remove from domain? */ if( member_array(lev,LEVEL_LIST) < ENTRY_LEVEL && domain != 0 ) { map_delete(domains, domain); if(!undefinedp(domains["primary"]) && domains["primary"] == domain) map_delete(domains,"primary"); link->set("domains", domains); return 1; } /* promote or add user to domain */ rec = ([ "level" : lev, "sponsor" : sponsor ]); domains[domain] = rec; if( member_array(lev,LEVEL_LIST) >= ENTRY_LEVEL && ! domains[ "primary" ] ) domains[ "primary" ] = domain; link->set("domains", domains); return 1; } nomask int set_primary_domain(object link, string d) { mapping domains; if (geteuid(previous_object()) != ROOT_UID) return 0; domains = (mapping)link->query("domains"); if (!domains || !keys(domains) || !domains[d]) return 0; if ( member_array(d, DOMAIN_LIST ) < 0) return 0; if ( member_array(domains[d]["level"],LEVEL_LIST) < ENTRY_LEVEL) return 0; domains["primary"] = d; return 1; } nomask string query_primary_domain(object link) { mapping domains; domains = (mapping)link->query("domains"); if (!domains || !mapp(domains)) return 0; return copy(domains["primary"]); } void create() { switch(sizeof(LEVEL_LIST)) { case 0: player=""; wizard=""; break; case 1: player=wizard=LEVEL_LIST[0]; break; default: player=LEVEL_LIST[0]; wizard=LEVEL_LIST[1]; } } /* EOF */