skylib_fluffos_v3/
skylib_fluffos_v3/bin/
skylib_fluffos_v3/bin/db/
skylib_fluffos_v3/fluffos-2.9-ds2.04/
skylib_fluffos_v3/fluffos-2.9-ds2.04/ChangeLog.old/
skylib_fluffos_v3/fluffos-2.9-ds2.04/Win32/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/
skylib_fluffos_v3/fluffos-2.9-ds2.04/compat/simuls/
skylib_fluffos_v3/fluffos-2.9-ds2.04/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/clone/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/command/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/data/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/etc/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/include/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/inherit/master/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/log/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/compiler/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/efuns/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/single/tests/operators/
skylib_fluffos_v3/fluffos-2.9-ds2.04/testsuite/u/
skylib_fluffos_v3/fluffos-2.9-ds2.04/tmp/
skylib_fluffos_v3/fluffos-2.9-ds2.04/windows/
skylib_fluffos_v3/mudlib/
skylib_fluffos_v3/mudlib/cmds/
skylib_fluffos_v3/mudlib/cmds/admin/
skylib_fluffos_v3/mudlib/cmds/guild-race/
skylib_fluffos_v3/mudlib/cmds/living/broken/
skylib_fluffos_v3/mudlib/cmds/player/group_cmds/
skylib_fluffos_v3/mudlib/cmds/playtester/
skylib_fluffos_v3/mudlib/d/admin/
skylib_fluffos_v3/mudlib/d/admin/room/
skylib_fluffos_v3/mudlib/d/admin/room/we_care/
skylib_fluffos_v3/mudlib/d/admin/save/
skylib_fluffos_v3/mudlib/d/admin/text/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/buildings/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/map/
skylib_fluffos_v3/mudlib/d/learning/TinyTown/roads/
skylib_fluffos_v3/mudlib/d/learning/chars/
skylib_fluffos_v3/mudlib/d/learning/functions/
skylib_fluffos_v3/mudlib/d/learning/handlers/
skylib_fluffos_v3/mudlib/d/learning/help_topics/
skylib_fluffos_v3/mudlib/d/learning/help_topics/npcs/
skylib_fluffos_v3/mudlib/d/learning/help_topics/objects/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/crowd/
skylib_fluffos_v3/mudlib/d/learning/help_topics/rooms/situations/
skylib_fluffos_v3/mudlib/d/learning/save/
skylib_fluffos_v3/mudlib/d/learning/school/
skylib_fluffos_v3/mudlib/d/learning/school/add_sc/
skylib_fluffos_v3/mudlib/d/learning/school/characters/
skylib_fluffos_v3/mudlib/d/learning/school/general/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/basic_commands/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/edtutor/
skylib_fluffos_v3/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_fluffos_v3/mudlib/d/learning/school/items/
skylib_fluffos_v3/mudlib/d/learning/school/npc_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/room_basic/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/situations/
skylib_fluffos_v3/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_fluffos_v3/mudlib/d/learning/text/
skylib_fluffos_v3/mudlib/d/liaison/
skylib_fluffos_v3/mudlib/d/mudlib/
skylib_fluffos_v3/mudlib/d/mudlib/changes/
skylib_fluffos_v3/mudlib/d/playtesters/
skylib_fluffos_v3/mudlib/d/playtesters/effects/
skylib_fluffos_v3/mudlib/d/playtesters/handlers/
skylib_fluffos_v3/mudlib/d/playtesters/items/
skylib_fluffos_v3/mudlib/d/sage/
skylib_fluffos_v3/mudlib/doc/
skylib_fluffos_v3/mudlib/doc/creator/
skylib_fluffos_v3/mudlib/doc/driver/
skylib_fluffos_v3/mudlib/doc/driver/efuns/arrays/
skylib_fluffos_v3/mudlib/doc/driver/efuns/buffers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/calls/
skylib_fluffos_v3/mudlib/doc/driver/efuns/compile/
skylib_fluffos_v3/mudlib/doc/driver/efuns/filesystem/
skylib_fluffos_v3/mudlib/doc/driver/efuns/floats/
skylib_fluffos_v3/mudlib/doc/driver/efuns/functions/
skylib_fluffos_v3/mudlib/doc/driver/efuns/general/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mappings/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mixed/
skylib_fluffos_v3/mudlib/doc/driver/efuns/mudlib/
skylib_fluffos_v3/mudlib/doc/driver/efuns/numbers/
skylib_fluffos_v3/mudlib/doc/driver/efuns/parsing/
skylib_fluffos_v3/mudlib/doc/login/
skylib_fluffos_v3/mudlib/doc/lpc/basic_manual/
skylib_fluffos_v3/mudlib/doc/lpc/intermediate/
skylib_fluffos_v3/mudlib/doc/new/add_command/
skylib_fluffos_v3/mudlib/doc/new/events/
skylib_fluffos_v3/mudlib/doc/new/handlers/
skylib_fluffos_v3/mudlib/doc/new/living/race/
skylib_fluffos_v3/mudlib/doc/new/living/spells/
skylib_fluffos_v3/mudlib/doc/new/object/
skylib_fluffos_v3/mudlib/doc/new/player/
skylib_fluffos_v3/mudlib/doc/new/room/guild/
skylib_fluffos_v3/mudlib/doc/new/room/outside/
skylib_fluffos_v3/mudlib/doc/new/room/storeroom/
skylib_fluffos_v3/mudlib/doc/object/
skylib_fluffos_v3/mudlib/doc/playtesters/
skylib_fluffos_v3/mudlib/doc/policy/
skylib_fluffos_v3/mudlib/doc/weapons/
skylib_fluffos_v3/mudlib/global/
skylib_fluffos_v3/mudlib/global/creator/
skylib_fluffos_v3/mudlib/handlers/
skylib_fluffos_v3/mudlib/include/casino/
skylib_fluffos_v3/mudlib/include/cmds/
skylib_fluffos_v3/mudlib/include/effects/
skylib_fluffos_v3/mudlib/include/npc/
skylib_fluffos_v3/mudlib/include/room/
skylib_fluffos_v3/mudlib/include/shops/
skylib_fluffos_v3/mudlib/net/daemon/
skylib_fluffos_v3/mudlib/net/daemon/chars/
skylib_fluffos_v3/mudlib/net/inherit/
skylib_fluffos_v3/mudlib/net/obj/
skylib_fluffos_v3/mudlib/net/obj/BACKUPS/
skylib_fluffos_v3/mudlib/obj/amulets/
skylib_fluffos_v3/mudlib/obj/armours/plate/
skylib_fluffos_v3/mudlib/obj/b_day/
skylib_fluffos_v3/mudlib/obj/clothes/transport/horse/
skylib_fluffos_v3/mudlib/obj/faith/symbols/
skylib_fluffos_v3/mudlib/obj/fungi/
skylib_fluffos_v3/mudlib/obj/gatherables/
skylib_fluffos_v3/mudlib/obj/instruments/
skylib_fluffos_v3/mudlib/obj/media/
skylib_fluffos_v3/mudlib/obj/misc/player_shop/
skylib_fluffos_v3/mudlib/obj/monster/godmother/
skylib_fluffos_v3/mudlib/obj/monster/transport/
skylib_fluffos_v3/mudlib/obj/rings/
skylib_fluffos_v3/mudlib/obj/scabbards/
skylib_fluffos_v3/mudlib/obj/spells/
skylib_fluffos_v3/mudlib/obj/stationery/
skylib_fluffos_v3/mudlib/obj/stationery/envelopes/
skylib_fluffos_v3/mudlib/obj/toys/
skylib_fluffos_v3/mudlib/obj/vessels/
skylib_fluffos_v3/mudlib/obj/weapons/axes/
skylib_fluffos_v3/mudlib/obj/weapons/chains/
skylib_fluffos_v3/mudlib/obj/weapons/maces/BACKUPS/
skylib_fluffos_v3/mudlib/save/autodoc/
skylib_fluffos_v3/mudlib/save/book_handler/
skylib_fluffos_v3/mudlib/save/books/history/calarien/
skylib_fluffos_v3/mudlib/save/mail/
skylib_fluffos_v3/mudlib/save/new_soul/data/
skylib_fluffos_v3/mudlib/save/parcels/
skylib_fluffos_v3/mudlib/save/playerinfo/
skylib_fluffos_v3/mudlib/save/players/d/
skylib_fluffos_v3/mudlib/save/players/s/
skylib_fluffos_v3/mudlib/save/random_names/
skylib_fluffos_v3/mudlib/save/random_names/data/
skylib_fluffos_v3/mudlib/save/terrains/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_desert/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_grassy_field/
skylib_fluffos_v3/mudlib/save/terrains/tutorial_mountain/
skylib_fluffos_v3/mudlib/save/todo_lists/
skylib_fluffos_v3/mudlib/secure/
skylib_fluffos_v3/mudlib/secure/cmds/admin/
skylib_fluffos_v3/mudlib/secure/cmds/lord/
skylib_fluffos_v3/mudlib/secure/config/
skylib_fluffos_v3/mudlib/secure/handlers/autodoc/
skylib_fluffos_v3/mudlib/secure/handlers/intermud/
skylib_fluffos_v3/mudlib/secure/include/global/
skylib_fluffos_v3/mudlib/secure/save/
skylib_fluffos_v3/mudlib/secure/save/handlers/
skylib_fluffos_v3/mudlib/secure/std/
skylib_fluffos_v3/mudlib/secure/std/classes/
skylib_fluffos_v3/mudlib/secure/std/modules/
skylib_fluffos_v3/mudlib/std/creator/
skylib_fluffos_v3/mudlib/std/dom/
skylib_fluffos_v3/mudlib/std/effects/
skylib_fluffos_v3/mudlib/std/effects/external/
skylib_fluffos_v3/mudlib/std/effects/fighting/
skylib_fluffos_v3/mudlib/std/effects/magic/
skylib_fluffos_v3/mudlib/std/effects/magic/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/other/BACKUPS/
skylib_fluffos_v3/mudlib/std/effects/priest/
skylib_fluffos_v3/mudlib/std/effects/room/
skylib_fluffos_v3/mudlib/std/environ/
skylib_fluffos_v3/mudlib/std/guilds/
skylib_fluffos_v3/mudlib/std/guilds/old/
skylib_fluffos_v3/mudlib/std/languages/
skylib_fluffos_v3/mudlib/std/liquids/
skylib_fluffos_v3/mudlib/std/npc/
skylib_fluffos_v3/mudlib/std/npc/goals/
skylib_fluffos_v3/mudlib/std/npc/goals/basic/
skylib_fluffos_v3/mudlib/std/npc/goals/misc/
skylib_fluffos_v3/mudlib/std/npc/plans/
skylib_fluffos_v3/mudlib/std/npc/plans/basic/
skylib_fluffos_v3/mudlib/std/npc/types/
skylib_fluffos_v3/mudlib/std/npc/types/helper/
skylib_fluffos_v3/mudlib/std/npcs/
skylib_fluffos_v3/mudlib/std/outsides/
skylib_fluffos_v3/mudlib/std/races/shadows/
skylib_fluffos_v3/mudlib/std/room/basic/BACKUPS/
skylib_fluffos_v3/mudlib/std/room/basic/topography/
skylib_fluffos_v3/mudlib/std/room/controller/
skylib_fluffos_v3/mudlib/std/room/inherit/topography/
skylib_fluffos_v3/mudlib/std/room/topography/area/
skylib_fluffos_v3/mudlib/std/room/topography/iroom/
skylib_fluffos_v3/mudlib/std/room/topography/milestone/
skylib_fluffos_v3/mudlib/std/shadows/curses/
skylib_fluffos_v3/mudlib/std/shadows/disease/
skylib_fluffos_v3/mudlib/std/shadows/fighting/
skylib_fluffos_v3/mudlib/std/shadows/healing/
skylib_fluffos_v3/mudlib/std/shadows/magic/
skylib_fluffos_v3/mudlib/std/shadows/poison/
skylib_fluffos_v3/mudlib/std/shadows/room/
skylib_fluffos_v3/mudlib/std/shops/controllers/
skylib_fluffos_v3/mudlib/std/shops/objs/
skylib_fluffos_v3/mudlib/std/shops/player_shop/
skylib_fluffos_v3/mudlib/std/socket/
skylib_fluffos_v3/mudlib/std/soul/d/
skylib_fluffos_v3/mudlib/std/soul/e/
skylib_fluffos_v3/mudlib/std/soul/i/
skylib_fluffos_v3/mudlib/std/soul/j/
skylib_fluffos_v3/mudlib/std/soul/k/
skylib_fluffos_v3/mudlib/std/soul/l/
skylib_fluffos_v3/mudlib/std/soul/n/
skylib_fluffos_v3/mudlib/std/soul/o/
skylib_fluffos_v3/mudlib/std/soul/q/
skylib_fluffos_v3/mudlib/std/soul/r/
skylib_fluffos_v3/mudlib/std/soul/u/
skylib_fluffos_v3/mudlib/std/soul/v/
skylib_fluffos_v3/mudlib/std/soul/y/
skylib_fluffos_v3/mudlib/std/soul/z/
skylib_fluffos_v3/mudlib/std/stationery/
skylib_fluffos_v3/mudlib/w/
skylib_fluffos_v3/mudlib/w/default/
skylib_fluffos_v3/mudlib/w/default/armour/
skylib_fluffos_v3/mudlib/w/default/clothes/
skylib_fluffos_v3/mudlib/w/default/item/
skylib_fluffos_v3/mudlib/w/default/npc/
skylib_fluffos_v3/mudlib/w/default/room/
skylib_fluffos_v3/mudlib/w/default/weapon/
skylib_fluffos_v3/mudlib/www/
skylib_fluffos_v3/mudlib/www/java/
skylib_fluffos_v3/mudlib/www/secure/
skylib_fluffos_v3/mudlib/www/secure/lpc/advanced/
skylib_fluffos_v3/mudlib/www/secure/lpc/intermediate/
skylib_fluffos_v3/win32/
/* domaintool.c
 * The Domain Control Tool
 * for the admtool
 *Shaydz 3 Apr '00
 */

#include <colors.h>
inherit COMMAND_BASE;

private mapping return_mapping = ([ ]);
private string main_menu_template = @END
-------------------------------------------------------------------------
%s
-------------------------------------------------------------------------
  %sCommand                                      Status%s

  [1]  Create new Domain                      %s
  [2]  Delete Domain                          %s
  [3]  List Domains                           %s
  [4]  Add Leader to Domain                   %s
  [5]  Add Senior to Domain                   %s
  [6]  Add Member to Domain                   %s
  [7]  Remove Leader from Domain              %s
  [8]  Remove Senior from Domain              %s
  [9]  Remove Member from Domain              %s

END;

private string main_prompt = "Enter your command [1-9], or [Q] to quit: ";
private string main_prompt2 = "Enter your command [1-9], [B] to go back, or [Q] to quit: ";

// Function prototypes
mixed cmd(string arg);
private void get_command(string str);
private void create_domain();
private void create_domain2(string str);
private void create_domain3(string str, string domain);
private void delete_domain();
private void delete_domain2(string str);
private void delete_domain3(string str, string domain);
private void list_domains();
private void add_leader();
private void add_leader2(string str);
private void add_leader3(string str, string domain);
private void add_member();
private void add_member2(string str);
private void add_member3(string str, string domain);
private void remove_leader();
private void remove_leader2(string str);
private void remove_leader3(string str, string domain);
private void remove_member();
private void remove_member2(string str);
private void remove_member3(string str, string domain);
private void add_senior();
private void add_senior2(string str);
private void add_senior3(string str, string domain);
private void remove_senior();
private void remove_senior2(string str);
private void remove_senior3(string str, string domain);

private void display_menu() {
    string title, s1, s2, s3, s4, s5, s6, s7, s8, s9;

    title = sprintf("%s%|72s%s", YELLOW,
        mud_name()+" Domains Control Tool v1.5", RESET );

    s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = s9 = RED+"Unavailable"+RESET;

    if( DOMAIN_H->query_leader( TP->query_name() ) ) {
        s5 = s6 = s8 = s9 = MAGENTA+"Limited"+RESET;
        s3 = GREEN+"Available"+RESET;
    }

    if( adminp(TP) )
        s1 = s2 = s3 = s4 = s5 = s6 = s7 = s8 = s9 = GREEN+"Available"+RESET;

    tell_object( TP, sprintf( main_menu_template, title, BOLD, RESET,
        s1, s2, s3, s4, s5, s6, s7, s8, s9 ) );

} /* display_menu() */

private void do_prompt() {
    tell_object( TP, undefinedp(return_mapping[TP]) ? main_prompt :
                                                      main_prompt2 );
    input_to( (: get_command :) );
} /* do_prompt() */

private void create_domain() {
    if( !adminp(TP) ) {
        tell_object( TP, RED+"\nYou are not authorised to use this option.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the NEW Domain ('q' to abort): ");
    input_to( (: create_domain2 :) );

} /* create_domain() */

private void create_domain2( string str ) {
    if( !str || str == "")
        return do_prompt();

    if( DOMAIN_H->query_domain( str ) ) {
        tell_object( TP, "The "+CAP(str)+" domain already exists.\n");
        return do_prompt();
    }

    if( ( str = lower_case(str) ) == "q")
        return do_prompt();

    tell_object( TP, "Enter the name of the Domain leader or press return "
        "to use yourself ('q' to abort): ");
    input_to( (: create_domain3( $1, $(str)) :) );

} /* create_domain2() */

private void create_domain3( string str, string domain ) {
    string err, old;

    if( !str || str == "")
        str = TP->query_name();

    if( ( str = lower_case(str) ) == "q")
        return do_prompt();

    old = geteuid(TO);
    seteuid(geteuid(TP));

    if( err = DOMAIN_H->add_domain(domain) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    if( err = DOMAIN_H->add_member( domain, str ) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    if( err = DOMAIN_H->add_leader( domain, str ) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    seteuid(old);

    log_file("PROMOTIONS", "%s - %s created a new domain %s with %s as "
        "lord.\n", ctime(time()), CAP(TP->query_name()), CAP(domain),
        CAP(str) );

    tell_object( TP, GREEN+"\nCreated domain "+CAP(domain)+" with "+
        CAP(str)+" as its leader.\n\n"+RESET );

    do_prompt();

} /* create_domain3() */

private void delete_domain() {
    if( !adminp(TP) ) {
        tell_object( TP, RED+"\nYou are not authorised to use this option.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the domain to DELETE: ");
    input_to( (: delete_domain2 :) );

} /* delete_domain() */

private void delete_domain2( string str ) {
    if( !str || str == "")
        return do_prompt();

    if( !DOMAIN_H->query_domain( str = lower_case(str) ) ) {
        tell_object( TP, RED+"The "+CAP(str)+" domain doesn't exist.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Are you sure you wish to delete the "+
        CAP(str)+" domain? : ");
    input_to( (: delete_domain3( $1, $(str)) :) );

} /* delete_domain2() */

private void delete_domain3( string str, string domain ) {
    string err, old;

    if( !str || str == "")
        return do_prompt();

    str = lower_case(str);

    if( str != "y" && str != "yes" ) {
        tell_object( TP, "\nThe "+CAP(domain)+" domain has NOT been "
            "deleted.\n");
        return do_prompt();
    }

    old = geteuid(TO);
    seteuid(geteuid(TP));

    if( err = DOMAIN_H->remove_domain(domain) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    seteuid(old);

    log_file("PROMOTIONS", "%s - %s removed domain %s.\n", ctime(time()),
        CAP(TP->query_name()), CAP(domain) );

    tell_object( TP, GREEN+"\nRemoved domain "+CAP(domain)+".\n"+RESET );

    do_prompt();

} /* delete_domain3() */

private void list_domains() {
    tell_object( TP, create_table( ({"Domains", "domain"}),
        DOMAIN_H->query_domains(), 1 ) );
    do_prompt();
} /* list_domains() */

private void add_leader() {
    if( !adminp(TP) ) {
        tell_object( TP, RED+"\nYou are not authorised to use this option.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the Domain to add a leader to: ");
    input_to( (: add_leader2 :) );

} /* add_leader() */

private void add_leader2( string str ) {
    if( !str || str == "")
        return do_prompt();

    if( !DOMAIN_H->query_domain( str = lower_case(str) ) ) {
        tell_object( TP, RED+"The "+CAP(str)+" domain doesn't exist.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the Domain leader to add or press "
        "return to use yourself: ");
    input_to( (: add_leader3( $1, $(str)) :) );

} /* add_leader2() */

private void add_leader3( string str, string domain ) {
    string err, old;

    if( !str || str == "")
        str = TP->query_name();

    if( DOMAIN_H->query_leader( domain, str = lower_case(str) ) ) {
        tell_object( TP, RED+CAP(str)+" is already a leader of "+
            CAP(domain)+".\n"+RESET );
        return do_prompt();
    }

    if( !DOMAIN_H->query_member( domain, str ) ) {
        if( err = DOMAIN_H->add_member( domain, str ) ) {
            tell_object( TP, RED+"\n"+err+"\n"+RESET );
            return do_prompt();
        }
    }

    old = geteuid(TO);
    seteuid(geteuid(TP));

    if( err = DOMAIN_H->add_leader( domain, str ) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    if( DOMAIN_H->query_senior( domain, str ) )
        DOMAIN_H->remove_senior( domain, str );

    seteuid(old);

    log_file("PROMOTIONS", "%s - %s added %s as a lord of %s.\n",
        ctime(time()), CAP(TP->query_name()), CAP(str), CAP(domain) );

    tell_object( TP, GREEN+"\nAdded "+CAP(str)+" as a leader of the "+
        CAP(domain)+" domain.\n\n"+RESET );

    do_prompt();

} /* add_leader3() */

private void add_senior() {
    tell_object( TP, "Enter the name of the Domain to add a senior to: ");
    input_to( (: add_senior2 :) );
} /* add_senior() */

private void add_senior2( string str ) {
    if( !str || str == "")
        return do_prompt();

    if( !DOMAIN_H->query_domain( str = lower_case(str) ) ) {
        tell_object( TP, RED+"The "+CAP(str)+" domain doesn't exist.\n"+
            RESET );
        return do_prompt();
    }

    if( !adminp(TP) && !DOMAIN_H->query_leader( str, TP->query_name() ) ) {
        tell_object( TP, RED+"\nYou are not authorised to do that.\n"+RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the senior to add or press return to "
        "use yourself: ");
    input_to( (: add_senior3( $1, $(str)) :) );

} /* add_member2() */

private void add_senior3( string str, string domain ) {
    string err, old;

    if( !str || str == "")
        str = TP->query_name();

    if( DOMAIN_H->query_senior( domain, str = lower_case(str) ) ) {
        tell_object( TP, RED+CAP(str)+" is already a senior of "+
            CAP(domain)+".\n"+RESET );
        return do_prompt();
    }

    if( DOMAIN_H->query_leader( domain, str ) ) {
        tell_object( TP, RED+CAP(str)+" is already a leader of "+
            CAP(domain)+".\n"+RESET );
        return do_prompt();
    }

    old = geteuid(TO);
    seteuid(geteuid(TP));

    if( err = DOMAIN_H->add_senior( domain, str ) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    seteuid(old);

    log_file("PROMOTIONS", "%s - %s added %s as a senior of %s.\n",
        ctime(time()), CAP(TP->query_name()), CAP(str),CAP(domain) );

    tell_object( TP, GREEN+"\nAdded "+CAP(str)+" as a senior of "+
        CAP(domain)+".\n\n"+RESET );

    do_prompt();

} /* add_senior3() */

private void add_member() {
    tell_object( TP, "Enter the name of the Domain to add a member to: ");
    input_to( (: add_member2 :) );
} /* add_member() */

private void add_member2( string str ) {
    if( !str || str == "")
        return do_prompt();

    if( !DOMAIN_H->query_domain( str = lower_case(str) ) ) {
        tell_object( TP, RED+"The "+CAP(str)+" domain doesn't exist.\n"+
            RESET );
        return do_prompt();
    }

    if( !adminp(TP) && !DOMAIN_H->query_leader( str, TP->query_name() ) ) {
        tell_object( TP, RED+"\nYou are not authorised to do that.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the member to add or press return to "
        "use yourself: ");
    input_to( (: add_member3( $1, $(str)) :) );

} /* add_member2() */

private void add_member3( string str, string domain ) {
    string err, old;

    if( !str || str == "")
        str = TP->query_name();

    if( DOMAIN_H->query_member( domain, str = lower_case(str) ) ) {
        tell_object( TP, RED+CAP(str)+" is already a member of "+
            CAP(domain)+".\n"+RESET );
        return do_prompt();
    }

    old = geteuid(TO);
    seteuid(geteuid(TP));

    if( err = DOMAIN_H->add_member( domain, str ) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    seteuid(old);

    tell_object( TP, GREEN+"\nAdded "+CAP(str)+" as a member of "+
        CAP(domain)+".\n\n"+RESET );

    do_prompt();

} /* add_member3() */

private void remove_leader() {
    if( !adminp(TP) ) {
        tell_object( TP, RED+"\nYou are not authorised to use this option.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the Domain to remove a Leader "
        "from: ");
    input_to( (: remove_leader2 :) );

} /* remove_leader() */

private void remove_leader2( string str ) {
    if( !str || str == "")
        return do_prompt();

    if( !DOMAIN_H->query_domain( str = lower_case(str) ) ) {
        tell_object( TP, RED+"The "+CAP(str)+" domain doesn't exist.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the Domain leader to remove or press "
        "return to use yourself: ");
    input_to( (: remove_leader3( $1, $(str)) :) );

} /* remove_leader2() */

private void remove_leader3( string str, string domain ) {
    string err, old;

    if( !str || str == "")
        str = TP->query_name();

    if( !DOMAIN_H->query_leader( domain, str = lower_case(str) ) ) {
        tell_object( TP, RED+CAP(str)+" isn't a Leader of "+
            CAP(domain)+".\n"+RESET );
        return do_prompt();
    }

    old = geteuid(TO);
    seteuid(geteuid(TP));

    if( err = DOMAIN_H->remove_leader( domain, str ) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    seteuid(old);

    log_file("PROMOTIONS", "%s - %s removed %s as a lord of %s.\n",
        ctime(time()), CAP(TP->query_name()), CAP(str), CAP(domain) );

    tell_object( TP, GREEN+"\nRemoved "+CAP(str)+" as a leader from "+
        CAP(domain)+".\n"+RESET );

    do_prompt();

} /* remove_leader3() */

private void remove_senior() {
    tell_object( TP, "Enter the name of the Domain to remove senior from: ");
    input_to( (: remove_senior2 :) );
} /* remove_member() */

private void remove_senior2( string str ) {
    if( !str || str == "")
        return do_prompt();

    if( !DOMAIN_H->query_domain( str = lower_case(str) ) ) {
        tell_object( TP, RED+"The domain "+CAP(str)+" doesn't exist.\n"+
            RESET );
        return do_prompt();
    }

    if( !adminp(TP) && !DOMAIN_H->query_leader( str, TP->query_name() ) ) {
        tell_object( TP, RED+"\nYou are not authorised to do that.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the Domain senior to remove or press "
        "return to use yourself: ");
    input_to( (: remove_senior3( $1, $(str)) :) );

} /* remove_senior2() */

private void remove_senior3( string str, string domain ) {
    string err, old;

    if( !str || str == "")
        str = TP->query_name();

    if( !DOMAIN_H->query_senior( domain, str = lower_case(str) ) ) {
        tell_object( TP, RED+CAP(str)+" isn't a senior of "+CAP(domain)+".\n"+
            RESET );
        return do_prompt();
    }

    if( DOMAIN_H->query_leader( domain, str ) ) {
        tell_object( TP, RED+CAP(str)+" is a Leader of "+
            CAP(domain)+", use the remove leader option.\n"+RESET );
        return do_prompt();
    }

    old = geteuid(TO);
    seteuid(geteuid(TP));

    if( err = DOMAIN_H->remove_senior( domain, str ) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    seteuid(old);

    log_file("PROMOTIONS", "%s - %s removed %s as a senior of %s.\n",
        ctime(time()), CAP(TP->query_name()), CAP(str),CAP(domain) );

    tell_object( TP, GREEN+"\nRemoved "+CAP(str)+" as senior of "+
        CAP(domain)+".\n\n"+RESET );

    do_prompt();

} /* remove_senior3() */

private void remove_member() {
    tell_object( TP, "Enter the name of the Domain to remove member from: ");
    input_to( (: remove_member2 :) );
} /* remove_member() */

private void remove_member2( string str ) {
    if( !str || str == "")
        return do_prompt();

    if( !DOMAIN_H->query_domain( str = lower_case(str) ) ) {
        tell_object( TP, RED+"The domain "+CAP(str)+" doesn't exist.\n"+
            RESET );
        return do_prompt();
    }

    if( !adminp(TP) && !DOMAIN_H->query_leader( str, TP->query_name() ) ) {
        tell_object( TP, RED+"\nYou are not authorised to do that.\n"+
            RESET );
        return do_prompt();
    }

    tell_object( TP, "Enter the name of the Domain member to remove or press "
        "return to use yourself: ");
    input_to( (: remove_member3( $1, $(str)) :) );

} /* remove_member2() */

private void remove_member3( string str, string domain ) {
    string err, old;

    if( !str || str == "")
        str = TP->query_name();

    if( DOMAIN_H->query_leader( domain, str = lower_case(str) ) ) {
        tell_object( TP, RED+CAP(str)+" is a Leader of "+CAP(domain)+", use "
            "the remove leader option first.\n"+RESET );
        return do_prompt();
    }

    if( !DOMAIN_H->query_member( domain, str ) ) {
        tell_object( TP, RED+CAP(str)+" isn't a member of "+
            CAP(domain)+".\n"+RESET );
        return do_prompt();
    }

    old = geteuid(TO);
    seteuid(geteuid(TP));

    if( err = DOMAIN_H->remove_member( domain, str ) ) {
        tell_object( TP, RED+"\n"+err+"\n"+RESET );
        seteuid(old);
        return do_prompt();
    }

    seteuid(old);

    tell_object( TP, GREEN+"\nRemoved " + CAP(str) + " as member of "+
        CAP(domain)+".\n\n"+RESET );

    do_prompt();

} /* remove_member3() */

private void get_command( string str ) {
    if( !str ) {
        display_menu();
        return do_prompt();
    }

    switch( str ) {
      case "1":
        create_domain();
      break;
      case "2":
        delete_domain();
      break;
      case "3":
        list_domains();
      break;
      case "4":
        add_leader();
      break;
      case "5":
        add_senior();
      break;
      case "6":
        add_member();
      break;
      case "7":
        remove_leader();
      break;
      case "8":
        remove_senior();
      break;
      case "9":
        remove_member();
      break;
      case "B":
      case "b":
        if( !return_mapping[TP] ) {
            display_menu();
            return do_prompt();
        }
        return_mapping[TP]->cmd("");
        map_delete( return_mapping, TP );
      break;
      case "Q":
      case "q":
        map_delete( return_mapping, TP );
      break;
      default:
        display_menu();
        return do_prompt();
    }

} /* get_command() */

int cmd( string arg ) {
    if( file_name(PO) == "/secure/cmds/creator/admtools")
        return_mapping[TP] = PO;

    display_menu();
    do_prompt();
    return 1;

} /* cmd() */