/* This file will load all optional modules. These are features that
 * not everyone will use or are considered experimental.
 * You can include this file from your unrealircd.conf like this:
 * include "modules.optional.conf";
 * OR... and this is probably a better idea... you can copy-paste it
 * to another file where you do your own customizations.
 *
 * DO NOT EDIT THIS FILE! IT WILL BE OVERWRITTEN DURING NEXT UPGRADE!!
 * If you want to customize, make a copy of this file (for example
 * name it modules.custom.conf) and edit it.
 * Then include that file from your unrealircd.conf instead of this one.
 */

/*** Commands ***/

// This add the /IRCOPS command: A more visual way for users
// to see which IRCOps are online.
loadmodule "ircops";

// This adds the /STAFF command: This command simply displays
// a text file that you can configure here:
loadmodule "staff";
set { staff-file "network.staff"; }


/*** Channel modes ***/

// The following module ('nocodes') is not a true channel mode.
// It simply enhances the existing channel mode +S/+c to include
// stripping/blocking of bold, underline and italic text.
loadmodule "nocodes";


/*** Other ***/

// The hideserver module will hide /MAP and /LINKS to regular users.
// It does not truly enhance security as server names can still be
// seen at other places.
// Comment out the following line to enable this:
// loadmodule "hideserver";

// The antirandom module will kill or *line users that have a nick,
// ident and/or realname that is considered "random".
// This helps to combat simple botnets/drones.
// Note that failure to set the right settings may ban innocent users.
// This is especially true if you are on a non-English network where
// the module may consider a sequence of characters "random" even though
// it is a perfectly pronounceable word in your language.
loadmodule "antirandom";
set {
	antirandom {
		/* THRESHOLD:
		 * This is pretty much the most important setting of all.
		 * For every randomly looking ident the user gets a certain amount of
		 * 'points', if this value reaches 'threshold' then the appropriate
		 * action is taken (killed, *lined, see later on).
		 *  lower = more randomly looking users will be catched (but also more
		 *	  innocent users)
		 * higher = less chance of innocent users getting killed, but also less
		 *	  chance on bots getting catched.
		 * <2:  DON'T!!
		 *  4:  Works good, probably a few more innocent kills but if you got
		 *      quite a bot problem then this might be a useful setting.
		 *  5:  Works well with few innocent kills, probably good to begin with.
		 *  6:  If you want to be a tad more careful
		 * >6:  For the paranoid. Module can still be quite effective, though :)
		 */
		threshold 7;

		/* BAN-ACTION:
		 * Action to take whenever the user is catched as random, options:
		 * warn, kill, gline, gzline, kline, zline, shun, tempshun
		 */
		ban-action kill;

		/* BAN-TIME:
		 * Time to ban the user (irrelevant for tempshun/kill).
		 * Something between 1 hour and 2 days is recommended.
		 * If you set it higher than 3 or 4 days then you get quite a risk
		 * of catching innocent users due to dynamic IP, not to mention
		 * your *line list gets filled up... so choose it wisely.
		 */
		ban-time 4h;

		/* BAN-REASON:
		 * The ban (or kill) reason to use.
		 * You might want to put in an entry to a FAQ or an email address
		 * where users can mail if they have been catched and don't know what to do.
		 * NOTE: One of the various reasons that ""innocent users"" are catched is
		 *       if they just randomly type in info for their nick, ident, or realname.
		 */
		ban-reason "You look like a bot. Be sure to fill in your nick/ident/realname properly.";

		/* CONVERT-TO-LOWERCASE:
		 * Convert nicks, idents, and realnames to lowercase before doing random checks?
		 * This has not been tested extensively for false positives, but might be (very)
		 * helpful to catch GnStA5FYhiTH51TUkf style random nicks as random.
		 * Enabled by default.
		 */
		convert-to-lowercase yes;

		/* FULLSTATUS-ON-LOAD:
		 * If enabled, then upon loading it will check all users that are currently
		 * connected and give a status report about who it would have killed.
		 * Note that it doesn't actually kill any currently connected users, it is for
		 * informative purposes only.
		 * This can be (very) useful if you use the module for the first time.
		 * But you probably want to disable it after a while, since once the module
		 * is actively dealing with randomly looking persons, it shouldn't report any
		 * users anymore on load and then this check only eats useless CPU on /REHASH.
		 * Enabled by default.
		 */
		fullstatus-on-load yes;

		/* SHOW-FAILEDCONNECTS:
		 * This will send out a notice whenever a randomly looking user has been catched
		 * during connecting. Obviously this can be pretty noisy.
		 * Especially recommended to enable during the first few days you use this module.
		 */
		show-failedconnects yes;

		/* EXCEPT-HOSTS:
		 * Hostmasks on this list are matched against the IP and hostname of the connecting
		 * user. If it matches then we do not check if the nick/ident/realname is random.
		 * NOTE: Use the REAL host or IP here, not any cloaked hosts!
		 */
		except-hosts {
			mask 192.168.0.0/16;
			mask 127.0.0.0/8;
		}

		/* EXCEPT-WEBIRC:
		 * This will make antirandom not check connections from WEBIRC gateways.
		 * ( see https://www.unrealircd.org/docs/WebIRC_block )
		 * It seems WEBIRC connections frequently cause false positives so the
		 * default is 'yes'.
		 */
		except-webirc yes;
	}
}

// This module will send a HTTP 301 redirect to any client which sends
// a HTTP request to us. This is commented out by default:
//loadmodule "webredir";
//set {
//	webredir {
//		url "https://...";
//	}
//}

// This adds websocket support. For more information, see:
// https://www.unrealircd.org/docs/WebSocket_support
loadmodule "websocket";

// This module will detect and stop spam containing of characters of
// mixed "scripts", where (for example) some characters are in
// Latin script and other characters are in Cyrillic script.
loadmodule "antimixedutf8";
set {
	antimixedutf8 {
		/* Take action at this 'score' (lower = more sensitive)
		 *
		 * A score of 2 or 3 will catch a lot but also
		 * catch innocent users who are not using a pure
		 * Latin script, such as Russian people who
		 * commonly use a mix of Latin and Cyrillic.
		 *
		 * A score of 8 is a safe default.
		 */
		score 8;

		/* Action to take, see:
		 * https://www.unrealircd.org/docs/Actions
		 */
		ban-action block;

		/* Block/kill/ban reason (sent to user) */
		ban-reason "Mixed character spam";

		/* Duration of ban (does not apply to block/kill) */
		ban-time 4h; // For other types
	}
}
