/
LIB3/
LIB3/D/ADMIN/
LIB3/D/ADMIN/OBJ/
LIB3/D/ADMIN/ROOM/W/
LIB3/D/HOME/
LIB3/D/HOME/CITY/ARENA/
LIB3/D/HOME/CITY/ITEMS/
LIB3/D/HOME/CITY/POSTOFFI/
LIB3/DOC/
LIB3/GLOBAL/SPECIAL/
LIB3/GLOBAL/VIRTUAL/
LIB3/NET/
LIB3/NET/CONFIG/
LIB3/NET/DAEMON/CHARS/
LIB3/NET/GOPHER/
LIB3/NET/INHERIT/
LIB3/NET/OBJ/
LIB3/NET/SAVE/
LIB3/NET/VIRTUAL/
LIB3/OBJ/B_DAY/
LIB3/OBJ/HANDLERS/TERM_TYP/
LIB3/PLAYERS/B/
LIB3/PLAYERS/N/
LIB3/ROOM/
LIB3/SAVE/
LIB3/SAVE/BOARDS/
LIB3/SAVE/ENVIRON/
LIB3/SAVE/POST/
LIB3/STD/COMMANDS/SHADOWS/
LIB3/STD/CREATOR/
LIB3/STD/DOM/
LIB3/STD/EFFECTS/
LIB3/STD/EFFECTS/HEALING/
LIB3/STD/EFFECTS/OTHER/
LIB3/STD/EFFECTS/POISONS/
LIB3/STD/ENVIRON/
LIB3/STD/GUILDS/
LIB3/STD/LIQUIDS/
LIB3/STD/ROOM/
LIB3/STD/TRIGGER/SHADOW/
LIB3/W/
LIB3/W/BANNOR/
LIB3/W/NEWSTYLE/
/*
   **  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() */