/
Finger snippet - Originally coded by an unknown author, it was ported to SWR by 
Atrox of Paradawn, and then modifed by Greven of DW, and then cleaned up by Gavin of DW.

You are free to distribute/modify/post this snippet as you see fit, as long you leave
all of the original comments and headers in the file.

This snippet allows people to share OOC information with people by entering it into
a sort of profile. These files can be viewed when the victim is both online and offline.

oh, BTW, the name for this command is from the unix command "finger" that gives online
status and times for users on the system, not what most people think it means :) - Greven

This snippet was tested on stock SWR 1.0, and should work on most SWR muds. It may require
som bludgeoning to make it work with other DIKU derivitives.

Version 1.01 removes check for can_see, since if they weren't online they would get the
file anyways, so...

mud.h
-----

Find:

    long		bank;

in pc_data, and add below it:

    char *		realname;
    char *		icq;
    char *		msn;
    char *		aolim;
    char *		yahoo;

Find:

/* newscore.c */
char *  get_race 	args( (CHAR_DATA *ch) );

Below, add:

/* Finger.c */
void save_finger args( ( CHAR_DATA *ch ) );


Find the do_ declares, and add with them:

DECLARE_DO_FUN( do_setself );
DECLARE_DO_FUN( do_finger );

act_comm.c
------

in do_save, find:

    saving_char = NULL;
    send_to_char( "Ok.\n\r", ch );

below that, add:

#ifdef FINGER
    save_finger( ch );
#endif

save.c
------

In function fwrite_char, find:

	if ( ch->pcdata->homepage && ch->pcdata->homepage[0] != '\0' )
	  fprintf( fp, "Homepage     %s~\n",	ch->pcdata->homepage	);

And below, add:

	if ( ch->pcdata->aolim && ch->pcdata->aolim[0] != '\0' )
	  fprintf( fp, "Aim          %s~\n",	ch->pcdata->aolim	);
	if ( ch->pcdata->icq && ch->pcdata->icq[0] != '\0' )
	  fprintf( fp, "Icq          %s~\n",	ch->pcdata->icq	);
	if ( ch->pcdata->yahoo && ch->pcdata->yahoo[0] != '\0' )
	  fprintf( fp, "Yahoo        %s~\n",	ch->pcdata->yahoo	);
	if ( ch->pcdata->msn && ch->pcdata->msn[0] != '\0' )
	  fprintf( fp, "Msn          %s~\n",	ch->pcdata->msn	);
	if ( ch->pcdata->realname && ch->pcdata->realname[0] != '\0' )
	  fprintf( fp, "Realname     %s~\n",	ch->pcdata->realname	);

Further down, in load_char_obj, find:

	ch->pcdata->authed_by		= STRALLOC( "" );
	ch->pcdata->prompt		= STRALLOC( "" );

And below that, add:

	ch->pcdata->icq			= STRALLOC( "" );
	ch->pcdata->msn			= STRALLOC( "" );
	ch->pcdata->aolim		= STRALLOC( "" );
	ch->pcdata->yahoo		= STRALLOC( "" );
	ch->pcdata->realname		= STRALLOC( "" );

In function fread_char, you need to add these to the right case, if the word starts with I, 
put it in case I (ICQ, for example):

	    KEY( "Aim", 	ch->pcdata->aolim,      fread_string( fp ) );
	    KEY( "Icq",    ch->pcdata->icq,	fread_string( fp ) );
	    KEY( "Msn",    ch->pcdata->msn,	fread_string( fp ) );
	    KEY( "Realname",    ch->pcdata->realname,	fread_string( fp ) );

You will probably have to add this:

	case 'Y':
	    KEY( "Yahoo",    ch->pcdata->yahoo,	fread_string( fp ) );
	    break;

db.c
----

In free_char, find:

	STRFREE( ch->pcdata->authed_by	);
	STRFREE( ch->pcdata->prompt	);

Below, add this:

	if ( ch->pcdata->realname )
		STRFREE( ch->pcdata->realname );
	if ( ch->pcdata->icq )
		STRFREE( ch->pcdata->icq );
	if ( ch->pcdata->msn )
		STRFREE( ch->pcdata->msn );
	if ( ch->pcdata->aolim )
		STRFREE( ch->pcdata->aolim );
	if ( ch->pcdata->yahoo )
		STRFREE( ch->pcdata->yahoo );
	if ( ch->pcdata->title )

Next, we need to edit the makefile.

Add finger.c and finger.o to your .o and .c files.

Below this line:

#DBUGFLG = -DREQUESTS

add this line:

DEFINES = -DFINGER

and on the line declaring C_FLAGS, add this to the end:

$(DEFINES)

Save, and exit.

tables.c
--------
find:

    if ( skill == do_force )		return "do_force";

and below, add:
#ifdef FINGER
    if ( skill == do_finger )		return "do_finger";
    if ( skill == do_setself )		return "do_setself";
#endif

Find:

	if ( !str_cmp( name, "do_freeze" ))		return do_freeze;

Below, add:

#ifdef FINGER
	if ( !str_cmp( name, "do_finger" ))		return do_finger;
#endinf

Find:

	if ( !str_cmp( name, "do_shout" ))		return do_shout;

Below, add:

#ifdef FINGER
	if ( !str_cmp( name, "do_setself" ))		return do_setself;
#endif

Compile clean, compile, and reboot your mud. Now, whenever anyone saves, it should save/update the file. 

Inside your mud, use cedit to create the commands:

cedit finger create
cedit setself create
cedit save cmdtable

That should do it. Enjoy! -Greven