/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
loadmodule "modules/commands.dll";
loadmodule "modules/cloak.dll";

include "help.conf";
include "badwords.channel.conf";
include "badwords.message.conf";
include "badwords.quit.conf";
include "spamfilter.conf";

me
{
	name "localhost.net";
	info "FooNet Server";
	numeric 1;
};

admin {
	"Bob Smith";
	"bob";
	"widely@used.name";
};

class           clients
{
	pingfreq 90;
	maxclients 500;
	sendq 100000;
	recvq 8000;
};

allow {
	ip             *@*;
	hostname       *@*;
	class          clients;
	password "password";
	maxperip 5;
};

allow           channel {
	channel "#camel-test";
};

listen         *:6667
{
	options
	{
		clientsonly;
	};
};

listen         *:6669
{
	options
	{
		ssl;
		clientsonly;
	};
};

files
{
	/* The Message Of The Day shown to users who log in: */
	motd ircd.motd;

	/*
	 * A short MOTD. If this file exists, it will be displayed to
	 * the user in place of the MOTD. Users can still view the
	 * full MOTD by using the /MOTD command.
	 */
	/* shortmotd ircd.smotd; */

	/* Shown when an operator /OPERs up */
	/* opermotd oper.motd; */

	/* Services MOTD append. */
	/* svsmotd ircd.svsmotd; */

	/* Bot MOTD */
	/* botmotd bot.motd; */

	/* Shown upon /RULES */
	/* rules ircd.rules; */

	/*
	 * Where the IRCd stores and loads a few values which should
	 * be persistent across server restarts. Must point to an
	 * existing file which the IRCd has permission to alter or to
	 * a file in a folder within which the IRCd may create files.
	 */
	/* tunefile ircd.tune; */

	/* Where to save the IRCd's pid. Should be writable by the IRCd. */
	/* pidfile ircd.pid; */
};

/* Network configuration */
set {
	network-name 		"TestNet";
	default-server 		"irc.roxnet.org";
	services-server 	"junk.org";
	help-channel 		"#TestNet";
	hiddenhost-prefix	"rox";
	/* prefix-quit 		"no"; */
	/* Cloak keys should be the same at all servers on the network.
	 * They are used for generating masked hosts and should be kept secret.
	 * The keys should be 3 random strings of 5-100 characters
	 * (10-20 chars is just fine) and must consist of lowcase (a-z),
	 * upcase (A-Z) and digits (0-9) [see first key example].
	 * HINT: On *NIX, you can run './unreal gencloak' in your shell to let
	 *       Unreal generate 3 random strings for you.
	 */
	cloak-keys {
		"aoAr1HnR6gl3sJ7hVz4Zb7x4YwpW";
		"aoAr1HnR6gl3sJ7hVz4Zb7x4YwpD";
		"aoAr1HnR6gl3sJ7hVz4Zb7x4YwpF";
	};
	/* on-oper host */
	hosts {
		local		"locop.roxnet.org";
		global		"ircop.roxnet.org";
		coadmin		"coadmin.roxnet.org";
		admin		"admin.roxnet.org";
		servicesadmin 	"csops.roxnet.org";
		netadmin 	"netadmin.roxnet.org";
		host-on-oper-up "no";
	};
};

/* Server specific configuration */

set {
	kline-address "spam@mailinator.com";
	modes-on-connect "+xw";
	modes-on-oper	 "+xwgs";
	oper-auto-join "#opers";
	options {
		hide-ulines;
		/* You can enable ident checking here if you want */
		/* identd-check; */
		show-connect-info;
	};

	maxchannelsperuser 10;
	/* The minimum time a user must be connected before being allowed to use a QUIT message,
	 * This will hopefully help stop spam */
	anti-spam-quit-message-time 10s;
	/* Make the message in static-quit show in all quits - meaning no
           custom quits are allowed on local server */
	/* static-quit "Client quit";	*/

	/* You can also block all part reasons by uncommenting this and say 'yes',
	 * or specify some other text (eg: "Bye bye!") to always use as a comment.. */
	/* static-part yes; */

	/* This allows you to make certain stats oper only, use * for all stats,
	 * leave it out to allow users to see all stats. Type '/stats' for a full list.
	 * Some admins might want to remove the 'kGs' to allow normal users to list
	 * klines, glines and shuns.
	 */
	oper-only-stats "okfGsMRUEelLCXzdD";

	/* Throttling: this example sets a limit of 3 connection attempts per 60s (per host). */
	throttle {
		connections 50;
		period 60s;
	};

	/* Anti flood protection */
	anti-flood {
		nick-flood 3:60;	/* 3 nickchanges per 60 seconds (the default) */
	};

	/* Spam filter */
	spamfilter {
		ban-time 1d; /* default duration of a *line ban set by spamfilter */
		ban-reason "Spam/Advertising"; /* default reason */
		virus-help-channel "#help"; /* channel to use for 'viruschan' action */
		/* except "#help"; channel to exempt from filtering */
	};
	ssl {
		certificate "C:\Program Files\Unreal3.2\server.cert.pem";
		key "C:\Program Files\Unreal3.2\server.key.pem";
	};
};