/* Do not remove the headers from this file! see /USAGE for more info. */

// Rust

//:PLAYERCOMMAND
//USAGE: finger  or
//       finger player  or
//       finger @mudname  or
//       finger player@mudname
//
//Gives you information about a player named.  If you do not mention a
//particular mud, it searches for that player info here.  If you do not
//mention a player or a mud, it gives general finger info for everyone
//on line here.  If you mention another mud but no player, it gives you
//general info on the players on that mud.
//
//The mud name doesn't have to be the complete name, and can be a
//partial match, as long as you provide enough information so that the
//game can figure out which mud you're talking about.

#include <commands.h>

inherit CMD;
inherit M_COMPLETE;
inherit M_GRAMMAR;
inherit CLASS_FINGER;

private nomask string get_idle(int i)
{
    if ( i > 3600 )
	return " (idle " + (i/3600) + "h)";
    if ( i > 60 )
	return " (idle " + (i/60) + "m)";

    return "";
}

private void main( string who )
{
    string mud, name;
    string* matches;
    class finger info;
    string s;
    string first_line;
    string idle;
    string mailstring;
  
    if(!who) who = "";
    who = lower_case(trim_spaces(who));
    if ( sscanf(who, "%s@%s", name, mud) == 2 || sscanf(who, "@%s", mud) )
    {
	string test;

	matches = case_insensitive_complete(M_GLOB->translate(mud),
					    IMUD_D->query_up_muds());

	switch ( sizeof(matches) )
	{
	case 0:
	    outf("No matching mud currently up.\n");
	    return;

	case 1:
	    mud = matches[0];
	    break;

	default:
	    mud = lower_case(mud);
	    foreach ( test in matches )
		if ( lower_case(test) == mud )
		{
		    matches = 0;
		    break;
		}
	    if ( !matches )
		break;
	    outf("Ambigous.  The following muds might apply: %s\n",
		   implode(matches, ", "));
	    return;
	}

	if ( name == "" )
	    IMUD_D->do_who(mud);
	else
	    IMUD_D->do_finger(mud, name);
	return;
    }

    if ( who == "" )
    {
	out(FINGER_D->show_big_finger());
	return;
    }

    info = FINGER_D->get_finger_data(who);
    if ( !info )
    {
	out("No such player.\n");
	return;
    }

    if ( !info->real_name )
	info->real_name = "(private or none given)";
    if ( !info->email )
	info->email = "(private or none given)";
    if ( !info->nickname )
	info->nickname = "(none)";

#ifdef USE_WIZ_POSITION
    if ( !info->position )
	info->position = "(none)";
    info->position = " Position: " + info->position;
#else
    info->position = "";
#endif

    if ( info->home_page )
	info->home_page = "Homepage: " + info->home_page + "\n";
    else
	info->home_page = "";

    if ( info->connect_from )
	info->connect_from = " from " + info->connect_from;
    else
	info->connect_from = "";

    if ( info->idle == -1 )
	idle = "";
    else if ( info->idle == -2 )
	idle = " (linkdead)";
    else
	idle = get_idle(info->idle);

    if ( info->mail_count == 0 )
	mailstring = info->visname + " has no mail.";
    else
    {
	mailstring = sprintf("%s has %s.",
			     info->visname,
			     number_of(info->mail_count, "message"));

	if ( info->mail_unread )
	    mailstring[<1..] = sprintf(", %d of which %s unread.",
				       info->mail_unread,
				       info->mail_unread > 1 ? "are" : "is");
    }

    first_line = info->title ? info->title : info->visname;

    s = sprintf(
	"%s\n"
	"Nickname: %-29s Level: %s\n"
	"In real life: %-25s%s\n"
	"%s %s%s%s\n"
	"%s\n"
	"Email Address: %s\n"
	"%s",
	first_line,
	info->nickname, info->level,
	info->real_name, info->position,
	info->idle == -1 ? "Left at" : "On since",
	info->last_login ? ctime(info->last_login) : "<unknown>",
	idle,
	info->connect_from,
	mailstring,
	info->email,
	info->home_page);

    if ( info->plan )
	s += "Plan:\n" + info->plan + "\n";
#ifdef EVERYONE_HAS_A_PLAN
    else
	s += "No plan.\n";
#endif

    out(s);
}

nomask int valid_resend(string ob)
{
    return ob == CMD_OB_FINGER;
}



