/**************************************************************************/
// banedit.cpp
/***************************************************************************
* The Dawn of Time v1.69r (c)1997-2004 Michael Garratt *
* >> A number of people have contributed to the Dawn codebase, with the *
* majority of code written by Michael Garratt - www.dawnoftime.org *
* >> To use this source code, you must fully comply with the dawn license *
* in licenses.txt... In particular, you may not remove this copyright *
* notice. *
**************************************************************************/
#include "include.h"
#include "ban.h"
#include "olc.h"
extern BAN_DATA *ban_list;
int wild_match(register unsigned char *m, register unsigned char *n);
// prototypes
bool banedit_show (char_data *ch, char *);
void save_bans(void);
extern const struct olc_cmd_type banedit_table[];
/**************************************************************************/
// returns a pointer to the ban number as addressed by 'value'
BAN_DATA *get_ban_index( int value )
{
BAN_DATA *pBan;
for (pBan = ban_list; pBan != NULL; pBan = pBan->next)
{
if (--value<0){
return pBan;
}
}
return NULL;
}
/**************************************************************************/
void do_banedit( char_data *ch, char *argument )
{
BAN_DATA *pBan;
char arg1[MIL];
int value;
// must have some pcdata to use the command
if(!TRUE_CH(ch)->pcdata){
do_huh(ch,"");
return;
}
if (!IS_TRUSTED(ch,MAX_LEVEL-2)
&& !IS_SET(TRUE_CH(ch)->pcdata->council, COUNCIL_HEADLAW))
{
ch->println( "Banedit is for law and high level admin only." );
return;
}
argument = one_argument( argument, arg1 );
if ( is_number( arg1 ) )
{
value = atoi( arg1 );
if ( !( pBan= get_ban_index( value ) ) )
{
ch->printf("Banedit: There is no ban numbered '%d'\n", value);
return;
}
ch->desc->pEdit = (void *)pBan;
ch->desc->editor = ED_BAN;
ch->println( "`=rEditing Ban... type `=Cdone`=r to finish editing." );
banedit_show(ch,"");
return;
}
ch->print("BanEdit: Type the number of the ban you want to edit.\n");
return;
}
/**************************************************************************/
void banedit(char_data *ch, char *argument)
{
// BAN_DATA *pBan;
char arg[MSL];
char command[MIL];
int cmd;
/* if (!HAS_SECURITY(ch,1))
{
ch->println( "The hedit command is an olc command, "
"you dont have olc permissions." );
edit_done( ch );
return;
}
*/
smash_tilde( argument );
strcpy( arg, argument );
argument = one_argument( argument, command );
// BAN_EDIT(ch, pBan);
if ( !str_cmp(command, "done") )
{
edit_done( ch );
return;
}
/* if (!HAS_SECURITY(ch,pHelp->helpfile->security))
{
do_modehelp(ch, argument);
ch->println( "Insufficient security to edit this help entry." );
edit_done( ch );
return;
}
*/
if ( command[0] == '\0' )
{
banedit_show( ch, argument );
return;
}
// Search Table and Dispatch Command.
for ( cmd = 0; banedit_table[cmd].name != NULL; cmd++ )
{
if ( !str_prefix( command, banedit_table[cmd].name ) )
{
if ( (*banedit_table[cmd].olc_fun) ( ch, argument ) )
{
// bans_changed=true;
save_bans();
return;
}
else
return;
}
}
// Default to Standard Interpreter.
interpret( ch, arg );
return;
}
/**************************************************************************/
bool banedit_show (char_data *ch, char *){
ban_data *pBan;
EDIT_BAN(ch, pBan);
ch->titlebar("BANEDIT SHOW");
ch->print("`=rSitemask: '`=R");
ch->printbw(pBan->sitemasks);
if (IS_NULLSTR(pBan->intended_people)){
ch->print("`=r'\nIntendedPeople: `Rnone\n");
}else{
ch->printf("`=r'\nIntendedPeople: `=R%s\n",
pBan->intended_people);
}
ch->printf("`=rEnabled: `=R%s\n", pBan->enabled?"True":"False");
ch->printf("`=rPermanent: `=R%s\n", pBan->permanent?"True":"False");
if(pBan->type==BAN_UNDEFINED){
ch->printf("`=rType: `R%s!\n", flag_string( ban_types, pBan->type ) );
}else{
ch->printf("`=rType: `=R%s\n", flag_string( ban_types, pBan->type ) );
}
ch->printf("`=rban created on: `S%s`=rby: `S%s`x\n", (char*)ctime(&pBan->ban_date), pBan->by);
if (IS_NULLSTR(pBan->reason)){
ch->print("`=rReason: `Rnone\n");
}else{
ch->printf("`=rReason: `=R%s",
pBan->reason);
}
if (IS_NULLSTR(pBan->custom_disconnect_message)){
ch->print("`=rCustom disconnect message: `Snone\n");
}else{
ch->printf("`=rCustom disconnect message: `=R\n%s",
pBan->custom_disconnect_message);
}
ch->printf("`=rExpire date: `=R%s", pBan->expire_date<1?
"none\n":(char*)ctime(&pBan->expire_date));
if(pBan->type==BAN_EMAIL_REQ)
{
// allowed email masks
if (IS_NULLSTR(pBan->always_allowed_email_masks)){
ch->println("`=ralways_allowed_email_masks: `xnone.");
}else{
ch->printf("`=ralways_allowed_email_masks: `=R\r\n%s",
pBan->always_allowed_email_masks);
}
// allowed email masks
if (IS_NULLSTR(pBan->allowed_email_masks)){
ch->println("`=rallowed_email_masks: `RNONE!");
}else{
ch->printf("`=rallowed_email_masks: `=R\r\n%s",
pBan->allowed_email_masks);
}
// disallowed email masks
if (IS_NULLSTR(pBan->disallowed_email_masks)){
ch->println("`=rdisallowed_email_masks: `Rnone");
}else{
ch->printf("`=rdisallowed_email_masks: `=R\r\n%s",
pBan->disallowed_email_masks);
}
ch->wrapln( "`=rnote: disallowed_email_masks have a higher priority "
"than allowed masks, if a particular email addy matches the disallowed email "
"mask, it will be denied even if it matches the allowed mask also. "
"The only exception to this is if the email address is on the "
"always_allowed_email_masks list for this ban... note the always allowed "
"only applies to this particular ban... if the host and email match a disallowed "
"on another ban, it will be declined.`x");
// disallowed email custom message
if (IS_NULLSTR(pBan->disallowed_email_custom_message)){
ch->println("`=rdisallowed_email_custom_message: `Snone - using default");
}else{
ch->printf("`=rdisallowed_email_masks_message: `=R\r\n%s",
pBan->disallowed_email_custom_message);
}
}
ch->print("`x");
return false;
};
/**************************************************************************/
bool banedit_type(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(IS_NULLSTR(argument)){
ch->println( "syntax: type <bantype>" );
ch->println( " were <bantype> is one of the following" );
show_help(ch,"ban_types");
return false;
}
int newvalue=flag_value( ban_types, argument );
if(newvalue==NO_FLAG){
ch->printf("No such ban type as '%s'\n", argument);
banedit_type(ch,"");
return false;
}
// check for no change
if(pBan->type == newvalue){
ch->printf("No change in ban type, ban type is still '%s'\n",
flag_string( ban_types, pBan->type ));
return false;
};
// do the change
ch->printf("bantype changed from '%s' to '%s'\n",
flag_string( ban_types, pBan->type),
flag_string( ban_types, newvalue));
pBan->type = newvalue;
return true;
}
/**************************************************************************/
bool banedit_sitemasks(char_data *ch, char *argument)
{
if(IS_UNSWITCHED_MOB(ch)){
ch->println( "Players only!" );
return false;
}
if(!IS_NULLSTR(argument)){
ch->println( "syntax: sitemasks <bansitemasks> (string editor used)" );
ch->wrapln(
"This affects all bans:`1"
"The host address of a player is matched against all site masks..."
"(1 sitemask per line), read the helps on permban for more details.`1"
"e.g. `1*.aol.com`1*.aol2.com`1192.168.50.*`1"
"Would mean the ban applies to machines from the "
"two domains names and the ip address range");
return false;
}
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
string_append( ch, &pBan->sitemasks);
return true;
}
/**************************************************************************/
bool banedit_intendedpeople(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(!IS_NULLSTR(argument)){
ch->println( "Syntax: intendedplayer (string editor used)" );
ch->println( "uses the string editor to edit the list of intended people." );
return false;
}
string_append( ch, &pBan->intended_people);
return true;
}
/**************************************************************************/
bool banedit_reason(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(!IS_NULLSTR(argument)){
ch->println( "Syntax: reason (string editor used)" );
ch->println( "uses the string editor to edit/add the reason for the ban." );
return false;
}
string_append( ch, &pBan->reason);
return true;
}
/**************************************************************************/
bool banedit_disconnect_msg(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(!IS_NULLSTR(argument)){
ch->println( "Syntax: disconnect_msg (string editor used)" );
ch->wrapln(
"This message is displayed to someone when they "
"are disconnected due to the ban. If there is "
"no custom disconnect message, the default for "
"the type of ban is displayed.");
return false;
}
string_append( ch, &pBan->custom_disconnect_message);
return true;
}
/**************************************************************************/
bool banedit_always_allowed_email_masks(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(!IS_NULLSTR(argument)){
ch->println( "Syntax: always_allowed (string editor used)" );
return false;
}
string_append( ch, &pBan->always_allowed_email_masks);
return true;
}
/**************************************************************************/
bool banedit_allowed_email_masks(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(!IS_NULLSTR(argument)){
ch->println( "Syntax: allowed_email_masks (string editor used)" );
ch->wrapln(
"Comes into affect when the type of ban is 'email'`1"
"There can be multiple lines of email address formats "
"that you accept (1 mask per line), read the helps on bans for more details.`1"
"e.g. `1*@aol.com`1d?g@hotmail.com`1`1would allow someone to say their email "
"is something at aol.com or a hotmail account with a 3 letter username, "
"starting with d ending with g.");
return false;
}
string_append( ch, &pBan->allowed_email_masks);
return true;
}
/**************************************************************************/
bool banedit_disallowed_email_masks(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(!IS_NULLSTR(argument)){
ch->println( "Syntax: disallowed_email_masks (string editor used)" );
ch->wrapln(
"Comes into affect when the type of ban is 'email'`1"
"There can be multiple lines of email address formats "
"that you will be declined, regardless even if they pass under an "
"accept email mask. Read the helps on bans for more details.`1"
"e.g. if an accept mask had a line that read '*@aol.com' and we "
"knew fred@aol.com was bad, we would add fred@aol.com (or could "
"do *fred*@aol.com) to the list of disallowed email masks.");
return false;
}
string_append( ch, &pBan->disallowed_email_masks);
return true;
}
/**************************************************************************/
bool banedit_disallowed_msg(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(!IS_NULLSTR(argument)){
ch->println( "Syntax: disallowed_msg (string editor used)" );
ch->wrapln(
"This message is displayed to someone when they "
"the email addy the supplied matches one on the "
"disallowed email masks list. If there is "
"no custom disallowed email masks message, "
"the default is displayed.");
return false;
}
string_append( ch, &pBan->disallowed_email_custom_message);
return true;
}
/**************************************************************************/
bool banedit_level (char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
int newlevel;
if(IS_NULLSTR(argument) || !is_number( argument ) ){
ch->println( "Syntax: level <number>" );
return false;
}
newlevel= atoi( argument );
// check the new level
if(newlevel<LEVEL_IMMORTAL){
ch->printf("level must be greater than %d", LEVEL_IMMORTAL-1);
return false;
}
if(newlevel>get_trust(ch)){
ch->printf("Level must less than or equal to your trust of %d",
get_trust(ch));
return false;
}
// do the change
ch->printf("ban level changed from %d to %d\n",
pBan->level,newlevel);
pBan->level= newlevel;
return true;
}
/**************************************************************************/
bool banedit_permanent(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(!IS_NULLSTR(argument)){
ch->println( "Syntax: permanent" );
ch->wrapln( "it simply toggled... If it isn't permanent "
"it wont be saved, and will be gone next reboot.");
return false;
}
if(pBan->permanent){
ch->print("Ban set to temporary... wont be saved (gone next reboot).\n");
pBan->permanent=false;
return true;
}
ch->print("Ban set to permanent.\n");
pBan->permanent=true;
return true;
}
/**************************************************************************/
bool banedit_enabled(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
if(!IS_NULLSTR(argument)){
ch->println( "Syntax: enabled" );
ch->wrapln( "it simply toggled... If it is not enabled"
"it is still saved to disk, but not applied to players logging in.");
return false;
}
if(pBan->enabled){
ch->print("Ban disabled\n");
pBan->enabled=false;
return true;
}
ch->print("Ban enabled.\n");
pBan->enabled=true;
return true;
}
/**************************************************************************/
bool banedit_expire_date(char_data *ch, char *argument)
{
BAN_DATA *pBan;
EDIT_BAN(ch, pBan);
int value;
if(IS_NULLSTR(argument) || !is_number( argument)){
ch->println( "Syntax: expire 0 (to set for no expire)" );
ch->println( " expire <number of days from today to expire>" );
return false;
}
value = atoi( argument);
if(value<1){
if(pBan->expire_date==0){
ch->println( "Ban is already set to not expire." );
return false;
}
pBan->expire_date=0;
ch->println( "Ban will no longer expire." );
return true;
}
// set the number of days till expirey
if(value>2000){
ch->println( "A reasonable number of days is required." );
return false;
}
pBan->expire_date=current_time + (value *60*60*24); // days
ch->printf("Ban will now expire at %s system time.\n",
(char*)ctime(&pBan->expire_date));
return true;
}
/**************************************************************************/