// 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() */