/***************************************************************************
* Dark Warrior *
*--------------------------------------------------------------------------*
* Dark Warrior Code additions and changes from the Star Wars Reality code *
* copyright (c) 2003 by Michael Ervin, Mark Gottselig, Gavin Mogan *
* ------------------------------------------------------------------------ *
* Star Wars Reality Code Additions and changes from the Smaug Code *
* copyright (c) 1997 by Sean Cooper *
* ------------------------------------------------------------------------ *
* Starwars and Starwars Names copyright(c) Lucas Film Ltd. *
* ------------------------------------------------------------------------ *
* SMAUG 1.0 (C) 1994, 1995, 1996 by Derek Snider *
* SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, *
* Scryn, Rennard, Swordbearer, Gorog, Grishnakh and Tricops *
* ------------------------------------------------------------------------ *
* 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 *
****************************************************************************/
#ifdef FINGER
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#ifndef WIN32
#include <dirent.h>
#endif
#include "mud.h"
typedef struct finger_data {
char * name;
int race;
char * title;
int age;
int top_level;
int main_ability;
int sex;
/* Finger Data */
char * icq;
char * msn;
char * realname;
char * homepage;
char * email;
char * aolim;
char * yahoo;
char * logon;
} FINGER_DATA;
#define QUICK_VALID_STRING(string) ((string) != NULL && (string)[0] != '\0')
#define FILE_VERSION 1
void read_finger args(( CHAR_DATA *ch, char *argument ));
void fread_finger args(( CHAR_DATA *ch, FILE *fp, char *laston ));
bool file_exist args(( char *name ));
void output_finger (CHAR_DATA *ch, FINGER_DATA *finger)
{
send_to_char("&B------------------&w<&B<&C<&w<&B<&C< &wCharacter Info&B &w>&B>&C>&w>&B>&C>&B------------------\n\r", ch);
ch_printf(ch, "&BN&zame &w: %-20s &w &BA&zge &w: %-3d\n\r", finger->name, finger->age );
ch_printf(ch, "&BL&zevel&w: %-20d &w &BC&zlass&w: %-10s\n\r", finger->top_level,
finger->main_ability == 0 ? "Combatant" :
finger->main_ability == 1 ? "Pilot" :
finger->main_ability == 2 ? "Engineer" :
finger->main_ability == 3 ? "Bounty Hunter" :
finger->main_ability == 4 ? "Smuggler" :
finger->main_ability == 5 ? "Diplomat" :
finger->main_ability == 6 ? "Leader" :
finger->main_ability == 7 ? "Force User" : "Unknown" );
ch_printf(ch, "&BS&zex&w : %-20s &w &BR&zace&w : %s\n\r",
finger->sex == SEX_MALE ? "Male" :
finger->sex == SEX_FEMALE ? "Female" : "Neutral",
capitalize( race_table[finger->race].race_name ) );
ch_printf(ch, "&BT&zitle&w: %s\n\r", finger->title );
send_to_char("&B------------------&w<&B<&C<&w<&B<&C< &wReal Life Info&B &w>&B>&C>&w>&B>&C>&B------------------\n\r", ch);
ch_printf(ch, "&BR&zealname&w: &B[&w%-20s&B]\n\r", QUICK_VALID_STRING(finger->realname) ? finger->realname : "Not specified" );
ch_printf(ch, "&BH&zomepage&w: &B[&w%-20s&B]\n\r", QUICK_VALID_STRING(finger->homepage) ? finger->homepage : "Not specified" );
ch_printf(ch, "&BE&zmail &w: &B[&w%-20s&B]\n\r", QUICK_VALID_STRING(finger->email) ? finger->email : "Not specified" );
ch_printf(ch, "&BA&zIM &w : &B[&w%-20s&B]&w &w &BI&zCQ&w: &B[&w%-20s&B]&w\n\r",
QUICK_VALID_STRING(finger->aolim) ? finger->aolim : "Not specified",
QUICK_VALID_STRING(finger->icq) ? finger->icq : "None specified" );
ch_printf(ch, "&BY&zahoo IM&w: &B[&w%-20s&B]&w &w &BM&zSN&w: &B[&w%-20s&B]&w\n\r",
QUICK_VALID_STRING(finger->yahoo) ? finger->yahoo : "Not specified",
QUICK_VALID_STRING(finger->msn) ? finger->msn : "None specified" );
send_to_char("&B----------------------------------------------------------------\n\r", ch);
ch_printf(ch, "&BL&zast on&w : %s\n\r", finger->logon );
return;
}
void do_finger( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
FINGER_DATA * finger;
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;
}
victim = get_char_world(ch, argument);
if ( ( victim == NULL ) || (!victim) )
{
read_finger( ch, argument );
return;
}
if ( IS_NPC( victim ) )
{
read_finger( ch, argument );
return;
}
CREATE(finger, FINGER_DATA ,1 );
finger->name = victim->name;
finger->race = victim->race;
finger->title = victim->pcdata->title;
finger->age = IS_IMMORTAL(victim) ? 0 : get_age(victim);
finger->top_level = victim->top_level;
finger->main_ability = victim->main_ability;
finger->sex = victim->sex;
finger->realname = victim->pcdata->realname;
finger->homepage = victim->pcdata->homepage;
finger->email = victim->pcdata->email;
finger->icq = victim->pcdata->icq;
finger->msn = victim->pcdata->msn;
finger->aolim = victim->pcdata->aolim;
finger->yahoo = victim->pcdata->yahoo;
finger->logon = (char *) ctime(&victim->logon);
output_finger(ch, finger);
DISPOSE(finger);
return;
}
void read_finger( CHAR_DATA *ch, char *argument )
{
FILE *fpFinger;
char fingload[MAX_INPUT_LENGTH];
char laston[250];
struct stat fst;
snprintf( fingload,MSL, "%s%c/%s", PLAYER_DIR, tolower(argument[0]),
capitalize( argument ) );
if ( !file_exist(fingload) ) {
send_to_char( "&YNo such player exists.\n\r", ch );
return;
}
snprintf( fingload, MSL, "%s%c/%s.F", PLAYER_DIR, tolower(argument[0]),
capitalize( argument ) );
if ( stat( fingload, &fst ) != -1 )
{
strncpy(laston,ctime( &fst.st_mtime ), 250);
if ( ( fpFinger = fopen ( fingload, "r" ) ) != NULL )
{
for ( ; ; )
{
char letter;
char *word;
letter = fread_letter( fpFinger );
if ( letter == '*' )
{
fread_to_eol( fpFinger );
continue;
}
if ( letter != '#' )
{
bug( "finger.c: read_finger: # not found in finger file.", 0 );
bug( fingload, 0 );
ch_printf( ch, "&YThe finger file for %s is unreadable.\n\r", capitalize ( argument ) );
break;
}
word = fread_word( fpFinger );
if ( !strcmp( word, "FINGER" ) )
fread_finger( ch, fpFinger, laston );
else
if ( !strcmp( word, "END" ) ) /* Done */
break;
else
{
bug( "finger.c: read_finger: bad section.", 0 );
bug( fingload, 0 );
ch_printf( ch, "&YThe finger file for %s is unreadable.\n\r", capitalize ( argument ) );
break;
}
}
fclose( fpFinger );
}
}
else
ch_printf( ch, "&G%s does not have a finger file to read.\n\r", capitalize( argument ) );
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 )
{
FINGER_DATA * finger;
char buf[MAX_STRING_LENGTH];
const char *word;
int version = 1;
bool fMatch;
CREATE(finger, FINGER_DATA ,1 );
for ( ; ; )
{
word = feof( fp ) ? "End" : fread_word( fp );
fMatch = FALSE;
if ( !strcmp( word, "End" ) )
break;
switch ( UPPER(word[0]) )
{
case '*':
fMatch = TRUE;
fread_to_eol( fp );
break;
case 'A':
KEY( "Aim", finger->aolim, fread_string( fp ) );
break;
case 'M':
KEY( "Msn", finger->msn, fread_string( fp ) );
break;
case 'Y':
KEY( "Yahoo", finger->yahoo, fread_string( fp ) );
break;
case 'I':
KEY( "Icq", finger->icq, fread_string( fp ) );
break;
case 'C':
KEY( "Class", finger->main_ability, fread_number( fp ) );
break;
case 'E':
KEY( "Email", finger->email, fread_string( fp ) );
break;
case 'H':
KEY( "Homepage", finger->homepage, fread_string( fp ) );
break;
case 'L':
KEY( "Level", finger->top_level, fread_number( fp ) );
break;
case 'N':
KEY ("Name", finger->name, fread_string( fp ) );
break;
case 'R':
KEY ("Race", finger->race, fread_number( fp ) );
KEY( "Realname", finger->realname, fread_string_nohash( fp ) );
break;
case 'S':
KEY( "Sex", finger->sex, fread_number( fp ) );
break;
case 'T':
KEY( "Title", finger->title, fread_string( fp ) );
break;
case 'V':
KEY( "Version", version, fread_number( fp ) );
break;
}
if ( !fMatch )
{
snprintf( buf, MSL, "finger.c: fread_finger: no match: %s", word );
bug( buf, 0 );
}
}
finger->age = 0;
finger->logon = laston;
output_finger(ch, finger);
if (finger->email)
STRFREE(finger->email);
if (finger->homepage)
STRFREE(finger->homepage);
if (finger->name)
STRFREE(finger->name);
if (finger->title)
STRFREE(finger->title);
if (finger->aolim)
STRFREE(finger->aolim);
if (finger->realname)
STRFREE(finger->realname);
if (finger->icq)
STRFREE(finger->icq);
if (finger->msn)
STRFREE(finger->msn);
if (finger->yahoo)
STRFREE(finger->yahoo);
DISPOSE(finger);
return;
}
void save_finger( CHAR_DATA *ch )
{
FILE *fp;
char fng [MAX_INPUT_LENGTH];
// Better than top level > 2.. 'cause...
if( IS_NPC(ch) || NOT_AUTHED(ch) )
return;
if ( ch->desc && ch->desc->original )
ch = ch->desc->original;
snprintf( fng, MSL, "%s%c/%s.F", PLAYER_DIR, tolower(ch->name[0]),
capitalize( ch->name ) );
fclose( fpReserve );
if ( ( fp = fopen( fng, "w" ) ) == NULL )
{
bug( "finger.c: save_finger: fopen", 0 );
perror( "save_finger" );
}
else
{
fprintf( fp, "#FINGER\n" );
fprintf( fp, "Version\t\t%d\n", FILE_VERSION );
if (ch->name[0] != '\0')
fprintf( fp, "Name\t\t%s~\n", ch->name );
fprintf( fp, "Level\t\t%d\n", ch->top_level );
fprintf( fp, "Sex\t\t%d\n", ch->sex );
fprintf( fp, "Class\t\t%d\n", ch->main_ability );
fprintf( fp, "Race\t\t%d\n", ch->race );
if (QUICK_VALID_STRING(ch->pcdata->title))
fprintf( fp, "Title\t\t%s~\n", ch->pcdata->title );
if (QUICK_VALID_STRING(ch->pcdata->homepage))
fprintf( fp, "Homepage\t\t%s~\n", ch->pcdata->homepage );
if (QUICK_VALID_STRING(ch->pcdata->email))
fprintf( fp, "Email\t\t%s~\n", ch->pcdata->email );
if (QUICK_VALID_STRING(ch->pcdata->aolim))
fprintf( fp, "Aim\t\t%s~\n", ch->pcdata->aolim );
if (QUICK_VALID_STRING(ch->pcdata->icq))
fprintf( fp, "Icq\t\t%s~\n", ch->pcdata->icq );
if (QUICK_VALID_STRING(ch->pcdata->msn))
fprintf( fp, "Msn\t\t%s~\n", ch->pcdata->msn );
if (QUICK_VALID_STRING(ch->pcdata->yahoo))
fprintf( fp, "Yahoo\t\t%s~\n", ch->pcdata->yahoo );
fprintf( fp, "End\n\n" );
fprintf( fp, "#END\n" );
fclose(fp);
}
fpReserve = fopen ( NULL_FILE, "r" );
return;
}
void do_setself( CHAR_DATA *ch, char *argument )
{
char arg[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "&zS&wyntax&Y: &zsetself \n\r",ch);
send_to_char( "&zF&wields&Y: &zemail realname mudname icq\n\r",ch);
send_to_char( " &zhomepage aim msn yahoo &w\n\r",ch);
send_to_char( " &zhair eye weight build complextion height&w\n\r",ch);
return;
}
if ( !str_cmp( arg, "email" ) )
{
if ( strlen(argument) > 70 )
buf[70] = '\0';
if ( argument[0] == '\0' )
{
send_to_char( "&zS&wyntax&Y: &zsetself email <your email address>\n\r",ch);
return;
}
hide_tilde( argument );
if ( ch->pcdata->email )
STRFREE(ch->pcdata->email);
ch->pcdata->email = STRALLOC(argument);
send_to_char( "Email address set.\n\r", ch );
return;
}
if ( !str_cmp( arg, "realname" ) )
{
if ( strlen(argument) > 70 )
buf[70] = '\0';
if ( argument[0] == '\0' )
{
send_to_char( "&zS&wyntax&Y: &zsetself realname <your real name>\n\r",ch);
return;
}
hide_tilde( argument );
if ( ch->pcdata->realname )
STRFREE(ch->pcdata->realname);
ch->pcdata->realname = STRALLOC(argument);
send_to_char( "Realname set.\n\r", ch );
return;
}
if ( !str_cmp( arg, "icq" ) )
{
if ( strlen(argument) > 70 )
buf[70] = '\0';
if ( argument[0] == '\0' )
{
send_to_char( "&zS&wyntax&Y: &zsetself icq <your icq number>\n\r",ch);
return;
}
hide_tilde( argument );
if ( ch->pcdata->icq )
STRFREE(ch->pcdata->icq);
ch->pcdata->icq = STRALLOC(argument);
send_to_char( "ICQ set.\n\r", ch );
return;
}
if ( !str_cmp( arg, "homepage" ) )
{
if ( strstr( argument, "://" ) )
strcpy( buf, argument );
else
snprintf( buf, MSL, "http://%s", argument );
if ( strlen(buf) > 70 )
buf[70] = '\0';
if ( argument[0] == '\0' )
{
send_to_char( "&zS&wyntax&Y: &zsetself homepage <your website address>\n\r",ch);
return;
}
hide_tilde( argument );
if ( ch->pcdata->homepage )
STRFREE(ch->pcdata->homepage);
ch->pcdata->homepage = STRALLOC(argument);
send_to_char( "Homepage set.\n\r", ch );
return;
}
if ( !str_cmp( arg, "aim" ) )
{
if ( strlen(argument) > 70 )
buf[70] = '\0';
if ( argument[0] == '\0' )
{
send_to_char( "&zS&wyntax&Y: &zsetself aim <your aim name>\n\r",ch);
return;
}
hide_tilde( argument );
if ( ch->pcdata->aolim )
STRFREE(ch->pcdata->aolim);
ch->pcdata->aolim = STRALLOC(argument);
send_to_char( "Aim set.\n\r", ch );
return;
}
if ( !str_cmp( arg, "msn" ) )
{
if ( strlen(argument) > 70 )
buf[70] = '\0';
if ( argument[0] == '\0' )
{
send_to_char( "&zS&wyntax&Y: &zsetself msn <your msn account>\n\r",ch);
return;
}
hide_tilde( argument );
if ( ch->pcdata->msn )
STRFREE(ch->pcdata->msn);
ch->pcdata->msn = STRALLOC(argument);
send_to_char( "MSN set.\n\r", ch );
return;
}
if ( !str_cmp( arg, "yahoo" ) )
{
if ( strlen(argument) > 70 )
buf[70] = '\0';
if ( argument[0] == '\0' )
{
send_to_char( "&zS&wyntax&Y: &zsetself yahoo <your yahoo name>\n\r",ch);
return;
}
hide_tilde( argument );
if ( ch->pcdata->yahoo )
STRFREE(ch->pcdata->yahoo);
ch->pcdata->yahoo = STRALLOC(argument);
send_to_char( "Yahoo set.\n\r", ch );
return;
}
do_setself( ch, "" );
save_finger( ch );
return;
}
bool file_exist( char *name )
{
/*
* F_OK = Existance of the file
* according to 'man 2 access'
*/
if ( access( name, F_OK ) == 0 )
return TRUE;
return FALSE;
/*FILE *fp;
if ( ( fp = fopen( name, "r" ) ) != NULL )
{
fclose( fp );
return TRUE;
}
else
{
return FALSE;
}
return FALSE;*/
}
#endif