tfe-1.0/area/
tfe-1.0/files/
tfe-1.0/logs/
tfe-1.0/logs/immortal/
tfe-1.0/logs/mob/
tfe-1.0/logs/object/
tfe-1.0/logs/player/
tfe-1.0/logs/room/
tfe-1.0/notes/clans/
tfe-1.0/player/
tfe-1.0/prev/
tfe-1.0/prev/area/
tfe-1.0/prev/player/
tfe-1.0/prev/rooms/
tfe-1.0/rooms/
tfe-1.0/src-gc/
tfe-1.0/src-msvc/
tfe-1.0/src-unix/
tfe-1.0/www/
tfe-1.0/www/html/
#include "define.h"
#include "struct.h"


const char**  badname_array  = NULL;
int             max_badname  = 0;


class ban_data
{
 public:
  ban_data*    next;
  char*        name;

  ban_data( );
  ~ban_data( );
};


ban_data* ban_list = NULL;


ban_data :: ban_data( )
{
  name = empty_string;

  record_new( sizeof( ban_data ), MEM_BAN );
  append( ban_list, this );
};


ban_data :: ~ban_data( )
{
  free_string( name, MEM_BAN );

  record_delete( sizeof( ban_data ), MEM_BAN );
  remove( ban_list, this );
};


/*
 *   BAN/ALLOW ROUTINES
 */


void do_ban( char_data* ch, char* argument )
{
  account_data*   account;
  ban_data*           ban;
  pfile_data*       pfile  = NULL;
  int               flags;
  int                   i;
  bool              first  = TRUE;
  const char*        name;
  player_data*     victim;

  if( !get_flags( ch, argument, &flags, "srn", "Ban" ) )
    return;

  if( is_set( &flags, 2 ) ) {
    if( *argument == '\0' ) {
      if( badname_array == NULL ) {
        send( ch, "The badname array is empty.\r\n" );
        }
      else {
        display_array( ch, "Bad Name Array", &badname_array[0],
          &badname_array[1], max_badname );
        }
      return;
      }
    i = pntr_search( badname_array, max_badname, argument );
    if( is_set( &flags, 1 ) ) {
      if( i < 0 ) {
        send( ch, "The name '%s' wasn't in the badname array.\r\n",
          argument );
        }
      else {
        record_delete( sizeof( char* ), MEM_BADNAME );
        remove( badname_array, max_badname, i );
        send( ch, "Name removed from badname array.\r\n" );
        save_badname( );
        }
      }
    else {
      if( i > 0 ) {
        send( ch, "The name '%s' is already in the badname array.\r\n",
          argument );
        }
      else if( check_parse_name( ch->link, argument ) ) {
        i = -i-1;
        record_new( sizeof( char* ), MEM_BADNAME );
        name = alloc_string( argument, MEM_BADNAME );
        insert( badname_array, max_badname, name, i );
        send( ch, "The name '%s' is added to the badname array.\r\n",
          name );
        save_badname( );
        }
      }
    return;
    }

  if( is_set( &flags, 0 ) ) {
    if( *argument == '\0' ) {
      page_title( ch, "Banned Sites" );
      for( ban = ban_list; ban != NULL; ban = ban->next )
        page( ch, "%s\r\n", ban->name );
      return;
      }
    if( !is_set( &flags, 1 ) ) {
      for( ban = ban_list; ban != NULL; ban = ban->next ) {
        if( !strcasecmp( argument, ban->name ) ) {
          send( "That site is already banned!\r\n", ch );
          return;
          }
        }
      ban        = new ban_data;
      ban->name  = alloc_string( argument, MEM_BAN );
      save_banned( );
      send( ch, "Ok.\r\n" );
      }
    else {
      for( ban = ban_list; ban != NULL; ban = ban->next ) {
        if( !strcasecmp( argument, ban->name ) ) {
          delete ban;
          save_banned();
          send( ch, "Ok.\r\n" );
          return;
          }
        }
      send( ch, "Site is not banned.\r\n" );
      }
    return;
    }

  if( *argument == '\0' ) {
    page_title( ch, "Banned Accounts" );
    for( i = 0; i < max_account; i++ )
      if( account_list[i]->banned != -1 ) 
        display_account( ch, account_list[i], first );
    return;
    }

  if( ( account = account_arg( argument ) ) == NULL ) {
    if( ( pfile = player_arg( argument ) ) == NULL ) {
      send( ch, "No such account or player.\r\n" );
      return;
      }
    if( ( account = pfile->account ) == NULL ) {
      send( ch, "That player doesn't have an account which makes banning\
 it difficult.\r\n" );
      return;
      }
    }

  if( is_set( &flags, 1 ) ) {
    if( account->banned == -1 ) {
      send( ch, "That account was not banned.\r\n" );
      }
    else {
      send( ch, "Ban lifted.\r\n" );
      account->banned = -1;
      save_accounts( );
      }
    return;
    }

  if( ch->pcdata->pfile->account == account ) {
    send( ch, "Banning yourself is rather phulish.\r\n" );
    return;
    }

  for( i = 0; i < max_pfile; i++ )
    if( pfile_list[i]->account == account 
      && pfile_list[i]->trust >= ch->pcdata->trust ) {
      send( ch, "You do not have permission to ban that account.\r\n" );
      return;
      }

  if( *argument == '\0' ) {
    send( ch, "For how what time period?\r\n" );
    return;
    }

  if( ( i = time_arg( argument, ch ) ) == -1 ) 
    return;

  if( i == 0 ) {
    account->banned = 0;
    send( ch, "Account %s banned forever.\r\n",
      account->name );
    }
  else {
    account->banned = current_time+i;
    send( ch, "Account %s banned until %s.\r\n",
      account->name, ltime( account->banned )+4 );
    }
 
  save_accounts( );

  for( i = 0; i < player_list; i++ ) {
    victim = player_list[i];
    if( victim->Is_Valid( )
      && victim->pcdata->pfile->account == account ) {
      send( victim, "-- You have been banned. --\r\n" );
      forced_quit( victim );
      }
    }

  return;
}


/*
 *   IS_BANNED ROUTINE
 */


bool is_banned( const char* host )
{
  ban_data*       ban;
  int        host_len  = strlen( host );
  int         ban_len;

  for( ban = ban_list; ban != NULL; ban = ban->next ) { 
    ban_len = strlen( ban->name );
    if( ban_len <= host_len
      && !strcasecmp( &host[host_len-ban_len], ban->name ) ) 
      break;
    }

  return( ban != NULL );
}


bool is_banned( account_data* account, link_data* link )
{
  if( account == NULL || account->banned == -1 )
    return FALSE;

  if( account->banned != 0 && account->banned < current_time ) {
    account->banned = -1;
    return FALSE;
    }

  help_link( link, "Banned_Acnt" );

  if( account->banned != 0 ) 
    send( link, "Ban Expires: %s\r\n", ltime( account->banned ) );

  close_socket( link, TRUE );
  return TRUE;
}


/*
 *   READ/WRITE BADNAME
 */


void load_badname( void )
{
  FILE*           fp;
  const char*   name;

  printf( "Loading Bad Names...\r\n" );

  if( ( fp = fopen( BADNAME_FILE, "r" ) ) == NULL ) {
    perror( BADNAME_FILE );
    exit( 1 );
    }

  if( strcmp( fread_word( fp ), "#BADNAME" ) )
    panic( "Load_badname: missing header" );

  for( ; ; ) {
    name = fread_string( fp, MEM_BADNAME );
    if( *name == '$' ) 
      break;
    record_new( sizeof( char* ), MEM_BADNAME );
    insert( badname_array, max_badname, name, max_badname );
    }

  free_string( (char *) name, MEM_BADNAME );
  fclose( fp );

  return;
}


void save_badname( void )
{
  FILE*    fp;
  int       i;

  if( ( fp = fopen( BADNAME_FILE, "w" ) ) == NULL ) {
    bug( "Save_badname: fopen" );
    return;
    }

  fprintf( fp, "#BADNAME\n\n" );

  for( i = 0; i < max_badname; i++ )
    fprintf( fp, "%s~\n", badname_array[i] );

  fprintf( fp, "$~\n" );
  fclose( fp );

  return;
}


/*
 *   READ/WRITE BANNED
 */


void load_banned( void )
{
  ban_data*    ban;
  char*       name;
  FILE*         fp;

  printf( "Loading Banned Sites...\r\n" );

  if( ( fp = fopen( BANNED_FILE, "r" ) ) == NULL ) {
    perror( BANNED_FILE );
    exit( 1 );
    }

  if( strcmp( fread_word( fp ), "#BANNED" ) )
    panic( "Load_banned: missing header" );

  for( ; ; ) {
    name = fread_string( fp, MEM_BAN );
    if( *name == '$' )
      break;
    ban        = new ban_data;
    ban->name  = name;
    }

  free_string( name, MEM_BAN );
  fclose( fp );

  return;
}


void save_banned( )
{
  ban_data*  ban;
  FILE*      fp;

  fp = open_file( BANNED_FILE, "w" ); 

  fprintf( fp, "#BANNED\n\n" );

  for( ban = ban_list; ban != NULL; ban = ban->next ) 
    fprintf( fp, "%s~\n", ban->name );
  fprintf( fp, "$~\n" );

  fclose( fp );
  return;
}