// Update our mudlist information private void mudlist_reply(mixed *packet) { mapping mudlist; string *remove; if (sizeof(packet) != (S_P + SIZEOF_MUDLIST)) { packet_invalid(packet); return; } if (packet[S_P + MUDLIST_ID] == (config -> mud_list -> id)) return; // Find any muds using a version of the NS mudlib remove = keys(filter(packet[S_P+MUDLIST_INFO], (: sizeof($2) ? strsrch( lower_case($2[MUDLIST_INFO_MUDLIB]), "sorrows", 1) != -1 : 0 :) )); ns_libs += filter(remove, (: member_array($1, $2) == -1 :), ns_libs); // Find any muds using a version of the DW mudlib remove = keys(filter(packet[S_P+MUDLIST_INFO], (: sizeof($2) ? (lower_case($2[MUDLIST_INFO_BMUDLIB]) == "fr") || (lower_case($2[MUDLIST_INFO_BMUDLIB]) == "nanvaent") || (strsrch(lower_case($2[MUDLIST_INFO_BMUDLIB]), "discworld", 1) != -1) : 0 :) )); dw_libs += filter(remove, (: member_array($1, $2) == -1 :), dw_libs); // Only cache active muds, it gets out of hand otherwise. mudlist = filter(packet[S_P + MUDLIST_INFO], (: sizeof($2) ? ($2[MUDLIST_INFO_STATE] == -1) : 0 :) ); config -> mud_list -> list += mudlist; // Remove muds that are going down, if they're in our list remove = keys(filter(packet[S_P + MUDLIST_INFO], (: sizeof($2) ? ($2[MUDLIST_INFO_STATE] >= 0) : 0 :) )); config -> mud_list -> list = filter(config -> mud_list -> list, (: member_array($1, $(remove)) == -1 :) ); dw_libs = filter(dw_libs, (: member_array($1, $(remove)) == -1 :) ); ns_libs = filter(ns_libs, (: member_array($1, $(remove)) == -1 :) ); if (config -> configured) { map(keys(filter(admin_channels, (: $1[0..3] == "disc" :))), (: administrate_channel($1,$2,0) :), dw_libs); map(keys(filter(admin_channels, (: $1[0..1] == "ns" :))), (: administrate_channel($1,$2,0) :), ns_libs); } save_me(); } /* mudlist() */ string mudlist(string mud, mapping flags) { string *muds, *f_keys, f_val; int index; if (sizeof(mud)) if (mud = mud_exists(mud)) return sprintf("Name: %s, %s\nIP: %s %d\n" "TCP: %d\nUDP: %d\n" "MudLib: %s\nBaseLib: %s\n" "Driver: %s\nStatus: %s\n" "Admin: %s\nServices: %s\n", mud, config->mud_list->list[mud][MUDLIST_INFO_MUDTYPE], config->mud_list->list[mud][MUDLIST_INFO_IPADDR], config->mud_list->list[mud][MUDLIST_INFO_PPORT], config->mud_list->list[mud][MUDLIST_INFO_TCPPORT], config->mud_list->list[mud][MUDLIST_INFO_UDPPORT], config->mud_list->list[mud][MUDLIST_INFO_MUDLIB], config->mud_list->list[mud][MUDLIST_INFO_BMUDLIB], config->mud_list->list[mud][MUDLIST_INFO_DRIVER], config->mud_list->list[mud][MUDLIST_INFO_STATUS], config->mud_list->list[mud][MUDLIST_INFO_EMAIL], implode(keys(config -> mud_list -> list[mud] [MUDLIST_INFO_SERVICES]), ", ") ); else return "No mud is registered with that name.\n"; muds = keys(config -> mud_list -> list); f_keys = keys(flags); for (int i = 0; i < sizeof(f_keys); i++) { if (!sizeof(muds)) break; if (f_keys[i] == "S") { for (int j = 0; j < sizeof(flags[f_keys[i]]); j++) { switch (flags[f_keys[i]][j]) { default: f_val = NULL; case "a": f_val = "auth"; break; case "A": f_val = "amcp"; break; case "c": f_val = "channel"; break; case "e": f_val = "emoteto"; break; case "f": f_val = "finger"; break; case "F": f_val = "file"; break; case "h": f_val = "http"; break; case "l": f_val = "locate"; break; case "m": f_val = "mail"; break; case "n": f_val = "news"; break; case "N": f_val = "nntp"; break; case "P": f_val = "ftp"; break; case "r": f_val = "rcp"; break; case "s": f_val = "smtp"; break; case "t": f_val = "tell"; break; case "u": f_val = "ucache"; break; case "w": f_val = "who"; } if (f_val) muds = filter(muds, (: config -> mud_list -> list[$1][MUDLIST_INFO_SERVICES][$(f_val)] :) ); } continue; } else { f_val = flags[f_keys[i]]; } if (f_keys[i] == "n") { muds = filter(muds, (: regexp(lower_case($1), lower_case($(f_val))) :) ); continue; } switch (f_keys[i]) { default: index = -1; break; case "d": index = MUDLIST_INFO_DRIVER; break; case "i": index = MUDLIST_INFO_IPADDR; break; case "m": index = MUDLIST_INFO_MUDLIB; break; case "t": index = MUDLIST_INFO_MUDTYPE; break; case "s": index = MUDLIST_INFO_STATUS; break; } if (index != -1) muds = filter(muds, (: regexp(lower_case(config -> mud_list -> list[$1][$(index)]), lower_case($(f_val))) :) ); } if (sizeof(muds)) { muds = map(muds, (: CAP($1[0..23]) :) ); muds = sort_array(muds, 1); return create_table( ({ "Intermuds", "mud" }), muds, 1); } else { return "No muds match your request.\n"; } } /* mudlist() */