skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
// Domain handler (/secure/handler/domain.c)
// Coded by Donky - 25/09/96
// Converted and redone for here by Shaydz 08/10/00

// WARNING: _Never_ edit this file, edit it under a different filename
//          and make sure it updates before replacing the old version
//          otherwise _IT CAN ONLY BE FIXED FROM THE SHELL_

#include "access.h"

inherit "/secure/std/modules/group";

#define RANK_LOG "/secure/log/RANK"
#define SAVE_FILE "/secure/save/handlers/domain"
#define SECURITY geteuid(PO)

void load_me();
void save_me();

nosave string *leaders;
nosave string *seniors;

private void create() {
    string group;
    leaders = ({ });
    seniors = ({ });
    seteuid(master()->creator_file(file_name(TO)));

    group::mudlib_setup();

    load_me();
    foreach(group in query_groups(0)) {
        leaders += query_leaders(group);
        seniors += query_seniors(group);
    }
    leaders = uniq_array(leaders);
    seniors = uniq_array(seniors);
} /* setup() */

void load_me() {
    unguarded((: restore_object , SAVE_FILE :));
} /* load_me() */

void save_me() {
    unguarded((: save_object, SAVE_FILE :));
} /* save_me() */

// CREATOR: --------------------------------------

// determine whether a player is a creator
// determine whether a creator is a member of a domain
varargs int query_creator(string domain, string name) {
    return group::query_member(domain, name);
}

// list all creators
// list all the creators who belong to a domain
varargs string *query_creators(string domain) {
    return copy(group::query_members(domain));
}

string add_creator(string name) {
    object ob;
    string file, time;

    if( !PRIVILEGE_H->query_privilege("creator.add", SECURITY) ) {
        log_file("$SECURITY", "NOTE (Privilege - %s): promote %s.\n",SECURITY,
          name);
        return "Insufficient privilege to promote.";
    }

    if( !stringp(name) )
        return "Invalid name.";

    ob = find_player(name);

    if( ob && ob->query_property("guest") )
        return "You cannot promote guests.";

    if( !ob && !PLAYER_H->test_user(name) )
        return "User does not exist.";

    if( query_creator(name) )
        return capitalize(name) +" is already a creator.";

    if( file_size("/save/creators/"+name+".o") > 0 )
        return "Player file has already been backed up.";

    if( ob )
        ob->save();

    if( file_size("/save/players/"+name[0..0]+"/"+name+".o") < 1 )
	return CAP(name)+" doesn't have a save file!";

    unguarded( (: cp, "/save/players/"+name[0..0]+"/"+name+".o",
        "/save/creators/"+name+".o" :) );

    if( ob ) {
        ob->set_creator(1); // set_creator() saves as well.
        tell_object( ob, "You have been promoted by "+
            CAP(  TP->query_name() ) +".\n");
        tell_object( ob, "Quit and log back in to get the "
          "creator commands.\n");
        tell_object( ob, "Be sure to check \"help "
          "creator start\" when you log back in, as it contains valuable "
          "and useful information.\n");
    } else {
        unguarded( (: write_file, "/save/players/"+name[0..0]+"/"+name+".o",
            "creator 1\nhome_dir \"/w/"+name+"\"\n" :) );
    }

    if( unguarded( (: file_size, CREATOR_DIR "/"+ name :) ) == -1 ) {
        tell_object(TP, "Creating directory entry...\n\n");

        // build standard creator directory structure
        file = unguarded( (: read_file, "/std/creator/defs_standard.h" :) );
        unguarded( (: mkdir, CREATOR_DIR "/"+ name :) );
        unguarded( (: mkdir, CREATOR_DIR "/"+ name +"/weapon" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/weapon/defs.h",
            file :) );

        unguarded( (: mkdir, CREATOR_DIR "/"+ name +"/item" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/item/defs.h",
            file :) );

        unguarded( (: mkdir, CREATOR_DIR "/"+ name +"/armour" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/armour/defs.h",
            file :) );

        unguarded( (: mkdir, CREATOR_DIR "/"+ name +"/clothes" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/clothes/defs.h",
            file :) );

        unguarded( (: mkdir, CREATOR_DIR "/"+ name +"/npc" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/npc/defs.h",
            file :) );

        unguarded( (: mkdir, CREATOR_DIR "/"+ name +"/room" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/room/defs.h",
            file :) );

        unguarded( (: mkdir, CREATOR_DIR "/"+ name +"/secure" :) );
        unguarded( (: mkdir, CREATOR_DIR "/"+ name +"/text" :) );

        file = unguarded( (: read_file, "/std/creator/defs.h" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/defs.h",
            "#define CREATOR   \""+ name +"\"\n" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/defs.h",
            "#define HOME      \"/w/"+ name +"/\"\n" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/defs.h",
            file :) );

        file = unguarded( (: read_file, "/std/creator/workroom.c" :) );
        unguarded( (: write_file, CREATOR_DIR "/"+ name +"/workroom.c",
            file :) );
    } else
        tell_object( TP, "Creator directory already exists.\n\n");

    unguarded( (: write_file, "/log/EMPLOYMENT",
        sprintf( "%s: %s employed by %s\n", ctime( time() ), name,
          (string)TP->query_name() ) :) );

    write( CAP( name )+" promoted.\n");

    if( group::create_member(name) ) {
        time = ctime(time());
        log_file(RANK_LOG, "%s '%s: %s promoted by %s.\n",
            time[4..9], time[22..23], capitalize(name), CAP(SECURITY));
        save_me();
        return 0;
    }

    return "Unable to promote, please inform a member of the admin domain";

} /* add_creator() */

string remove_creator( string str ) {
    mapping mine;
    string time, name, reason;
    int last_log_on, time_on;
    object ob;

    if( !PRIVILEGE_H->query_privilege("creator.remove", SECURITY ) ) {
        log_file("SECURITY", sprintf("NOTE (Privilege - %s): demote %s.\n",
            SECURITY, name ) );
        return "Insufficient privilege to demote.";
    }

    if( sscanf(str, "%s %s", name, reason) != 2 ) {
        return "You need to give a reason.";
    }

    if( !stringp(name) )
        return "Invalid name.";

    if( !query_creator(name) )
        return capitalize(name)+" is not a creator.";

    if( lordp(name) && !adminp(TP) ) {
        return "You cannot demote Lords.";
    }

    if( catch( last_log_on = PLAYER_H->test_last(name) ) ||
        catch( time_on = PLAYER_H->test_age(name) ) )
        return "You cannot demote anyone while the player handler is broken.";

    PLAYER_H->delete_from_cache(name);

    unguarded( (: write_file, "/log/DISMISSALS",
        sprintf( "%s: %s demoted by %s\nreason: %s\n",
            ctime( time() ), name, (string)TP->query_name(), reason ) :) );

    write( CAP( name )+" dismissed.\n");

    if( ob = find_player(name) ) {
        ob->set_creator(0);
        ob->save();
        tell_object( ob, "You have just been demoted by "+
            CAP( (string)TP->query_name() )+".\n");
        ob->quit();
    } else if( file_exists("/save/players/"+name[0..0]+"/"+name+".o") ) {
        if( name == "default")
            unguarded( (: rm, "/save/players/"+name[0..0]+"/"+name+".o" :) );
        else
            unguarded( (: write_file, "/save/players/"+name[0..0]+"/"+name+".o",
                "creator 0\nhome_dir 0\n" :) );
    }

    if( file_exists("/save/creators/"+name+".o") ) {
        unguarded( (: write_file, "/save/creators/"+name+".o",
            "last_log_on "+last_log_on+"\n"
            "time_on "+time_on+"\n" :) );
        unguarded( (: cp, "/save/creators/"+name+".o",
            "/save/players/"+name[0..0]+"/"+name+".o" :) );
        unguarded((: rm, "/save/creators/"+name+".o" :) );
    }

    if( file_size("/w/"+name) == -2 && file_size("/w/.old_creators/"+name ) != -2 )
        unguarded( (: rename, "/w/"+name, "/w/.old_creators/"+name :) );

    PROJECT_H->remove_member(name);

    mine = ([ ]);

    foreach( string path, mapping people in master()->query_permissions() )
        if( people[name] )
            mine[path] = people[name];

    if( sizeof(mine) )
        map( mine, (: master()->remove_permission( $(name), $1, $2 ) :) );

    if( group::query_senior(name) )
        map( filter( group::query_groups(),
            (: group::query_senior( $1, $(name) ) :) ),
            (: group::remove_senior( $1, $(name) ) :) );

    if( group::delete_member(name) ) {
        time = ctime(time());
        log_file( RANK_LOG, "%s '%s: %s demoted by %s.\n", time[4..9],
            time[22..23], CAP(name), ( SECURITY == "Root" ? "retiring" :
            CAP(SECURITY) ) );

        leaders = filter( leaders, (: $1 != $2 :), name );
        seniors = filter( seniors, (: $1 != $2 :), name );

        save_me();
        return 0;
    }

    return "Unable to demote, please inform a member of the admin domain.";

} /* remove_creator() */

// DOMAIN: --------------------------------------
int query_domain(string name) {
    return group::query_group(name);
} /* query_domain() */

string *query_domains(string name) {
    return copy(group::query_groups(name));
} /* query_domains() */

string add_domain(string name) {
    int i;

    if (!PRIVILEGE_H -> query_privilege("domain.add", SECURITY))
        return "Insufficient privilege to create a domain";

    if (i = group::add_group(name))
        save_me();

    return (i ? 0 : "Unable to create domain");
} /* add_domain() */

string remove_domain(string name) {
    int i;

    if (!PRIVILEGE_H -> query_privilege("domain.remove", SECURITY))
        return "Insufficient privilege to delete a domain";

    if (i = group::remove_group(name))
        save_me();

    return (i ? 0 : "Unable to delete a domain");
} /* remove_domain() */

// SENIOR: --------------------------------------

varargs int query_senior(string domain, string name) {
    return group::query_senior(domain, name);
} /* query_senior() */

string *query_seniors(string domain) {
    if (!stringp(domain))
        return copy(seniors);

    return copy(group::query_seniors(domain));
} /* query_seniors() */

mixed add_senior(string domain, string name) {
    if (!PRIVILEGE_H -> query_privilege("domain."+ domain +".senior.add",
        SECURITY))
        return "Insufficient privilege to add a domain senior";

    if (group::add_senior(domain, name)) {
        if (member_array(name, seniors) == -1)
            seniors += ({ name });

        save_me();
        return 0;
    }

    return "Unable to add a domain senior";
} /* add_senior() */

mixed remove_senior(string domain, string name) {
    if (!PRIVILEGE_H -> query_privilege("domain."+ domain +".senior.remove",
        SECURITY))
        return "Insufficient privilege to remove a domain senior";

    if (group::remove_senior(domain, name)) {
        if (!query_senior(name))
            seniors -= ({ name });

        save_me();
        return 0;
    }

    return "Unable to remove a domain senior";
} /* remove_senior() */

// LEADER: --------------------------------------

varargs int query_leader(string domain, string name) {
    return group::query_leader(domain, name);
} /* query_leader() */

string *query_leaders(string domain) {
    if (!stringp(domain))
        return copy(leaders);

    return copy(group::query_leaders(domain));
} /* query_leaders() */

mixed add_leader(string domain, string name) {
    if (!PRIVILEGE_H -> query_privilege("domain."+ domain +".leader.add",
        SECURITY))
        return "Insufficient privilege to add a domain leader";

    if (group::add_leader(domain, name)) {
        if (member_array(name, leaders) == -1)
            leaders += ({ name });

        save_me();
        return 0;
    }

    return "Unable to add a domain leader";
} /* add_leader() */

mixed remove_leader(string domain, string name) {
    if (!PRIVILEGE_H -> query_privilege("domain."+ domain +".leader.remove",
        SECURITY))
        return "Insufficient privilege to remove a domain leader";

    if (group::remove_leader(domain, name)) {
        if (!query_leader(name))
            leaders -= ({ name });

        save_me();
        return 0;
    }

    return "Unable to remove a domain leader";
} /* remove_leader() */

// MEMBER: --------------------------------------

int query_member(string domain, string name) {
    if (!stringp(domain) || !stringp(name))
        return 0;

    return group::query_member(domain, name);
} /* query_member() */

string *query_members(string domain) {
    string *arr;

    if (!stringp(domain))
        return ({ });

    if (!arrayp(arr = copy(group::query_members(domain))))
        return ({ });

    return arr;
} /* query_members() */

mixed add_member(string domain, string name) {
    int i;

    if (!PRIVILEGE_H -> query_privilege("domain."+ domain +".member.add",
        SECURITY))
        return "Insufficient privilege to add "+ capitalize(name) +" to the "+
        domain +" domain";

    if (i = group::add_member(domain, name))
        save_me();

    return (i ? 0 : "Unable to add "+ capitalize(name) +" to the "+
      domain +" domain");
} /* add_member() */

mixed remove_member(string domain, string name) {
    int i;

    if (!PRIVILEGE_H -> query_privilege("domain."+ domain +".member.remove",
        SECURITY))
        return "Insufficient privilege to remove "+ capitalize(name) +" from "
        "the "+ domain +" domain";

    if (i = group::remove_member(domain, name))
        save_me();

    return (i ? 0 : "Unable to remove "+ capitalize(name) +" from the "+ domain +
      " domain");
} /* remove_member() */

// Error reports: return creator(s) to receive them

mixed log_who(string domain, string file) {
    return query_leaders(domain);
}

varargs string query_short(string domain, string user) {
    int d, p, dl, pl;
    string ret, name;
    string *prjs, *dmns, *lprj = ({ }), *ldmn = ({ });

    if (stringp(domain) && !stringp(user)) {
        // Quick hack.
        return capitalize(domain);
    }

    if (!stringp(domain) && stringp(user)) {
        dmns = query_domains(user);
        prjs = PROJECT_H -> query_projects(user);

        foreach (name in dmns)
        if (query_leader(name, user))
            ldmn += ({ name });

        if (dl = sizeof(ldmn))
            dmns -= ldmn;

        foreach (name in prjs)
        if (PROJECT_H -> query_leader(name, user))
            lprj += ({ name });

        if (pl = sizeof(lprj))
            prjs -= lprj;

        d  = sizeof(dmns);
        p  = sizeof(prjs);

        ret = "";

        if (dl || pl)
            ret += "leader of the "+
            (dl ? query_multiple_short(ldmn) +" domain"+ (dl > 1 ? "s" : "") +
              (pl ? " and the " : "") : "") +
            (pl ? query_multiple_short(lprj) +" project"+
              (pl > 1 ? "s" : "") : "") + (d || p ? ", " : "");

        if (d || p)
            ret += "member of the "+
            (d ? query_multiple_short(dmns) +" domain"+ (d > 1 ? "s" : "") +
              (p ? " and the " : "") : "") +
            (p ? query_multiple_short(prjs) +" project"+ (p > 1 ? "s" : "") : "");

        return ret;
    }

    if (stringp(domain) && stringp(user)) {
        // return ctrs domain specific title
    }

    return 0;
}

// Storing the domain description in the handler turned unwieldy, so we simply
// read a file and return that.

string query_long(string name) {
    if (file_exists(DOMAIN_DIR "/"+ name +"/ABOUT"))
        return read_file(DOMAIN_DIR "/"+ name +"/ABOUT");
    else
        return "This domain hasn't been documented yet.  "
        "Please mail "+ query_multiple_short(query_leaders(name)) +
        " to get this fixed.\n";
} /* query_long */

nomask void dwep() {
  object my_ob = TO;

  if (my_ob)
    destruct(my_ob);
} /* dwep() */

void dest_me() { dwep(); }