lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* 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;
}