/****************************************************************************
 * [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;
}

