1stMUD/corefiles/
1stMUD/gods/
1stMUD/player/
1stMUD/win32/
1stMUD/win32/ROM/
/**************************************************************************
*  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
*  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
*                                                                         *
*  Merc Diku Mud improvements 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          *
*  benefiting.  We hope that you share your changes too.  What goes       *
*  around, comes around.                                                  *
***************************************************************************
*       ROM 2.4 is copyright 1993-1998 Russ Taylor                        *
*       ROM has been brought to you by the ROM consortium                 *
*           Russ Taylor (rtaylor@hypercube.org)                           *
*           Gabrielle Taylor (gtaylor@hypercube.org)                      *
*           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                    *
***************************************************************************
*       1stMUD ROM Derivative (c) 2001-2002 by Ryan Jennings              *
*            http://1stmud.dlmud.com/  <r-jenn@shaw.ca>                   *
***************************************************************************/
#include <sys/types.h>
#if !defined(WIN32)
#include <sys/time.h>
#include <unistd.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "merc.h"
#include "recycle.h"
#include "interp.h"

bool check_ban(const char *site, int type)
{
	BAN_DATA *pban;
	char host[MAX_STRING_LENGTH];

	strcpy(host, capitalize(site));
	host[0] = LOWER(host[0]);

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

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

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

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

	return FALSE;
}

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

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

	if (arg1[0] == '\0')
	{
		if (ban_first == NULL)
		{
			chprintln(ch, "No sites banned at this time.");
			return;
		}
		buffer = new_buf();

		add_buf(buffer, "Banned sites  level  type     status\n\r");
		for (pban = ban_first; 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, "%-12s    %-3d  %-7s  %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");
			add_buf(buffer, buf);
		}

		page_to_char(buf_string(buffer), ch);
		free_buf(buffer);
		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
	{
		chprintln(ch, "Acceptable ban types are all, newbies, and permit.");
		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)
	{
		chprintln(ch, "You have to ban SOMETHING.");
		return;
	}

	prev = NULL;
	for (pban = ban_first; pban != NULL; pban = prev)
	{
		prev = pban->next;

		if (!str_cmp(name, pban->name))
		{
			if (pban->level > get_trust(ch))
			{
				chprint(ch, "That ban was set by a higher power.");
				return;
			}
			else
			{
				UNLINK(pban, ban_first, ban_last, next, prev);
				free_ban(pban);
			}
		}
	}

	pban = new_ban();
	pban->name = str_dup(name);
	pban->level = get_trust(ch);

	/* 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);

	LINK(pban, ban_first, ban_last, next, prev);
	save_bans();
	sprintf(buf, "%s has been banned.\n\r", pban->name);
	chprint(ch, buf);
	return;
}

CH_CMD(do_ban)
{
	ban_site(ch, argument, FALSE);
}

CH_CMD(do_permban)
{
	ban_site(ch, argument, TRUE);
}

CH_CMD(do_allow)
{
	char arg[MAX_INPUT_LENGTH];
	BAN_DATA *prev;
	BAN_DATA *curr;

	one_argument(argument, arg);

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

	prev = NULL;
	for (curr = ban_first; curr != NULL; curr = prev)
	{
		prev = curr->next;

		if (!str_cmp(arg, curr->name))
		{
			if (curr->level > get_trust(ch))
			{
				chprintln(ch, "You are not powerful enough to lift that ban.");
				return;
			}
			UNLINK(curr, ban_first, ban_last, next, prev);

			free_ban(curr);
			chprintlnf(ch, "Ban on %s lifted.", arg);
			save_bans();
			return;
		}
	}

	chprintln(ch, "Site is not banned.");
	return;
}