ds2.9a12/bin/
ds2.9a12/extra/
ds2.9a12/extra/crat/
ds2.9a12/extra/creremote/
ds2.9a12/extra/mingw/
ds2.9a12/extra/wolfpaw/
ds2.9a12/fluffos-2.14-ds13/
ds2.9a12/fluffos-2.14-ds13/Win32/
ds2.9a12/fluffos-2.14-ds13/compat/
ds2.9a12/fluffos-2.14-ds13/compat/simuls/
ds2.9a12/fluffos-2.14-ds13/include/
ds2.9a12/fluffos-2.14-ds13/testsuite/
ds2.9a12/fluffos-2.14-ds13/testsuite/clone/
ds2.9a12/fluffos-2.14-ds13/testsuite/command/
ds2.9a12/fluffos-2.14-ds13/testsuite/data/
ds2.9a12/fluffos-2.14-ds13/testsuite/etc/
ds2.9a12/fluffos-2.14-ds13/testsuite/include/
ds2.9a12/fluffos-2.14-ds13/testsuite/inherit/
ds2.9a12/fluffos-2.14-ds13/testsuite/inherit/master/
ds2.9a12/fluffos-2.14-ds13/testsuite/log/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/tests/compiler/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/tests/efuns/
ds2.9a12/fluffos-2.14-ds13/testsuite/single/tests/operators/
ds2.9a12/fluffos-2.14-ds13/testsuite/u/
ds2.9a12/lib/cmds/admins/
ds2.9a12/lib/cmds/common/
ds2.9a12/lib/cmds/creators/include/
ds2.9a12/lib/daemon/services/
ds2.9a12/lib/daemon/tmp/
ds2.9a12/lib/doc/
ds2.9a12/lib/doc/bguide/
ds2.9a12/lib/doc/efun/all/
ds2.9a12/lib/doc/efun/arrays/
ds2.9a12/lib/doc/efun/buffers/
ds2.9a12/lib/doc/efun/compile/
ds2.9a12/lib/doc/efun/floats/
ds2.9a12/lib/doc/efun/functions/
ds2.9a12/lib/doc/efun/general/
ds2.9a12/lib/doc/efun/mixed/
ds2.9a12/lib/doc/efun/numbers/
ds2.9a12/lib/doc/efun/parsing/
ds2.9a12/lib/doc/hbook/
ds2.9a12/lib/doc/help/classes/
ds2.9a12/lib/doc/help/races/
ds2.9a12/lib/doc/lfun/
ds2.9a12/lib/doc/lfun/all/
ds2.9a12/lib/doc/lfun/lib/abilities/
ds2.9a12/lib/doc/lfun/lib/armor/
ds2.9a12/lib/doc/lfun/lib/bank/
ds2.9a12/lib/doc/lfun/lib/bot/
ds2.9a12/lib/doc/lfun/lib/clay/
ds2.9a12/lib/doc/lfun/lib/clean/
ds2.9a12/lib/doc/lfun/lib/clerk/
ds2.9a12/lib/doc/lfun/lib/client/
ds2.9a12/lib/doc/lfun/lib/combat/
ds2.9a12/lib/doc/lfun/lib/connect/
ds2.9a12/lib/doc/lfun/lib/container/
ds2.9a12/lib/doc/lfun/lib/corpse/
ds2.9a12/lib/doc/lfun/lib/creator/
ds2.9a12/lib/doc/lfun/lib/daemon/
ds2.9a12/lib/doc/lfun/lib/damage/
ds2.9a12/lib/doc/lfun/lib/deterioration/
ds2.9a12/lib/doc/lfun/lib/donate/
ds2.9a12/lib/doc/lfun/lib/door/
ds2.9a12/lib/doc/lfun/lib/equip/
ds2.9a12/lib/doc/lfun/lib/file/
ds2.9a12/lib/doc/lfun/lib/fish/
ds2.9a12/lib/doc/lfun/lib/fishing/
ds2.9a12/lib/doc/lfun/lib/flashlight/
ds2.9a12/lib/doc/lfun/lib/follow/
ds2.9a12/lib/doc/lfun/lib/ftp_client/
ds2.9a12/lib/doc/lfun/lib/ftp_data_connection/
ds2.9a12/lib/doc/lfun/lib/fuel/
ds2.9a12/lib/doc/lfun/lib/furnace/
ds2.9a12/lib/doc/lfun/lib/genetics/
ds2.9a12/lib/doc/lfun/lib/holder/
ds2.9a12/lib/doc/lfun/lib/id/
ds2.9a12/lib/doc/lfun/lib/interactive/
ds2.9a12/lib/doc/lfun/lib/lamp/
ds2.9a12/lib/doc/lfun/lib/leader/
ds2.9a12/lib/doc/lfun/lib/light/
ds2.9a12/lib/doc/lfun/lib/limb/
ds2.9a12/lib/doc/lfun/lib/living/
ds2.9a12/lib/doc/lfun/lib/load/
ds2.9a12/lib/doc/lfun/lib/look/
ds2.9a12/lib/doc/lfun/lib/manipulate/
ds2.9a12/lib/doc/lfun/lib/meal/
ds2.9a12/lib/doc/lfun/lib/messages/
ds2.9a12/lib/doc/lfun/lib/player/
ds2.9a12/lib/doc/lfun/lib/poison/
ds2.9a12/lib/doc/lfun/lib/position/
ds2.9a12/lib/doc/lfun/lib/post_office/
ds2.9a12/lib/doc/lfun/lib/potion/
ds2.9a12/lib/doc/lfun/lib/room/
ds2.9a12/lib/doc/lfun/lib/server/
ds2.9a12/lib/doc/lfun/lib/spell/
ds2.9a12/lib/doc/lfun/lib/torch/
ds2.9a12/lib/doc/lfun/lib/vendor/
ds2.9a12/lib/doc/lfun/lib/virt_sky/
ds2.9a12/lib/doc/lfun/lib/weapon/
ds2.9a12/lib/doc/lfun/lib/worn_storage/
ds2.9a12/lib/doc/lpc/basic/
ds2.9a12/lib/doc/lpc/concepts/
ds2.9a12/lib/doc/lpc/constructs/
ds2.9a12/lib/doc/lpc/etc/
ds2.9a12/lib/doc/lpc/intermediate/
ds2.9a12/lib/doc/lpc/types/
ds2.9a12/lib/doc/misc/
ds2.9a12/lib/doc/old/
ds2.9a12/lib/domains/
ds2.9a12/lib/domains/Praxis/adm/
ds2.9a12/lib/domains/Praxis/attic/
ds2.9a12/lib/domains/Praxis/cemetery/mon/
ds2.9a12/lib/domains/Praxis/data/
ds2.9a12/lib/domains/Praxis/death/
ds2.9a12/lib/domains/Praxis/mountains/
ds2.9a12/lib/domains/Praxis/obj/armour/
ds2.9a12/lib/domains/Praxis/obj/magic/
ds2.9a12/lib/domains/Praxis/obj/weapon/
ds2.9a12/lib/domains/Praxis/orc_valley/
ds2.9a12/lib/domains/Ylsrim/
ds2.9a12/lib/domains/Ylsrim/adm/
ds2.9a12/lib/domains/Ylsrim/armor/
ds2.9a12/lib/domains/Ylsrim/broken/
ds2.9a12/lib/domains/Ylsrim/fish/
ds2.9a12/lib/domains/Ylsrim/meal/
ds2.9a12/lib/domains/Ylsrim/npc/
ds2.9a12/lib/domains/Ylsrim/obj/
ds2.9a12/lib/domains/Ylsrim/virtual/
ds2.9a12/lib/domains/Ylsrim/weapon/
ds2.9a12/lib/domains/campus/adm/
ds2.9a12/lib/domains/campus/etc/
ds2.9a12/lib/domains/campus/meals/
ds2.9a12/lib/domains/campus/save/
ds2.9a12/lib/domains/campus/txt/ai/charles/
ds2.9a12/lib/domains/campus/txt/ai/charles/bak2/
ds2.9a12/lib/domains/campus/txt/ai/charles/bak2/bak1/
ds2.9a12/lib/domains/campus/txt/ai/charly/
ds2.9a12/lib/domains/campus/txt/ai/charly/bak/
ds2.9a12/lib/domains/campus/txt/jenny/
ds2.9a12/lib/domains/cave/doors/
ds2.9a12/lib/domains/cave/etc/
ds2.9a12/lib/domains/cave/meals/
ds2.9a12/lib/domains/cave/weap/
ds2.9a12/lib/domains/default/creator/
ds2.9a12/lib/domains/default/doors/
ds2.9a12/lib/domains/default/etc/
ds2.9a12/lib/domains/default/vehicles/
ds2.9a12/lib/domains/default/virtual/
ds2.9a12/lib/domains/default/weap/
ds2.9a12/lib/domains/town/txt/shame/
ds2.9a12/lib/domains/town/virtual/
ds2.9a12/lib/domains/town/virtual/bottom/
ds2.9a12/lib/domains/town/virtual/space/
ds2.9a12/lib/estates/
ds2.9a12/lib/ftp/
ds2.9a12/lib/lib/comp/
ds2.9a12/lib/lib/daemons/
ds2.9a12/lib/lib/daemons/include/
ds2.9a12/lib/lib/lvs/
ds2.9a12/lib/lib/user/
ds2.9a12/lib/lib/virtual/
ds2.9a12/lib/log/
ds2.9a12/lib/log/adm/
ds2.9a12/lib/log/archive/
ds2.9a12/lib/log/chan/
ds2.9a12/lib/log/errors/
ds2.9a12/lib/log/law/adm/
ds2.9a12/lib/log/law/email/
ds2.9a12/lib/log/law/names/
ds2.9a12/lib/log/law/sites-misc/
ds2.9a12/lib/log/law/sites-register/
ds2.9a12/lib/log/law/sites-tempban/
ds2.9a12/lib/log/law/sites-watch/
ds2.9a12/lib/log/open/
ds2.9a12/lib/log/reports/
ds2.9a12/lib/log/router/
ds2.9a12/lib/log/secure/
ds2.9a12/lib/log/watch/
ds2.9a12/lib/obj/book_source/
ds2.9a12/lib/obj/include/
ds2.9a12/lib/powers/prayers/
ds2.9a12/lib/powers/spells/
ds2.9a12/lib/realms/template/adm/
ds2.9a12/lib/realms/template/area/armor/
ds2.9a12/lib/realms/template/area/npc/
ds2.9a12/lib/realms/template/area/obj/
ds2.9a12/lib/realms/template/area/room/
ds2.9a12/lib/realms/template/area/weap/
ds2.9a12/lib/realms/template/bak/
ds2.9a12/lib/realms/template/cmds/
ds2.9a12/lib/save/kills/o/
ds2.9a12/lib/secure/cfg/classes/
ds2.9a12/lib/secure/cmds/builders/
ds2.9a12/lib/secure/cmds/creators/include/
ds2.9a12/lib/secure/cmds/players/
ds2.9a12/lib/secure/cmds/players/include/
ds2.9a12/lib/secure/daemon/imc2server/
ds2.9a12/lib/secure/daemon/include/
ds2.9a12/lib/secure/lib/
ds2.9a12/lib/secure/lib/include/
ds2.9a12/lib/secure/lib/net/include/
ds2.9a12/lib/secure/lib/std/
ds2.9a12/lib/secure/log/adm/
ds2.9a12/lib/secure/log/bak/
ds2.9a12/lib/secure/log/intermud/
ds2.9a12/lib/secure/log/network/
ds2.9a12/lib/secure/modules/
ds2.9a12/lib/secure/npc/
ds2.9a12/lib/secure/obj/include/
ds2.9a12/lib/secure/room/
ds2.9a12/lib/secure/save/
ds2.9a12/lib/secure/save/backup/
ds2.9a12/lib/secure/save/boards/
ds2.9a12/lib/secure/tmp/
ds2.9a12/lib/secure/upgrades/files/
ds2.9a12/lib/secure/verbs/creators/
ds2.9a12/lib/std/board/
ds2.9a12/lib/std/lib/
ds2.9a12/lib/tmp/
ds2.9a12/lib/verbs/admins/include/
ds2.9a12/lib/verbs/builders/
ds2.9a12/lib/verbs/common/
ds2.9a12/lib/verbs/common/include/
ds2.9a12/lib/verbs/creators/
ds2.9a12/lib/verbs/creators/include/
ds2.9a12/lib/verbs/rooms/
ds2.9a12/lib/verbs/rooms/include/
ds2.9a12/lib/www/client/
ds2.9a12/lib/www/errors/
ds2.9a12/lib/www/images/
ds2.9a12/lib/www/lpmuds/downloads_files/
ds2.9a12/lib/www/lpmuds/intermud_files/
ds2.9a12/lib/www/lpmuds/links_files/
ds2.9a12/win32/
#include <lib.h>
#include <save.h>
#include <daemons.h>

inherit LIB_DAEMON;
mapping mudlist;
string banned, unbanned;
string blacklisted, unblacklisted;
string *allmuds, *banned_arr, *unbanned_arr;
string *blacklisted_arr, *unblacklisted_arr;

varargs string match_mud_name(string mud, string *list){
    list = allmuds;
    if(member_array(mud, list) != -1) return mud;
    foreach(string element in list){
        if(lower_case(element) == lower_case(mud)) {
            return element;
        }
    }
    foreach(string element in list){
        if(!strsrch(lower_case(element), lower_case(mud))){
            return element;
        }
        if(mudlist[element]["ip"]+" "+mudlist[element]["player_port"] == mud)
            return mudlist[element]["name"];
    }

    return "";
}

mixed cmd(string args) {
    string arg1, arg2, tmp;
    int scannedp;
    object router = find_object(ROUTER_D);

    if(!archp(previous_object())) return 0;

    if(!router && (args != "on" && args != "online")){
        write("Router is not loaded. First try: mudconfig router enable");
        return 1;
    }

    mudlist = router->query_mudinfo();
    allmuds = keys(mudlist);

    if(!args || args == ""){
        args = "show";
    }

    if(args == "show"){
        write("Router config:");
        router->get_info();
        return 1;
    }

    if(!router){
        write("Router is not loaded.");
        return 1;
    }

    scannedp = sscanf(args,"%s %s", arg1, arg2);

    if(args == "mudlist" || arg1 == "mudlist"){
        mapping info;
        string *list;
        mapping borg;
        string mud, tempy;
        int all = 0;
        int ipsort = 0;
        int fdsort = 0;
        if(sizeof(arg2)) tempy = match_mud_name(arg2);
        if(sizeof(tempy)) arg2 = tempy;
        if(arg2 && !strsrch(arg2,"-i")){
            ipsort = 1;
            arg2 = trim(arg2[2..]);
        }
        if(arg2 && !strsrch(arg2,"-f")){
            fdsort = 1;
            arg2 = trim(arg2[2..]);
        }

        if( arg2 && arg2 != "" && strlen(arg2) > 3 ) {
            mapping tmp_map;
            string opt, tmpstr;

            tmp_map = mudlist;
            if( arg2[0] != '-' ) arg2 = "-n " + arg2;
            opt = arg2[1..1];
            arg2 = arg2[3..];
            borg = ([]);

            foreach(mud, info in tmp_map) {
                int x, y, z;

                switch(opt) {
                case "a":
                    all = 1;
                    break;
                case "m":
                    x = 5;
                    break;
                case "d":
                    x = 7;
                    break;
                case "n":
                    x = 0;
                    break;
                }
                tmpstr = (x ? info[x] : mud);
                z = strlen(arg2 = replace_string(lower_case(arg2), " ", ""));
                y = strlen(tmpstr = replace_string(lower_case(tmpstr), " ", ""));
                if( lower_case(arg2) == lower_case(tmpstr) ) {
                    borg = ([ mud : info ]);
                    break;
                }
                else if( y > z && tmpstr[0..z-1] == arg2 && info[0] == -1 ) 
                    borg[mud] = info;
            }
        }
        else {
            borg = ([ ]);
            foreach( mud, info in mudlist ){
                if( all == 1 || (info["restart_delay"] && info["restart_delay"] == -1) ) 
                    borg[mud] = info;
            }
        }
        if( !sizeof(borg) ) {
            message("system", "No MUDs match your query.", this_player());
            return 1;
        }
        else if( sizeof(borg) == 1 ) {
            string msg, svc;
            int val, comma = 0;

            mud = keys(borg)[0];
            msg = "\nDetailed information on %^GREEN%^" + mud + "%^RESET%^:\n";
            msg += sprintf("MUD Type: %:-6s Server: %:-20s Library: %s\n",
              borg[mud]["mud_type"], borg[mud]["driver"], borg[mud]["base_mudlib"]);
            msg += "Status: " + borg[mud]["open_status"] + "\nAdmin email: " +
            borg[mud]["admin_email"] + "\n";
            msg += "Services: ";
            foreach(svc, val in borg[mud]["services"]) {
                if( val == 1 ) {
                    if( comma ) msg += ", " + svc;
                    else {
                        msg += svc;
                        comma = 1;
                    }
                }
            }
            msg += "\nHost: " + borg[mud]["ip"] + "\n";
            msg += "Telnet port: " + borg[mud]["player_port"] + "\n";
            if( borg[mud]["services"]["amcp"] )
                msg += "AMCP version: " + borg[mud]["services"]["amcp"] + "\n";
            if( borg[mud]["services"]["http"] ) 
                msg += "HTTP port (World Wide Web): " + borg[mud]["services"]["http"]+"\n";
            if( borg[mud]["services"]["ftp"] ) 
                msg += "FTP port (File Transfer): " + borg[mud]["services"]["ftp"] + "\n";
            if( borg[mud]["services"]["rcp"] )
                msg += "RCP port (Remote Creator): " + borg[mud]["services"]["rcp"] + "\n";
            message("info", msg, this_player());
            return 1;
        }

        list = ({});

        if(fdsort){
            mapping fds = ROUTER_D->query_connected_fds();
            string *ret = ({});
            int i, quant = sizeof(socket_status());
            for(i = 0; i < quant; i++){
                if(last_string_element(socket_status(i)[3],".") == ROUTER_D->GetRouterPort() ){
                    string mudnamen;
                    if(fds[i]) mudnamen = fds[i];
                    else mudnamen = "UNKNOWN";
                    ret += ({ i+" "+mudnamen+" "+explode(socket_address(i)," ")[0] });
                }
            }
            ret = sort_array(ret,1);
            this_player()->eventPage(ret);
            return 1;
        }

        foreach(mud, info in borg){
            if(ipsort)
                list += ({ sprintf("%:-15s %:-6s %:-15s %:-18s",
                    info["ip"], itoa(info["player_port"]), replace_string(mud,"%^","%%^^"), info["base_mudlib"]) });

            else
                list += ({ sprintf("%:-15s %:-6s %:-15s %:-18s %s %d",
                    replace_string(mud,"%^","%%^^"), info["mud_type"], info["driver"], info["base_mudlib"], info["ip"], info["player_port"]) });
        }
        list = sort_array(list, 1);
        list = ({ replace_string(mud_name(),"%^","%%^^") + " recognizes " + consolidate(sizeof(borg), "a mud")+
          " matching your query: ", "" }) + list;
        this_player()->eventPage(list);
        return 1;
    }

    if(args == "reload" || args == "restart" || args == "reset"){
        object rsocket = find_object(RSOCKET_D);
        if(router){
            if(args == "reset"){
                router->clear();
                router->irn_clear();
            }
            router->SetList();
            router->eventDestruct();
            router = find_object(ROUTER_D);
            if(router) write("Router unload failed.");
            else write("Router unloaded from memory.");
            flush_messages();
        }
        if(args == "restart" || args == "reset"){
            if(rsocket) rsocket->eventDestruct();
            if(rsocket) destruct(rsocket);
            if(rsocket) write("%^RED%^BOLD%^Router socker not destructed.%^RESET%^");
            rsocket = load_object(RSOCKET_D);
            if(!rsocket) write("Could not reload router socket daemon.");
        }
        write("Loading router daemon...");
        flush_messages();
        router = load_object(ROUTER_D);
        if(!router) write("Router load failed.");
        else write("Router loaded.");
        return 1;
    }

    if(args == "on" || args == "online"){
        if(router){
            write("The router daemon is already online.");
            return 1;
        }
        else {
            write("Loading router daemon...");
            flush_messages();
            router = load_object(ROUTER_D);
            if(!router) write("Router load failed.");
            else write("Router loaded.");
            return 1;
        }
    }

    if(args == "off" || args == "offline"){
        if(!router){
            write("The router daemon is already offline.");
            return 1;
        }
        else {
            write("Unloading router daemon...");
            flush_messages();
            router->eventDestruct();
            router = find_object(ROUTER_D);
            if(router) write("Router unload failed.");
            else write("Router unloaded from memory.");
            return 1;
        }
    }

    if(!router){
        write("The intermud router is not loaded.");
        return 1;
    }

    if(!arg2) arg1 = args;

    if(arg1 == "ban" || arg1 == "banned"){
        if(sizeof(router->GetBannedMuds())) banned_arr = router->GetBannedMuds();
        else banned_arr = ({});
        if(!sizeof(banned_arr)) banned = "No banned muds.";
        else banned = implode(banned_arr,", ");
        if(!arg2){
            write("Banned muds: "+banned);
            return 1;
        }
        tmp = match_mud_name(arg2, allmuds);
        if(!sizeof(tmp)){
            write("There is no such mud, but I am adding the name to the list.");
        }
        else arg2 = tmp;

        router->AddBannedMud(arg2);
        write(arg2+" has been added to the banned list.");
        return 1;
    }

    if(arg1 == "unban" || arg1 == "unbanned"){
        if(sizeof(router->GetBannedMuds())) banned_arr = router->GetBannedMuds();
        else banned_arr = ({});
        if(!sizeof(banned_arr)) unbanned = "No banned muds.";
        else {
            banned = implode(banned_arr,", ");
            unbanned_arr = filter(keys(mudlist), (: member_array($1, banned_arr) == -1 :) ) || ({});
            unbanned = implode(unbanned_arr,", ");
        }
        if(!arg2){
            write("Unbanned muds: "+unbanned);
            return 1;
        }

        router->RemoveBannedMud(arg2);
        write(arg2+" has been removed from the banned list.");
        return 1;
    }

    if(arg1 == "blacklist" || arg1 == "blacklisted"){
        if(sizeof(router->GetBlacklistedMuds())) blacklisted_arr = router->GetBlacklistedMuds();
        else blacklisted_arr = ({});
        if(!sizeof(blacklisted_arr)) blacklisted = "No blacklisted muds.";
        else blacklisted = implode(blacklisted_arr,", ");
        if(!arg2){
            write("Blacklisted muds: "+blacklisted);
            return 1;
        }
        tmp = match_mud_name(arg2, allmuds);
        if(!sizeof(tmp)){
            write("There is no such mud, but I am adding the name to the list.");
        }
        else arg2 = tmp;

        router->AddBlacklistedMud(arg2);
        write(arg2+" has been added to the blacklisted list.");
        return 1;
    }

    if(arg1 == "unblacklist" || arg1 == "unblacklisted"){
        if(sizeof(router->GetBlacklistedMuds())) blacklisted_arr = router->GetBlacklistedMuds();
        else blacklisted_arr = ({});
        if(!sizeof(blacklisted_arr)) unblacklisted = "No blacklisted muds.";
        else {
            blacklisted = implode(blacklisted_arr,", ");
            unblacklisted_arr = filter(keys(mudlist), (: member_array($1, blacklisted_arr) == -1 :) ) || ({});
            unblacklisted = implode(unblacklisted_arr,", ");
        }
        if(!arg2){
            write("Unblacklisted muds: "+unblacklisted);
            return 1;
        }

        router->RemoveBlacklistedMud(arg2);
        write(arg2+" has been removed from the blacklisted list.");
        return 1;
    }

    if(arg1 == "id" || arg1 == "identify"){
        if(!arg2){
            write("Identify which mud?");
            return 1;
        }
        tmp = match_mud_name(arg2, allmuds);
        if(!sizeof(tmp)){
            write("Mud not found.");
            return 1;
        }
        else arg2 = tmp;

        write("The proper name is: "+arg2);
        return 1;
    }


    if(arg1 == "config"){
        string s1, s2, s3;
        if(arg2 && sizeof(arg2)){
            arg2 = reverse_string(arg2);
            sscanf(arg2,"%s %s %s", s3, s2, s1);
        }
        if(s1){
            s1 = reverse_string(s1);
            if(!strsrch(s1,"*")) true();
            else s1 = "*"+s1;
        }
        if(!s3){
            write("Syntax: router config NAME IP PORT");
            return 1;
        }
        if(s2) s2 = reverse_string(s2);
        s3 = reverse_string(s3);
        router->SetRouterName(s1);
        router->SetRouterIP(s2);
        router->SetRouterPort(s3);
        router->SetRouterList();
        write("Config complete. To activate, type: router reset");
        return 1;
    }

    if(arg1 == "deletemud"){
        if(!arg2 || !sizeof(arg2)){
            write("Syntax: router deletemud MUDNAME");
            return 1;
        }
        arg2 = match_mud_name(arg2, allmuds); 
        router->remove_mud(arg2, 1);
        write("Mud removed.");
        return 1;
    }

    if(arg1 == "name"){
        if(!arg2 || !sizeof(arg2)){
            write("Syntax: router name NAME");
            return 1;
        }
        router->SetRouterName(arg2);
        write("Router name set.");
        return 1;
    }


    if(arg1 == "ip"){
        if(!arg2 || !sizeof(arg2)){
            write("Syntax: router ip ADDRESS");
            return 1;
        }
        router->SetRouterIP(arg2);
        write("Router ip set.");
        return 1;
    }


    if(arg1 == "port"){
        if(!arg2 || !sizeof(arg2)){
            write("Syntax: router port NUMBER");
            return 1;
        }
        router->SetRouterPort(arg2);
        write("Router port set.");
        return 1;
    }

    if(arg1 == "irn"){
        if(!arg2){
            write("Please specify an irn subcommand: enable, disable, "
              "check, force.");
            return 1;
        }
        if(arg2 == "check"){
            ROUTER_D->irn_checkstat();
            write("irn status check issued.");
            return 1;
        }
        if(arg2 == "enable"){
            if(ROUTER_D->query_irn_enabled()){
                write("irn already enabled.");
                return 1;
            }
            ROUTER_D->toggle_irn(1);
            ROUTER_D->irn_checkstat(); 
            write("irn enabled.");
            return 1;
        }
        if(arg2 == "disable"){
            if(!(ROUTER_D->query_irn_enabled())){
                write("irn already disabled.");
                return 1;
            }
            ROUTER_D->toggle_irn(0);
            ROUTER_D->irn_clear();
            write("irn disabled.");
            return 1;
        } 
        if(arg2 == "force"){
            ROUTER_D->toggle_irn(1);
            ROUTER_D->irn_setup(1);
            write("irn forcibly reloaded.");
            return 1;
        }
    }

    write("Router command completed.");
    return 1;
}

string GetHelp(string args) {
    return ("Syntax: router [subcommand [arg]]\n\n"
      "With no arguments, router status is displayed.\n"
      "examples:\n" 
      "router reload : bounces the router without dropping connections\n"
      "router restart : bounces the router dropping all connections\n"
      "router reset : like restart but also clears all saved mud info\n"
      "router irn [enable|disable|check|force] : manages IRN subsystem\n"
      "router ban : lists banned muds\n"
      "router ban <mudname> : bans the mud with the name <mudname>\n"
      "router unban <mudname> : the opposite of banning\n"
      "router blacklist : lists blacklisted names and IP's\n"
      "router blacklist [name | ip address] : a harsher kind of ban\n"
      "router unblacklist [name | ip address] : the opposite of blacklisting\n"
      "router config <name> <ip> <port> : config the router in one line\n"
      "router port <portnum> : sets the router port\n"
      "router ip <ip number> : sets the ip address, e.g. 11.22.33.44\n"
      "router name <routername> : sets the router name\n"
      "router mudlist : display information of known muds\n" 
      "router mudlist -i : display muds sorted by ip\n" 
      "router mudlist -f : display connected muds sorted by file descriptor\n" 
      "\n"
      "To bring the router online or offline, use the mudconfig command."
      "\n\n"
      "");
}