/* * Whitelist will allow players to restrict the domains that are able to login to their character. It functions * the same as a reverse site ban, basically. This code was written for AckFUSS with a tiny bit of C++ (bitset), * but should be simple to modify and fit into any Diku-derived base. If your MUD does not have ch_printf(), add * it or simply replace it with snprintf(buf,stuff) like usual. * * Add the following to your pc_data struct in your main header file (mud.h, merc.h, etc): * char *whitelist[MAX_HOSTS]; * * Add the following to the header file you keep config values in (config.h, mud.h, etc): * #define MAX_HOSTS 3 * #define ACT_WHITELIST <next free bitvector> * * In your save.c file, if you have a SAVE_REVISION system, increment the revision and add the following into * fread_char() and fwrite_char() in the appropriate places with similar code. * * fprintf( fp, "Whitelist "); * for( cnt = 0; cnt < MAX_HOSTS; cnt++ ) * fprintf(fp,"%s~",ch->pcdata->whitelist[cnt]); * fprintf( fp, "\n"); * * if( !str_cmp( word, "Whitelist" ) && !IS_NPC(ch) ) * { * if( cur_revision >= SAVE_REVISION ) * { * for( short i = 0; i < MAX_HOSTS; i++ ) * ch->pcdata->whitelist[i] = fread_string( fp ); * } * else * SKEY("Host",ch->pcdata->whitelist[0],fread_string(fp)); * * Also in save.c, or wherever you initialize your ch->pcdata struct on load, add the following: * for( short i = 0; i < MAX_HOSTS; i++ ) * whitelist[i] = &str_empty[0]; * * In comm.c add the following below any deny/ban code. Adjust/remove the monitor_chan() call as needed. * * if( ch->act.test(ACT_WHITELIST) ) * { * bool found = false; * * for( short i = 0; i < MAX_HOSTS; i++ ) * if( ch->pcdata->whitelist[i] != str_empty && !str_prefix(ch->pcdata->whitelist[i],d->host) ) * found = true; * * if( !found ) * { * snprintf(log_buf,(2 * MIL),"Whitelist prohibited login %s@%s.",argument,d->host); * log_string(log_buf); * monitor_chan(log_buf,MONITOR_CONNECT); * write_to_buffer(d,"This is not an approved connection domain for this character.\r\n"); * close_socket(d); * return; * } * } * * If your MUD has a do_config() or similar command where autoloot, autosac, etc are handled, * drop this in or write something appropriate to allow players to toggle their WHITELIST flag. * * send_to_char( ch->act.test(ACT_WHITELIST) * ? "@@d[@@a+WHITELIST @@d]@@a You may only login from your whitelist domains.@@N\r\n" * : "@@d[@@c-whitelist @@d]@@c You may login from any domain.@@N\r\n", ch ); * * Add the appropriate inclusions to your interp.c command table, and anyplace else you need to define * commands, then drop the below command in a file and you should be good to go! * * Feel free to modify this code to suit your needs, and if you have a great improvement I wouldn't mind if you * shared it with me either, if you're so inclined :D. All I ask is to give me credit for the code if you do * choose to use it. * * --Kline (Matt Goff) */ void do_whitelist(CHAR_DATA *ch, char *argument) { char *farg; char arg1[MSL] = {'\0'}, arg2[MSL] = {'\0'}; short i = 0; farg = argument; farg = one_argument(farg,arg1); farg = one_argument(farg,arg2); if( arg1[0] == '\0' ) { ch_printf(ch,"You are limited to [%2d] whitelist sites. Whitelist status: [%14s]\r\n",MAX_HOSTS,ch->act.test(ACT_WHITELIST) ? "@@rACTIVE@@N" : "@@eINACTIVE@@N" ); send_to_char("---------------------------------------------------------------------\r\n",ch); for( i = 0; i < MAX_HOSTS; i++ ) ch_printf(ch," [%2d] %s\r\n",i,ch->pcdata->whitelist[i]); return; } if( !str_prefix(arg1,"add") ) { for( i = 0; i < MAX_HOSTS; i++ ) { if( ch->pcdata->whitelist[i] == &str_empty[0] ) { if( arg2[0] == '\0' || strlen(arg2) < 8 ) { send_to_char("Host must be at least 8 characters long.\r\n",ch); return; } ch->pcdata->whitelist[i] = str_dup(arg2); send_to_char("Whitelist updated.\r\n",ch); return; } } send_to_char("Your whitelist is full. Please delete an entry first.\r\n",ch); return; } else if( !str_prefix(arg1,"del") ) { if( arg2[0] == '\0' ) { send_to_char("You must supply a host to delete.\r\n",ch); return; } for( i = 0; i < MAX_HOSTS; i++ ) { if( !str_cmp(arg2,ch->pcdata->whitelist[i]) ) { ch_printf(ch,"Host %s has been removed from your whitelist.\r\n",ch->pcdata->whitelist[i]); free_string(ch->pcdata->whitelist[i]); ch->pcdata->whitelist[i] = &str_empty[0]; return; } } send_to_char("That host was not found. Did you spell it exactly as it is listed in your whitelist?\r\n",ch); return; } else do_whitelist(ch); return; }