DBZu/area/
DBZu/area/imc/
DBZu/boards/
DBZu/clans/
DBZu/color/
DBZu/councils/
DBZu/deity/
DBZu/doc/mudprogs/
DBZu/gods/
DBZu/log/
DBZu/notes/
DBZu/player/a/
DBZu/player/backup/c/
DBZu/player/backup/k/
DBZu/player/c/
DBZu/player/d/
DBZu/player/j/
DBZu/player/k/
DBZu/player/o/
DBZu/player/r/
DBZu/player/s/
DBZu/player/t/
DBZu/player/v/
DBZu/player/w/
DBZu/player/z/
#include <ctype.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <time.h>
#include "mud.h"

#if defined(KEY)
#undef KEY
#endif

#define KEY( literal, field, value )                                    \
                                if ( !str_cmp( word, literal ) )        \
                                {                                       \
                                      field = value;                    \
                                      fMatch = TRUE;                    \
                                      break;                            \
                                }

bool     check_parse_name        args( ( char *name, bool newchar ) );

void do_finger( CHAR_DATA *ch, char *argument )
{
   CHAR_DATA *victim = NULL;
   CMDTYPE *command;
   ROOM_INDEX_DATA *temproom, *original = NULL;
   int level = LEVEL_IMMORTAL;
   char buf[MAX_STRING_LENGTH], fingload[MAX_INPUT_LENGTH];
   struct stat fst;
   char *laston = NULL;
   bool loaded = FALSE, skip = FALSE;

   if( IS_NPC(ch) )
   {
      send_to_char( "Mobs can't use the finger command.\n\r", ch );
      return;
   }

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

   sprintf( buf, "0.%s", argument );

   if( ( victim = get_char_world( ch, buf ) ) != NULL )
   {

        if ( IS_IMMORTAL(victim) && !IS_IMMORTAL(ch) )
        {
           send_to_char( "You cannot finger an immortal.\n\r", ch );
           return;
        }
   }

   /* Check for offline players */
   else
   {
      DESCRIPTOR_DATA *d;

      sprintf( fingload, "%s%c/%s", PLAYER_DIR, tolower(argument[0]), capitalize( argument ) );
      /* Bug fix stop /dev/null crash */
      if( stat( fingload, &fst ) == -1 || !check_parse_name( capitalize( argument ), FALSE ) )
      {
         ch_printf( ch, "&YNo such player named '%s'.\n\r", argument );
         return;
      }

      /*laston = ctime( &fst.st_mtime );*/
      temproom = get_room_index( ROOM_VNUM_LIMBO );
      if( !temproom )
      {
         bug( "%s", "do_finger: Limbo room is not available!" );
         send_to_char( "Fatal error, report to the immortals.\n\r", ch );
         return;
      }

        CREATE( d, DESCRIPTOR_DATA, 1 );
        d->next = NULL;
        d->prev = NULL;
        d->connected = CON_GET_NAME;
        d->outsize = 2000;
        CREATE( d->outbuf, char, d->outsize );
      argument[0] = UPPER( argument[0] );

        loaded = load_char_obj( d, argument, FALSE, FALSE );
      LINK( d->character, first_char, last_char, next, prev );
        original = d->character->in_room;
        char_to_room( d->character, temproom );
        victim = d->character; /* Hopefully this will work, if not, we're SOL */
        d->character->desc      = NULL;
        d->character            = NULL;
        DISPOSE( d->outbuf );
        DISPOSE( d );

        /* Link dead check?  Was crashing on "IP Info" line below */
        if (!victim->desc)
                loaded = FALSE;

        if( IS_IMMORTAL(victim) && !IS_IMMORTAL(ch) )
        {
           send_to_char( "You cannot finger an immortal.\n\r", ch );
         skip = TRUE;
        }
      loaded = TRUE;
   }
   if( !skip )
   {
      send_to_char( "&z          Finger Info\n\r", ch );
      send_to_char( "&c          -----------\n\r", ch );
      ch_printf( ch, "&zName&O    :&W %-20s &zMUD Age&O: &w%d\n\r", victim->name, get_age( victim ) );
/*      ch_printf( ch, "&zRace&O    : &w%s\n\r",
                capitalize( get_race(victim) ) ); */
      ch_printf( ch, "&zSex     : &w%-20s\n\r",
                victim->sex == SEX_MALE   ? "Male"   :
                victim->sex == SEX_FEMALE ? "Female" : "Neutral" );
      ch_printf( ch, "&zTitle&O   : &w%s\n\r", victim->pcdata->title );
      ch_printf( ch, "&zEmail&O   : &w%s\n\r", victim->pcdata->email != NULL ? victim->pcdata->email : "Not specified" );
      ch_printf( ch, "&zAIM&O     : &w%d\n\r", victim->pcdata->aim );
      if (victim->pcdata->clan)
      ch_printf( ch, "&zClan&O    : &G%s\n\r", victim->pcdata->clan->name );

      if( loaded )
         ch_printf( ch, "&zLast on&O : &W%s\n\r", ctime( &victim->pcdata->lastlogon ) );
      else
         ch_printf( ch, "&zLast on&O : &RCurrently Online\n\n\r", laston );
      if ( IS_IMMORTAL(ch) )
      {
           send_to_char( "&wImmortal Information\n\r", ch );
           send_to_char( "--------------------\n\r", ch );
/*           ch_printf( ch, "&wIP Info       : &G%s\n\r", loaded ? "Unknown" : victim->desc->host ); */
           ch_printf( ch, "&wTime played   : &G%ld hours\n\r", (long int)GET_TIME_PLAYED( victim ) );
           ch_printf( ch, "&wAuthorized by : &G%s\n\r",
              victim->pcdata->authed_by ? victim->pcdata->authed_by : ( sysdata.WAIT_FOR_AUTH ? "Not Authed" : "TheCode" ) );
         if( victim->level < ch->level )
         {
            /* Added by Tarl 19 Dec 02 to remove Huh? when ch not high enough to view comments. */
            command = find_command( "comment" );
            if( !command )
               level = LEVEL_IMMORTAL;
            else
               level = command->level;
            if( ch->level >= command->level )
            {
               sprintf( buf, "comment list %s", victim->name );
               interpret( ch, buf );
            }
         }
      }
//                pager_printf_color (ch, "\n\r&wDescription:\n\r&G%s\n\r", victim->description ? victim->description : "Not created" );
   }

   if( loaded )
   {
      int x, y;

      char_from_room( victim );
        char_to_room( victim, original );

      quitting_char = victim;
      /*save_char_obj( victim );*/

        if( sysdata.save_pets && victim->pcdata->pet )
           extract_char( victim->pcdata->pet, TRUE );

      saving_char = NULL;

      extract_char( victim, TRUE );
      for ( x = 0; x < MAX_WEAR; x++ )
          for ( y = 0; y < MAX_LAYERS; y++ )
            save_equipment[x][y] = NULL;
   }
   return;
}