/*--------------------------------------------------------------------------* * ** WolfPaw 1.0 ** * *--------------------------------------------------------------------------* * WolfPaw 1.0 (c) 1997,1998 by Dale Corse * *--------------------------------------------------------------------------* * The WolfPaw Coding Team is headed by: Greywolf * * With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag * * Scryn, Thoric, Justice, Tricops and Mask. * *--------------------------------------------------------------------------* * Custom Mud-Mail Functions Module * *--------------------------------------------------------------------------*/ #include <stdio.h> #include <string.h> #include <time.h> #include <unistd.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include "mud.h" void load_letter args( (MAIL_DATA *mail, FILE *fp ) ); void write_mail args( ( void ) ); void edit_mail args( ( CHAR_DATA *ch, MAIL_DATA *mail ) ); bool forward_mail( MAIL_DATA *mail, char *fw_email ); OFFLINE_DATA *od_lookup( char *name ); int mail_complete=0; char *to; char *subject; #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } void do_mail( CHAR_DATA *ch, char *argument ) { MAIL_DATA *mail=NULL; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char fname[MSL]; char *strtime; struct stat fst; CHAR_DATA *mob; OFFLINE_DATA *od=NULL; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); /* * Check for postmaster. */ for ( mob = ch->in_room->first_person; mob; mob = mob->next_in_room ) { if ( IS_NPC(mob) && IS_SET(mob->act, ACT_POSTMASTER) ) { break; } } if ( !mob ) { send_to_char("I see no Postmaster here.\n\r",ch); return; } if ( mail_complete != 1 ) { if ( arg1[0] == '\0' ) { send_to_char("Syntax: mail <char> <subject(optional)>\n\r",ch); return; } arg1[0] = UPPER(arg1[0]); sprintf( fname, "%s%c/%s.gz", PLAYER_DIR, tolower(arg1[0]), capitalize( arg1 ) ); if ( stat( fname, &fst ) == -1 ) sprintf( fname, "%s%c/%s", PLAYER_DIR, tolower(arg1[0]), capitalize( arg1 ) ); if ( stat( fname, &fst ) != -1 ) { to = STRALLOC( arg1 ); } else { send_to_char("No player exists by that name.\n\r",ch); return; } if ( !str_cmp( arg1, ch->name ) ) { send_to_char("The Postmaster tells you 'You can't mail yourself!'\n\r",ch); return; } if ( ch->gold < 150 ) { send_to_char("The Postmaster tells you 'You need 150 copper coins for a stamp.'\n\r",ch); return; } else { send_to_char("The Postmaster takes 150 copper coins for a stamp.\n\r",ch); ch->gold -= 150; } if ( arg2[0] != '\0' ) { subject = STRALLOC( arg2 ); } else { send_to_char("No Subject specified, setting Subject to None\n\r",ch); subject = STRALLOC( "None" ); } } strtime = ctime( ¤t_time ); strtime[strlen(strtime)-1] = '\0'; CREATE( mail, MAIL_DATA, 1 ); mail->sender = STRALLOC( ch->name ); mail->to = STRALLOC( capitalize(to) ); mail->subject = STRALLOC( subject ); mail->date = STRALLOC( strtime ); mail->text = STRALLOC( "" ); mail->read = 0; edit_mail( ch, mail ); if ( mail_complete != 1 ) { if ((od=od_lookup(mail->to))!=NULL) { if ( od->email_fw != NULL && str_cmp(od->email_fw, "(null)")) { forward_mail(mail,od->email_fw); ch_printf(ch,"Your Mud-Mail was Email-Forwarded to %s.\n\r",mail->to); DISPOSE(mail); DISPOSE(od); write_mail(); return; } DISPOSE(od); } LINK(mail,first_mail,last_mail,next,prev); write_mail(); STRFREE( to ); STRFREE( subject ); } write_mail(); return; } void edit_mail( CHAR_DATA *ch, MAIL_DATA *mail ) { switch( ch->substate ) { default: bug("do_mail: illegal substate.",0); return; case SUB_RESTRICTED: send_to_char("You can't do that from within another command.\n\r",ch); return; case SUB_NONE: ch->substate = SUB_WRITING_NOTE; ch->dest_buf = ch; mail_complete = 1; start_editing( ch, mail->text ); act( AT_BLUE,"$n starts writing some mail.",ch,NULL,NULL,TO_ROOM); return; case SUB_WRITING_NOTE: STRFREE( mail->text ); mail->text = copy_buffer( ch ); stop_editing( ch ); mail_complete = 0; act( AT_BLUE,"$n finishes sending some mail.",ch,NULL,NULL,TO_ROOM); send_to_char("Mail Sent.\n\r",ch); return; } } void do_receive( CHAR_DATA *ch, char *argument ) { MAIL_DATA *mail,*mail_next=NULL; char arg[MAX_INPUT_LENGTH]; OBJ_DATA *paper=NULL; ZONE_DATA *in_zone; char notebuf[MAX_STRING_LENGTH]; char short_desc_buf[MAX_STRING_LENGTH]; char long_desc_buf[MAX_STRING_LENGTH]; char keyword_buf[MAX_STRING_LENGTH]; bool found; CHAR_DATA *mob; int cnt=0; bool postmaster; arg[0] = '\0'; one_argument( argument, arg ); notebuf[0] = '\0'; short_desc_buf[0] = '\0'; long_desc_buf[0] = '\0'; keyword_buf[0] = '\0'; postmaster = FALSE; /* * Check for postmaster. */ for ( mob = ch->in_room->first_person; mob; mob = mob->next_in_room ) { if ( IS_NPC(mob) && IS_SET(mob->act, ACT_POSTMASTER) ) { postmaster = TRUE; break; } } if ( !postmaster ) { send_to_char("I see no Postmaster here.\n\r",ch); return; } in_zone = find_zone(1); found = FALSE; for ( mail = first_mail; mail; mail = mail_next ) { mail_next = mail->next; if( !str_cmp( mail->to, ch->name ) && ( mail->read == 0 ) ) { cnt++; found = TRUE; paper = create_object(get_obj_index(OBJ_VNUM_NOTE,1),0,in_zone); sprintf(notebuf,"*-*-* Age of the Ancients Mud-Mail System *-*-*"); strcat(notebuf, "\n\nDate: "); strcat(notebuf, mail->date); strcat(notebuf, "\n\rFrom: "); strcat(notebuf, mail->sender); strcat(notebuf, "\n\rTo: "); strcat(notebuf, mail->to); strcat(notebuf, "\n\rSubject: "); strcat(notebuf, mail->subject); strcat(notebuf, "\n\r\n\r"); strcat(notebuf, mail->text); strcat(notebuf, "\n\r"); paper->spare_desc = STRALLOC(notebuf); paper->value[0] = 2; paper->value[1] = 2; paper->value[2] = 2; sprintf(short_desc_buf, "Some Mail"); STRFREE(paper->short_descr); paper->short_descr = STRALLOC(short_desc_buf); sprintf(long_desc_buf, "Some Mail lies here."); STRFREE(paper->description); paper->description = STRALLOC(long_desc_buf); sprintf(keyword_buf, "mail parchment paper %d",cnt); STRFREE(paper->name); paper->name = STRALLOC(keyword_buf); send_to_char("The Postmaster hands you a piece of mail.\n\r",ch); act(AT_BLUE,"The Postmaster hands $n a piece of mail.",ch,NULL,NULL,TO_ROOM); obj_to_char(paper,ch); mail->read = 1; UNLINK(mail,first_mail,last_mail,next,prev); DISPOSE(mail); write_mail(); } } if ( !found ) send_to_char("The Postmaster tells you 'you have no mail waiting.'\n\r",ch); else write_mail(); return; } void do_read( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj=NULL; char arg[MAX_INPUT_LENGTH]; arg[0] = '\0'; one_argument( argument, arg ); if ( ms_find_obj(ch) ) return; if ( ( obj = get_obj_carry( ch, arg ) ) == NULL ) { send_to_char("You don't have that.\n\r",ch); return; } if ( obj->pIndexData->vnum == OBJ_VNUM_NOTE ) { send_to_char( obj->spare_desc, ch ); return; } send_to_char( "You can't seem to read that.\n\r",ch); return; } void mail_notice( CHAR_DATA *ch ) { MAIL_DATA *mail; int cnt = 0; for ( mail = first_mail; mail; mail = mail->next ) { if( mail == NULL ) break; if( !str_cmp( mail->to, ch->name ) && ( mail->read == 0 ) ) cnt++; } if ( cnt > 0 ) { send_to_char("&BYOU HAVE MAIL\n\r",ch); return; } return; } void mail_count(CHAR_DATA *ch) { MAIL_DATA *mail; int cnt = 0; for ( mail = first_mail; mail; mail = mail->next ) { if( mail == NULL ) break; if( !str_cmp( mail->to, ch->name ) && ( mail->read == 0 ) ) cnt++; } if ( cnt ) ch_printf(ch, "You have %d mail messages waiting.\n\r", cnt); return; } void load_mail( void ) { MAIL_DATA *mail=NULL; FILE *fp; bool fHeader = FALSE; if( (fp=fopen( MAIL_FILE,"r" ) )==NULL ) { bug("load_mail: CANNOT OPEN MAIL_FILE",0); perror(MAIL_FILE); return; } for ( ; ; ) { char letter; char *word; letter = feof( fp ) ? '$' : fread_letter( fp ); if( letter == '*' ) { fread_to_eol( fp ); continue; } if ( letter == '$' ) { break; } if ( letter != '#' ) { bug("Load_Mail: # not Found.",0); break; } word = feof( fp ) ? "END" : fread_word( fp ); if ( !str_cmp(word, "START" ) ) { fread_to_eol( fp ); fHeader = TRUE; continue; } else if ( !str_cmp(word, "MAIL" ) ) { mail=NULL; CREATE( mail, MAIL_DATA,1); load_letter( mail, fp ); LINK( mail, first_mail, last_mail, next, prev ); continue; } else if ( !str_cmp(word, "END" ) ) break; else { bug("Load_Mail: Bad Section. (%s)",word); break; } if ( !fHeader ) log_string("Load_Mail: #START MAIL not found!"); } new_fclose(fp); return; } void write_mail( void ) { MAIL_DATA *mail; FILE *fp; if ( (fp=fopen( MAIL_FILE,"w" ) )==NULL) { bug("Cannot open MAIL_FILE!",0); perror(MAIL_FILE); return; } fprintf( fp,"#START MAIL\n\n"); for ( mail = first_mail; mail; mail = mail->next ) { fprintf( fp,"#MAIL\n"); fprintf( fp,"Read %d\n", mail->read ); fprintf( fp,"Sender %s~\n", mail->sender ); fprintf( fp,"Date %s~\n", mail->date ); fprintf( fp,"To %s~\n", mail->to ); fprintf( fp,"Subject %s~\n", mail->subject ); fprintf( fp,"Text %s~\n", mail->text ); fprintf( fp,"$$\n"); } fprintf( fp,"#END MAIL" ); new_fclose(fp); return; } void load_letter( MAIL_DATA *mail, FILE *fp ) { char *word=NULL; bool fMatch=FALSE; for( ; ; ) { word = feof(fp) ? "$" : fread_word( fp ); fMatch = FALSE; switch ( UPPER(word[0]) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case '$': fMatch = TRUE; return; case 'D': KEY( "Date", mail->date, fread_string( fp ) ); break; case 'R': KEY( "Read", mail->read, fread_number( fp ) ); break; case 'S': KEY( "Sender", mail->sender, fread_string( fp ) ); KEY( "Subject", mail->subject, fread_string( fp ) ); break; case 'T': KEY( "To", mail->to, fread_string( fp ) ); KEY( "Text", mail->text, fread_string( fp ) ); break; } if ( !fMatch ) { bug( "Load_Letter: no match for %s.", word ); } } } bool forward_mail( MAIL_DATA *mail, char *fw_email ) { char buf[MSL*3]; FILE *fp; if ( !fw_email || !mail ) return FALSE; sprintf(buf,"/bin/mail -s 'FW: AOTA MudMail from %s.' %s",capitalize(mail->sender),fw_email); if ( (fp= popen( buf, "w" ))==NULL) { bug("Forward Mail: Unable to open process pipe! (%s)",buf); return FALSE; } sprintf(buf, "\n**************************************************************" "\n*** THIS IS AN AUTO-GENERATED MAIL - DONOT REPLY TO IT! ***" "\n**************************************************************\n\n" "The following Mail was forwarded to you from Age of the Ancients MUD.\n" "Please report all abuse of this system to aota@ancients.org, and include\n" "this mail attached.\n\n" "Sender: %s\n" "To: %s\n" "Date: %s\n" "Subject: %s\n\n" "%s\n\n" "-------------------------------------------------------------\n" "-=[ AOTA-Mail 1.2 ]=-\n" "Copyright 2000, Wolfpaw Services Inc\n" "Age of the Ancients MUD. Power Beyond your DREAMS.\n" "http://www.ancients.org telnet://mud.ancients.org:5000\n",mail->sender,mail->to,mail->date, mail->subject,mail->text); fprintf(fp,buf); fprintf(fp,"."); fprintf(fp,".\n"); pclose(fp); sprintf(buf,"MAIL: Forwarded Message from %s to %s to address %s.",mail->sender,mail->to,fw_email); log_string_plus(buf,LOG_NORMAL,58); return TRUE; } void do_forward( CHAR_DATA *ch, char *argument ) { char arg[MSL]; argument=one_argument( argument, arg ); if ( IS_NPC(ch) ) return; if ( arg[0] == '\0' ) { send_to_char("Syntax: forward <email address>\n\r",ch); send_to_char("&R**WARNING**&w&W: Abuse of this system will result in SITE BAN. It is Logged.\n\r",ch); } ch->pcdata->mail_forward = STRALLOC(arg); send_to_char("Done.\n\r",ch); return; }