dbna/clans/
dbna/councils/
dbna/deity/
dbna/gods/
dbna/houses/
dbna/space/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |   \\._.//   *
 * -----------------------------------------------------------|   (0...0)   *
 * SMAUG 1.4 (C) 1994, 1995, 1996, 1998  by Derek Snider      |    ).:.(    *
 * -----------------------------------------------------------|    {o o}    *
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |   / ' ' \   *
 * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek,      |~'~.VxvxV.~'~*
 * Tricops and Fireblade                                      |             *
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.     *
 * ------------------------------------------------------------------------ *
 *                        Immortal Host module by Shaddai                   *
 ****************************************************************************/

#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include "mud.h"


/*
 * This loads the Immortal host data structure to keep certain immortals
 * from logging on from certain sites...  IE keep hackers out of the high
 * level immortals.  Shaddai July 27, 1997
 */

#if defined(KEY)
#undef KEY
#endif

#define KEY( literal, field, value )                                    \
                                if ( !str_cmp( word, literal ) )        \
                                {                                       \
                                    field  = value;                     \
                                    fMatch = TRUE;                      \
                                    break;                              \
                                }


int load_imm_host(  )
{
  FILE *fp;
  char *word;
  char buf[MAX_STRING_LENGTH];
  bool my_continue = TRUE;
  bool fMatch = FALSE;
  IMMORTAL_HOST *host;


  if( ( fp = fopen( IMM_HOST_FILE, "r" ) ) == NULL )
  {
    log_string( "No immortal host data" );
    return rNONE;
  }

  while( my_continue )
  {
    word = feof( fp ) ? "#END" : fread_word( fp );
    fMatch = FALSE;

    switch ( UPPER( word[0] ) )
    {
      case '#':
        if( !str_cmp( word, "#END" ) )
        {
          fclose( fp );
          fMatch = TRUE;
          my_continue = FALSE;
        }
        break;
      case 'S':
        if( !str_cmp( word, "Start" ) )
        {
          CREATE( host, IMMORTAL_HOST, 1 );
          LINK( host, immortal_host_start, immortal_host_end, next, prev );
          fread_imm_host( fp, host );
          fMatch = TRUE;
        }
        break;
    }

    if( !fMatch )
    {
      sprintf( buf, "Load_imm_host: no match: %s", word );
      bug( buf, 0 );
    }
  }
  log_string( "Done." );
  return rNONE;
}


/* 
 * This function reads one immortal host to a file.
 * Shaddai  July 27, 1997
 */

int fread_imm_host( FILE * fp, IMMORTAL_HOST * data )
{
  char buf[MAX_STRING_LENGTH];
  char *word;
  bool fMatch;
  int temp;

  for( ;; )
  {
    word = feof( fp ) ? "End" : fread_word( fp );
    fMatch = FALSE;

    switch ( UPPER( word[0] ) )
    {
      case 'E':
        if( !str_cmp( word, "End" ) )
          return rNONE;
      case 'H':
        KEY( "Host", data->host, fread_string_nohash( fp ) );
        break;
      case 'N':
        KEY( "Name", data->name, fread_string_nohash( fp ) );
        break;
      case 'P':
        if( !str_cmp( word, "Prefix" ) )
        {
          temp = fread_number( fp );
          if( temp )
            data->prefix = TRUE;
          else
            data->prefix = FALSE;
          fMatch = TRUE;
        }
        break;
      case 'S':
        if( !str_cmp( word, "Suffix" ) )
        {
          temp = fread_number( fp );
          if( temp )
            data->suffix = TRUE;
          else
            data->suffix = FALSE;
          fMatch = TRUE;
        }
        break;
    }
    if( !fMatch )
    {
      sprintf( buf, "Fread_immortal_host: no match: %s", word );
      bug( buf, 0 );
    }
  }
  return rNONE;
}

bool check_immortal_domain( CHAR_DATA * ch, char *host )
{
  bool found = FALSE;
  IMMORTAL_HOST *temp;
  char my_host[MAX_STRING_LENGTH];
  char my_name[MAX_STRING_LENGTH];
  int i = 0;

  for( i = 0; i < strlen( host ); i++ )
    my_host[i] = LOWER( host[i] );
  my_host[i] = '\0';

  for( i = 0; i < strlen( ch->name ); i++ )
    my_name[i] = LOWER( ch->name[i] );
  my_name[i] = '\0';

  for( temp = immortal_host_start; temp; temp = temp->next )
  {
    if( !str_cmp( my_name, strlower( temp->name ) ) )
    {
      found = TRUE;
      if( temp->prefix && temp->suffix && strstr( temp->host, my_host ) )
        return TRUE;
      else if( temp->prefix && !str_suffix( temp->host, my_host ) )
        return TRUE;
      else if( temp->suffix && !str_prefix( temp->host, my_host ) )
        return TRUE;
      else if( !str_cmp( temp->host, my_host ) )
      {
        return TRUE;
      }
    }
  }

  if( !found )
    return TRUE;
  else
    return FALSE;
}

void do_add_imm_host( CHAR_DATA * ch, char *argument )
{
  char type[MAX_INPUT_LENGTH];
  char arg1[MAX_INPUT_LENGTH];
  char arg2[MAX_INPUT_LENGTH];
  char *arg3 = NULL;
  char *name;
  IMMORTAL_HOST *temp, *host;

  argument = one_argument( argument, type );
  argument = one_argument( argument, arg1 );
  argument = one_argument( argument, arg2 );

  set_char_color( AT_IMMORT, ch );

  if( type[0] == '\0' )
  {
    if( immortal_host_start == NULL )
    {
      send_to_char( "No immortals are protected at this time.\n\r", ch );
      return;
    }
    send_to_char( "Immortal   Host\n\r", ch );
    set_char_color( AT_PLAIN, ch );
    for( temp = immortal_host_start; temp; temp = temp->next )
      ch_printf( ch, "%-8s  %c%s%c\n\r",
                 temp->name, ( temp->prefix ? '*' : ' ' ), temp->host, ( temp->suffix ? '*' : ' ' ) );
    return;
  }

  /*
   * Ok we have a new entry make sure it doesn't contain a ~ 
   */

  if( !str_cmp( type, "save" ) )
  {
    do_write_imm_host(  );
    send_to_char( "Done.\n\r", ch );
    return;
  }

  if( arg2[0] == '\0' || arg1[0] == '\0' )
  {
    send_to_char( "Syntax: immhost add    <name> <host>\n\r", ch );
    send_to_char( "Syntax: immhost delete <name> <host>\n\r", ch );
    send_to_char( "Syntax: immhost save\n\r", ch );
    return;
  }

  if( !str_cmp( type, "delete" ) )
  {
    IMMORTAL_HOST *it = NULL;

    arg3 = arg2;
    if( arg3[0] == '*' )
      arg3++;
    if( arg3[strlen( arg3 ) - 1] == '*' )
      arg3[strlen( arg3 ) - 1] = '\0';

    for( temp = immortal_host_start; temp; temp = temp->next )
    {
      if( !str_cmp( arg1, temp->name ) && !str_cmp( arg3, temp->host ) )
      {
        it = temp;
        break;
      }
    }
    if( it == NULL )
    {
      send_to_char( "Didn't find that entry.\n\r", ch );
      return;
    }
    DISPOSE( temp->name );
    DISPOSE( temp->host );
    UNLINK( it, immortal_host_start, immortal_host_end, next, prev );
    DISPOSE( it );
  }
  else if( !str_cmp( type, "add" ) )
  {
    bool prefix = FALSE, suffix = FALSE;
    IMMORTAL_HOST *temp;
    int i;

    smash_tilde( arg1 );
    smash_tilde( arg2 );
    name = arg2;


    if( arg2[0] == '*' )
    {
      prefix = TRUE;
      name++;
    }

    if( name[strlen( name ) - 1] == '*' )
    {
      suffix = TRUE;
      name[strlen( name ) - 1] = '\0';
    }

    arg1[0] = toupper( arg1[0] );
    for( i = 0; i < ( int )strlen( name ); i++ )
      name[i] = LOWER( name[i] );
    for( temp = immortal_host_start; temp; temp = temp->next )
    {
      if( !str_cmp( temp->name, arg1 ) && !str_cmp( temp->host, name ) )
      {
        send_to_char( "Entry already exists.\n\r", ch );
        return;
      }
    }
    CREATE( host, IMMORTAL_HOST, 1 );
    host->name = str_dup( arg1 );
    host->host = str_dup( name );
    host->prefix = prefix;
    host->suffix = suffix;
    LINK( host, immortal_host_start, immortal_host_end, next, prev );
  }
  else
  {
    send_to_char( "Syntax: immhost add    <name> <host>\n\r", ch );
    send_to_char( "Syntax: immhost delete <name> <host>\n\r", ch );
    send_to_char( "Syntax: immhost save\n\r", ch );
    return;
  }
  send_to_char( "Done.\n\r", ch );
  return;
}

void do_write_imm_host( void )
{
  IMMORTAL_HOST *temp;
  FILE *fp;

  fclose( fpReserve );

  if( immortal_host_start == NULL )
  {
    unlink( IMM_HOST_FILE );
    fpReserve = fopen( NULL_FILE, "r" );
    return;
  }

  if( ( fp = fopen( IMM_HOST_FILE, "w" ) ) == NULL )
  {
    bug( "Do_write_imm_host: fopen", 0 );
    perror( IMM_HOST_FILE );
    fpReserve = fopen( NULL_FILE, "r" );
    return;
  }

  for( temp = immortal_host_start; temp; temp = temp->next )
  {
    fprintf( fp, "Start\n" );
    fprintf( fp, "Name\t%s~\n", temp->name );
    fprintf( fp, "Host\t%s~\n", temp->host );
    if( temp->prefix )
      fprintf( fp, "Prefix\t1\n" );
    if( temp->suffix )
      fprintf( fp, "Suffix\t1\n" );
    fprintf( fp, "End\n" );
  }
  fprintf( fp, "#END\n" );
  fclose( fp );
  fpReserve = fopen( NULL_FILE, "r" );
  return;
}