/****************************************************************************
* [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;
}