// /bin/user/_where.c // from the Nightmare mudlib // created 30 March 1993 by Billbo Baggins esq. // redone to use mapping, by Valodin, July 1, 1993 #include <databases.h> #include <std.h> inherit DAEMON; private mapping sites; int privileged; void load_info(); string query_info(object ob); void create() { load_info(); privileged = 0; } void load_info() { int i, tmp; string *str; string *line; sites = ([]); str = ({ 0, 0, 0, 0, 0 }); for(i=0, tmp = sizeof(line = read_database(WHERE_DB)); i<tmp; i++) { if(sscanf(line[i],"%s.%s.%s.%s:%s",str[0],str[1],str[2],str[3],str[4])!=5) continue; if(!sites[str[0]]) sites[str[0]] = ([]); if(!sites[str[0]][str[1]]) sites[str[0]][str[1]] = ([]); if(!sites[str[0]][str[1]][str[2]]) sites[str[0]][str[1]][str[2]] = ([]); sites[str[0]][str[1]][str[2]][str[3]] = str[4]; } } string query_info(object ob) { string host,*str,*info; string pre, post; int i; pre = ""; post = ""; if(ob->query_where_block()) if(privileged) { pre = "["; post = "]"; } else return "Anonymous"; host=query_ip_number(ob); info=explode(host,"."); // limited to at least 2 digits precision if(!sites[info[0]] || !sites[info[0]][info[1]]) return pre + "Unknown" + post; if(!sites[info[0]][info[1]][info[2]]) { if(!sites[info[0]][info[1]]["*"]) return pre + "Unknown" + post; if(!sites[info[0]][info[1]]["*"]["*"]) return pre + "Unknown" + post; return pre + (string)sites[info[0]][info[1]]["*"]["*"] + post; } else if(!sites[info[0]][info[1]][info[2]][info[3]]) { if(!sites[info[0]][info[1]][info[2]]["*"]) return pre + "Unknown" + post; return pre + (string)sites[info[0]][info[1]][info[2]]["*"] + post; } else return pre + (string)sites[info[0]][info[1]][info[2]][info[3]] + post; return pre + "Unknown" + post; } int cmd_where(string str1) { int i, tmp; string str; object *list; if(str1 == "block") { if(this_player()->query_where_block()) write("Location blocking off."); else write("Now blocking location information."); this_player()->set_where_block(); return 1; } list=users(); load_info(); if((str = (string)this_player()->query_position()) == "arch" || str == "head arch" || str == "administrator") privileged = 1; else privileged = 0; str = ""; for(i=0, tmp = sizeof(list); i<tmp; i++) { if(list[i]->query_invis() && !privileged) continue; if(!((string)list[i]->query_cap_name())) continue; str += arrange_string((string)list[i]->query_cap_name(), 17); str += query_info(list[i]); str += "\n"; } this_player()->more(explode(str, "\n")); sites = ([]); privileged = 0; return 1; } void help() { write("Syntax: <where>\n\n" "Lists all players online and the towns from which those players\n" "whose machine site locations are known. If your site is marked\n" "<mail superuser> with the town your *machine* is located in and\n" "the ip # (four numbers separated by a period).\n" "\nOptional: <where [block]>\n\n" "Allows you to keep your location anonymous.\n" "See also: users, who\n" ); }