toc/
toc/account/a/
toc/area/backup/
toc/area/imc/
toc/caste/
toc/caste/backup/
toc/clans/
toc/classes/
toc/crash/
toc/gods/
toc/guilds/
toc/lname/s/
toc/maps/backup/
toc/player/a/
toc/src/
toc/system/backup/
toc/tableprog/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |   \\._.//   *
 * -----------------------------------------------------------|   (0...0)   *
 * SMAUG 1.4 (C) 1994, 1995, 1996, 1998  by Derek Snider      |    ).:.(    *
 * -----------------------------------------------------------|    {o o}    *
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |   / ' ' \   *
 * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek,      |~'~.VxvxV.~'~*
 * Tricops and Fireblade                                      |             *
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.     *
 * ------------------------------------------------------------------------ *
 *			           Finger Module                                  *
 ****************************************************************************/

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
#ifndef WIN32
#include <dirent.h>
#endif
#include "mud.h"

/* Finger snippet courtesy of unknown author. Installed by Samson 4-6-98 */
/* File read/write code redone using standard Smaug I/O routines - Samson 9-12-98 */
/* Data gathering now done via the pfiles, eliminated separate finger files - Samson 12-21-98 */
void do_finger(CHAR_DATA * ch, char *argument)
{
   CHAR_DATA *victim;
   char buf[MSL];
   char wbuf[MSL];

   buf[0] = '\0'; /* Clear out buffer, just in case. */

   if (IS_NPC(ch))
   {
      send_to_char("Mobs can't use the finger command.\n\r", ch);
      return;
   }
   if (argument[0] == '\0')
   {
      send_to_char("Finger whom?\n\r", ch);
      return;
   }
   strcat(buf, "0.");
   strcat(buf, argument);
   victim = get_char_world(ch, buf);

   if ((victim == NULL) || (!victim))
   {
      read_finger(ch, argument);
      return;
   }
   if (!can_see_map(ch, victim))
   {
      send_to_char("Finger whom?\n\r", ch);
      return;
   }
   if (IS_NPC(victim))
   {
      send_to_char("Not on victim.\n\r", ch);
      return;
   }
   if (IS_SET(victim->pcdata->flags, PCFLAG_NOFINGER))
   {
      if (IS_IMMORTAL(victim) && !IS_IMMORTAL(ch))
      {
         send_to_char("Cannot finger an immortal.\n\r", ch);
         return;
      }
      if ((ch->level < victim->level && ch->level < LEVEL_STAFF) && IS_IMMORTAL(ch))
      {
         send_to_char("Cannot finger an immortal above your own level.\n\r", ch);
         return;
      }
   }
   sprintf(wbuf, "%s%s %s", victim->pcdata->pretit, victim->name, victim->last_name);
   if (str_cmp(PERS_MAP(victim, ch), wbuf))
   {
      read_finger(ch, argument);
      return;
   }
   send_to_char("&c&w          Finger Info\n\r", ch);
   send_to_char("          -----------\n\r", ch);
   ch_printf(ch, "&c&wName : &G%-20s &wMUD Age: &G%d\n\r", victim->name, get_age(victim));
   ch_printf(ch, "&c&wSex  : &G%-20s &w   Race: &G%s\n\r",
      victim->sex == SEX_MALE ? "Male" : victim->sex == SEX_FEMALE ? "Female" : "Neutral", capitalize(print_npc_race(victim->race)));
   ch_printf(ch, "&c&wTitle: &G%s\n\r", victim->pcdata->title);
   ch_printf(ch, "&c&wPreTitle: &G%s\n\r", victim->pcdata->pretit);
   ch_printf(ch, "&RPkills: &G%d   &RPdeaths: &G%d   &RPranking: &G%d\n\r",
      victim->pcdata->pkills, victim->pcdata->pdeaths, victim->pcdata->pranking);
   ch_printf(ch, "&c&wHomepage: &G%s\n\r", victim->pcdata->homepage != NULL ? victim->pcdata->homepage : "Not specified");
   ch_printf(ch, "&c&wEmail: &G%s\n\r", victim->pcdata->email != NULL ? victim->pcdata->email : "Not specified");
   ch_printf(ch, "&c&wKingdom: &G%s\n\r", kingdom_table[victim->pcdata->hometown]->name);
   ch_printf(ch, "&c&wHometown: &G%s\n\r", victim->pcdata->town ? victim->pcdata->town->name : "None");
   ch_printf(ch, "&c&wICQ#: &G%d\n\r", victim->pcdata->icq);
   ch_printf(ch, "&c&wLast on: &G%s\n\r", (char *) ctime(&ch->pcdata->logon));
   if (IS_IMMORTAL(ch))
   {

      char ipbuf[MSL];

      if (victim->desc)
         sprintf(ipbuf, "%s@%s", victim->desc->user, victim->desc->host);
      else
         strcpy(ipbuf, "(Link-Dead)");
      ch_printf(ch, "&c&wIP Info: &G%s\n\r", ipbuf);
      ch_printf(ch, "&c&wAuthorized by: &G%s\n\r", victim->pcdata->authed_by ? victim->pcdata->authed_by : "Unknown");
      ch_printf(ch, "&c&wCame From: &w&G%s\n\r", victim->pcdata->came_from ? victim->pcdata->came_from : "Unknown");
   }
   ch_printf(ch, "&wBio:\n\r&G%s\n\r", victim->pcdata->bio ? victim->pcdata->bio : "Not created");
   return;
}

void read_finger(CHAR_DATA * ch, char *argument)
{
   FILE *fpFinger;
   char fingload[MIL];
   char *laston = NULL;
   struct stat fst;

   fingload[0] = '\0';
   sprintf(fingload, "%s%c/%s", PLAYER_DIR, tolower(argument[0]), capitalize(argument));

   if (stat(fingload, &fst) == -1)
   {
      send_to_char("&YNo such player exists.\n\r", ch);
      return;
   }
   laston = ctime(&fst.st_mtime);

   if (stat(fingload, &fst) != -1)
   {
      if ((fpFinger = fopen(fingload, "r")) != NULL)
      {
         for (;;)
         {
            char letter;
            char *word;

            letter = fread_letter(fpFinger);

            if (letter != '#')
               continue;

            word = fread_word(fpFinger);
            if (!str_cmp(word, "End"))
               break;

            if (!str_cmp(word, "PLAYER"))
               fread_finger(ch, fpFinger, laston);
            else if (!str_cmp(word, "END")) /* Done  */
               break;
         }
         fclose(fpFinger);
      }
   }
   return;
}

#if defined(KEY)
#undef KEY
#endif

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

void fread_finger(CHAR_DATA * ch, FILE * fp, char *laston)
{
   char *word;
   char *email = NULL;
   char *homepage = NULL;
   char *name = NULL;
   char *town = NULL;
   char *site = NULL;
   char *title = NULL;
   char *bio = NULL;
   char *came_from = NULL;
   char *authed = NULL;
   char *temp = NULL;
   int race = 0, sex = 0, icq = 0, pranking = 0, pdeaths = 0, pkills = 0;
   int hometown = 0;
   bool fMatch;

   for (;;)
   {
      word = feof(fp) ? "End" : fread_word(fp);
      fMatch = FALSE;

      switch (UPPER(word[0]))
      {
         case '*':
            fMatch = TRUE;
            fread_to_eol(fp);
            break;

         case 'A':
            KEY("AuthedBy", authed, fread_string(fp));
            break;

         case 'B':
            KEY("Bio", bio, fread_string(fp));
            break;
            
         case 'C':
            KEY("CameFrom", came_from, fread_string(fp));
            break;

         case 'D':
            KEY("Description", temp, fread_string(fp));
            break;

         case 'E':
            if (!strcmp(word, "End"))
               goto finger_display;
            KEY("Email", email, fread_string_nohash(fp));
            break;

         case 'H':
            KEY("Homepage", homepage, fread_string_nohash(fp));
            if (!strcmp(word, "HomeTown"))
            {
               hometown = fread_number(fp);
               if (hometown >= sysdata.max_kingdom)
               {
                  bug("fread_finger: %s has an invalid kingdom value of %d", name, hometown);
                  hometown = 0;
               }
               fMatch = TRUE;
               break;
            }            
            break;

         case 'I':
            KEY("ICQ", icq, fread_number(fp));
            break;

         case 'N':
            KEY("Name", name, fread_string(fp));
            break;

         case 'P':
            KEY("PDeaths", pdeaths, fread_number(fp));
            KEY("PKills", pkills, fread_number(fp));
            KEY("PRanking", pranking, fread_number(fp));
            break;

         case 'R':
            KEY("Race", race, fread_number(fp));
            break;

         case 'S':
            KEY("Sex", sex, fread_number(fp));

            if (!strcmp(word, "Site"))
            {
               site = STRALLOC(fread_word(fp));
               fMatch = TRUE;
            }
            break;

         case 'T':
            KEY("Town", town, fread_string(fp));
            KEY("Title", title, fread_string(fp));
            break;
      }

      if (!fMatch)
         fread_to_eol(fp);
   }

/* Extremely ugly and disgusting goto hack, if there's a better way to
   do this, I'd sure like to know - Samson */

 finger_display:

   send_to_char("&c&w          Finger Info\n\r", ch);
   send_to_char("          -----------\n\r", ch);
   ch_printf(ch, "&&cwName : &G%-20s\n\r", name);
   ch_printf(ch, "&c&wSex  : &G%-20s &c&w   Race: &G%s\n\r",
      sex == SEX_MALE ? "Male" : sex == SEX_FEMALE ? "Female" : "Neutral", capitalize(print_npc_race(race)));
   ch_printf(ch, "&c&wTitle: &G%s\n\r", title);
   ch_printf(ch, "&RPkills: &G%d   &RPdeaths: &G%d   &RPranking: &G%d\n\r", pkills, pdeaths, pranking);
   ch_printf(ch, "&c&wHomepage: &G%s\n\r", homepage ? homepage : "Not specified");
   ch_printf(ch, "&c&wEmail: &G%s\n\r", email ? email : "Not specified");
   ch_printf(ch, "&c&wKingdom: &G%s\n\r", kingdom_table[hometown]->name);
   ch_printf(ch, "&c&wTown: &G%s\n\r", town);
   ch_printf(ch, "&c&wICQ#: &G%d\n\r", icq);
   ch_printf(ch, "&c&wLast on: &G%s\n\r", laston);
   if (IS_IMMORTAL(ch))
   {
      ch_printf(ch, "&c&wLast IP: &G%s\n\r", site);
      ch_printf(ch, "&c&wAuthorized by: &G%s\n\r", authed ? authed : "Unknown");
      ch_printf(ch, "&c&wCame from: &w&G%s\n\r", came_from ? came_from : "Unknown");
   }
   ch_printf(ch, "&c&wBio:\n\r&G%s\n\r", bio ? bio : "Not created");

   STRFREE(site);
   return;
}

/* Added a clone of homepage to let players input their email addy - Samson 4-18-98 */
void do_email(CHAR_DATA * ch, char *argument)
{
   char buf[MSL];

   if (IS_NPC(ch))
      return;

   if (argument[0] == '\0')
   {
      if (!ch->pcdata->email)
         ch->pcdata->email = str_dup("");
      ch_printf(ch, "Your email address is: %s\n\r", show_tilde(ch->pcdata->email));
      return;
   }

   if (!str_cmp(argument, "clear"))
   {
      if (ch->pcdata->email)
         DISPOSE(ch->pcdata->email);
      ch->pcdata->email = str_dup("");
      send_to_char("Email address cleared.\n\r", ch);
      return;
   }

   strcpy(buf, argument);

   if (strlen(buf) > 70)
      buf[70] = '\0';

   hide_tilde(buf);
   if (ch->pcdata->email)
      DISPOSE(ch->pcdata->email);
   ch->pcdata->email = str_dup(buf);
   send_to_char("Email address set.\n\r", ch);
}

void do_icq_number(CHAR_DATA * ch, char *argument)
{
   int icq;

   if (IS_NPC(ch))
      return;

   if (argument[0] == '\0')
   {
      if (!ch->pcdata->icq)
         ch->pcdata->icq = 0;
      ch_printf(ch, "Your ICQ# is: %d\n\r", ch->pcdata->icq);
      return;
   }

   if (!str_cmp(argument, "clear"))
   {
      ch->pcdata->icq = 0;
      send_to_char("ICQ# cleared.\n\r", ch);
      return;
   }

   if (!is_number(argument))
   {
      send_to_char("You must enter numeric data.\n\r", ch);
      return;
   }

   icq = atoi(argument);

   if (icq < 1)
   {
      send_to_char("Valid range is greater than 0.\n\r", ch);
      return;
   }

   ch->pcdata->icq = icq;

   send_to_char("ICQ# set.\n\r", ch);
   return;
}