/****************************************************************************
* ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh, *
* Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith. *
* ------------------------------------------------------------------------ *
* Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain, *
* Ohio. ALL RIGHTS RESERVED See /doc/RMLicense.txt for more details. *
****************************************************************************/
/****************************************************************************
* [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. *
* ------------------------------------------------------------------------ *
* Comments: 'notes' attached to players to keep track of outstanding *
* and problem players. -haus 6/25/1995 *
****************************************************************************/
/* INSTALLATION: 1) Add following stuff to mud.h
*
* NOTE_DATA * comments; (* inside char_data definition *)
* DECLARE_DO_FUN( do_comment );
*
* 2) Add do_comment to interp.c, as usual
*
* 3) in save.c the following must be added
*
* save.c:107: if ( ch->comments ) (* saves comments *)
* save.c:108: fwrite_comments( ch, fp ); (* in file *)
*
*
* save.c:411: ch->comments = NULL; (* nulls ch->comments *)
*
*
* save.c:457: else if ( !str_cmp( word, "COMMENT") ) fread_comment(ch, fp ); (*snags #COMMENT*)
*
* 4) That looks like it to these eyes. Lemme know if i forgot anything.
*
*
* EXAMPLE: See end of this file.
*
*/
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "mud.h"
void note_attach( CHAR_DATA * ch );
void comment_remove( CHAR_DATA * victim, NOTE_DATA * pnote )
{
if( !victim->comments )
{
bug( "comment remove: null board", 0 );
return;
}
if( !pnote )
{
bug( "comment remove: null pnote", 0 );
return;
}
/*
* Remove comment from linked list.
*/
if( !pnote->prev )
victim->comments = pnote->next;
else
pnote->prev->next = pnote->next;
STRFREE( pnote->text );
STRFREE( pnote->subject );
STRFREE( pnote->to_list );
STRFREE( pnote->date );
STRFREE( pnote->sender );
DISPOSE( pnote );
/*
* Rewrite entire list.
*/
save_char_obj( victim );
return;
}
void do_comment( CHAR_DATA * ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
char arg1[MAX_INPUT_LENGTH];
NOTE_DATA *pnote;
CHAR_DATA *victim;
int vnum;
int anum;
if( IS_NPC( ch ) )
{
send_to_char( "Mobs can't use the comment command.\r\n", ch );
return;
}
if( !ch->desc )
{
bug( "do_comment: no descriptor", 0 );
return;
}
/*
* Put in to prevent crashing when someone issues a comment command
* from within the editor. -Narn
*/
if( ch->desc->connected == CON_EDITING || ch->desc->connected == CON_NOTE_TO )
{
send_to_char( "You can't use the comment command from within the editor.\r\n", ch );
return;
}
switch ( ch->substate )
{
default:
break;
case SUB_WRITING_NOTE:
if( !ch->pnote )
{
bug( "do_comment: note got lost?", 0 );
send_to_char( "Your note got lost!\r\n", ch );
stop_editing( ch );
return;
}
if( ch->dest_buf != ch->pnote )
bug( "do_comment: sub_writing_note: ch->dest_buf != ch->pnote", 0 );
STRFREE( ch->pnote->text );
ch->pnote->text = copy_buffer( ch );
stop_editing( ch );
return;
}
set_char_color( AT_NOTE, ch );
argument = one_argument( argument, arg );
smash_tilde( argument );
if( !str_cmp( arg, "about" ) )
{
victim = get_char_world( ch, argument );
if( !victim )
{
send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "No comments about mobs\r\n", ch );
return;
}
}
if( !str_cmp( arg, "list" ) )
{
victim = get_char_world( ch, argument );
if( !victim )
{
send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "No comments about mobs\r\n", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You're not of the right caliber to do this...\r\n", ch );
return;
}
if( !victim->comments )
{
send_to_char( "There are no relevant comments.\r\n", ch );
return;
}
vnum = 0;
for( pnote = victim->comments; pnote; pnote = pnote->next )
{
vnum++;
sprintf( buf, "%2d) %-10s [%s] %s\r\n", vnum, pnote->sender, pnote->date, pnote->subject );
/* Brittany added date to comment list and whois with above change */
send_to_char( buf, ch );
}
/*
* act( AT_ACTION, "$n glances over the notes.", ch, NULL, NULL, TO_ROOM );
*/
return;
}
if( !str_cmp( arg, "read" ) )
{
bool fAll;
argument = one_argument( argument, arg1 );
victim = get_char_world( ch, arg1 );
if( !victim )
{
send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "No comments about mobs\r\n", ch );
return;
}
if( get_trust( victim ) >= get_trust( ch ) )
{
send_to_char( "You're not of the right caliber to do this...\r\n", ch );
return;
}
if( !victim->comments )
{
send_to_char( "There are no relevant comments.\r\n", ch );
return;
}
if( !str_cmp( argument, "all" ) )
{
fAll = TRUE;
anum = 0;
}
else if( is_number( argument ) )
{
fAll = FALSE;
anum = atoi( argument );
}
else
{
send_to_char( "Note read which number?\r\n", ch );
return;
}
vnum = 0;
for( pnote = victim->comments; pnote; pnote = pnote->next )
{
vnum++;
if( vnum == anum || fAll )
{
sprintf( buf, "[%3d] %s: %s\r\n%s\r\nTo: %s\r\n",
vnum, pnote->sender, pnote->subject, pnote->date, pnote->to_list );
send_to_char( buf, ch );
send_to_char( pnote->text, ch );
/*
* act( AT_ACTION, "$n reads a note.", ch, NULL, NULL, TO_ROOM );
*/
return;
}
}
send_to_char( "No such comment.\r\n", ch );
return;
}
if( !str_cmp( arg, "write" ) )
{
note_attach( ch );
ch->substate = SUB_WRITING_NOTE;
ch->dest_buf = ch->pnote;
start_editing( ch, ch->pnote->text );
return;
}
if( !str_cmp( arg, "subject" ) )
{
note_attach( ch );
STRFREE( ch->pnote->subject );
ch->pnote->subject = STRALLOC( argument );
send_to_char( "Ok.\r\n", ch );
return;
}
if( !str_cmp( arg, "to" ) )
{
note_attach( ch );
STRFREE( ch->pnote->to_list );
ch->pnote->to_list = STRALLOC( argument );
send_to_char( "Ok.\r\n", ch );
return;
}
if( !str_cmp( arg, "clear" ) )
{
if( ch->pnote )
{
STRFREE( ch->pnote->text );
STRFREE( ch->pnote->subject );
STRFREE( ch->pnote->to_list );
STRFREE( ch->pnote->date );
STRFREE( ch->pnote->sender );
DISPOSE( ch->pnote );
}
ch->pnote = NULL;
send_to_char( "Ok.\r\n", ch );
return;
}
if( !str_cmp( arg, "show" ) )
{
if( !ch->pnote )
{
send_to_char( "You have no comment in progress.\r\n", ch );
return;
}
sprintf( buf, "%s: %s\r\nTo: %s\r\n", ch->pnote->sender, ch->pnote->subject, ch->pnote->to_list );
send_to_char( buf, ch );
send_to_char( ch->pnote->text, ch );
return;
}
if( !str_cmp( arg, "post" ) )
{
char *strtime;
if( !ch->pnote )
{
send_to_char( "You have no comment in progress.\r\n", ch );
return;
}
argument = one_argument( argument, arg1 );
victim = get_char_world( ch, arg1 );
if( !victim )
{
send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "No comments about mobs\r\n", ch );
return;
}
if( get_trust( victim ) > get_trust( ch ) )
{
send_to_char( "You're not of the right caliber to do this...\r\n", ch );
return;
}
/*
* act( AT_ACTION, "$n posts a note.", ch, NULL, NULL, TO_ROOM );
*/
strtime = ctime( ¤t_time );
strtime[strlen( strtime ) - 1] = '\0';
ch->pnote->date = STRALLOC( strtime );
pnote = ch->pnote;
ch->pnote = NULL;
/*
* LIFO to make life easier
*/
pnote->next = victim->comments;
if( victim->comments )
victim->comments->prev = pnote;
pnote->prev = NULL;
victim->comments = pnote;
save_char_obj( victim );
#ifdef NOTDEFD
fclose( fpReserve );
sprintf( notefile, "%s/%s", BOARD_DIR, board->note_file );
if( ( fp = fopen( notefile, "a" ) ) == NULL )
{
perror( notefile );
}
else
{
fprintf( fp, "Sender %s~\nDate %s~\nTo %s~\nSubject %s~\nText\n%s~\n\n",
pnote->sender, pnote->date, pnote->to_list, pnote->subject, pnote->text );
fclose( fp );
}
fpReserve = fopen( NULL_FILE, "r" );
#endif
send_to_char( "Ok.\r\n", ch );
return;
}
if( !str_cmp( arg, "remove" ) )
{
argument = one_argument( argument, arg1 );
victim = get_char_world( ch, arg1 );
if( !victim )
{
send_to_char( "They're not logged on!\r\n", ch ); /* maybe fix this? */
return;
}
if( IS_NPC( victim ) )
{
send_to_char( "No comments about mobs\r\n", ch );
return;
}
if( ( get_trust( victim ) >= get_trust( ch ) ) || ( get_trust( ch ) < 58 ) ) /* switch to some LEVEL_ thingie */
{
send_to_char( "You're not of the right caliber to do this...\r\n", ch );
return;
}
/*
* argument = one_argument(argument, arg);
*/
if( !is_number( argument ) )
{
send_to_char( "Comment remove which number?\r\n", ch );
return;
}
anum = atoi( argument );
vnum = 0;
for( pnote = victim->comments; pnote; pnote = pnote->next )
{
vnum++;
if( ( 58 <= get_trust( ch ) ) /* switch to some LEVEL_ thingie */
&& ( vnum == anum ) )
{
comment_remove( victim, pnote );
send_to_char( "Ok.\r\n", ch );
/*
* act( AT_ACTION, "$n removes a note.", ch, NULL, NULL, TO_ROOM );
*/
return;
}
}
send_to_char( "No such comment.\r\n", ch );
return;
}
send_to_char( "Type 'help comment' for usage (i hope!).\r\n", ch );
return;
}
void fwrite_comments( CHAR_DATA * ch, FILE * fp )
{
NOTE_DATA *pnote;
if( !ch->comments )
return;
for( pnote = ch->comments; pnote; pnote = pnote->next )
{
fprintf( fp, "#COMMENT\n" );
fprintf( fp, "sender %s~\n", pnote->sender );
fprintf( fp, "date %s~\n", pnote->date );
fprintf( fp, "to %s~\n", pnote->to_list );
fprintf( fp, "subject %s~\n", pnote->subject );
fprintf( fp, "text\n%s~\n", pnote->text );
}
return;
}
void fread_comment( CHAR_DATA * ch, FILE * fp )
{
NOTE_DATA *pnote;
for( ;; )
{
char letter;
do
{
letter = getc( fp );
if( feof( fp ) )
{
fclose( fp );
return;
}
}
while( isspace( letter ) );
ungetc( letter, fp );
CREATE( pnote, NOTE_DATA, 1 );
if( str_cmp( fread_word( fp ), "sender" ) )
break;
pnote->sender = fread_string( fp );
if( str_cmp( fread_word( fp ), "date" ) )
break;
pnote->date = fread_string( fp );
if( str_cmp( fread_word( fp ), "to" ) )
break;
pnote->to_list = fread_string( fp );
if( str_cmp( fread_word( fp ), "subject" ) )
break;
pnote->subject = fread_string( fp );
if( str_cmp( fread_word( fp ), "text" ) )
break;
pnote->text = fread_string( fp );
pnote->next = ch->comments;
pnote->prev = NULL;
ch->comments = pnote;
return;
}
bug( "fread_comment: bad key word. strap in!", 0 );
/*
* exit( 1 );
*/
}
/*
<758hp 100m 690mv> <#10316> loadup boo
Log: Haus: loadup boo
Log: Reading in player data for: Boo
Done.
<758hp 100m 690mv> <#10316> poke boo
You poke him in the ribs.
<758hp 100m 690mv> <#10316> comment subject boo's a nutcase!
Ok.
<758hp 100m 690mv> <#10316> comment to all
Ok.
<758hp 100m 690mv> <#10316> comment write
Begin entering your text now (/? = help /s = save /c = clear /l = list)
-----------------------------------------------------------------------
> He transed shimmy to temple square!
> /s
Done.
<758hp 100m 690mv> <#10316> comment post boo
Ok.
<758hp 100m 690mv> <#10316> comment list boo
1) Haus: boo's a nutcase!
<758hp 100m 690mv> <#10316> comment read boo 1
[ 1] Haus: boo's a nutcase!
Sun Jun 25 18:26:54 1995
To: all
He transed shimmy to temple square!
<758hp 100m 690mv> <#10316> comment remove boo 1
Ok.
<758hp 100m 690mv> <#10316> comment list boo
There are no relevent comments.
*/