area/
build/testing/
log/
player/
player/backup/
/***************************************************************************   
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/

/***************************************************************************
*	ROM 2.4 is copyright 1993-1996 Russ Taylor			   *
*	ROM has been brought to you by the ROM consortium		   *
*	    Russ Taylor (rtaylor@efn.org)				   *
*	    Gabrielle Taylor						   *
*	    Brian Moore (zump@rom.org)					   *
*	By using this code, you have agreed to follow the terms of the	   *
*	ROM license, in the file Rom24/doc/rom.license			   *
***************************************************************************/

#include <glib.h>

#if defined(macintosh)
#include <types.h>
#include <time.h>
#else
	#include <sys/types.h>
#if defined(unix)	
#include <sys/time.h>
#else
#include <time.h>
#endif
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <merc.h>
#include <unistd.h>
//#include <actaffect.h>
//#include <recycle.h>

BAN_DATA *ban_list;

void save_bans(void)
{
    BAN_DATA *pban;
    FILE *fp;
    bool found = FALSE;

    fclose( fpReserve ); 
    if ( ( fp = fopen( BAN_FILE, "w" ) ) == NULL )
    {
        bug( "Can't OPen banfile",0 );
    }

    for (pban = ban_list; pban != NULL; pban = pban->next)
    {
	if (IS_SET(pban->ban_flags,BAN_PERMANENT))
	{
	    found = TRUE;
	    fprintf(fp,"%-20s %-2d %s  %s~\n",pban->name,pban->level,
		print_flags(pban->ban_flags),pban->reason);
	}
     }

     fclose(fp);
     fpReserve = fopen( NULL_FILE, "r" );
     if (!found)
	unlink(BAN_FILE);
}

void load_bans(void)
{
    FILE *fp;
    BAN_DATA *ban_last;
 
    if ( ( fp = fopen( BAN_FILE, "r" ) ) == NULL )
        return;
 
    ban_last = NULL;
    for ( ; ; )
    {
        BAN_DATA *pban;
        if ( feof(fp) )
        {
            fclose( fp );
            return;
        }
 
        pban = new_ban();
 
        pban->name = g_strdup(fread_word(fp));
	pban->level = fread_number(fp);
	pban->ban_flags = fread_flag(fp);
	pban->reason = fread_string(fp);
	fread_to_eol(fp);

        if (ban_list == NULL)
	    ban_list = pban;
	else
	    ban_last->next = pban;

	ban_last = pban;
    }
}

bool check_ban(const GString *site,int type)
{
    BAN_DATA *pban;
    GString *host;
    bool SameHost = FALSE;
     
    host = g_string_new("");
    
    host = g_string_assign(host,site->str);
    host = g_string_down(host);

    for ( pban = ban_list; pban != NULL; pban = pban->next ) 
    {
		if(!IS_SET(pban->ban_flags,type))
	    	continue;

		if (!str_cmp(pban->name,host->str))
			SameHost = TRUE;

		if (IS_SET(pban->ban_flags,BAN_PREFIX) 
			&&  IS_SET(pban->ban_flags,BAN_SUFFIX)  
			&&  strstr(pban->name,host->str) != NULL)
	    	SameHost = TRUE;

		if (IS_SET(pban->ban_flags,BAN_PREFIX)
			&&  !str_suffix(pban->name,host->str))
		    SameHost = TRUE;

		if (IS_SET(pban->ban_flags,BAN_SUFFIX)
		&&  !str_prefix(pban->name,host->str))
		    SameHost = TRUE;
    }
	
	g_string_free(host,TRUE);
	
    return SameHost;
}


void ban_site(CHAR_DATA *ch, char *argument, bool fPerm)
{
    char buf[MAX_STRING_LENGTH],buf2[MAX_STRING_LENGTH];
    char arg1[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
    char arg3[MAX_INPUT_LENGTH];
    char *name;
    char buffer[MAX_STRING_LENGTH];
    BAN_DATA *pban, *prev;
    bool prefix = FALSE,suffix = FALSE;
    int type;

    argument = one_argument(argument,arg1);
    argument = one_argument(argument,arg2);
	str_cpy(arg3,argument);


    if ( arg1[0] == '\0' )
    {
	if (ban_list == NULL)
	{
	    send_to_char("No sites banned at this time.\n\r",ch);
	    return;
  	}
	buffer[0] = '\0';

        send_to_char("Banned sites                 level  type       status   reason\n\r",ch);
        for (pban = ban_list;pban != NULL;pban = pban->next)
        {
	    	sprintf(buf2,"%s%s%s",
				IS_SET(pban->ban_flags,BAN_PREFIX) ? "*" : "",
				pban->name,
				IS_SET(pban->ban_flags,BAN_SUFFIX) ? "*" : "");
	    	sprintf(buf,"%-27s    %-3d  %-9s  %-6s   %s\n\r",
				buf2, pban->level,
				IS_SET(pban->ban_flags,BAN_NEWBIES) ? "newbies" :
				IS_SET(pban->ban_flags,BAN_PERMIT)  ? "permit"  :
				IS_SET(pban->ban_flags,BAN_ALL)     ? "all"	: "",
	    		IS_SET(pban->ban_flags,BAN_PERMANENT) ? "perm" : "temp",
	    		pban->reason);
	    	send_to_char( buf, ch );
        }

        return;
    }

    /* find out what type of ban */
    if (arg2[0] == '\0' || !str_prefix(arg2,"all"))
	type = BAN_ALL;
    else if (!str_prefix(arg2,"newbies"))
	type = BAN_NEWBIES;
    else if (!str_prefix(arg2,"permit"))
	type = BAN_PERMIT;
    else
    {
	send_to_char("Acceptable ban types are all, newbies, and permit.\n\r",
	    ch); 
	return;
    }

    name = arg1;

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

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

    if (strlen(name) == 0)
    {
	send_to_char("You have to ban SOMETHING.\n\r",ch);
	return;
    }

    prev = NULL;
    for ( pban = ban_list; pban != NULL; prev = pban, pban = pban->next )
    {
        if (!str_cmp(name,pban->name))
        {
	    if (pban->level > get_trust(ch))
	    {
            	send_to_char( "That ban was set by a higher power.\n\r", ch );
            	return;
	    }
	    else
	    {
		if (prev == NULL)
		    ban_list = pban->next;
		else
		    prev->next = pban->next;
		free_ban(pban);
	    }
        }
    }

    pban = new_ban();
    pban->name = g_strdup(name);
    pban->level = get_trust(ch);
	if (arg3[0] != '\0' )
		pban->reason = g_strdup(arg3);
	
    /* set ban type */
    pban->ban_flags = type;

    if (prefix)
	SET_BIT(pban->ban_flags,BAN_PREFIX);
    if (suffix)
	SET_BIT(pban->ban_flags,BAN_SUFFIX);
    if (fPerm)
	SET_BIT(pban->ban_flags,BAN_PERMANENT);

    pban->next  = ban_list;
    ban_list    = pban;
    save_bans();
    sprintf(buf,"%s has been banned.\n\r",pban->name);
    send_to_char( buf, ch );
    return;
}

void do_ban(CHAR_DATA *ch, char *argument)
{
    ban_site(ch,argument,FALSE);
}

void do_permban(CHAR_DATA *ch, char *argument)
{
    ban_site(ch,argument,TRUE);
}


void do_allow( CHAR_DATA *ch, char *argument )                        
{
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    BAN_DATA *prev;
    BAN_DATA *curr;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
        send_to_char( "Remove which site from the ban list?\n\r", ch );
        return;
    }

    prev = NULL;
    for ( curr = ban_list; curr != NULL; prev = curr, curr = curr->next )
    {
        if ( !str_cmp( arg, curr->name ) )
        {
	    if (curr->level > get_trust(ch))
	    {
		send_to_char(
		   "You are not powerful enough to lift that ban.\n\r",ch);
		return;
	    }
            if ( prev == NULL )
                ban_list   = ban_list->next;
            else
                prev->next = curr->next;

            free_ban(curr);
	    sprintf(buf,"Ban on %s lifted.\n\r",arg);
            send_to_char( buf, ch );
	    save_bans();
            return;
        }
    }

    send_to_char( "Site is not banned.\n\r", ch );
    return;
}