This is the do_finger command by wench.  we just added the parts that were 
missing from it that you have to add into merc.h.  we take no credit for this
we just wanted everyone to know becuase it was left out of his code.  Also 
there is a section we removed because we dont want people to see how long
someone is idle on our mud. you can add it back if you want.  Have fun and 
another thanxs to Wench.


============================================================================

This is the do_finger command I wrote for my mud.  Some things may be
specific to my mud and need to be changed, these should be fairly obvious,
I would think.  I'd appreciate a mention somewhere, or at least an email,
if you use this mostly as is.  (Formatting of the output may not be
exactly perfect, that's something I never bothered to change.)  Hope this
helps, lemme know if you're still having problems.

=============================================================================

/* Finger command, by Wench. */

void do_finger(CHAR_DATA *ch, char *argument)
{
    FILE *fp;
    char strsave[MAX_INPUT_LENGTH];
    bool email_found = FALSE;
    bool real_found = FALSE;
    bool laston_found = FALSE;
    bool host_found = FALSE;
    char buf[MAX_STRING_LENGTH];
    char arg[MAX_STRING_LENGTH];
    char arg2[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    char *real = "";
    char *email = "";
    char *host = "";
    long laston;
    bool finished = FALSE;
    int d, h, m, s = 0;

    if(argument[0] == '\0' || argument[0] == '/' || argument[0] == '\\')
    {
send_to_char("Finger who?\n\r", ch);
return;
    }

    smash_tilde(argument);
    argument = one_argument(argument, arg);
    strcpy(arg2, argument);
    if(!str_cmp(arg, "email"))
    {
if(arg2[0] == '\0')
{
  sprintf(buf, "Your email address is currently listed as %s.\n\r",
ch->pcdata->email);
  send_to_char(buf, ch);
  return;
}
ch->pcdata->email = strdup(arg2);
sprintf(buf, "Your email address will now be displayed as %s.\n\r",
ch->pcdata->email);
send_to_char(buf, ch);
return;
    }

    if(!str_cmp(arg, "real"))
    {
if(arg2[0] == '\0')
{
  sprintf(buf, "Your real name is currently listed as %s.\n\r",
ch->pcdata->real_name);
  send_to_char(buf, ch);
  return;
}
ch->pcdata->real_name = strdup(arg2);
sprintf(buf, "Your real name will now appear as %s.\n\r",
ch->pcdata->real_name);
send_to_char(buf, ch);
return;
    }

    if(((victim = get_char_world(ch, arg)) != NULL) && (!IS_NPC(victim)))
    {
int seconds = 0;
sprintf(buf,"Name: %16s   Real Name: %16s\n\r", victim->name,
victim->pcdata->real_name);
send_to_char(buf, ch);
sprintf(buf, "E-mail address: %35s\n\r", victim->pcdata->email);
send_to_char(buf, ch);
if(victim->desc != NULL)
sprintf(buf, "%s is currently playing Mud.\n\r", victim->name);
else
sprintf(buf, "%s is currently linkdead.\n\r", victim->name);
send_to_char(buf, ch);
//seconds = (int) (current_time - victim->pcdata->idle_time);
/*OK, we did remove this on our mud because i don't like you see how long a person is idle, to use full if like to kill someone. you can add it back if you want.
if(seconds > 10)
{
  int hours = 0;
  int minutes = 0;
  hours = seconds/3600;
  seconds -= hours*3600;
  minutes = seconds/60;
  seconds -= minutes*60;
  sprintf(buf, 
"Idle:                                       %02d:%02d:%02d\n\r", hours,
minutes, seconds);
  send_to_char(buf, ch);
}*/
return;
    }

    sprintf(strsave, "%s%s", PLAYER_DIR, capitalize(arg));
    if((fp = fopen(strsave, "r")) == NULL)
    {
sprintf(buf, "No such player: %s.\n\r", capitalize(arg));
send_to_char(buf, ch);
return;
    }

    for(;;)
    {
char *word;
fread_to_eol(fp);
word = feof(fp) ? "End" : fread_word(fp);
switch(UPPER(word[0]))
{
  case 'E':
    if(!str_cmp(word, "Email"))
    {
      email = fread_string(fp);
      email_found = TRUE;
    }
    if(!str_cmp(word, "End"))
    {
      finished = TRUE;
      break;
    }
    break;
  case 'H':
    if(!str_cmp(word, "Host"))
    {
host = fread_string(fp);
host_found = TRUE;
    }
    break;
  case 'R':
    if(!str_cmp(word, "Real"))
    {
      real = fread_string(fp);
      real_found = TRUE;
    }
    break;
  case 'L':
    if(!str_cmp(word, "LogO"))
    {
      laston = fread_number(fp);
      laston_found = TRUE;
    }
    break;
  case '#':
    finished = TRUE;
    break;
  default:
    fread_to_eol(fp);
    break;
}
if((finished)||(real_found&&laston_found&&email_found))
  break; 
    }

    s = current_time - laston;
    d = s/86400;
    s-=d*86400;
    h = s/3600;
    s -= h*3600;
    m = s/60;
    s -= m*60;

    sprintf(buf, "Name: %16s   Real Name: %16s\n\r", capitalize(arg), 
real_found ? real: "Not specified.");
    send_to_char(buf, ch);
    sprintf(buf, "E-mail address: %20s\n\r", 
email_found ? email : "Not specified.");
    send_to_char(buf, ch);
    sprintf(buf, "%s last logged on at %s\n\r", capitalize(arg),
laston_found ? ctime(&laston) : "Not found.");
    send_to_char(buf, ch);
    printf_to_char(ch, 
"That was %d days, %d hours, %d minutes and %d seconds ago.\n\r",
d, h, m, s);
#ifdef BUILDER_PORT
    if(ch->level < MAX_LEVEL)
    {
fclose(fp);
return;
    }
#endif
    if(IS_IMMORTAL(ch))
    {
if(host_found)
    sprintf(buf, "%s last logged on from %s\n\r", capitalize(arg),
host);
else
    sprintf(buf, "No logon site found for %s.\n\r", capitalize(arg));
send_to_char(buf, ch);
    }
    fclose(fp);
    return;
}





 
/* Look for this line
char *			alias_sub[MAX_ALIAS];
and below it add the following*/ 

char *			email; 
char *			real_name;