/* ** finger object... /secure/finger.c ** This object returns finger information about a given person. ** ** Modifications: 08-13-93 by Phretys ** - slightly changed the look of finger ** - added domain description ** Mods: 93-8-23 by Bannor ** - fixed formatting ** - added ftp finger target ** Player killer info added, Newstyle, 30/08/93 */ #include "mail.h" string title; string birth_day, where; int last_log_on, time_on, creator, start_time, gender; string email, real_name, home_dir, last_on_from; mapping aliases, map_prop; string guild_ob; string make_string( mixed *al ) { string str; str = (string)"/global/alias"->alias_string( al ); sscanf( str, "%s $*$", str ); return str; } /* make_string() */ varargs string make_list( string *some_list, int size, string type ) { string result; int i; result = ""; if( size > 2 ) { for( i = 0; i < size - 1; i++ ) result += capitalize( some_list[ i ] ) + ", "; result += "and " + capitalize( some_list[ size - 1 ] ); if( stringp( type ) ) result += " " + type + "s"; } else if( size == 2 ) { result += capitalize( some_list[ 0 ] ) + " and " + capitalize( some_list[ 1 ] ); if( stringp( type ) ) result += " " + type + "s"; } else { result += capitalize( some_list[ 0 ] ); if( stringp( type ) ) result += " " + type; } result += ".\n"; return result; } string banish_finger( string name ) { string retval, time, ban_by; string *file; file = explode( read_file( "/banish/" + name + ".o" ), "\n" ); retval = sprintf( "%35-s%35-s\n", "Login name: " + capitalize( name ), "Real name: Banished" ); retval += "No age.\n"; retval += "No mail ever.\n"; retval += "No plan.\nNo future.\n"; if( this_player()->query_creator() ) if( sizeof( file ) == 3 ) retval += implode( file, "\n" ) + "\n"; else retval += "Banish info not in the correct format.\n"; return retval; } /* banish_finger() */ string domain_finger( string name ) { string ret, master, *members_list; int i, j; master = "/d/" + name + "/master"; ret = capitalize( name ) + " domain:\n"; ret += "* The lord of this domain is " + capitalize( (string)master->query_lord() ) + ".\n"; members_list = (string *)master->query_members(); j = sizeof( members_list ); if( j > 1 ) { ret += "* The current members of this domain are "; ret += make_list( members_list, j ); } else if( j == 1 ) ret += "* The only member of this domain is " + capitalize( ((string *)master->query_members())[ 0 ] ) + ".\n"; else ret += "* This domain has no members.\n"; if( master->query_info() ) ret += (string)master->query_info(); ret += "* It hasn't been idle, and it hasn't had a lunch break in years.\n"; ret += "Description of " + capitalize( name ) + ": "; if( master->query_description() ) ret += (string)master->query_description(); else ret += "No description has been set.\n"; return ret; } /* domain_finger() */ string ftp_finger() { string ret; string *list; int count; list = ({ }); list = (string *)"/secure/ftpd"->query_connections(); ret = "\nPeople connected to FTP:\n\n"; if( sizeof( list ) == 0 ) return ret + "<no one connected>\n"; for( count = 0; count < sizeof( list ); count++ ) ret += list[ count ] + "\n"; return ret; } /* ftp_finger() */ string finger_info( string name ) { string retval, nick, subject, *bing, *lord_list; string titles; object ob; int i, j, pk; if( (ob = find_player( name )) ) ob->save_me(); if( this_player() ) nick = (string)this_player()->expand_nickname( name ); if( nick ) name = nick; if( lower_case( name ) == "ftp" ) return ftp_finger(); if( file_size( "/banish/" + name + ".o" ) > 0 ) return banish_finger( name ); seteuid( "Root" ); if( file_size( "/d/" + name ) == -2 ) return domain_finger( name ); if( !"/secure/login"->test_user( name ) ) return 0; title = 0; birth_day = 0; last_log_on = 0; time_on = 0; email = 0; where = 0; real_name = 0; home_dir = 0; guild_ob = 0; last_on_from = 0; start_time = 0; gender = 0; aliases = ([ ]); map_prop = ([ ]); restore_object( "/players/" + name[ 0..0 ] + "/" + name ); retval = sprintf( "%35-s%35-s\n", "Login name: " + capitalize( name ), "Real name: " + (real_name ? real_name : "???") ); if( birth_day ) retval += sprintf( "%35-s", "Birthday: " + birth_day ); if( email ) if( email[ 0 ] == ':' ) { if( "/secure/master"->valid_read( "/players/" + name[ 0..0 ] + "/" + name, geteuid( previous_object() ) ) ) retval += "Email: " + email + "\n"; } else retval += "Email: " + email + "\n"; else if( birth_day ) retval += "\n"; if( home_dir ) if( "/secure/master"->valid_read( "/players/" + name[ 0..0 ] + "/" + name, geteuid( previous_object() ) ) ) { retval += sprintf( "%35-s\n", "Home directory: " + home_dir ); } if( where ) retval += sprintf( "%35-s", "Location: " + where + "\n" ); if( !gender ) subject = "It"; else if( gender == 1 ) subject = "He"; else subject = "She"; if( guild_ob ) retval += subject + " is a member of the " + guild_ob->query_name() + ".\n"; if( creator ) { /* Find out which domains they are a member of... */ lord_list = ({ }); bing = get_dir( "/d/" ); for( i = 0; i < sizeof( bing ); i++ ) if( file_size( "/d/" + bing[ i ] ) == -2 ) if( (string)("/d/" + bing[ i ] + "/master")->query_lord() == name ) lord_list += ({ bing[ i ] }); else if( !("/d/" + bing[ i ] + "/master")->query_member( name ) ) { bing = delete( bing, i, 1 ); i--; } j = sizeof( lord_list ); if( j ) { retval += subject + " is a lord of the "; retval += make_list( lord_list, j, "domain" ); } j = sizeof( bing ); if( !j ) retval += subject + " is not a member of any domain.\n"; else { retval += subject + " is a member of the "; retval += make_list( bing, j, "domain" ); } if( !sizeof( lord_list ) ) retval += subject + " is " + "/obj/handlers/cregrade"->query_cre_string( name ) + ".\n"; if(titles = "/obj/handlers/cregrade"->query_string_title(name) ) retval += "Titles : "+titles+".\n"; } pk = map_prop[ "players killed" ]; if (pk) { retval += subject + " is a registered player killer"; pk--; if (pk>0) { retval += ", having killed " + pk + " player"; if (pk>1) retval += "s"; } retval += ".\n"; } if( start_time ) retval += "First logged on " + ctime( start_time ) + ".\n"; time_on = -time_on; retval += "Age: "; if( time_on > 86400 ) retval += sprintf( "%d days, ", time_on / 86400 ); if( time_on > 3600 ) retval += sprintf( "%d hours, ", ( time_on / 3600 ) % 24 ); retval += sprintf( "%d minutes and %d seconds.\n", (time_on / 60) % 60, time_on % 60 ); if( ob = find_living( name ) ) retval += "On since " + ctime( last_log_on ); /* else if( ob->query_hidden() ) retval += "Last logged on" + ctime( last_log_on - 14400 ) + "\n"; */ else { int tmp_time, sec, min, hour, day; /* Should be a nice number.... */ tmp_time = time() - last_log_on; if( !tmp_time ) sec = min = hour = day = 0; if( tmp_time < 60 ) retval += "Last logged on " + tmp_time + " seconds ago"; else if( tmp_time < 60 * 60 ) /* One minute */ retval += "Last logged on " + (tmp_time / 60) + " minute" + (tmp_time < 120 ? "" : "s") + (tmp_time % 60 ? " and " + (tmp_time % 60) + " second" + ((tmp_time % 60 < 2) ? "" : "s") : "") + " ago"; else if( tmp_time < 24 * 60 * 60 ) /* Hours... */ retval += "Last logged on " + (hour = tmp_time / (60 * 60)) + " hour" + (hour < 2 ? "" : "s") + ((min = (tmp_time / 60) % 60) ? " and " + min + " minute" + (min < 2 ? "" : "s") : "") + " ago"; else /* Days.... */ retval += "Last logged on " + (day = tmp_time / (24 * 60 * 60)) + " day" + (day < 2 ? "" : "s") + ((hour = (tmp_time / (60 * 60)) % 24) ? " and " + hour + " hour" + (hour < 2 ? "" : "s") : "") + " ago"; /* retval += "Last logged on " + ctime( last_log_on ); */ } if( "/secure/master"->query_lord( previous_object()->query_name() ) && last_on_from ) { retval += " from " + last_on_from; } retval += ".\n"; if( ob ) if( interactive( ob ) ) retval += "Idle for " + (query_idle( ob ) / 60) + " minutes and " + (query_idle( ob ) % 60) + " seconds.\n"; else retval += "Net dead.\n"; retval += (string)MAILER->finger_mail( name ); if( !mappingp( aliases ) ) aliases = ([ ]); if( aliases[ ".project" ] ) retval += "Project: " + make_string( aliases[ ".project" ] ) + "\n"; if( aliases[ ".plan" ] ) return retval + "Plan:\n" + implode( explode( make_string( aliases[ ".plan" ] ), ";" ), "\n" ) + "\n"; return retval + "No plan.\n"; } /* finger_info() */