#include <ctype.h> #include <stdio.h> #include <string.h> #include <time.h> #include <sys/time.h> #include "h/mud.h" void free_friend( FRIEND_DATA *ofriend ) { if( !ofriend ) return; STRFREE( ofriend->name ); DISPOSE( ofriend ); } void free_all_friends( CHAR_DATA *ch ) { FRIEND_DATA *ofriend, *ofriend_next; if( !ch || !ch->pcdata || !ch->pcdata->first_friend ) return; for( ofriend = ch->pcdata->first_friend; ofriend; ofriend = ofriend_next ) { ofriend_next = ofriend->next; UNLINK( ofriend, ch->pcdata->first_friend, ch->pcdata->last_friend, next, prev ); free_friend( ofriend ); } } FRIEND_DATA *find_friend( CHAR_DATA *ch, char *fname ) { FRIEND_DATA *ofriend; if( !ch || !fname || fname[0] == '\0' ) return NULL; for( ofriend = ch->pcdata->first_friend; ofriend; ofriend = ofriend->next ) { if( !str_cmp( ofriend->name, fname ) ) return ofriend; } return NULL; } FRIEND_DATA *add_friend( CHAR_DATA *ch, char *fname ) { FRIEND_DATA *ofriend; if( !ch || !fname || fname[0] == '\0' ) return NULL; fname = capitalize( fname ); if( ( ofriend = find_friend( ch, fname ) ) ) return NULL; if( !valid_pfile( fname ) ) return NULL; CREATE( ofriend, FRIEND_DATA, 1 ); STRSET( ofriend->name, fname ); LINK( ofriend, ch->pcdata->first_friend, ch->pcdata->last_friend, next, prev ); return ofriend; } CMDF( do_friend ) { FRIEND_DATA *ofriend; DESCRIPTOR_DATA *d; char arg[MSL], uname[MSL]; const char *person; short cnt = -1; bool found = false, pending = false; if( !ch || !ch->pcdata ) return; argument = one_argument( argument, arg ); if( arg == NULL || arg[0] == '\0' ) { for( ofriend = ch->pcdata->first_friend; ofriend; ofriend = ofriend->next ) { if( !ofriend->name ) continue; if( cnt == -1 ) { send_to_char( "&[white] Friend Friend Friend Friend\r\n", ch ); send_to_char( "--------------- --------------- --------------- ---------------\r\n", ch ); cnt = 0; } found = true; person = color_str( AT_PERSON, ch ); if( ofriend->sex == SEX_MALE ) person = color_str( AT_MALE, ch ); if( ofriend->sex == SEX_FEMALE ) person = color_str( AT_FEMALE, ch ); if( !ofriend->approved ) { snprintf( uname, sizeof( uname ), "[%13.13s]", ofriend->name ); pending = true; } else snprintf( uname, sizeof( uname ), "%15.15s", ofriend->name ); ch_printf( ch, "%s%15.15s", person, uname ); if( ++cnt == 4 ) { cnt = 0; send_to_char( "\r\n", ch ); } else send_to_char( " ", ch ); } if( !found ) send_to_char( "&[white]You currently have no one as a friend.\r\n", ch ); else if( cnt != 0 ) send_to_char( "\r\n", ch ); if( pending ) send_to_char( "&[white]Ones in [ ] are pending and not saved until you are approved to have them on your friend list.\r\n", ch ); return; } argument = capitalize( argument ); if( !str_cmp( arg, "add" ) ) { if( !argument || argument[0] == '\0' ) { send_to_char( "Who would you like to add to your friend list?\r\n", ch ); return; } for( d = first_descriptor; d; d = d->next ) { if( !d->character || !d->character->pcdata ) continue; if( !str_cmp( d->character->name, argument ) ) break; } if( !d || !d->character || !d->character->pcdata || str_cmp( d->character->name, argument ) || !can_see( ch, d->character ) ) { send_to_char( "No one online by that name to add to your friend list.\r\n", ch ); return; } if( !( ofriend = add_friend( ch, argument ) ) ) { ch_printf( ch, "Sorry %s can't be added as your friend.\r\n", argument ); return; } ofriend->sex = d->character->sex; ofriend->approved = false; ch_printf( ch, "%s has now been added as your friend.\r\n", argument ); ch_printf( d->character, "%s would like to have you as a friend.\r\n", ch->name ); return; } if( !str_cmp( arg, "remove" ) ) { if( !( ofriend = find_friend( ch, argument ) ) ) { ch_printf( ch, "Sorry %s isn't one of your friends.\r\n", argument ); return; } UNLINK( ofriend, ch->pcdata->first_friend, ch->pcdata->last_friend, next, prev ); free_friend( ofriend ); ch_printf( ch, "%s is no longer one of your friends.\r\n", argument ); return; } if( !str_cmp( arg, "approve" ) ) { if( !argument || argument[0] == '\0' ) { send_to_char( "Who would you like to approve to have you on their friend's list.\r\n", ch ); return; } for( d = first_descriptor; d; d = d->next ) { if( !d->character || !d->character->pcdata || !d->character->pcdata->first_friend ) continue; if( str_cmp( d->character->name, argument ) ) continue; if( !( ofriend = find_friend( d->character, ch->name ) ) ) continue; if( ofriend->approved ) { send_to_char( "You have already approved them to have you on their friend list.\r\n", ch ); return; } ofriend->approved = true; ch_printf( ch, "You have allowed %s to have you on %s friends list.\r\n", d->character->name, his_her[d->character->sex] ); ch_printf( d->character, "%s has allowed you to have %s on your friends list.\r\n", ch->name, him_her[ch->sex] ); if( !( ofriend = add_friend( ch, d->character->name ) ) ) return; ofriend->sex = d->character->sex; ofriend->approved = true; ch_printf( d->character, "You have allowed %s to have you on %s friends list.\r\n", ch->name, his_her[ch->sex] ); ch_printf( ch, "%s has allowed you to have %s on your friends list.\r\n", d->character->name, him_her[d->character->sex] ); return; } send_to_char( "No one by that name was found online wanting you on their friend list.\r\n", ch ); return; } if( !str_cmp( arg, "deny" ) ) { if( !argument || argument[0] == '\0' ) { send_to_char( "Who would you like to deny to have you on their friend's list.\r\n", ch ); return; } for( d = first_descriptor; d; d = d->next ) { if( !d->character || !d->character->pcdata || !d->character->pcdata->first_friend ) continue; if( str_cmp( d->character->name, argument ) ) continue; if( !( ofriend = find_friend( d->character, ch->name ) ) ) continue; UNLINK( ofriend, d->character->pcdata->first_friend, d->character->pcdata->last_friend, next, prev ); free_friend( ofriend ); ch_printf( ch, "You have denied %s having you on %s friends list.\r\n", d->character->name, his_her[d->character->sex] ); ch_printf( d->character, "%s has denied you having %s on your friends list.\r\n", ch->name, him_her[ch->sex] ); if( !( ofriend = find_friend( ch, d->character->name ) ) ) return; UNLINK( ofriend, ch->pcdata->first_friend, ch->pcdata->last_friend, next, prev ); free_friend( ofriend ); ch_printf( d->character, "You have denied %s having you on %s friends list.\r\n", ch->name, his_her[ch->sex] ); ch_printf( ch, "%s has denied you having %s on your friends list.\r\n", d->character->name, him_her[d->character->sex] ); return; } send_to_char( "No one by that name was found online wanting you on their friend list.\r\n", ch ); return; } send_to_char( "&[white]Usage: friend add/remove/approve/deny <name>\r\n", ch ); } void send_friend_info( CHAR_DATA *ch, char *message ) { DESCRIPTOR_DATA *d; FRIEND_DATA *ofriend; const char *person; if( !ch || !message || !ch->pcdata ) return; if( xIS_SET( ch->act, PLR_NOFINFO ) ) return; for( d = first_descriptor; d; d = d->next ) { if( !d->character || !d->character->pcdata || !( ofriend = find_friend( d->character, ch->name ) ) || !ofriend->approved ) continue; /* Might as well go ahead and update the sex if it is needed */ if( ofriend->sex != ch->sex ) ofriend->sex = ch->sex; if( xIS_SET( d->character->act, PLR_NOFINFO ) ) continue; if( !can_see( d->character, ch ) ) continue; person = color_str( AT_PERSON, d->character ); if( ofriend->sex == SEX_MALE ) person = color_str( AT_MALE, d->character ); if( ofriend->sex == SEX_FEMALE ) person = color_str( AT_FEMALE, d->character ); ch_printf( d->character, "&[white][Friend] %s%s\r\n", person, message ); } }