/*
 * Example configuration file for BotServ.
 */

/*
 * First, create the service. If you do not want to have a 'BotServ', but do want the ability to have
 * ChanServ assigned to channels for the use of fantasy commands, you may delete the below 'service' block.
 *
 * Note that deleting a 'service' block for a pseudoclient that is already online will not remove the
 * client, the client becomes no different from a normal service bot, so you will have to use botserv/bot
 * to manually delete the client.
 *
 * You may then want to map some of the below commands to other services, like placing botserv/bot on
 * OperServ so you can delete the below client, and mapping assign and unassign to ChanServ so users are
 * able to control whether or not ChanServ is in the channel. You may also want to map botserv/set/nobot
 * to OperServ so you can restrict who can assign the other core service clients.
 */
service
{
	/*
	 * The name of the BotServ client.
	 * If you change this value, you probably want to change the client directive in the configuration for the botserv module too.
	 */
	nick = "BotServ"

	/*
	 * The username of the BotServ client.
	 */
	user = "services"

	/*
	 * The hostname of the BotServ client.
	 */
	host = "services.host"

	/*
	 * The realname of the BotServ client.
	 */
	gecos = "Bot Service"

	/*
	 * The modes this client should use.
	 * Do not modify this unless you know what you are doing.
	 *
	 * These modes are very IRCd specific. If left commented, sane defaults
	 * are used based on what protocol module you have loaded.
	 *
	 * Note that setting this option incorrectly could potentially BREAK some, if
	 * not all, usefulness of the client. We will not support you if this client is
	 * unable to do certain things if this option is enabled.
	 */
	#modes = "+o"

	/*
	 * An optional comma separated list of channels this service should join. Outside
	 * of log channels this is not very useful, as the service will just idle in the
	 * specified channels, and will not accept any types of commands.
	 *
	 * Prefixes may be given to the channels in the form of mode characters or prefix symbols.
	 */
	#channels = "@#services,#mychan"
}

/*
 * Core BotServ module.
 *
 * Provides essential functionality for BotServ.
 */
module
{
	name = "botserv"

	/*
	 * The name of the client that should be BotServ.
	 *
	 * This directive is optional.
	 */
	client = "BotServ"

	/*
	 * The default bot options for newly registered channels. Note that changing these options
	 * will have no effect on channels which are already registered. The list must be separated
	 * by spaces.
	 *
	 * The options are:
	 * -    dontkickops: Channel operators will be protected against BotServ kicks
	 * - dontkickvoices: Voiced users will be protected against BotServ kicks
	 * -          greet: The channel's BotServ bot will greet incoming users that have set a greet
	 *                     in their NickServ settings
	 * -        fantasy: Enables the use of BotServ fantasy commands in the channel
	 *
	 * This directive is optional, if left blank, there will be no defaults.
	 */
	defaults = "greet fantasy"

	/*
	 * The minimum number of users there must be in a channel before the bot joins it. The best
	 * value for this setting is 1 or 2. This can be 0, the service bots will not part unless
	 * specifically unassigned, and will keep the channel open.
	 */
	minusers = 1

	/*
	 * The bots are currently not affected by any modes or bans when they try to join a channel.
	 * But some people may want to make it act like a real bot, that is, for example, remove all
	 * the bans affecting the bot before joining the channel, remove a ban that affects the bot
	 * set by a user when it is in the channel, and so on. Since it consumes a bit more CPU
	 * time, you should not enable this on larger networks.
	 *
	 * This directive is optional.
	 */
	#smartjoin = yes

	/*
	 * Modes to set on service bots when they join channels, comment this out for no modes
	 *
	 * This directive is optional.
	 */
	botmodes = "ao"

	/*
	 * User modes to set on service bots. Read the comment about the service:modes directive
	 * on why this can be a bad idea to set.
	 */
	#botumodes = "i"
}

/*
 * Core BotServ commands.
 *
 * In Anope modules can provide (multiple) commands, each of which has a unique command name. Once these modules
 * are loaded you can then configure the commands to be added to any client you like with any name you like.
 *
 * Additionally, you may provide a permission name that must be in the opertype of users executing the command.
 *
 * Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
 */

/* Give it a help command. */
command { service = "BotServ"; name = "HELP"; command = "generic/help"; }

/*
 * bs_assign
 *
 * Provides the commands:
 *   botserv/assign - Used to assign BotServ bots to channels
 *   botserv/unassign - Used to unassign BotServ bots
 *   botserv/set/nobot - Used to prohibit channels from being assigned BotServ bots.
 *
 * Used for assigning and unassigning bots to channels.
 */
module { name = "bs_assign" }
command { service = "BotServ"; name = "ASSIGN"; command = "botserv/assign"; }
command { service = "BotServ"; name = "UNASSIGN"; command = "botserv/unassign"; }
command { service = "BotServ"; name = "SET NOBOT"; command = "botserv/set/nobot"; permission = "botserv/set/nobot"; }

/*
 * bs_autoassign
 *
 * Allows service bots to be automatically assigned to channels upon registration.
 */
#module
{
	name = "bs_autoassign"

	/*
	 * Automatically assign ChanServ to channels upon registration.
	 */
	bot = "ChanServ"
}

/*
 * bs_badwords
 *
 * Provides the command botserv/badwords.
 *
 * Used for controlling the channel badword list.
 */
module
{
	name = "bs_badwords"

	/*
	 * The maximum number of entries a single bad words list can have.
	 */
	badwordsmax = 32

	/*
	 * If set, BotServ will use case sensitive checking for badwords.
	 *
	 * This directive is optional.
	 */
	#casesensitive = yes
}
command { service = "BotServ"; name = "BADWORDS"; command = "botserv/badwords"; }

/*
 * bs_bot
 *
 * Provides the command botserv/bot.
 *
 * Used for administrating BotServ bots.
 */
module { name = "bs_bot" }
command { service = "BotServ"; name = "BOT"; command = "botserv/bot"; permission = "botserv/bot"; }

/*
 * bs_botlist
 *
 * Provides the command botserv/botlist.
 *
 * Used for listing all available bots.
 */
module { name = "bs_botlist" }
command { service = "BotServ"; name = "BOTLIST"; command = "botserv/botlist"; }

/*
 * bs_control
 *
 * Provides the commands botserv/act and botserv/say.
 *
 * Used for making the bot message a channel.
 */
module { name = "bs_control" }
command { service = "BotServ"; name = "ACT"; command = "botserv/act"; }
command { service = "BotServ"; name = "SAY"; command = "botserv/say"; }

/*
 * bs_info
 *
 * Provides the command botserv/info.
 *
 * Used for getting information on bots or channels.
 */
module { name = "bs_info" }
command { service = "BotServ"; name = "INFO"; command = "botserv/info"; }

/*
 * bs_kick
 *
 * Provides the commands:
 *   botserv/kick - Dummy help wrapper for the KICK command.
 *   botserv/kick/amsg - Configures BotServ's AMSG kicker.
 *   botserv/kick/badwords - Configures BotServ's badwords kicker.
 *   botserv/kick/bolds - Configures BotServ's bold text kicker.
 *   botserv/kick/caps - Configures BotServ's capital letters kicker.
 *   botserv/kick/colors - Configures BotServ's color kicker.
 *   botserv/kick/flood - Configures BotServ's flood kicker.
 *   botserv/kick/italics - Configures BotServ's italics kicker.
 *   botserv/kick/repeat - Configures BotServ's repeat kicker.
 *   botserv/kick/reverses - Configures BotServ's reverse kicker.
 *   botserv/kick/underlines - Configures BotServ's underline kicker.
 *   botserv/set/dontkickops - Used for preventing BotServ from kicking channel operators.
 *   botserv/set/dontkickvoices - Used for preventing BotServ from kicking voices.
 *
 * Used for configuring what bots should kick for.
 */
module
{
	name = "bs_kick"

	/*
	 * The amount of time that data for a user is valid in BotServ. If the data exceeds this time,
	 * it is reset or deleted depending on the case. Do not set it too high, otherwise your
	 * resources will be slightly affected.
	 */
	keepdata = 10m

	/*
	 * If set, the bots will use a kick reason that does not state the word when it is kicking.
	 * This is especially useful if you have young people on your network.
	 *
	 * This directive is optional.
	 */
	gentlebadwordreason = yes
}
command { service = "BotServ"; name = "KICK"; command = "botserv/kick"; }
command { service = "BotServ"; name = "KICK AMSG"; command = "botserv/kick/amsg"; }
command { service = "BotServ"; name = "KICK BADWORDS"; command = "botserv/kick/badwords"; }
command { service = "BotServ"; name = "KICK BOLDS"; command = "botserv/kick/bolds"; }
command { service = "BotServ"; name = "KICK CAPS"; command = "botserv/kick/caps"; }
command { service = "BotServ"; name = "KICK COLORS"; command = "botserv/kick/colors"; }
command { service = "BotServ"; name = "KICK FLOOD"; command = "botserv/kick/flood"; }
command { service = "BotServ"; name = "KICK ITALICS"; command = "botserv/kick/italics"; }
command { service = "BotServ"; name = "KICK REPEAT"; command = "botserv/kick/repeat"; }
command { service = "BotServ"; name = "KICK REVERSES"; command = "botserv/kick/reverses"; }
command { service = "BotServ"; name = "KICK UNDERLINES"; command = "botserv/kick/underlines"; }

command { service = "BotServ"; name = "SET DONTKICKOPS"; command = "botserv/set/dontkickops"; }
command { service = "BotServ"; name = "SET DONTKICKVOICES"; command = "botserv/set/dontkickvoices"; }


/*
 * bs_set
 *
 * Provides the commands:
 *   botserv/set/private - Used to prohibit specific BotServ bots from being assigned to channels.
 */
module { name = "bs_set" }
command { service = "BotServ"; name = "SET"; command = "botserv/set"; }
command { service = "BotServ"; name = "SET BANEXPIRE"; command = "botserv/set/banexpire"; }
command { service = "BotServ"; name = "SET PRIVATE"; command = "botserv/set/private"; permission = "botserv/set/private"; }

/*
 * greet
 *
 * Provides the commands:
 *   botserv/set/greet - Used for enabling or disabling BotServ's greet messages in a channel.
 *   nickserv/set/greet, nickserv/saset/greet - Used for changing a users greet message, which is displayed when they enter channels.
 */
module { name = "greet" }
command { service = "BotServ"; name = "SET GREET"; command = "botserv/set/greet"; }
command { service = "NickServ"; name = "SET GREET"; command = "nickserv/set/greet"; }
command { service = "NickServ"; name = "SASET GREET"; command = "nickserv/saset/greet"; permission = "nickserv/saset/greet"; }

/*
 * GREET privilege.
 *
 * Used by 'greet'.
 *
 * Users with this privilege have their greet shown when they join channels.
 */
privilege
{
	name = "GREET"
	rank = 40
	level = 5
	flag = "g"
	xop = "AOP"
}


/*
 * fantasy
 *
 * Allows 'fantasist' commands to be used in channels.
 *
 * Provides the commands:
 *   botserv/set/fantasy - Used for enabling or disabling BotServ's fantasist commands.
 */
module
{
	name = "fantasy"

	/*
	 * Defines the prefixes for fantasy commands in channels. One of these characters will have to be prepended
	 * to all fantasy commands. If you choose "!", for example, fantasy commands will be "!kick",
	 * "!op", etc. This directive is optional, if left out, the default fantasy character is "!".
	 */
	#fantasycharacter = "!."
}
command { service = "BotServ"; name = "SET FANTASY"; command = "botserv/set/fantasy"; }

/*
 * Fantasy commands
 *
 * Fantasy commands can be executed in channels that have a BotServ bot by prefixing the
 * command with one of the fantasy characters configured in botserv's fantasycharacter
 * directive.
 *
 * Sane defaults are provided below that do not need to be edited unless you wish to change the default behavior.
 */
fantasy { name = "ACCESS"; command = "chanserv/access"; }
fantasy { name = "AKICK"; command = "chanserv/akick"; }
fantasy { name = "AOP"; command = "chanserv/xop"; }
fantasy { name = "BAN"; command = "chanserv/ban"; }
fantasy { name = "CLONE"; command = "chanserv/clone"; }
fantasy { name = "DEHALFOP"; command = "chanserv/modes"; }
fantasy { name = "DEOP"; command = "chanserv/modes"; }
fantasy { name = "DEOWNER"; command = "chanserv/modes"; }
fantasy { name = "DEPROTECT"; command = "chanserv/modes"; }
fantasy { name = "DEVOICE"; command = "chanserv/modes"; }
fantasy { name = "DOWN"; command = "chanserv/down"; }
fantasy { name = "ENFORCE"; command = "chanserv/enforce"; }
fantasy { name = "ENTRYMSG"; command = "chanserv/entrymsg"; }
fantasy { name = "FLAGS"; command = "chanserv/flags"; }
fantasy { name = "HALFOP"; command = "chanserv/modes"; }
fantasy { name = "HELP"; command = "generic/help"; prepend_channel = false; }
fantasy { name = "HOP"; command = "chanserv/xop"; }
fantasy { name = "INFO"; command = "chanserv/info"; prepend_channel = false; }
fantasy { name = "INVITE"; command = "chanserv/invite"; }
fantasy { name = "K"; command = "chanserv/kick"; }
fantasy { name = "KB"; command = "chanserv/ban"; }
fantasy { name = "KICK"; command = "chanserv/kick"; }
fantasy { name = "LEVELS"; command = "chanserv/levels"; }
fantasy { name = "LIST"; command = "chanserv/list"; prepend_channel = false; }
fantasy { name = "LOG"; command = "chanserv/log"; }
fantasy { name = "MODE"; command = "chanserv/mode"; }
fantasy { name = "MUTE"; command = "chanserv/ban"; kick = no; mode = "QUIET"; }
fantasy { name = "OP"; command = "chanserv/modes"; }
fantasy { name = "OWNER"; command = "chanserv/modes"; }
fantasy { name = "PROTECT"; command = "chanserv/modes"; }
fantasy { name = "QOP"; command = "chanserv/xop"; }
fantasy { name = "SEEN"; command = "chanserv/seen"; prepend_channel = false; }
fantasy { name = "SOP"; command = "chanserv/xop"; }
fantasy { name = "STATUS"; command = "chanserv/status"; }
fantasy { name = "SUSPEND"; command = "chanserv/suspend"; permission = "chanserv/suspend"; }
fantasy { name = "SYNC"; command = "chanserv/sync"; }
fantasy { name = "TOPIC"; command = "chanserv/topic"; }
fantasy { name = "UNBAN"; command = "chanserv/unban"; }
fantasy { name = "UNSUSPEND"; command = "chanserv/unsuspend"; permission = "chanserv/suspend"; }
fantasy { name = "UP"; command = "chanserv/up"; }
fantasy { name = "VOICE"; command = "chanserv/modes"; }
fantasy { name = "VOP"; command = "chanserv/xop"; }
