summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.indent.pro1
-rw-r--r--Changes1299
-rw-r--r--Changes.conf428
-rw-r--r--Changes.lang963
-rw-r--r--Makefile174
-rw-r--r--actions.c93
-rwxr-xr-xbin/checklang16
-rwxr-xr-xbin/cp-recursive21
-rwxr-xr-xbin/fixlang17
-rwxr-xr-xbin/getanope42
-rwxr-xr-xbin/langtool.pl239
-rwxr-xr-xbin/makepatch83
-rwxr-xr-xbin/mydbgen194
-rwxr-xr-xbin/putanope104
-rw-r--r--botserv.c2512
-rw-r--r--channels.c1595
-rw-r--r--chanserv.c6187
-rw-r--r--commands.c178
-rw-r--r--commands.h34
-rw-r--r--compat.c212
-rw-r--r--config.c1283
-rw-r--r--config.h81
-rwxr-xr-xconfigure1858
-rw-r--r--converter.c398
-rw-r--r--data/example.chk44
-rw-r--r--data/example.conf1450
-rw-r--r--data/tables.sql470
-rw-r--r--datafiles.c507
-rw-r--r--datafiles.h67
-rw-r--r--defs.h40
-rw-r--r--docs/BUGS17
-rw-r--r--docs/COPYING339
-rw-r--r--docs/DEFCON111
-rw-r--r--docs/FAQ423
-rw-r--r--docs/INSTALL177
-rw-r--r--docs/MODULES110
-rw-r--r--docs/MYSQL97
-rw-r--r--docs/NEWS92
-rw-r--r--docs/README307
-rw-r--r--encrypt.c434
-rw-r--r--encrypt.h17
-rw-r--r--extern.h838
-rw-r--r--helpserv.c83
-rw-r--r--hostserv.c1108
-rw-r--r--init.c807
-rw-r--r--install-script29
-rw-r--r--lang/Makefile79
-rw-r--r--lang/cat.l6172
-rw-r--r--lang/de.l6380
-rw-r--r--lang/en_us.l5946
-rw-r--r--lang/es.l6182
-rwxr-xr-xlang/fixlang.pl118
-rw-r--r--lang/fr.l6204
-rw-r--r--lang/gr.l6049
-rw-r--r--lang/index1410
-rw-r--r--lang/it.l6208
-rw-r--r--lang/langcomp.c256
-rw-r--r--lang/nl.l6069
-rwxr-xr-xlang/obs.pl129
-rw-r--r--lang/pt.l5804
-rw-r--r--lang/ru.l5951
-rw-r--r--lang/tr.l5982
-rw-r--r--language.c265
-rw-r--r--list.c178
-rw-r--r--log.c298
-rw-r--r--mail.c202
-rw-r--r--main.c521
-rw-r--r--memory.c96
-rw-r--r--memoserv.c1175
-rw-r--r--messages.c1196
-rw-r--r--messages.h23
-rw-r--r--misc.c642
-rw-r--r--modules.c1399
-rw-r--r--modules.h223
-rw-r--r--modules/Makefile26
-rw-r--r--modules/README1
-rwxr-xr-xmodules/compile.sh37
-rwxr-xr-xmodules/configure21
-rw-r--r--modules/hs_moo.c99
-rw-r--r--modules/ircd_catserv.c128
-rw-r--r--modules/module.h9
-rw-r--r--mysql.c869
-rw-r--r--news.c541
-rw-r--r--nickserv.c4010
-rw-r--r--operserv.c5099
-rw-r--r--process.c268
-rw-r--r--protocol.c182
-rw-r--r--proxy.c793
-rw-r--r--pseudo.h20
-rw-r--r--rdb.c347
-rw-r--r--send.c202
-rw-r--r--services.h1198
-rw-r--r--sessions.c834
-rw-r--r--slist.c325
-rw-r--r--slist.h63
-rw-r--r--sockutil.c549
-rw-r--r--threads.c82
-rw-r--r--timeout.c130
-rw-r--r--timeout.h50
-rw-r--r--users.c1136
-rw-r--r--version.log1055
-rw-r--r--version.sh146
-rw-r--r--vsnprintf.c518
103 files changed, 119474 insertions, 0 deletions
diff --git a/.indent.pro b/.indent.pro
new file mode 100644
index 000000000..a60379ba5
--- /dev/null
+++ b/.indent.pro
@@ -0,0 +1 @@
+-kr -nut
diff --git a/Changes b/Changes
new file mode 100644
index 000000000..af1ca30e5
--- /dev/null
+++ b/Changes
@@ -0,0 +1,1299 @@
+Anope Version 1.6.0
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2004/03/22 Added and updated several documents on "docs" folder.
+2004/03/22 Added bin/dbgen to help MySQL db schema.
+2004/03/21 Fixed module makefile to use -Wall for new modules
+2004/03/21 Fixed config check startup warnings (0000467)
+2004/03/21 Fixed bug where mkdir should be mkdir -p to create parent (0000468)
+2004/03/22 Fixed Crash on channel memo (0000347)
+
+Anope Version 1.5.15
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2004/03/14 Fixed LogBot and LogChan issue (0000437)
+2004/03/14 Fixed tiny bug in french lang file (0000465)
+2004/03/14 Fixed chanmode +r not being removed. (0000462)
+2004/03/12 Fixed MySQL limited data fields (0000434)
+2004/03/12 Fixed a cosmetic typo (0000440)
+2004/03/14 Fixed mysql (null) values (0000450)
+2004/03/06 Fixed module duplicate functions (0000431)
+2004/03/06 Fixed module unload issue (0000432)
+2004/03/13 Fixed missing channel fields on MySQL schema
+2004/03/13 Fixed MySQL calls even when disabled.
+2004/03/07 Fixed a malformed mode crash for some ircd's
+2004/03/13 Added db save on startup
+
+Anope Version 1.5.14
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2004/02/17 Disabled modules on OpenBSD for the time being (0000408)
+2004/02/15 Added Viagra's VS command to handle vHosts properly (0000404)
+2004/02/15 Fixed HostSetters to cover all aliases in the group (0000412)
+2004/02/07 Fixed channel '#' may not be registered anymore (0000030)
+2004/02/07 Fixed opers can't /OS MODE on +A chans anymore (0000403)
+2004/02/07 Fixed registration via group on nicknames preconfirmation (0000400)
+2004/02/14 Fixed hardcoded references to "OperServ" (0000411)
+2004/02/19 Fixed nickserv list problem with unconfirmed nicknames (0000406)
+2004/02/14 Fixed DefCon to cover more cases properly (0000407)
+2004/02/02 Fixed bug where non-id'ed nicks could do /cs identify
+2004/02/07 Fixed bug where you could /cs identify infinite times
+2004/02/09 Fixed incorrect help files Changed ServicesAdmin->SuperAdmin
+2004/02/14 Fixed typos in en_us.l language file
+
+Anope Version 1.5.13
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2004/01/30 Fixed malformed buffer bug (0000398)
+2004/01/31 Fixed OperServ news system reordering. (0000396)
+2004/01/19 Fixed minor typos on en_us.l (0000380) (0000381)
+2004/01/31 Fixed ALL option for ChanServ info (0000395)
+2004/01/18 Fixed HostServ Set message for non-registered nicks
+
+Anope Version 1.5.12
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2004/01/12 Added optimized language parser
+2004/01/11 Added moduleSetHelpHelp to modules.h
+2004/01/11 Added updated documentation
+2004/01/12 Added language tool (langtool.pl)
+2004/01/13 Added line length check (>60 char) to langtool.pl
+2004/01/17 Added better MySQL detection on configure script
+2004/01/17 Removed ExtSock experimental code
+2004/01/07 Fixed broken CHANKILL expire (0000333)
+2004/01/03 Fixed bot creation issue (0000348)
+2004/01/11 Fixed /OS STAFF output (0000346)
+2004/01/11 Fixed bot change/creation error (0000348)
+2004/01/03 Fixed /MS STAFF output (0000356)
+2004/01/07 Fixed modunload crash with disabled services (0000370)
+2004/01/17 Fixed missing HostServ on HelpServ help list (0000377)
+
+Provided by GeniousDex
+2004/01/04 Updated nl.l (Dutch language File)
+2004/01/11 Updated documentation
+
+Anope Version 1.5.11
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/12/12 Fixed all printf parameters on all language files
+2003/12/08 Fixed HOST_HELP string for all languages (0000340)
+2003/12/08 ChanServ and NickServ LIST's now accept #X-Y for seaching
+2003/12/09 Nickname enforcer will now kill instead of svsnick on hybridircd
+
+Provided by Oleg Nikolaev aka Isot <isot@complife.ru>
+2003/12/12 New ru.l (Russian lang file)
+
+Provided by DrStein
+2003/12/12 Updated es.l (Spanish language File).
+
+Provided by GeniousDex
+2003/12/12 Updated nl.l (Dutch language File).
+
+Provided by Stuff <the.stuff@gmx.de>
+2003/12/09 Updated de.l (German lang file)
+
+Anope Version 1.5.10
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/11/24 New version of putanope to make more robust
+2003/11/24 New #defines for version tokens (see built version.h)
+2003/11/24 New version schema: major.minor.patch.build
+2003/11/16 Fixed mlock +c on Ultimate3 (0000320)
+2003/11/16 Fixed BotServ +ao on PTLink (0000313)
+2003/11/16 All channel modes now supported on PTLink (0000311)
+2003/11/16 Absolute mode cleaning for /CS CLEAR #chan MODES
+2003/11/16 Services will now kill users on hybrid instead of svsnick (0000240)
+2003/11/15 Fixed a bug with module message's
+2003/11/15 Added a generic footer to list's without (0000222)
+2003/11/15 Adding a ./configure script to modules folder
+2003/11/15 Removed Experimental status from Module and Viagra
+2003/11/15 Fixed /ms staff on memo notifucation (0000221)
+2003/11/09 Fixed compile.sh for bsd based systems
+2003/11/09 Fixed bug in moduleDelCallback routine
+
+Anope Version 1.5.9
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/11/03 Added optional MysqlSecure password security directive
+2003/11/03 Fixed case insensitive password fields on MySQL (0000196)
+2003/11/03 Fixed /OS STAFF bug not showing online aliases (0000124)
+2003/11/03 Fixed wrong /CS HELP output on Ultimate2/3 (0000189)
+2003/11/02 Fixed empty fields on the cs_access table (0000197)
+2003/11/02 Fixed SA's unable to /NS LOGOUT themselves (0000288)
+2003/11/02 Fixed SQLINE help syntax (0000291)
+2003/11/01 Added moduleDelCallback for module coders
+2003/11/01 Modified module AnopeInit call, fixed bug (0000289)
+2003/11/01 Fixed error in pt.l file and memoserv help
+2003/10/29 Fixed -h bug for valid halfop's when joining a empty chan (0000245)
+2003/10/29 Fixed forbidden chan spammy log file bug (0000284)
+
+Provided by GeniusDex <geniusdex@twistification.net>
+2003/11/01 Converted HelpServ into a "real" services, modules now work for it
+
+Anope Version 1.5.8
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/10/08 Fixed compile errors on PTLink and Ultimate3 as nither have vIdents
+2003/10/17 Fixed double TAB on language files (0000283)
+2003/10/14 Added a check on nicksserv logout so you can't logout services admins
+2003/10/17 Added new configuration directive AnonymousGlobal (0000116)
+
+Provided by ShadowMaster <ShadowMaster@Shadow-Realm.org>
+2003/10/08 Added NickIP Akill matching
+
+Anope Version 1.5.7
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/10/05 Added /ns update to replace further identifies, /ns identify will now only work once
+2003/10/03 Added check_unload function to modules. (like on-error unloading)
+2003/10/03 Added directive MysqlPort
+2003/09/22 Added moduleHelp framework for module coders, see hs_moo.c
+2003/09/21 Added moduleGetLastBuffer() and a module cmdTable bug fixed
+2003/08/16 Added moduleAddCallback command for module coders
+2003/10/06 Fixed bug with botserv bot creation when using services-aliases. (thanks to Killerchen)
+2003/10/05 Fixed vident on ban issue (bug 0000268)
+2003/10/05 Fixed memo order reset on deletion (bug 0000270)
+2003/09/07 Fixed clearmodes issue (bug 0000121)
+2003/09/07 Fixed ServicesRoot reload issue (bug 0000194)
+2003/09/07 Fixed empty ip proxy crash (bug 0000217)
+2003/09/04 Fixed bug ref: 0000170 - optional ""'s in mail sending
+2003/07/28 Fixed Channel DROP then FORBID crash on MySQL (0000199)
+2003/07/28 Fixed HostServ launch on Viagra and PTlink (0000190)
+2003/07/27 Fixed BotServ bots now unkickable on Ultimate3 (0000159)
+2003/07/27 Fixed Hybrid NICK_IS_REGISTERED dupe (0000184)
+2003/07/27 Fixed PTlink /newmask issue (0000188)
+2003/07/20 Fixed MySQL compile errors on Ultimate
+2003/07/20 Fixed PTlink sbuf compile error
+2003/07/20 Fixed chanserv badword MySQL issue
+2003/08/30 Allow for E/F lines when handling akilled host's joining the network
+2003/07/25 Added External socket support (*VERY* EXPERIMENTAL)
+2003/07/20 Made MySQL ns_id, na_id and ci_id useful by preserving it's value across updates
+2003/07/20 Some MySQL Optimizations (MySQL 3.23.32+ required)
+
+Provided by DrStein
+2003/10/05 Updated es.l (Spanish language File).
+
+Anope Version 1.5.6
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/07/16 Reimplemented +oa and +oq on net-joins and ModeOnId (less intrusive)
+2003/07/16 Added bin directory with misc tools
+2003/07/12 Fixed chankill no expire
+2003/07/13 Fixed BotServ bug when trying to add a bot with a services client's name.
+2003/07/10 Changed mlock_key from int to a String in mysql.c (Thanks goto Trystan)
+2003/07/09 Added request Syntax. Changed version to show the actual compiled Ircd's name.
+2003/06/29 Added services/modules/runtime for tmp storage of .so files
+2003/06/29 Fixed a small bug in nickserv load.
+2003/06/29 Fixed multiple chan modes at once Ulitmate issue
+
+Anope Version 1.5.5
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/06/24 Added the ability to autoload modules at services startup
+2003/06/23 Now MySQL functionality is optional even when compiled with MySQL support
+2003/06/23 Combined +oq +oa +ha +va on net-joins.
+2003/06/22 Prevent botserv say sending a ctcp to a channel
+2003/06/22 Fixed nickserv setting +d on users using group
+2003/06/22 Fixed non services admins able to drop nick's still awaiting a email code
+2003/06/17 Added EXPERIMENTAL module support.
+
+Provided by GeniusDex <geniusdex@twistification.net>
+2003/06/23 Dutch language file.
+
+Anope Version 1.5.4
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/06/11 Added RemoteServer2 and RemoteServer3 to the conf. If one server is down, the services will try the next one.
+2003/06/06 Added /MS SENDALL to send a massmemo to all registered users
+2003/06/03 Renamed function log() to alog() to prevent gcc3.3 warnings
+2003/06/03 Services now WALLOPS about db saves on /os shutdown
+2003/06/03 Modified NetworkDomain directive to allow multiple domains
+2003/06/03 Added NSRestrictGetPass and CSRestrictGetPass directives to restrict access to getpass command.
+2003/06/03 Added a directive in the conf that makes ChanServ opers only.
+2003/06/02 Added phase 1 of MySQL Support
+
+Anope Version 1.5.3
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/05/31 Removed TitanIRCd support. Difference willnot allow joint support
+2003/05/25 Custom GlobalOnCycle message
+2003/05/25 Defcon reject all new connections Kill message.
+2003/05/25 CHANKILL will not akill opers in the channel
+2003/05/25 Add command for MemoServ to send memo to all Admins/Opers
+2003/05/24 Fixed /os restart bug
+2003/05/24 Updated lang files - various errors/bug fixs
+2003/05/23 Fixed NSModeOnID it will only set unset modes (as far as possible)
+
+Provided by Popcorn <popcorn@anope.org>
+2003/05/26 Added ViagraIRCd 1.3.x / TitanIRCd 2.0.3 support (experimental)
+
+Provided by James <slowking50@aol.com>
+2003/05/30 Fixed deleting ban exceptions.
+2003/05/29 Added a much improved services ignore that can use wildcards.
+2003/05/24 Added Hybrid 7 support - james your the daddy! :-)
+
+Provided by openglx <openglx@brasnerd.com.br>
+2003/05/26 Added PTlink 6.15.0 or later support (experimental)
+
+Anope Version 1.5.2
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/05/20 Added GlobalOnDefcon to global current Defcon Level when set
+2003/05/20 Added GlobalOnDefconMore to allow admin to attach a msg to users
+2003/05/15 Added No New Memos to Defcon
+2003/05/15 Edit lanuage file to allow the user to know services are in Defcon
+2003/05/15 Added /NS GETEMAIL to allow matches of nick to email (0000013)
+2003/04/28 Added /OS SVSNICK to forcefully change a user's nickname
+
+Anope Version 1.5.1
+--------------------
+Provided by Anope Dev. <dev@anope.org> :)
+2003/04/27 Added Forbid/Suspend reason on akick if defined (0000023)
+2003/04/27 Added /OS CHANKILL command to deal with botnet channels (0000066)
+2003/04/26 Added DEFCON framework, along with basic settings
+2003/04/23 Removed Sequana IRCd support as well as conversion from IRCservices v4.4
+2003/04/19 Added HostSetters directive to allow NON-OPERS to use HostServ
+2003/04/19 Added Operserv Staff command feature request: 0000018
+2003/04/18 Added a pattern matching + range specifying to /HostServ LIST
+2003/04/18 Added DELALL command to HostServ to compliment SETALL
+2003/04/14 Services Root Admins are no longer affected by MailDelay
+2003/04/10 Added user's ident and host to WallBadOS
+2003/04/02 The old chanbot will now part on a /bs assign (smarter assign)
+2003/04/02 Added name tag for globalmsgs (shows the name of the sender)
+
+Anope Version 1.4.23
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/05/18 Fixed /ns list display error with no-expire
+2003/05/15 Fixed Exception move bug
+2003/05/15 Fixed /msg Operserv noop issue
+2003/05/05 Fixed Invalid nick/host/ident when using /bs bot CHANGE
+
+Anope Version 1.4.22
+--------------------
+Provided by Anope Dev. <dev@anope.org>
+2003/04/27 Fixed unsuspend crash when the # sign was left out
+2003/04/27 Fixed JOIN modes not set correctly internaly (e.g. for /cs clear ops)
+2003/04/26 Fixed OperServ jupe will only attempt to Jupe valid server masks
+2003/04/26 Fixed SETHOST for nonexistent user nickname in log files
+2003/04/26 Fixed Nonrelevant compiler warning (eof on botserv.c)
+2003/04/26 Fixed vIdent support for Ultimate2.x
+
+Provided by James <slowking50@aol.com>
+2003/04/26 Fixed No valid tld and logchan issue on Ultimate3
+
+Anope Version 1.4.21
+--------------------
+Provided by Anope Dev. <dev@anope.org> (thanks goto PopCorn)
+2003/04/20 Fixed BotServ nick/host/ident checking
+2003/04/20 Fixed HostServ valid host/ident checking
+
+Anope Version 1.4.20
+--------------------
+Provided by PopCorn
+2003/04/18 Fixed xOP permission problem
+
+Anope Version 1.4.19
+--------------------
+Provided by Anope Dev. <dev@anope.org> :)
+2003/04/12 Fixed MSNofityAll bug that crashed Services.
+2003/04/12 Fixed MD5 compilation error.
+
+Anope Version 1.4.18
+--------------------
+Provided by Anope Dev. <dev@anope.org> :)
+2003/03/27 SUSPENDed Channels can't be DROPed by Founder anymore
+2003/03/27 Fixed a couple of log'ing errors to tidy logfiels up a bit
+2003/03/20 Fixed a minor epona bug with !unban (BotServ will now
+ check the UNBAN level instead of the OPDEOP level)
+2003/03/14 On Ultimate3 you can now MLOCK +NSA.
+ Please note that MLOCK'ing +A and +O will only work on
+ Ultimate3.a31 and later.
+2003/03/11 Fixed buffer bug with long akill reasons and AddAkiller
+2003/03/08 MemoServ notification for Channel memos, upon join and send.
+2003/03/07 SuperAdmin can now be turned ON/OFF on a per-admin basis
+ logging of use is also added.
+2003/03/07 Added OperServ ignore function
+2003/03/07 Added optional globalmsg on startup and shutdown/restart
+2003/03/07 Added config option to hide Services stats o from non-opers
+2003/03/05 Fixed a bug with clearmodes
+2003/03/03 Added OperServ umode function to change usermodes (SuperAdmin only)
+2003/03/03 Added OperServ oline function to give operflags to users (SuperAdmin only)
+2003/03/03 Fixed several issues with +p users and ChanServ/Botserv
+ kick and negative mode changes.
+2003/03/02 Added Optional Channel ModeOnID
+2003/02/22 Added email verification when registering a nick
+2003/02/22 Added HostServ GROUP command, to allow users to sync
+ all vHost's in a nick group.
+2003/02/22 Added /MS DEL LAST
+2003/03/21 Updated it.l (Italian language File).
+2003/03/21 Updated es.l (Spanish language File).
+2003/03/21 Updated de.l (German language File).
+
+Provided by Kevin <kevin@botstats.com>
+2003/03/21 Updated fr.l (French language File).
+
+Anope Version 1.4.17
+--------------------
+Provided by Anope Dev. <anope@zero.org> :)
+2003/03/02 Fixed HostServ bug on non VHOST ircds.
+2003/02/20 Fixed the -logchan -debug bug, now they are mutualy exclusive
+2003/02/19 Added the #define HAS_VIDENT to signify an ircd able to
+ dynamicaly change a user's ident
+2003/02/19 HostServ updated to allow ident@host's for compatiable
+ ircds
+2003/02/19 NickServ ALIST command added which deprecates ChanServ
+ CLIST/ALIST
+2003/02/19 Complain to the oper about long vhosts
+2003/02/19 Added sanity check on vHost on HostServ SET/SETALL
+2003/02/19 Fixed HostServ support for UltimateIRCd 3.0.0
+2003/02/18 NS INFO ALL shows the vHost if it was set with hostserv
+2003/02/18 NS ID is an alias for NS IDENTIFY
+2003/02/18 Updated it.l (Italian language File).
+2003/02/18 Updated es.l (Spanish language File).
+2003/02/17 Fixed KILL (Alias Recovery) bug.
+2003/02/17 Fixed CHAN_CLIST_FORMAT on all languages.
+2003/02/17 Removed "scalloc" warnings.
+
+Provided by Seb <seb@iftouch.net>
+2003/02/18 Updated fr.l (French language File).
+
+Provided by Certus <Certus@irc-downloads.de>
+2003/03/01 Updated de.l (German language File).
+
+Anope Version 1.4.16
+--------------------
+Provided by Anope Dev. <anope@zero.org>
+2003/02/16 Fixed all language files to conform to latest index
+2003/02/15 Fix for Bahamut/Ultimate3 AKILL command.
+2003/02/14 CS XOP ADD moves an existing xop nick between lists
+2003/02/14 CS ACCESS LIST shows xop properly instead of levels
+2003/02/14 CS ALIST implemented
+2003/02/14 CS CLIST modified for users
+2003/02/13 HostServ Support + Alias
+2003/02/13 CS SUSPEND/UNSUSPEND implemented
+2003/02/13 Kill recovery for Aliases
+2003/02/13 Exception checking banning mechanism
+
+Anope Version 1.4.15
+--------------------
+Provided by Daniel Engel <dane@zero.org>
+2003/02/03 Interim name change for the project to Anope.
+2003/02/03 Created Changes.conf for services.conf changes.
+2003/02/03 Portuguese Language File up to date.
+2003/02/03 Spanish Language File up to date.
+2003/02/03 RAW messages now logged.
+2003/02/03 Access list DELETE and CLEAR now logged.
+2003/02/03 Added Super Admin founder of all (view new example.conf).
+2003/02/03 Prepend nick to AKILL reason (view new example.conf).
+2003/02/03 Added AKILL reason to WallOSAkill notifier.
+2003/02/03 Added BotServ !k alias of !kick.
+2003/02/03 Logging BotServ ACT and SAY to a channel (view new example.conf).
+2003/02/03 Added a more informative error on disabled RAW command.
+2003/02/03 Fixed most compile warnings.
+
+Provided by Lucas Nussbaum <lucas@lucas-nussbaum.net>
+2003/02/03 Access Denied Logging.
+2003/02/03 Services Alias (view new example.conf).
+2003/02/03 Split Buffer exploit fix.
+
+Provided by David Narayan <jester@phrixus.net>
+2003/02/03 Logging to a channel + CLI flag (view new example.conf).
+
+Provided by David <dv@diboo.net>
+2003/02/03 OperServ corruption notification.
+
+Provided by JH <jh@irc-chat.net>
+2003/02/03 ChanServ end of ACCESS list notification.
+
+Provided by Thomas Juberg <ShadowMaster@Shadow-Realm.org>
+2003/02/03 UltimateIRCd version 3.0.0.1 (mod-1.2) support.
+
+Provided by Daniele Nicolucci <jollino@sogno.net>
+2003/02/03 Italian language file.
+
+Epona Version 1.4.14
+--------------------
+2002/09/01 Nickname SQLINEs are now also enforced on nick change.
+ Reported by vandit <castortroy@piranho.net>
+2002/08/27 Made NickServ and ChanServ log certain events more
+ verbosely.
+2002/08/27 Added LogUsers configuration directive.
+2002/08/20 Fixed NickServ password encryption for newly registered
+ nicknames.
+ Reported by -ozone <ozone@securify.org.uk>
+2002/08/20 ChanServ will now also convert halfops to the HOP list
+ when switching to the xOP system.
+ Reported by Daniele Nicolucci <jollino@sogno.net>
+2002/08/20 Fixed Operserv NOOP command for non-Bahamut networks.
+ Reported by zak beam <zak@beam.dropbear.id.au>
+
+Epona Version 1.4.13
+--------------------
+2002/08/13 Added ProxyMessage5 to 8 configuration directives.
+2002/08/13 Added a Greek language file.
+ Submitted by Sergios Karalis <sergios_k@hotmail.com>
+2002/08/13 Fixed proxy detector so that it doesn't akill legitimate
+ Apache HTTP servers.
+2002/08/13 Fixed Unreal support so that akills work again with recent
+ Unreal releases.
+ Reported by Daniele Nicolucci <jollino@sogno.net>
+2002/08/13 Upgraded Sequana support to 0.3.0.
+
+Epona Version 1.4.12
+--------------------
+2002/06/23 Fixed bug in NOTICE/GLOBOPS/PRIVMSG string formatting.
+ Reported by lucas <lucas@lucas-nussbaum.net>
+ and Aristotles.
+2002/06/23 BotServ BOT ADD cannot drop a Services admin's nick
+ anymore when NSSecureAdmins is enabled.
+ Reported by AnGe_HwOaRaNg <ange.hwoarang@free.fr>
+2002/06/23 Kick reasons now have a limited length.
+ Reported by BSD Admin <bsd@internetmx.com>
+2002/06/23 The current value of CSMaxReg is now used for all groups,
+ not only new ones.
+ Reported by Daniel Engel <dane@zero.org>
+
+Epona Version 1.4.11
+--------------------
+2002/05/03 Fixed the cosmetic issue in /stats o seen when the
+ config file has been reloaded.
+ Reported by [ins4ne] <ins4ne@gmx.net>
+2002/05/03 Fixed a bug in the HTTP proxy detection.
+ Reported by Marcel Stutz <solaris@swissirc.ch>
+2002/04/22 "Fixed" the RAW command that was slightly broken.
+ Added the DisableRaw configuration directive that
+ breaks it again.
+2002/04/14 Added a check in ChanServ LEVELS to make sure the
+ submitted level is valid.
+2002/04/14 The BotServ SET DONTKICKOPS option now also protects
+ the +h/+a/+q users.
+2002/04/14 ChanServ now also checks and removes the +h mode on
+ join and in the SECUREOPS check.
+2002/04/14 Renamed the default crontab script from services.chk
+ to example.chk and updated the documentation
+ accordingly.
+2002/04/14 Fixed a bug in the UsePrivmsg feature.
+ Reported by David Narayan <jester@phrixus.net>
+2002/04/04 Fixed /stats l output.
+ Reported by lucas <lucas@langochat.net>
+
+Epona Version 1.4.10
+--------------------
+2002/02/27 Fixed the bug in MemoServ SEND that was also fixed
+ in ircservices.
+2002/02/27 Added missing channel name to ChanServ ACCESS and xOP
+ log messages.
+ Reported by David Narayan <jester@phrixus.net>
+2002/02/25 Enhanced the UsePrivmsg/SET MSG feature.
+2002/02/25 Another bugfix in create_mask().
+ Reported by Olfan <public@crononautas.com>
+2002/02/25 Fixed a bug in the SQLINE command that could make
+ OperServ report that a channel SQLINE is covered
+ by a nickname SQLINE, hence preventing the
+ addition.
+ Reported by Laurent <laurent@langochat.net>
+2002/02/24 OperServ RAW is now disabled by default.
+2002/02/24 Updated the FAQ (about HostServ and OperServ RAW).
+
+Epona Version 1.4.9
+-------------------
+2002/01/13 Fixed an harmless bug causing ChanServ to send multiple
+ (S)JOINs for its CSInhabit feature.
+ Reported by lucas <lucas@langochat.net>
+2002/01/13 Made OperServ KILLCLONES always kill real host, to avoid
+ killing users with the same vanity-host.
+ Reported by Magnet <magnet@epiknet.org>
+2002/01/13 Fixed bad snprintf parameters order in tr.l.
+ Reported by Reha BÝÇER <reha@showtvnet.com>
+2002/01/13 Fixed(?) a weird bug in create_mask()... hopefully.
+2002/01/04 Added a Catalan language file.
+ Submitted by the AUJAC.
+
+Epona Version 1.4.8
+-------------------
+2001/12/09 Extended the NSSecureAdmins configuration directive to
+ apply to FORBID too.
+2001/11/20 Updated Turkish language file.
+ Submitted by Guven Guzelbey <guzelbey@cs.utk.edu>
+2001/11/18 Fixed the bug of thread support affecting Epona compiled
+ for glibc 2.1 and less on linux.
+2001/11/10 Added support for Bahamut 1.4.30: channel mode M
+ and the new NS, CS, MS, OS and HS messages.
+2001/11/08 Made notice_help() take care of the SET MSG option.
+ Reported by David Narayan <jester@phrixus.net>
+2001/11/08 ChanServ now sends a SJOIN instead of a JOIN on Bahamut-based
+ networks.
+2001/11/08 Fixed a bug in OperServ CLEARMODES.
+
+Epona Version 1.4.7
+-------------------
+2001/10/01 Default NickServ access list entry and ban masks are
+ now always formatted to not take care of the tilde in
+ username, so they match whether the identd has been
+ enabled or not.
+2001/10/01 Added missing *! when setting a ban of type 3. This
+ also fixes a memory leak when unsetting the ban.
+2001/10/01 Fixed create_mask() so that it handle IP hostnames
+ correctly.
+ Reported by Bob <azz2000@hotmail.com>
+2001/09/30 NSDefaultLanguage is now properly reloaded through
+ OperServ RELOAD.
+ Reported by MEAT <meat@epiknet.org>
+2001/09/30 NSDefaultLanguage now also applies to forbidden
+ nicknames.
+ Reported by MEAT <meat@epiknet.org>
+2001/09/30 Fixed portuguese BotServ HELP SET SYMBIOSIS.
+ Reported by Rafael Cerveira <papudo@interconect.com.br>
+2001/09/30 Adjusted informative notices for collide()'d nicks.
+ Reported by MEAT <meat@epiknet.org>
+
+Epona Version 1.4.6
+-------------------
+2001/09/23 Fixed a bug in version.sh when encryption is
+ enabled.
+2001/09/23 Fixed a bug in ChanServ CLEAR MODES happening
+ on Unreal and Ultimate only.
+ Reported by Hurricane <hurricane@ifrance.com>
+
+Epona Version 1.4.5
+-------------------
+2001/09/07 ChanServ won't set automatically +o on users
+ that get +q or +a on join anymore (because
+ of certain exotic levels configuration).
+2001/09/07 Made ChanServ TOPIC be usable by services admins.
+2001/08/26 Channel mode +f of Unreal now supports the *x:x
+ format for its parameter.
+2001/08/26 Removed hard-coded references to NickServ and
+ ChanServ in language files.
+2001/08/24 Updated the Turkish language file.
+ Submitted by CafeiN <oytuny@yahoo.com>
+2001/08/24 Added ProxyCheckHTTP3 configuration directive to
+ scan proxy on port 80.
+
+Epona Version 1.4.4
+-------------------
+2001/08/19 Made ChanServ also log SET XOP and LEVELS uses.
+2001/08/19 Added compile flags to the /version output.
+2001/08/19 OperServ commands manipulating channel modes
+ now override all ChanServ protections (such as
+ SET SECUREOPS, SET MLOCK, etc).
+2001/08/19 Removed references to SET TOPIC in the language
+ files.
+2001/08/19 Fixed various topic issues in ChanServ for Unreal
+ and Dreamforge.
+2001/08/19 Fixed another bug in ChanServ AKICK (UN)STICK.
+ Reported by Alvaro Toledo <atoledo@keldon.org>
+2001/08/15 Made ChanServ log access level additions.
+
+Epona Version 1.4.3
+-------------------
+2001/08/12 Fixed a bug in OperServ list ranges.
+2001/08/12 Fixed a bug in the AKICK STICK command.
+2001/08/12 Fixed a bug in ChanServ SET MLOCK, that happens
+ only on Unreal networks.
+ Reported by Austin <austin1@uni.de>
+
+Epona Version 1.4.2
+-------------------
+2001/08/08 A fix for UnrealIRCd NICK handling (sometimes sent
+ with only 7 parameters ?! oh well).
+ Reported by Benjamin <benjamin@chat-solutions.org>
+2001/08/07 In an attempt to make the configure script clearer,
+ I added the DumpCore and NetworkDomain configuration
+ directives.
+2001/08/06 Bots from BotServ now set themselves the mode +a
+ again on channels they join.
+ Reported by CyberScream <cyberscream@wondernet.nu>
+2001/08/05 Updated the Spanish language file.
+ Submitted by Alvaro Toledo <atoledo@keldon.org>
+
+Epona Version 1.4.1
+-------------------
+2001/08/02 Fixed two potential bugs in the AKICK system.
+2001/08/01 Fixed help for BotServ SET PRIVATE that was not
+ displayed.
+ Reported by SpiderWeb <Spider.Web@Laposte.net>
+
+Epona Version 1.4.0
+-------------------
+2001/07/23 Added support for Ultimate 2.8x.
+2001/07/23 Rewritten Unreal support entirely, using parts of
+ the Sequana hostmasking support. Unreal is now
+ officially supported again.
+2001/07/21 Added modes field to OperServ CHANLIST command.
+2001/07/21 Made NickServ/ChanServ FORBID change nick/clear
+ the channel if it is currently used.
+2001/07/21 Removed Ultimate 3.x support, since its development
+ has restarted. Cleanup of levels as well.
+2001/07/20 Added ChanServ SET PEACE option.
+2001/07/20 Added an INFO level for free consultation
+ of /chanserv INFO #chan ALL.
+2001/07/20 Optimized processing of non fantasy channel
+ messages.
+2001/07/20 Modified some help string to make them reflect
+ the truth.
+2001/07/20 Added AOP/SOP/VOP commands to ChanServ (one of
+ the most requested features, but far from being
+ my favourite).
+ You can't use both xOP and access lists at the
+ same time, you have to choose between them via
+ the new ChanServ SET XOP command.
+ These are newbie-friendly commands, and
+ therefore should be enabled by default.
+2001/07/20 Services admins can now use ACCESS ADD/DEL/CLEAR
+ without having a level on the channel (please
+ use this feature ethically =).
+2001/07/19 Made lang/index generate automatically through
+ Makefile.
+2001/07/18 Removed the CSRestrictDelay directive in ChanServ,
+ that is now useless due to the use of services
+ timestamp, and was dangerous anyways.
+2001/07/18 Removed the useless privilege for IRC operators that
+ were never deopped automatically by ChanServ (by
+ SECUREOPS or when they join an empty registered channel
+ for example).
+2001/07/18 Made OperServ JUPE send a SQUIT before introducing
+ the juped server because of so many reported
+ crashes when people don't care. If you're using
+ Bahamut, a better alternative to JUPE is to use
+ SZLINE. ;)
+2001/07/18 Made the LocalAddress directive actually work, it
+ wasn't working even before Epona was born.
+2001/07/18 Renamed ChanServ SET TOPIC to TOPIC so it can have a
+ dedicated level, and added ChanServ BAN command.
+2001/07/18 Added ChanServ AKICK STICK command.
+2001/07/13 Added NSMaxAliases directive to limit the number of
+ nicks in the same group.
+2001/07/10 Finally fixed the BotServ HELP SET SYMBIOSIS bug (the
+ message was cut =) -- this alone is worth the upgrade :P
+2001/07/10 /me are now handled correctly by BotServ kickers (ie. the
+ CTCP part is cut before processing the message).
+ Reported by Benjamin <benjamin@chat-solutions.org>
+2001/07/10 Used Bahamut new CAPAB NICKIP feature in the proxy scanner
+ so it doesn't need to resolve the hostnames.
+2001/07/08 Made some cleanup in proxy code.
+2001/07/01 Rewritten OP/DEOP and other pairs in an easily extensible
+ way.
+2001/06/30 Added OperServ SQLINE command. It will also support
+ Bahamut channel SQLINEs. However, bahamut 1.4.27
+ or later is required.
+2001/06/29 You needed a registered nick to use the privileges
+ given by ChanServ IDENTIFY, which is not the expected
+ behaviour. Fixed.
+2001/06/27 Changed stuff in configure for libpthread detection.
+2001/06/27 Fixed a bug in BotServ UNASSIGN.
+ Reported by lbr <lbr@langochat.net>
+2001/06/26 Added BotServ SET PRIVATE option for bots that need
+ to be oper-only.
+ Suggested by a lot of people :P
+2001/06/23 Added OperServ RANDOMNEWS.
+ Suggested by lucas <lucas@langochat.net>
+2001/06/21 Added the ability to set the default language for
+ non/newly-registered users in services.conf.
+2001/06/09 Rewritten do_sjoin so that it doesn't do useless things
+ sometimes.
+2001/05/20 Added more support for Sequana in do_nick().
+2001/05/20 Changed stuff in do_sjoin to make it easily extensible.
+2001/05/04 New more efficient channel modes handling.
+2001/05/04 Changed whosends() to a macro.
+2001/04/22 Fixed check_kick() not making ChanServ join the channel
+ if empty with Bahamut.
+2001/04/22 Fixed a bug that caused the existence of channels with
+ no users in certain cases.
+2001/04/06 Added support for services ids, allowing users to be
+ automatically re-identified after a split. It also prevents
+ the logon news to be resent for users that were already
+ there before the split.
+2001/04/06 Fixed a bug in NickServ that was not refreshing the last
+ seen time after a nick change.
+ Reported by Lucas <lucas@langochat.net>
+2001/04/05 Faster is_oper().
+2001/04/05 Improved the way the NICK command is handled with Bahamut,
+ it's now a LOT faster (and cleaner).
+2001/04/05 Added ProxyAkillReason directive, and more information
+ to some other proxy-related directives.
+ Suggested by Yougli <Yougli@free.fr>
+2001/04/05 Got rid of the usercount() function (should have been
+ done for months but I was just too lazy/busy).
+2001/02/24 More bugfixes in Sequana support.
+2001/02/24 NickServ usermask is now updated when an user changes
+ his nick to a nick from the same group.
+2001/02/16 Fixed a bug in the Sequana support.
+2001/02/16 Added configuration directives to specify what type of
+ detection must be done by the proxy detector.
+2001/02/16 NickServ now prevents users from trying too many invalid
+ passwords for NickServ GROUP.
+ Reported by Blaire <lisa-bot@lookat.org>
+2001/02/16 Fixed OperServ HELP RELOAD that pointed to HELP UPDATE.
+ Reported by Raynor <raynor@ministre.net>
+2001/02/16 Fixed BotServ HELP SET DONTKICKVOICES that spoke
+ about SET DONTKICKOPS in the French language file.
+ Reported by Night <Night04@netcourrier.com>
+2001/02/09 More support for Sequana.
+2001/02/09 Made the code compile without thread support (oops).
+2001/02/09 Added support for Sequana IRCd.
+2001/02/03 Changed the way bot greets are said.
+2001/01/28 Made is_services_root faster. It is also now fully
+ group-compatible. is_services_admin and is_services_operator
+ have been optimized as well.
+2001/01/25 SOCKS5 detector is now much more reliable.
+2001/01/22 Made some fixes to the proxy detector.
+2001/01/21 Added a full featured proxy detector (detects Wingate,
+ SOCKS4, SOCKS5, and even HTTP proxy!). It comes along with
+ the CACHE command in OperServ, and several configuration
+ directives.
+2001/01/21 Made the KILLCLONES command available to Services operators.
+2001/01/17 Made some cleanup to main.c, it's more readable now.
+2001/01/15 Made converter and core settings cachable in the configure
+ script.
+
+Epona Version 1.3.7
+-------------------
+2001/04/22 Added German and Spanish language files.
+
+Epona Version 1.3.6
+-------------------
+2001/03/09 Fixed a stupid bug in NickServ SET (oops).
+
+Epona Version 1.3.5
+-------------------
+2001/03/07 The Epona official IRC channel (for bug reports ONLY)
+ is not on the Kewl IRC network anymore, it's now
+ on irc.langochat.net (see the README for details).
+2001/03/07 Fixed bugs in NickServ ACCESS, SET, RECOVER, RELEASE,
+ GHOST, GETPASS and SENDPASS that caused Epona to crash
+ if they were used for forbidden nicks.
+ Reported (for RECOVER/RELEASE/GHOST) by
+ Vernom <vernom@sistec.com.mx>.
+2001/03/07 Fixed a bug in the turkish language file (damn, damn.)
+ Reported by so much people that I was in fact
+ flooded :P
+
+Epona Version 1.3.4
+-------------------
+2001/01/27 Fixed the timed_update evil crash, and a big memory leak as
+ a bonus. Another funny joke from Andy Church.
+ Reported by many people, so I thank them all.
+ I'd like also to say a special thank to Daniel Engel
+ <dane@zero.org> for his help in chasing this bug.
+
+Epona Version 1.3.3
+-------------------
+2001/01/22 Added a Portuguese language file.
+ Submitted by Marcelo Conde Foscarini <ircadmin@brmarket.net>
+
+Epona Version 1.3.2
+-------------------
+2001/01/18 Fixed the bug that was causing an infinite loop in Services if
+ someone tried to delete a very high range of records from
+ a numbered list.
+
+Epona Version 1.3.1
+-------------------
+2001/01/12 Updated mirror list in the INSTALL file.
+2001/01/11 Fixed the bug that made Epona crash when a Services
+ admin tried to drop a forbidden channel.
+ Reported by [Flop] <flop@oscfg.com>
+
+Epona Version 1.3.0
+-------------------
+2001/01/07 The Turkish language file was updated by CafeiN
+ <oytuny@yahoo.com>
+2001/01/06 Integrated patches for the Ultimate 3.0 basic support from
+ ShadowMaster <ShadowMaster@Shadow-Realm.Org>
+2001/01/02 Added NickServ SET MSG command, to be used with UsePrivmsg.
+2001/01/02 Made small fixes to AKILL/SGLINE/SZLINE commands.
+ Reported by ShadowMaster <ShadowMaster@Shadow-Realm.Org>
+2000/12/23 Fixed various things in the do_nick function, and added
+ a log message if an user remains identified after a nick
+ change.
+2000/12/23 Fixed a bug that allowed users to pass through the NickServ
+ protection option.
+ Reported by Daniel Engel <dane@zero.org>
+2000/12/14 Oops.. DreamForge/Unreal support was dumping core.
+2000/12/13 Made ChanServ SET TOPIC work with Unreal.
+2000/12/12 Corrected a few bugs in NickServ.
+2000/12/07 Cleanup of the FAQ file.
+2000/12/07 Cleanup of README file. KnownBugs renamed to BUGS.
+2000/12/06 Added an INSTALL file. Anyone willing to correct my poor
+ English? ;)
+2000/12/06 Added a crontab script.
+2000/12/05 Added BSDef... configuration directives.
+2000/12/05 Channels with a '@' in their name are not ignored by BotServ
+ anymore.
+2000/12/05 Bots now correctly reply to channel pings.
+2000/12/04 Added a database converter for ircservices-4.4. Deleted the
+ (not working anymore) database converter for Daylight 4.3.3.
+2000/12/04 Corrected a bug that would make Services segfault while loading
+ configuration file with certain versions of glibc.
+2000/12/03 Added CSDef... configuration directives.
+2000/12/02 Deleted SET LEAVEOPS command from ChanServ, because it's
+ just a big security hole maker.
+2000/12/02 Added CLIST command to ChanServ.
+2000/12/02 Added more Wall... configuration directives.
+2000/12/02 Added NOOP command to OperServ.
+2000/12/01 Corrected a little bug in the !seen command.
+2000/12/01 Services now use SVSMODE #chan -b nick on Bahamut networks
+ to unban an user, so they are now fully supporting the
+ somewhat different Bahamut ban system.
+2000/12/01 AKILL ADD, SGLINE ADD and SZLINE ADD now can change the
+ expiry time of an existing entry, but only if the new one
+ is longer than the old one.
+2000/11/30 NickServ GHOST, RECOVER and RELEASE now can be used without
+ a password, as long as you are identified and in the group
+ of the target nick.
+2000/11/30 Enhanced documentation for NickServ REGISTER and GROUP
+ commands.
+2000/11/27 NickServ LIST does not hide the nicks that are in the
+ group of the user issuing the command anymore if they have
+ SET PRIVATE ON. The same applies to usermasks and SET HIDE
+ USERMASK.
+2000/11/27 Added "remote" drop feature for nicks within the same
+ group of the user issuing the command.
+2000/11/27 Channels in use cannot expire anymore. However, their last
+ used time is still not updated while they're in use.
+2000/11/27 Made some needed cleanup in config.h.
+2000/11/26 Added BSGentleBWReason configuration directive.
+ Suggested by ShadowMaster <ShadowMaster@Shadow-Realm.org>
+2000/11/26 Added UsePrivmsg configuration directive.
+ Suggested by ShadowMaster <ShadowMaster@Shadow-Realm.org>
+2000/11/26 Made password encryption work again.
+2000/11/26 delnick was not cleaning NickServ timeouts... another
+ Churchery?
+2000/11/25 Made CLEAR OPS and CLEAR VOICES work correctly again.
+ Reported by TataZ <tataz@thepentagon.com>
+2000/11/24 Added NSNoGroupChange configuration directive. Its purpose
+ is easy to guess I think. =)
+2000/11/24 Deleted the obsolete HelpDir configuration directive.
+2000/11/24 NSDisableLink not used anymore; deleting it.
+2000/11/23 Few bugs of the new link system corrected.
+2000/11/22 New link system that is more efficient -- I let you discover
+ all the diffs! =) The GROUP, GLIST and SET DISPLAY commands
+ have been added to handle it.
+ The LINK, UNLINK, and LISTLINKS commands were all deleted
+ because they are not needed anymore.
+ The NoSplitRecovery config setting has been deleted, it is
+ always enabled now -- the code was buggy anyway.
+ NSExpireMaster and NSExpireSlaves are now only one setting,
+ NSExpire, like before, because there are no more master
+ and slave nicks.
+ During the conversion to the new system I corrected many bugs
+ and weird things in the code (especially two memory leaks when
+ freeing akick and nick structures). NickServ has now a faster
+ hash list -- this will greatly help on large networks.
+2000/11/22 Added SENDPASS to ChanServ help index.
+2000/11/21 Moved changes from (irc)services to the Changes.old file, as the
+ Changes file started to be really big.
+2000/11/14 Corrected another bug during nick deletion... If a nick was founder
+ of a channel and was also on the access list of the same channel ->
+ access list entry was not cleaned -> it crashed.
+2000/11/12 Channel successors were not cleaned on nick deletion. Oh well.
+2000/11/12 Linked nicks now have a working SET PRIVATE.
+ Reported by garner <garner@voila.fr>
+2000/11/11 Fixed some weird behaviour with certain compiler versions
+ in ChanServ ACCESS and AKICK lists.
+ Reported by lanxin <webmaster@nidenet.com>
+2000/10/28 Corrected ChanServ behavior for resetting last used
+ time. Was when someone was autoopped on JOIN before,
+ is whenever someone from the ACCESS list uses the
+ channel in any way now, because there are cases where
+ nobody gets autoopped at all.
+2000/10/26 Added SGLINE and SZLINE commands to OperServ (works
+ with latest Bahamut only).
+2000/10/25 Rewritten the OperServ AKILL command code. There cannot
+ be two times the same host anymore, and the command
+ will check whether the added AKILLs are already covered
+ by another or not. The bug in the AKILL wallops has
+ been fixed as well.
+ Additionally, AKILLs are now stocked in the OperServ
+ database (not in a dedicated database anymore).
+2000/10/23 Fixed OperServ RELOAD to make it reset all directives to 0
+ before reloading the config file (when this was not done
+ some settings were not reloaded correctly if not present).
+2000/10/23 Corrected the problem that caused some services admins list
+ entries to be "like a ghost" in wrong-way links.
+2000/10/10 Corrected some weird behavior when unlinking from a nick.
+2000/10/09 Changed the way channel user modes are handled, so it can
+ be easily extended.
+2000/10/06 Corrected some cosmetic problems in the language files.
+
+Epona Version 1.2.6
+-------------------
+2000/12/13 Made ChanServ SET TOPIC work with Unreal.
+2000/12/07 Fixed bugs in MemoServ when accessing memos from forbidden
+ channels.
+ Reported by ZeRo K <zero@townsito.net> and others later.
+
+Epona Version 1.2.5
+-------------------
+2000/11/06 For those who ask... Version 1.3.0 is currently being
+ developped. Don't know when it will go out though, but
+ probably in the beginning of December (no promises though).
+ I know it's a long time to wait but.. I'm coding Epona
+ during my free time that is not so huge currently. I know
+ you want more and more new features, but doing something
+ that does not crash every five minutes takes time for
+ coding AND testing.
+ Btw.. This version is probably the most stable ever.
+2000/11/06 Services does not segfault anymore when DEF_LANGUAGE
+ is not LANG_EN_US.
+ Reported by Firou <I've not his mail>.
+2000/11/03 Critical bug fixed in NickServ ... probably one that
+ had make the whole services crash periodically.
+2000/11/03 Fixed a bug in ChanServ DROP that was making the Services
+ crash when a non Services admin user tried to drop a
+ forbidden channel.
+2000/11/03 Fixed the bug in encryption (buffers needed to be
+ filled with zero).
+2000/10/27 Added support for channel modes +u, +C and +G from
+ Unreal 3.1. Probably more things soon.
+2000/10/23 Added support for +O channel mode from Bahamut.
+
+Epona Version 1.2.4
+-------------------
+2000/10/07 Fixed bugs in fantaisist commands.
+ Special thanks to the channel #rezo@kewl.org,
+ SeB <seb@kewl.org> and lbr <lbr@loopback0.net>
+
+Epona Version 1.2.3
+-------------------
+2000/09/11 Added a reference to BotServ in HelpServ HELP.
+2000/09/10 Services admin and Services operator lists are now sorted
+ alphabetically.
+2000/09/09 Epona now runs correctly on FreeBSD 5.0.
+
+Epona Version 1.2.2
+-------------------
+2000/09/05 Make -log command line option work again.
+2000/09/05 Turkish language file is finally back.
+2000/08/30 OP/DEOP/VOICE/DEVOICE/HALFOP/DEHALFOP/PROTECT/DEPROTECT/KICK
+ now have a check to make sure the target user is on the channel.
+
+Epona Version 1.2.1
+-------------------
+2000/08/30 Fixed the bug in ADMIN ADD that was making the whole
+ services to crash when the admin list is empty.
+
+Epona Version 1.2.0
+-------------------
+2000/08/27 Fixed a bug that was preventing the use of BADWORDS CLEAR
+ without a keyword.
+ Reported by Galak <thegalak@hotmail.com>
+2000/08/19 Fixed a bug in automatic akill in session limiting code
+ that used the nick of one user that is being killed
+ instead of OperServ.
+2000/08/19 OperServ lists are now cleaned up when a nick is dropped.
+2000/08/14 Added ChanServ SET SIGNKICK command.
+2000/08/14 Complete rewrite of the OperServ ADMIN and OPER commands. They
+ look like a "standard" numbered list now.
+2000/08/01 Added MaxSessionKill and SessionAutoKillExpiry configuration
+ directives.
+2000/07/31 Added "is a services operator", "is a services admin" status
+ line to NickServ INFO.
+2000/07/31 Added CLEARMODES to OperServ help index.
+2000/07/31 Switched KillAkillUsers to AkillOnAdd. Different behavior too.
+2000/07/31 Added ChanServ LOGOUT command.
+2000/07/30 Added the possibility to have a GLOBOPS raised when using the
+ OperServ RAW command.
+2000/07/30 Added NOTIFY info to MemoServ INFO command.
+2000/07/30 Added NickServ LOGOUT command.
+2000/07/28 MemoServ now shows to Services Admins whether the limit is
+ hard or not in /memoserv INFO <nick>.
+2000/07/28 Changed the behavior of NickServ LISTLINKS ALL to also show
+ the direct link of the nick being looked up. It looks like
+ something usable now (finally ;).
+2000/07/28 Forbidden channels cannot receive memos anymore.
+2000/07/28 Forbidden nicknames cannot be set founder or successor
+ anymore, cannot be added to access or akick list anymore,
+ and cannot receive memos anymore.
+2000/07/28 Added a confirmation notice for OperServ CLEARMODES.
+ Also, ALL parameter for CLEARMODES is now case
+ insensitive.
+2000/07/28 Fixed a bug in EXCEPTION DEL reply.
+2000/07/28 AKILL ADD now won't add masks that are only composed
+ of ~@.*?.
+2000/07/26 Fixed a cosmetic bug in the Services' WHOIS reply.
+2000/07/26 Channel successor cannot be the same nick as channel
+ founder anymore.
+2000/07/26 Default level for ACC-CHANGE is now 10.
+2000/07/26 Changed the way Services operators and admins are
+ handled. Although it's not totally finished yet
+ (but it works), it's already faster.
+2000/07/25 Added SET NOBOT option to BotServ.
+2000/07/25 Added ChanServ KICK command (with KICK and KICKME
+ levels).
+ Suggested (for over a year ;) by
+ Geo <geoffroy@geo.ouega.net>
+2000/07/25 Added NickServ SET ICQ command.
+ Suggested by Jack <jack@irc.kewl.org>
+2000/07/25 Added OperServ RELOAD command to allow configuration
+ file to be dynamically reloaded.
+ Suggested by Crow <crow@german-elite.net>
+2000/07/25 Added SHUTDOWN to OperServ help index.
+2000/07/24 Corrected ChanServ SENDPASS so it can now send
+ the password to the founder if it's a linked (slave)
+ nick.
+ Reported by shiva <aqua22@informaticien.org>
+2000/07/24 Restricted BotServ INFO #channel to founder
+ and Services admins only (maybe should I
+ think to implement a INFO level in the future?).
+2000/07/14 Color kicker can now be used on Bahamut and
+ Unreal networks. Although there is a mode +c
+ that *should* be used to prevent the use of
+ colors on the channel, some users have noticed
+ me that it does not make access level distinction.
+ Too right. :)
+2000/07/14 Added the !seen command to the fantaisist
+ commands.
+2000/07/12 Again changed the way AKILLs are handled on
+ Bahamut. Hopefully for the last time.
+2000/07/12 Added a reference to LISTLINKS in NickServ HELP.
+2000/07/12 Changed NickServ HELP output to reflect changes
+ in expiration system.
+2000/06/27 NSExpire has been broken into NSExpireMaster and
+ NSExpireSlaves.
+2000/06/23 If compiled for Bahamut, Epona will now use SVSKILL
+ instead of KILL for the GHOST and "Too many invalid
+ passwords" kills.
+2000/06/23 Networks that use Bahamut now need to use at least
+ the version 1.4.3 for Epona to work fine.
+
+Epona Version 1.1.4
+-------------------
+2000/07/07 Added Turkish language file.
+ Submitted by PRoLoGiC <oytuny@yahoo.com>
+
+Epona Version 1.1.3
+-------------------
+2000/06/20 One more time corrected the way BotServ uses AKILL on
+ Bahamut networks.
+2000/06/19 Corrected how MemoServ notifies online users of their
+ new memos that failed in certain cases if MSNotifyAll
+ is set. One more time, I'm asking myself how the heck
+ the link support was coded.
+ Reported by wezen <wezen@ifrance.com>
+2000/06/18 Fixed another bug in SJOIN processing that affects only
+ networks that use BotServ (and that have no luck ;).
+ Reported by acta <hackta@wanadoo.fr>
+2000/06/14 OperServ AKILL command is now case insensitive.
+ Reported by ShadWolf <netruner@bocal.cs.univ-paris8.fr>
+2000/06/14 Fixed a bug in SJOIN processing that may cause problems
+ on big channels.
+
+Epona Version 1.1.2
+-------------------
+2000/06/09 Added a 'For more info' notice in NickServ INFO.
+ This was needed because of the huge changement introduced
+ by the original Services maintainer. This
+ will certainly be removed in a future release.
+ Suggested by Lucas <lucas@ians.be>
+2000/06/09 Bots are now stocked in a hash list (increased speed
+ and alphabetical order in the list ;)
+2000/06/07 Corrected the way BotServ uses AKILL on Bahamut since
+ the command format has changed.
+ Reported by Lucas <lucas@ians.be>
+
+Epona Version 1.1.1
+-------------------
+2000/06/06 Corrected the way BotServ bots remove bans that match
+ them when they're on the channel.
+ Reported by p0lo <ping@com.bi>
+2000/06/06 Added !dehalfop, !deprotect, !halfop, !protect as
+ fantaisist commands in Unreal mode.
+2000/06/05 Finished Unreal support.
+2000/06/05 Added OPDEOPME level.
+2000/06/03 Corrected a bug that was preventing users to use
+ NickServ SENDPASS on linked nicks.
+2000/06/02 Services now sets -r on an user when it changes its
+ nick and he is not identified for.
+ Reported by AdRi <adri@pegirc.com>
+2000/06/02 Added KillAkillUsers configuration directive.
+ Suggested by Lucas <lucas@kewl.org>
+2000/05/31 Corrected a little bug that had make ChanServ LIST not
+ work anymore for wildcard masks.
+ Reported by Mars <mars@freemail.chatarea.net>
+2000/05/29 Changed the behaviour of NickServ INFO in some ways,
+ considering that nick options are only interesting
+ for the nick owner (and services admin); also, the nick
+ owner is now extended to the nick itself and its links.
+ ChanServ INFO adopts the same rules, but for channel
+ founder. Also, topic is not displayed anymore in INFO
+ if the channel has the mode s locked or the channel
+ is in +s mode.
+
+Epona Version 1.1.0
+-------------------
+2000/05/29 Corrected a bug in SJOIN handling code.
+ Reported by Peter <striker@zip.com.au>
+2000/05/27 Help for MemoServ SET LIMIT now shows all their killer
+ functionalities to Services admins.
+2000/05/27 The greet message in NickServ INFO is now only shown to
+ the nick owner.
+2000/05/27 This is not a new feature of Epona, BUT irc.kewl.org (500 users
+ network) now uses Epona, with BotServ feature enabled - and
+ it works fine! ;)
+2000/05/25 Rewritten Bahamut SJOIN handling, runs faster now especially
+ on large channels during a netjoin. Also it now works fine on
+ channels that have +k or +l mode set. ;)
+2000/05/23 Updated NickServ and ChanServ mem stats routines.
+2000/05/23 BSSmartJoin improved: the bot (virtually) invites itself
+ before joining when the channel is in +i mode or +l mode
+ if users limit has been reached.
+2000/05/23 Services now remove the old Q line for a bot when its nick
+ is changed.
+2000/05/23 Services now logs links/unlinks and password changes in
+ NickServ, as well as successor and password changes in
+ ChanServ.
+2000/05/23 Services admins can now register as many channels as they
+ want.
+ Suggested by Peter <striker@zip.com.au>
+2000/05/23 Rewritten is_services_root thingies, that was crashing on
+ some systems.
+2000/05/21 Improved the way BotServ removes bans when BSSmartJoin is
+ enabled.
+2000/05/21 Rewritten BADWORDS ADD command to allow words with spaces
+ (without breaking the old syntax).
+2000/05/21 Added "Linked to:" in NickServ INFO.
+2000/05/21 ChanServ ACCESS LIST and AKICK LIST/VIEW as well as BotServ
+ BADWORDS LIST now make case insensitive comparaison when a
+ mask is specified.
+2000/05/21 Added STATS C and STATS O replies.
+2000/05/21 BotServ now displays the channels a bot is on when a
+ Services admin uses the (BotServ) INFO command on a bot.
+2000/05/19 Added initial support for UnrealIRCd; not complete now.
+ Those who use Unreal, PLEASE make any suggestion on what
+ has been done and what should be done to epona@pegirc.com.
+2000/05/19 Changed "binary" mode handling system, so new modes can
+ be added quickly.
+2000/05/13 Added HelpChannel configuration directive.
+2000/05/13 ChanServ now saves who added an akick and when; this can be
+ seen with the AKICK VIEW command.
+2000/05/13 Added ChanServ SET SECUREFOUNDER.
+2000/05/13 Added ChanServ SET BANTYPE to control how ChanServ places bans
+ on the channel.
+2000/05/12 NickServ now changes the nick of nicknames that are forbidden
+ immediately.
+2000/05/12 Forbids now handle a reason, that can be make required
+ using configuration directive ForceForbidReason; also
+ forbid setter and reason are shown to IRC operators in
+ NickServ INFO output.
+2000/05/12 Added databases backup subsystem, controlled by the
+ configuration directive KeepBackups.
+2000/05/12 Log files are now located in logs directory. There is
+ a different log file used for each day. Also added the
+ KeepLogs configuration directive. Old log rotating stuff
+ in OperServ has been removed.
+2000/05/12 There can now be more than one Services Root defined in
+ configuration file.
+2000/05/12 Added ChanServ ACCESS CLEAR, AKICK CLEAR and BotServ
+ BADWORDS CLEAR.
+2000/05/11 Fixed BotServ BADWORDS LIST so it can be accessed by Services
+ admins on any channel.
+2000/05/11 BotServ BADWORDS LIST command now gives the type used to
+ add the word.
+2000/05/11 Added ChanServ GETKEY commands.
+2000/05/11 Added VOICE and DEVOICE commands to ChanServ, along with
+ two new levels VOICE and VOICEME; these levels now also control
+ the access to !voice and !devoice fantaisist commands.
+2000/05/11 Added STATS RESET command to OperServ.
+2000/05/11 Added MailDelay configuration directive.
+2000/05/11 Added command line -noexpire option and OperServ SET
+ NOEXPIRE option.
+ From TODO, suggested by Martin Butler <ibm@qualitynet.org>
+2000/05/11 Added MemoServ CANCEL command.
+2000/05/10 Corrected AKICK ENFORCE (silly :) bug.
+2000/05/10 Added NickServ SET GREET command, as well as BotServ SET
+ GREET command, and a GREET level in ChanServ.
+
+Epona Version 1.0.0
+-------------------
+2000/05/10 Bot now parts the channel when it is dropped.
+2000/05/10 Fixed an extremely crashing bug in BotServ BADWORDS stuff.
+ If you experienced segmentation fault on PRIVMSG the bug
+ should be fixed.
+ (Thanks come especially to Sysop_Mars
+ <mars@freemail.chatarea.net>, and all others that helped
+ me to find out the bug and fix it)
+2000/04/07 Added NickServ and ChanServ SENDPASS.
+2000/04/03 Added OperServ USERLIST and CHANLIST commands.
+ Suggested by Peter <striker@zip.com.au>
+2000/03/20 Added !unban command in the fantaisist commands.
+ Suggested by illusions <illusions@axs2k.net>
+2000/03/19 Fixed a bug in NickServ LINK that was allowing everybody
+ taking the target nick to be identified for it
+ automatically.
+2000/03/16 ChanServ LIST now hides channels that have the PRIVATE flag.
+ Reported by Peter <striker@zip.com.au>
+
+Epona Version 1.0pre2
+---------------------
+2000/03/15 ChanServ OP and DEOP commands have been modified (see
+ their help topic for more information on the new
+ syntaxs).
+2000/03/15 ChanServ SET PRIVATE has now its help topic accessible.
+2000/03/14 Completed BotServ HELP and HELP SET topics.
+2000/03/14 Added a configuration file option to force users to
+ give an e-mail when they register a nickname. It will
+ also ask already registered nicks for an e-mail when
+ they identify. Also, the REGISTER command has an
+ optional parameter email if this option is not enabled.
+2000/03/14 NickServ SET URL and SET EMAIL are now finally shared
+ between linked nicks.
+2000/03/14 Fixed a NickServ memory leak (it was not freeing the
+ email and url fields when a nick record was being deleted).
+2000/03/14 Changed the behavior of expire_nicks, that was updating
+ the last seen time of an user being online whether it
+ was recognized or not.
+2000/03/14 Added support for the SIDENTIFY command in NickServ.
+2000/03/12 BotServ BOT DEL now removes the Q line make for the
+ bot when it was created.
+2000/03/12 Added WallDrop and WallForbid configuration file options.
+2000/03/12 Added BotServ SAY and ACT commands.
+2000/03/12 Fixed the broken routine that loads the (very) old
+ ChanServ databases (it didn't initialize BotServ stuff).
+2000/03/12 BotServ KICK COLORS now won't work on Bahamut networks
+ anymore. Users should use the channel mode 'c' instead.
+
+Epona Version 1.0pre1
+---------------------
+2000/03/11 Added SET SYMBIOSIS command in BotServ.
+2000/03/11 Added SET FANTASY command in BotServ.
+2000/03/09 Corrected tiny bug that was making SQLINE for bots
+ in the wrong way.
+2000/03/09 Added SET DONTKICKOPS and SET DONTKICKVOICES commands in BotServ
+ to protect those ops and voice who aren't in the
+ access list (or not with the right level) against bot's
+ kicks.
+2000/03/09 BotServ now generates an error when an unknown option
+ is used in KICK command.
+2000/03/09 Optimized the way BotServ counts users on a channel.
+2000/03/02 Added a French language file.
+2000/03/02 Corrected some strings in language files.
+
+Epona Version 1.0pre0
+---------------------
+2000/02/23 Updated OperServ memory stats to reflect the changes
+ provided by BotServ.
+2000/02/23 Just finished first version of BotServ.
+2000/02/20 Fixed an exploit in do_nick(), that is usable in certain
+ conditions with linked nicks, see users.c for details.
+2000/02/19 HelpServ rewritten, now delivering messages depending
+ of users' language.
+2000/02/19 Removed irciihelp, not very useful nowadays. Heck, every
+ IRC clients are provided with an help file, so why
+ must we serve one?
+2000/02/19 NickServ now will always change nick instead of kill users
+ -- since it is really more efficient.
+2000/02/19 Fixed collide() problem that caused nick collision.
+2000/02/19 Fixed problem of ChanServ CLEAR MODES and OperServ CLEARMODES
+ not unsetting mode 'R'.
+2000/02/19 Corrected WHOIS output not giving right the end of WHOIS.
+2000/02/19 Added SQLINE support.
+2000/02/19 Corrected tiny bug in the command sent when an enforcer
+ is created.
+2000/02/19 Added Bahamut support. Hope it will work.
+2000/02/19 Removed support for all IRCd except dal4.4.15+. Epona
+ will definitely be dedicated to those using Dreamforge
+ or official successors.
+2000/02/19 Here starts the life of Epona. ;)
diff --git a/Changes.conf b/Changes.conf
new file mode 100644
index 000000000..e3f68fb5b
--- /dev/null
+++ b/Changes.conf
@@ -0,0 +1,428 @@
+Anope Version 1.6.0
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+###########################################################################
+#
+# DefCon configuration
+#
+###########################################################################
+# DefConLevel <level> [OPTIONAL]
+# Default defcon level (1-5) to use when starting services up, level 5
+# instructs services to run as normal.
+
+#DefConLevel 5
+
+# DefCon1-4 <numeric> [REQUIRED if Defcon is activated]
+# These numercics determine which of the following operations take place
+# at each level, the correct numeric can be found by adding together the
+# number for each restriction you wish to place at a level.
+# No new channel registrations 1
+# No New Nick Registrations 2
+# No MLOCK changes 4
+# Force Chan Mode 8
+# Use Reduced Session Limit 16
+# KILL any new clients trying to connect 32
+# Services will ignore everyone but opers 64
+# Services will silently ignore everyone but opers 128
+# AKILL all new clients trying to connect 256
+# No new memos sent to block memoserv attacks 512
+
+#DefCon4 23
+# No channel reg + No Nick Reg + No MLOCK changes + Use Reduced Session Limit
+# 1 + 2 + 4 + 16
+
+#DefCon3 31
+# As DefCon4 + Services will Force Chan Mode's on channels
+# 23 + 8
+
+#DefCon2 159
+# As DefCon3 + Services will silently ignore everyone but opers
+# 32 + 128
+
+#DefCon1 415
+# As DefCon2 + AKILL all new clients trying to connect
+# 159 + 256
+
+# DefConSessionLimit <limit> [REQUIRED if DefCon is activated]
+# New session limit to use when a defcon level is using "reduced"
+# session limiting.
+# NOTE: When using DefCon this value needs to be defined
+#DefConSessionLimit 2
+
+# DefConAkillExpire <time> [REQUIRED if DefCon is activated]
+# Length of time to add the AKILL for when DEFCON is preventing
+# all new clients from connecting to the network
+#
+# NOTE: As with all expire times, the expirey check will only be
+# carried out once every "ExpireTimeout" so if this setting is
+# 30m the the akill could last for 30m regardless of this setting.
+#
+# NOTE: When using DefCon this value needs to be defined
+#DefConAkillExpire 5m
+
+# DefConChanModes <modes> [REQUIRED if DefCon is activated]
+# The channel modes to set on all channel's when the DefCon channel
+# mode system is in use.
+#
+# NOTE: Choose these modes carefully, because when defcon switches to
+# a level which does NOT have the mode setting selected, services will
+# set the reverse on all channel's, e.g. if this setting is +RN
+# when defcon is used all channel's will be set to +RN, when
+# defcon is removed, channels will all be set to -RN. You don't
+# want to set this to +k for example because when defcon is removed all
+# channels will -k.
+# NOTE: mlock'ed modes will not be lost
+#DefConChanModes "+R"
+
+# DefConTimeOut <time> [OPTIONAL]
+# This value can be used to automaticaly return the network to
+# defcon 5 after the specified time period - just in case any opers
+# forget to remove a defcon setting.
+#DefConTimeOut 15m
+
+# GlobalOnDefcon [OPTIONAL]
+#
+# Setting this directive will make Services send a global message on
+# Defcon Level changes.
+#GlobalOnDefcon
+
+# GlobalOnDefconMore [OPTIONAL]
+#
+# Setting this directive will make Services send a global message on
+# Defcon Level changes. Uncommenting this will allow you to send along
+# with the new level, the DefconMessage.
+#GlobalOnDefconMore
+
+#DefconMessage "Put your message to send your users here. Dont forget to uncomment GlobalOnDefconMore"
+
+# DefConOffMessage [OPTIONAL]
+#
+# If this is defined, it will be used in place of GlobalOnDefcon and
+# GlobalOnDefconMore when defcon is returned to level 5
+#DefConOffMessage "Services are now back to normal, sorry for any inconvenience"
+
+# DefConAkillReason <text> [REQUIRED if DefCon is activated]
+#
+# When using DEFCON this setting will be used when any clients are killed
+# or akilled from the network by defcon
+#
+#DefConAkillReason "This network is currently not accepting connections, please try again later"
+
+###########################################################################
+#
+# MySQL configuration
+#
+###########################################################################
+#
+# Mysql [OPTIONAL]
+#
+# Your MySQL configuration for use with Anope.
+# To disable MySQL functionality, just comment out this block.
+# To make use of MySQL use these directives and change their
+# setting to the appropiate values.
+#
+# MysqlHost defines the Mysql server hostname.
+# MysqlUser defines the Mysql user to log in with.
+# MysqlPass defines the Mysql pass required for the specified user to log in.
+# MysqlName defines the Mysql database name Anope uses
+# MysqlSock defines the Mysql UNIX socket
+# MysqlPort defines the Mysql TCP port
+#
+#MysqlHost "localhost"
+#MysqlUser "Anonymous"
+#MysqlPass ""
+#MysqlName "anope"
+#MysqlSock "/tmp/mysql.sock"
+#MysqlPort 3306
+
+# MysqlSecure "<des>|<md5>|<sha>|<key>" [OPTIONAL]
+#
+# Method for storing passwords on MySQL. Available methods are:
+# Empty or not set will save your passwords as clear text.
+# des : Encrypt using a simple DES algorithm.
+# md5 : Produces the md5 hash for the password.
+# sha : Calculates the checksum using a Secure Hash Algorithm.
+# key : Encodes using "key" as password.
+# Please read docs/MYSQL file for more info and details.
+#
+#MysqlSecure ""
+
+# MysqlRetries <value> [OPTIONAL]
+# MysqlRetryGap <value> [OPTIONAL]
+#
+# These values let you define how often and with how much interruption Anope
+# shall retry to open a connection when losing the contact to the mysql db.
+# The product of these values must be between 1 and 60.
+#
+#MysqlRetries 10
+#MysqlRetryGap 1
+
+###########################################################################
+#
+# Module configuration
+#
+###########################################################################
+#
+# ModuleAutoload [OPTIONAL]
+#
+# When compiled with module support, this contains a space seperated list
+# of modules to automaticaly load as soon as possible, e.g. IRCD support modules.
+#
+#ModuleAutoload "hs_moo ircd_defizzer"
+
+# ModuleDelayedAutoload [OPTIONAL]
+#
+# When compiled with module support, this contains a space seperated list
+# of modules to automaticaly load when services are ready for new clients.
+# e.g. new pesudo clients such as CatServ :-) *meow*
+#
+#ModuleDelayedAutoload "ircd_catserv"
+
+###########################################################################
+#
+# Misc configuration
+#
+###########################################################################
+# AnonymousGlobal [OPTIONAL]
+# hides the oper's nick in a globalmsg
+#AnonymousGlobal
+
+# DontQuoteAddresses [OPTIONAL]
+#
+# When enabled, services will not attempt to "" the TO: fields in mails
+#
+# So far we only know of ESMTP which needs this set.
+#
+#DontQuoteAddresses
+
+# If services can't connect to the RemoteServer, they will try
+# RemoteServer2 (if defined). If they can't connect to RemoteServer2,
+# they will use RemoteServer3 (if defined).
+RemoteServer localhost 6667 "mypass"
+#RemoteServer2 localhost 6667 "mypass"
+#RemoteServer3 localhost 6667 "mypass"
+
+# NSRestrictGetPass [OPTIONAL]
+#
+# When enabled, services will only allow Services Root to use the getpass
+# command on a nick.
+#
+#NSRestrictGetPass
+
+# CSRestrictGetPass [OPTIONAL]
+#
+# When enabled, services will only allow Services Root to use the getpass
+# command on a channel.
+#
+#CSRestrictGetPass
+
+# CSOpersOnly [OPTIONAL]
+# If this is defined, only IRC Operators will be permitted to use ChanServ.
+#CSOpersOnly
+
+# GlobalOnCycleMessage <text> [OPTIONAL]
+#
+# This is the message to global when using GlobalOnCycle
+#GlobalOnCycleMEssage "Services are restarting, they will be back shortley - please be good while were gone"
+
+# GlobalOnCycleUP <text> [OPTIONAL]
+#
+# if defined, this string will be globaled when services join the network
+#GlobalOnCycleUP "Services are now back online - have a nice day"
+
+# ChanKillExpiry <time> [REQUIRED]
+# Default /OS CHANKILL expire time
+ChanKillExpiry 7d
+
+# HostSetters <nicks> [DISCOURAGED]
+# Specifies the nicks of NON-OPERS allowed to Set/Remove vHosts using
+# HostServ. Can be re-loaded with /msg operserv reload
+# You can specify more than one nick by separating each one by a space.
+#
+# make sure you insert the correct nick(s) here..
+#HostSetters "rob dengel certus"
+
+Anope Version 1.4.18
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+# PreNickServDB prenick.db
+
+# NSEmailReg [OPTIONAL]
+# This option splits the nick registration into 2 steps, the first
+# after registering a email with a passcode is sent to the supplied
+# email address, this passcode needs to be entered with a confirm
+# command before the nick registration will be completed.
+#
+# You must have mail / forcemail set for this to work correctly.
+# It is also recommended that MailDelay be set to a sensible value
+# to prevent mail flooding
+
+# NSEmailReg
+
+# NSRExpire <time> [OPTIONAL]
+# Sets the length of time a user gets to enter the confirmation code
+# which has been e-mailed to them before the nick will be relased
+# for general use again
+
+# NSRExpire 1d
+
+# NSModeOnID [OPTIONAL]
+#
+# When enabled, services will set channel modes a user has when they identify
+#
+
+# NSModeOnID
+
+# HideStatsO [OPTIONAL]
+#
+# Setting this directive will make Services only show Stats O to
+# IRC Operators.
+
+#HideStatsO
+
+# GlobalOnCycle [OPTIONAL]
+#
+# Setting this directive will make Services send global messages on
+# starting up and shuting down/restarting.
+
+#GlobalOnCycle
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+# NetworkDomain <name> [OPTIONAL]
+#
+# If your network has a common domain name, specify it there (for
+# example, all IRCZONE servers have a name ending in ".irczone.cl",
+# so "irczone.cl" would be set there. It will be used by the OperServ
+# GLOBAL command, and if you don't have a common domain name, this
+# command may just not work.
+#
+# You can specify more than one Network Domain by separating each one by
+# a space: NetworkDomain "localnet.net localnet.com"
+NetworkDomain "localnet.com"
+
+AnopeVersion 1.4.26
+--------------------------
+** ADDED CONFIGURATION DIRECTIVES **
+# DontQuoteAddresses [OPTIONAL]
+#
+# When enabled, services will not attempt to "" the to fields in mails
+#
+# So far we only know of ESMTP which needs this set.
+#
+
+#DontQuoteAddresses
+
+Anope Version 1.4.18
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+# PreNickServDB prenick.db
+
+# NSEmailReg [OPTIONAL]
+# This option splits the nick registration into 2 steps, the first
+# after registering a email with a passcode is sent to the supplied
+# email address, this passcode needs to be entered with a confirm
+# command before the nick registration will be completed.
+#
+# You must have mail / forcemail set for this to work correctly.
+# It is also recommended that MailDelay be set to a sensible value
+# to prevent mail flooding
+
+# NSEmailReg
+
+# NSRExpire <time> [OPTIONAL]
+# Sets the length of time a user gets to enter the confirmation code
+# which has been e-mailed to them before the nick will be relased
+# for general use again
+
+# NSRExpire 1d
+
+# NSModeOnID [OPTIONAL]
+#
+# When enabled, services will set channel modes a user has when they identify
+#
+
+# NSModeOnID
+
+# HideStatsO [OPTIONAL]
+#
+# Setting this directive will make Services only show Stats O to
+# IRC Operators.
+
+#HideStatsO
+
+# GlobalOnCycle [OPTIONAL]
+#
+# Setting this directive will make Services send global messages on
+# starting up and shuting down/restarting.
+
+#GlobalOnCycle
+
+Anope Version 1.4.16
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+HostServName "HostServ" "vHost Server"
+HostServDB hosts.db
+HostServAlias "HostServ2" "Vhostname Server Forwarder"
+
+** MODIFIED CONFIGURATION DIRECTIVES **
+
+# ForceForbidReason [OPTIONAL]
+#
+# If set, Services will require a reason when a forbid is added, else
+# the reason is optional. This directive also applies to SUSPENDed
+# channels as well.
+
+ForceForbidReason
+
+** DELETED CONFIGURATION DIRECTIVES **
+
+Anope Version 1.4.15
+--------------------
+** ADDED CONFIGURATION DIRECTIVES **
+
+# ...Alias <nick> <string> [OPTIONAL]
+# Specify alternate nicknames for services. When a user will /msg
+# NickServAlias sthing, it will be forwarded to NickServName, and
+# NickServName will answer. This can be used to ease the migration
+# from another network, for example if your services are called
+# NickKeeper, ChanKeeper, etc ... and the other network calls them
+# NickServ, ChanServ, etc ...
+
+NickServAlias "NickServ2" "Nickname Server Forwarder"
+ChanServAlias "ChanServ2" "Channel Server Forwarder"
+MemoServAlias "MemoServ2" "Memo Server Forwarder"
+BotServAlias "BotServ2" "Bot Server Forwarder"
+HelpServAlias "HelpServ2" "Help Server Forwarder"
+OperServAlias "OperServ2" "Operator Server Forwarder"
+GlobalAlias "Global2" "Global Noticer Forwarder"
+#DevNullName "DevNull2" "/dev/null -- message sink Forwarder"
+
+# LogChannel <channel> [OPTIONAL]
+#
+# When defined, services will output log messages to this channel.
+# IMPORTANT: This can be a security risk so make certain this channel
+# is sufficiently protected from normal access.
+
+#LogChannel "#services"
+
+# LogChannel [OPTIONAL]
+#
+# When defined, services will output all BotServ chatter to the defined
+# LogChan above. It shows all uses of BotServ ACT and SAY commands. Note
+# that there is no logging to the log file. Only works is LogChannel is
+# also defined.
+
+#LogBot
+
+# SuperAdmin [OPTIONAL]
+# Having this flag enabled will turn all Services Admin to have Founder
+# level on *all* registered channels.
+
+#SuperAdmin
+
+# AddAkiller [OPTIONAL]
+# Adds the nickname of the Operator issuing an AKILL to the kill reason.
+#
+
+AddAkiller
diff --git a/Changes.lang b/Changes.lang
new file mode 100644
index 000000000..320280a11
--- /dev/null
+++ b/Changes.lang
@@ -0,0 +1,963 @@
+Anope Version 1.6.0
+--------------------
+
+New Strings:
+ CHAN_HELP_ULTIMATE3
+ DEFCON_GLOBAL
+ END_OF_ANY_LIST
+ HELP_HELP_HOST
+ HOST_DELALL
+ HOST_DELALL_SYNTAX
+ HOST_HELP_DELALL
+ HOST_LIST_FOOTER
+ HOST_LIST_KEY_FOOTER
+ HOST_LIST_RANGE_FOOTER
+ HOST_OPER_HELP
+ MEMO_HELP_ADMIN
+ MEMO_HELP_FOOTER
+ MEMO_HELP_OPER
+ MEMO_HELP_SENDALL
+ MEMO_HELP_STAFF
+ MEMO_MASS_SENT
+ MODULE_HELP_HEADER
+ NICK_ALREADY_IDENTIFIED
+ NICK_GETEMAIL_EMAILS_ARE
+ NICK_GETEMAIL_NOT_USED
+ NICK_GETEMAIL_SYNTAX
+ NICK_HELP_UPDATE
+ NICK_LOGOUT_SERVICESADMIN
+ NICK_SERVADMIN_HELP_GETEMAIL
+ NICK_UPDATE_SUCCESS
+ NICK_X_ILLEGAL
+ NICK_X_IN_USE
+ NICK_X_TRUNCATED
+ OPER_CHANKILL_SYNTAX
+ OPER_DEFCON_CHANGED
+ OPER_DEFCON_DENIED
+ OPER_DEFCON_NO_CONF
+ OPER_DEFCON_SYNTAX
+ OPER_DEFCON_WALL
+ OPER_HELP_ADMIN_CMD
+ OPER_HELP_CHANKILL
+ OPER_HELP_DEFCON
+ OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ OPER_HELP_DEFCON_NO_NEW_MEMOS
+ OPER_HELP_DEFCON_NO_NEW_NICKS
+ OPER_HELP_DEFCON_OPER_ONLY
+ OPER_HELP_DEFCON_REDUCE_SESSION
+ OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ OPER_HELP_LOGGED
+ OPER_HELP_MODINFO
+ OPER_HELP_MODLIST
+ OPER_HELP_MODLOAD
+ OPER_HELP_MODUNLOAD
+ OPER_HELP_OPER_CMD
+ OPER_HELP_ROOT_CMD
+ OPER_HELP_SVSNICK
+ OPER_MODULE_CMD_LIST
+ OPER_MODULE_INFO_LIST
+ OPER_MODULE_INFO_SYNTAX
+ OPER_MODULE_LIST
+ OPER_MODULE_LOADED
+ OPER_MODULE_LOAD_FAIL
+ OPER_MODULE_LOAD_SYNTAX
+ OPER_MODULE_MSG_LIST
+ OPER_MODULE_NO_INFO
+ OPER_MODULE_NO_LIST
+ OPER_MODULE_REMOVE_FAIL
+ OPER_MODULE_UNLOADED
+ OPER_MODULE_UNLOAD_SYNTAX
+ OPER_STAFF_AFORMAT
+ OPER_STAFF_FORMAT
+ OPER_STAFF_LIST_HEADER
+ OPER_SVSNICK_NEWNICK
+ OPER_SVSNICK_SYNTAX
+
+Modified strings (need to be re-translated):
+ BOT_ASSIGN_ALREADY
+ CHAN_HELP_LOGOUT
+ CHAN_HELP_ULTIMATE
+ CHAN_SERVADMIN_HELP_LOGOUT
+ HOST_ENTRY
+ HOST_HELP_DEL
+ HOST_HELP_LIST
+ HOST_HELP_SET
+ HOST_IDENT_ENTRY
+ HOST_OPER_HELP
+ MEMO_HELP
+ NICK_HELP_DROP
+ OPER_HELP
+ OPER_HELP_ADMIN
+ OPER_HELP_UMODE
+
+Anope Version 1.4.22
+--------------------
+New strings:
+ OPER_JUPE_HOST_ERROR
+ CHAN_UNSUSPEND_ERROR
+
+Anope Version 1.4.21
+--------------------
+New strings:
+ BOT_BAD_NICK
+ BOT_BAD_HOST
+ BOT_BAD_IDENT
+ HOST_SET_IDENT_ERROR
+
+Modified strings (need to be re-translated):
+ HOST_SET_ERROR
+
+Anope Version 1.4.18
+--------------------
+New strings:
+ MEMO_X_MANY_NOTICE
+ MEMO_X_ONE_NOTICE
+ MEMO_NEW_X_MEMO_ARRIVED
+ MEMO_CHAN_DELETED_ALL
+ NICK_REQUESTED
+ NICK_IS_PREREG
+ NICK_ENTER_REG_CODE
+ NICK_CONFIRM_NOT_FOUND
+ NICK_CONFIRM_INVALID
+ NICK_REG_MAIL_SUBJECT
+ NICK_REG_MAIL_HEAD
+ NICK_REG_MAIL_LINE_1
+ NICK_REG_MAIL_LINE_2
+ NICK_REG_MAIL_LINE_3
+ NICK_REG_MAIL_LINE_4
+ NICK_REG_MAIL_LINE_5
+ HOST_HELP_GROUP
+ HOST_IDENT_GROUP
+ HOST_GROUP
+ NICK_REG_RESENT
+ NICK_REG_UNABLE
+ NICK_GETPASS_PASSCODE_IS
+ NICK_FORCE_REG
+ BOT_EXCEPT
+ OPER_IGNORE_SYNTAX
+ OPER_IGNORE_VALID_TIME
+ OPER_IGNORE_TIME_DONE
+ OPER_IGNORE_PERM_DONE
+ OPER_IGNORE_DEL_DONE
+ OPER_IGNORE_LIST_NOMATCH
+ OPER_IGNORE_LIST_CLEARED
+ OPER_HELP_IGNORE
+ OPER_HELP_UMODE
+ OPER_HELP_OLINE
+ OPER_UMODE_SYNTAX
+ OPER_OLINE_SYNTAX
+ OPER_OLINE_SUCCESS
+ OPER_SUPER_ADMIN_ON
+ OPER_SUPER_ADMIN_OFF
+ OPER_SUPER_ADMIN_SYNTAX
+ OPER_SUPER_ADMIN_WALL_ON
+ OPER_SUPER_ADMIN_WALL_OFF
+ OPER_UMODE_SUCCESS
+ OPER_UMODE_CHANGED
+ OPER_SUPER_ADMIN_ONLY
+ OPER_HELP_SET_SUPERADMIN
+ OPER_OLINE_IRCOP
+
+Modified strings (need to be re-translated):
+ HOST_HELP
+ NICK_LIST_SERVADMIN_SYNTAX
+ MEMO_HELP_DEL
+ OPER_HELP
+ OPER_HELP_SET
+
+Deleted strings:
+
+
+Anope Version 1.4.17
+--------------------
+New strings:
+ NICK_INFO_VHOST
+ HOST_SET_ERROR
+ HOST_SET_TOOLONG
+ NICK_ALIST_SYNTAX
+ NICK_ALIST_HEADER
+ NICK_ALIST_HEADER_X
+ NICK_ALIST_XOP_FORMAT
+ NICK_ALIST_ACCESS_FORMAT
+ NICK_ALIST_FOOTER
+ NICK_HELP_ALIST
+ NICK_SERVADMIN_HELP_ALIST
+ HOST_IDENT_SET
+ HOST_IDENT_SETALL
+ HOST_SET_IDENTTOOLONG
+ HOST_IDENT_ACTIVATED
+ HOST_NO_VIDENT
+
+Modified strings (need to be re-translated):
+ RAW_DISABLED
+ HOST_OFF_UNREAL
+ HOST_HELP_SET
+ HOST_HELP_SETALL
+
+Deleted strings:
+ CHAN_CLIST_SYNTAX
+ CHAN_CLIST_HEADER
+ CHAN_CLIST_FORMAT
+ CHAN_CLIST_FOOTER
+ CHAN_ALIST_SYNTAX
+ CHAN_ALIST_HEADER
+ CHAN_ALIST_XOP_FORMAT
+ CHAN_ALIST_AXS_FORMAT
+ CHAN_ALIST_FOOTER
+ CHAN_HELP_CLIST
+ CHAN_HELP_ALIST
+
+Anope Version 1.4.16
+--------------------
+New strings:
+ CHAN_X_SUSPENDED
+ CHAN_AOP_MOVED
+ CHAN_HOP_MOVED
+ CHAN_SOP_MOVED
+ CHAN_VOP_MOVED
+ CHAN_ACCESS_LIST_XOP_FORMAT
+ CHAN_ACCESS_LIST_AXS_FORMAT
+ CHAN_ALIST_SYNTAX
+ CHAN_ALIST_HEADER
+ CHAN_ALIST_XOP_FORMAT
+ CHAN_ALIST_AXS_FORMAT
+ CHAN_ALIST_FOOTER
+ CHAN_CLEARED_EXCEPTS
+ CHAN_FORBID_REASON
+ CHAN_SUSPEND_SYNTAX
+ CHAN_SUSPEND_SYNTAX_REASON
+ CHAN_SUSPEND_SUCCEEDED
+ CHAN_SUSPEND_FAILED
+ CHAN_SUSPEND_REASON
+ CHAN_UNSUSPEND_SYNTAX
+ CHAN_UNSUSPEND_SUCCEEDED
+ CHAN_UNSUSPEND_FAILED
+ CHAN_EXCEPTED
+ CHAN_HELP_CLIST
+ CHAN_HELP_ALIST
+ CHAN_SERVADMIN_HELP_SUSPEND
+ CHAN_SERVADMIN_HELP_UNSUSPEND
+ HOST_EMPTY
+ HOST_ENTRY
+ HOST_SET
+ HOST_SETALL
+ HOST_NOREG
+ HOST_SET_SYNTAX
+ HOST_SETALL_SYNTAX
+ HOST_DENIED
+ HOST_NOT_ASSIGNED
+ HOST_ACTIVATED
+ HOST_ID
+ HOST_NOT_REGED
+ HOST_DEL
+ HOST_DEL_SYNTAX
+ HOST_OFF_UNREAL
+ HOST_HELP
+ HOST_OPER_HELP
+ HOST_ADMIN_HELP
+ HOST_HELP_ON
+ HOST_HELP_SET
+ HOST_HELP_SETALL
+ HOST_HELP_OFF
+ HOST_HELP_DEL
+ HOST_HELP_LIST
+
+Modified strings:
+ CHAN_HELP
+ CHAN_CLIST_HEADER
+ CHAN_CLIST_FORMAT
+ CHAN_SERVADMIN_HELP
+ CHAN_SERVADMIN_HELP_LIST
+ CHAN_LIST_SERVADMIN_SYNTAX
+ CHAN_HELP_SET
+ CHAN_SERVADMIN_HELP
+
+Deleted strings:
+ CHAN_SERVADMIN_HELP_CLIST
+ CHAN_ACCESS_LIST_FORMAT
+ CHAN_XOP_ALREADY_EXISTS
+
+Anope Version 1.4.15
+--------------------
+New strings:
+ RAW_DISABLED
+ CHAN_ACCESS_LIST_FOOTER
+ OPER_SET_LOGCHAN_ON
+ OPER_SET_LOGCHAN_OFF
+ OPER_SET_LOGCHAN_ERROR
+ OPER_HELP_SET_LOGCHAN
+
+Modified strings:
+ OPER_HELP_SET
+
+Epona Version 1.4.0
+-------------------
+New strings:
+ BOT_BOTLIST_FOOTER
+ BOT_BOTLIST_PRIVATE_HEADER
+ BOT_INFO_BOT_OPTIONS
+ BOT_INFO_OPT_PRIVATE
+ BOT_SERVADMIN_HELP_SET_PRIVATE
+ BOT_SET_PRIVATE_...
+ CHAN_ACCESS_XOP
+ CHAN_AKICK_STUCK
+ CHAN_AKICK_UNSTUCK
+ CHAN_AKICK_VIEW_FORMAT_STUCK
+ CHAN_AOP_...
+ CHAN_HELP_AOP
+ CHAN_HELP_BAN
+ CHAN_HELP_DEOWNER
+ CHAN_HELP_HOP
+ CHAN_HELP_OWNER
+ CHAN_HELP_SET_PEACE
+ CHAN_HELP_SET_XOP
+ CHAN_HELP_SOP
+ CHAN_HELP_VOP
+ CHAN_HELP_TOPIC
+ CHAN_HOP_...
+ CHAN_INFO_OPT_OPNOTICE
+ CHAN_INFO_OPT_PEACE
+ CHAN_INFO_OPT_XOP
+ CHAN_LEVEL_BANME
+ CHAN_LEVEL_BAN
+ CHAN_LEVEL_INFO
+ CHAN_LEVEL_TOPIC
+ CHAN_LEVELS_XOP
+ CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ CHAN_SET_MLOCK_K_REQUIRED
+ CHAN_SET_PEACE_...
+ CHAN_SET_XOP_...
+ CHAN_SOP_...
+ CHAN_TOPIC_SYNTAX
+ CHAN_VOP_...
+ CHAN_XOP_...
+ NEWS_HELP_RANDOM
+ NEWS_RANDOM_...
+ NEWS_RANDOM_TEXT
+ NICK_GROUP_TOO_MANY
+ NICK_X_NOT_ON_CHAN
+ OPER_CACHE_...
+ OPER_HELP_CACHE
+ OPER_HELP_SQLINE
+ OPER_SQLINE_...
+ OPER_STATS_PROXY_MEM
+ OPER_STATS_SQLINE_...
+
+Modified strings:
+ BOT_HELP_INFO
+ BOT_HELP_SET_SYMBIOSIS
+ BOT_SERVADMIN_HELP_SET
+ CHAN_AKICK_SYNTAX
+ CHAN_AKICK_LIST_FORMAT
+ CHAN_HELP
+ CHAN_HELP_AKICK
+ CHAN_HELP_CLEAR
+ CHAN_HELP_DEHALFOP
+ CHAN_HELP_DEOP
+ CHAN_HELP_DEPROTECT
+ CHAN_HELP_DEVOICE
+ CHAN_HELP_HALFOP
+ CHAN_HELP_INFO
+ CHAN_HELP_INVITE
+ CHAN_HELP_KICK
+ CHAN_HELP_OP
+ CHAN_HELP_PROTECT
+ CHAN_HELP_SET
+ CHAN_HELP_SET_MLOCK
+ CHAN_HELP_VOICE
+ CHAN_HELP_ULTIMATE
+ CHAN_HELP_UNREAL
+ CHAN_HELP_UNBAN
+ NO_REASON
+ OPER_CHANLIST_HEADER
+ OPER_CHANLIST_HEADER_USER
+ OPER_CHANLIST_RECORD
+ OPER_HELP
+ OPER_HELP_KILLCLONES
+ OPER_HELP_JUPE
+
+Deleted strings:
+ CHAN_HELP_ADMIN
+ CHAN_HELP_DEADMIN
+ CHAN_HELP_SET_TOPIC
+ CHAN_LEVEL_ADMIN
+ CHAN_LEVEL_ADMINME
+ CHAN_LEVEL_AUTOADMIN
+ CHAN_MLOCK_REMOVED
+ CHAN_NO_AOP_SOP
+ CHAN_SET_MLOCK_FLOOD_REQUIRED
+ CHAN_SET_MLOCK_KEY_REQUIRED
+ CHAN_SET_MLOCK_LIMIT_POSITIVE
+ CHAN_SET_MLOCK_LIMIT_REQUIRED
+ CHAN_SET_MLOCK_REDIRECT_REQUIRED
+ CHAN_SET_TOPIC_FAILED
+ NICK_INFO_LINKED_TO
+
+Epona Version 1.3.0
+-------------------
+New strings:
+ CHAN_LEVEL_ADMIN
+ CHAN_LEVEL_ADMINME
+ CHAN_LEVEL_AUTOADMIN
+ BOT_REASON_BADWORD_GENTLE
+ CHAN_CLIST_...
+ CHAN_HELP_ADMIN
+ CHAN_HELP_DEADMIN
+ CHAN_HELP_ULTIMATE
+ CHAN_SERVADMIN_HELP_CLIST
+ EXPIRES_...
+ MAIL_X_INVALID
+ NICK_HELP_GLIST
+ NICK_HELP_GROUP
+ NICK_HELP_SET_DISPLAY
+ NICK_HELP_SET_MSG
+ NICK_IDENTIFY_EMAIL_HOWTO
+ NICK_INFO_OPT_MSG
+ NICK_GLIST_...
+ NICK_GROUP_...
+ NICK_SERVADMIN_HELP_GLIST
+ NICK_SET_DISPLAY_...
+ NICK_SET_MSG_...
+ NICK_SET_OPTION_DISABLED
+ OBSOLETE_COMMAND
+ OPER_AKILL_EXISTS
+ OPER_AKILL_ALREADY_COVERED
+ OPER_AKILL_REACHED_LIMIT
+ OPER_AKILL_CHANGED
+ OPER_AKILL_NO_MATCH
+ OPER_AKILL_DELETED
+ OPER_AKILL_DELETED_ONE
+ OPER_AKILL_DELETED_SEVERAL
+ OPER_AKILL_LIST_EMPTY
+ OPER_AKILL_VIEW_HEADER
+ OPER_AKILL_CLEAR
+ OPER_HELP_NOOP
+ OPER_HELP_SGLINE
+ OPER_HELP_SZLINE
+ OPER_NOOP_...
+ OPER_SGLINE_...
+ OPER_STATS_ALIASES_MEM
+ OPER_STATS_GROUPS_MEM
+ OPER_STATS_SGLINE_...
+ OPER_STATS_SZLINE_...
+ OPER_SZLINE_...
+
+Modified strings:
+ CHAN_HELP
+ CHAN_ACCESS_LIST_FORMAT
+ CHAN_SERVADMIN_HELP
+ NICK_HELP
+ NICK_HELP_DROP
+ NICK_HELP_EXPIRES
+ NICK_HELP_GHOST
+ NICK_HELP_RECOVER
+ NICK_HELP_REGISTER
+ NICK_HELP_RELEASE
+ NICK_HELP_SET
+ NICK_IDENTIFY_EMAIL_REQUIRED
+ NICK_SERVADMIN_HELP
+ NICK_SERVADMIN_HELP_DROP
+ OPER_ADMIN_LIST_FORMAT
+ OPER_AKILL_SYNTAX
+ OPER_AKILL_ADDED
+ OPER_AKILL_NOT_FOUND
+ OPER_AKILL_LIST_HEADER
+ OPER_AKILL_LIST_FORMAT
+ OPER_AKILL_VIEW_FORMAT
+ OPER_OPER_LIST_FORMAT
+ OPER_HELP
+ OPER_HELP_AKILL
+
+Deleted strings:
+ CHAN_HELP_SET_LEAVEOPS
+ CHAN_INFO_OPT_LEAVEOPS
+ CHAN_SET_LEAVEOPS_...
+ NICK_DROP_SYNTAX
+ NICK_HELP_LINK
+ NICK_HELP_UNLINK
+ NICK_LINK_SYNTAX
+ NICK_LINK_DISABLED
+ NICK_LINK_FAILED
+ NICK_LINK_CIRCULAR
+ NICK_LINKED
+ NICK_LISTLINKS_SYNTAX
+ NICK_LISTLINKS_HEADER
+ NICK_LISTLINKS_FOOTER
+ NICK_NO_LINK_SAME
+ NICK_NOT_LINKED
+ NICK_SERVADMIN_HELP_LISTLINKS
+ NICK_SERVADMIN_HELP_UNLINK
+ NICK_UNLINK_SYNTAX
+ NICK_UNLINK_FAILED
+ NICK_UNLINKED
+ NICK_X_NOT_LINKED
+ NICK_X_UNLINKED
+ OPER_AKILL_ADD_SYNTAX
+ OPER_AKILL_DEL_SYNTAX
+ OPER_AKILL_REMOVED
+ OPER_AKILL_NO_EXPIRE
+ OPER_AKILL_EXPIRES_SOON
+ OPER_AKILL_EXPIRES_M
+ OPER_AKILL_EXPIRES_1M
+ OPER_AKILL_EXPIRES_HM
+ OPER_AKILL_EXPIRES_H1M
+ OPER_AKILL_EXPIRES_1HM
+ OPER_AKILL_EXPIRES_1H1M
+ OPER_AKILL_EXPIRES_D
+ OPER_AKILL_EXPIRES_1D
+ OPER_STATS_NICKSERV_MEM
+ OPER_TOO_MANY_AKILLS
+
+Epona Version 1.2.3
+-------------------
+New strings:
+ HELP_HELP_BOT
+
+Epona Version 1.2.0
+-------------------
+New strings:
+ BOT_INFO_OPT_NOBOT
+ BOT_SEEN_BOT
+ BOT_SEEN_YOU
+ BOT_SEEN_ON_CHANNEL
+ BOT_SEEN_ON_CHANNEL_AS
+ BOT_SEEN_ON
+ BOT_SEEN_NEVER
+ BOT_SEEN_UNKNOWN
+ BOT_SERVADMIN_HELP_SET
+ BOT_SERVADMIN_HELP_SET_NOBOT
+ BOT_SET_NOBOT_SYNTAX
+ BOT_SET_NOBOT_ON
+ BOT_SET_NOBOT_OFF
+ CHAN_HELP_KICK
+ CHAN_HELP_LOGOUT
+ CHAN_HELP_SET_SIGNKICK
+ CHAN_INFO_OPT_SIGNKICK
+ CHAN_LEVEL_KICKME
+ CHAN_LEVEL_KICK
+ CHAN_LOGOUT_SYNTAX
+ CHAN_LOGOUT_SERVADMIN_SYNTAX
+ CHAN_LOGOUT_SUCCEEDED
+ CHAN_LOGOUT_ALL_SUCCEEDED
+ CHAN_SERVADMIN_HELP_LOGOUT
+ CHAN_SET_SIGNKICK_SYNTAX
+ CHAN_SET_SIGNKICK_ON
+ CHAN_SET_SIGNKICK_LEVEL
+ CHAN_SET_SIGNKICK_OFF
+ CHAN_SUCCESSOR_IS_FOUNDER
+ DURATION_DAY
+ DURATION_DAYS
+ DURATION_HOUR
+ DURATION_HOURS
+ DURATION_MINUTE
+ DURATION_MINUTES
+ DURATION_SECOND
+ DURATION_SECONDS
+ MEMO_INFO_NOTIFY_OFF
+ MEMO_INFO_NOTIFY_ON
+ MEMO_INFO_NOTIFY_RECEIVE
+ MEMO_INFO_NOTIFY_SIGNON
+ MEMO_INFO_X_NOTIFY_OFF
+ MEMO_INFO_X_NOTIFY_ON
+ MEMO_INFO_X_NOTIFY_RECEIVE
+ MEMO_INFO_X_NOTIFY_SIGNON
+ NICK_HELP_EXPIRES
+ NICK_HELP_LOGOUT
+ NICK_HELP_SET_ICQ
+ NICK_INFO_ICQ
+ NICK_INFO_SERVICES_ADMIN
+ NICK_INFO_SERVICES_OPER
+ NICK_LOGOUT_SYNTAX
+ NICK_LOGOUT_SUCCEEDED
+ NICK_LOGOUT_X_SUCCEEDED
+ NICK_SERVADMIN_HELP_LOGOUT
+ NICK_SET_ICQ_CHANGED
+ NICK_SET_ICQ_UNSET
+ NICK_SET_ICQ_INVALID
+ OPER_ADMIN_CLEAR
+ OPER_ADMIN_DELETED
+ OPER_ADMIN_DELETED_ONE
+ OPER_ADMIN_DELETED_SEVERAL
+ OPER_ADMIN_LIST_EMPTY
+ OPER_ADMIN_LIST_FORMAT
+ OPER_ADMIN_NO_MATCH
+ OPER_ADMIN_REACHED_LIMIT
+ OPER_HELP_RELOAD
+ OPER_OPER_CLEAR
+ OPER_OPER_DELETED
+ OPER_OPER_DELETED_ONE
+ OPER_OPER_DELETED_SEVERAL
+ OPER_OPER_LIST_EMPTY
+ OPER_OPER_LIST_FORMAT
+ OPER_OPER_NO_MATCH
+ OPER_OPER_REACHED_LIMIT
+ OPER_RELOAD
+ USERHOST_MASK_TOO_WIDE
+
+Modified strings:
+ BOT_HELP_SET_FANTASY
+ CHAN_HELP
+ CHAN_HELP_SET
+ MEMO_INFO_X_HARD_LIMIT
+ NICK_HELP
+ NICK_HELP_SET
+ NICK_SERVADMIN_HELP
+ OPER_ADMIN_LIST_HEADER
+ OPER_HELP
+ OPER_HELP_ADMIN
+ OPER_HELP_OPER
+ OPER_OPER_LIST_HEADER
+
+Deleted strings:
+ BOT_KICK_NO_COLORS
+ NICK_HELP_EXPIRE_ZERO
+ OPER_ADMIN_ADD_SYNTAX
+ OPER_ADMIN_DEL_SYNTAX
+ OPER_ADMIN_REMOVED
+ OPER_ADMIN_TOO_MANY
+ OPER_OPER_ADD_SYNTAX
+ OPER_OPER_DEL_SYNTAX
+ OPER_OPER_REMOVED
+ OPER_OPER_TOO_MANY
+
+Epona Version 1.1.x
+-------------------
+New strings:
+ BOT_BADWORDS_CLEAR
+ BOT_HELP_SET_GREET
+ BOT_INFO_OPT_GREET
+ CHAN_ACCESS_CLEAR
+ CHAN_AKICK_VIEW_FORMAT
+ CHAN_AKICK_CLEAR
+ CHAN_FORBID_SYNTAX_REASON
+ CHAN_HELP
+ CHAN_HELP_DEVOICE
+ CHAN_HELP_DEHALFOP
+ CHAN_HELP_DEPROTECT
+ CHAN_HELP_GETKEY
+ CHAN_HELP_HALFOP
+ CHAN_HELP_PROTECT
+ CHAN_HELP_SET_BANTYPE
+ CHAN_HELP_SET_SECUREFOUNDER
+ CHAN_HELP_UNREAL
+ CHAN_HELP_VOICE
+ CHAN_INFO_BANTYPE
+ CHAN_INFO_OPT_SECUREFOUNDER
+ CHAN_LEVEL_AUTOHALFOP
+ CHAN_LEVEL_AUTOPROTECT
+ CHAN_LEVEL_GETKEY
+ CHAN_LEVEL_GREET
+ CHAN_LEVEL_HALFOPME
+ CHAN_LEVEL_HALFOP
+ CHAN_LEVEL_OPDEOPME
+ CHAN_LEVEL_PROTECTME
+ CHAN_LEVEL_PROTECT
+ CHAN_LEVEL_VOICEME
+ CHAN_LEVEL_VOICE
+ CHAN_LIST_SERVADMIN_SYNTAX
+ CHAN_SET_BANTYPE_INVALID
+ CHAN_SET_BANTYPE_CHANGED
+ CHAN_SET_MLOCK_FLOOD_REQUIRED
+ CHAN_SET_MLOCK_REDIRECT_REQUIRED
+ CHAN_SET_MLOCK_L_REQUIRED
+ CHAN_SET_SECUREFOUNDER_SYNTAX
+ CHAN_SET_SECUREFOUNDER_ON
+ CHAN_SET_SECUREFOUNDER_OFF
+ CHAN_X_FORBIDDEN_OPER
+ MEMO_HELP_CANCEL
+ MEMO_CANCEL_SYNTAX
+ MEMO_CANCEL_DISABLED
+ MEMO_CANCEL_NONE
+ MEMO_CANCELLED
+ NICK_FORBID_SYNTAX_REASON
+ NICK_HELP_SET_GREET
+ NICK_INFO_GREET
+ NICK_INFO_LINKED_TO
+ NICK_SET_GREET_CHANGED
+ NICK_SET_GREET_UNSET
+ NICK_X_FORBIDDEN_OPER
+ NO_REASON
+ OPER_HELP_SET_NOEXPIRE
+ OPER_SET_READONLY_ON
+ OPER_SET_READONLY_OFF
+ OPER_SET_READONLY_ERROR
+ OPER_STATS_RESET
+ UNKNOWN
+
+Modified strings:
+ BOT_BADWORDS_SYNTAX
+ BOT_BADWORDS_LIST_FORMAT
+ BOT_HELP_BADWORDS
+ BOT_HELP_SET
+ CHAN_ACCESS_SYNTAX
+ CHAN_AKICK_SYNTAX
+ CHAN_FORBID_SYNTAX
+ CHAN_HELP
+ CHAN_HELP_ACCESS
+ CHAN_HELP_AKICK
+ CHAN_HELP_FORBID
+ CHAN_HELP_SET
+ CHAN_SERVADMIN_HELP_LIST
+ MEMO_HELP
+ NICK_FORBID_SYNTAX
+ NICK_HELP_FORBID
+ NICK_HELP_SET
+ OPER_HELP_SET
+ OPER_HELP_STATS
+ NICK_LIST_SERVADMIN_SYNTAX
+
+Deleted strings:
+ OPER_HELP_ROTATELOG
+ OPER_ROTATELOG_*
+
+Epona Version 1.0x
+------------------
+Deleted strings:
+ CHAN_OP_SYNTAX
+ CHAN_DEOP_SYNTAX
+ DISCONNECT_IN_1_MINUTE
+ DISCONNECT_IN_20_SECONDS
+ DISCONNECT_NOW
+
+Modified strings:
+ CHAN_HELP_OP
+ CHAN_HELP_DEOP
+ NICK_HELP_REGISTER
+ NICK_HELP_SET
+ NICK_HELP_SET_KILL
+ NICK_INFO_OPT_KILL
+ NICK_REGISTER_SYNTAX
+ NICK_SET_KILL_ON
+ NICK_SET_KILL_QUICK
+ NICK_SET_KILL_IMMED
+ NICK_SET_KILL_OFF
+
+New strings:
+ BOT_DOES_NOT_EXIST
+ BOT_NOT_ASSIGNED
+ BOT_NOT_ON_CHANNEL
+ BOT_REASON_BADWORD
+ BOT_REASON_BOLD
+ BOT_REASON_CAPS
+ BOT_REASON_COLOR
+ BOT_REASON_FLOOD
+ BOT_REASON_REPEAT
+ BOT_REASON_REVERSE
+ BOT_REASON_UNDERLINE
+ BOT_BOT_SYNTAX
+ BOT_BOT_ALREADY_EXISTS
+ BOT_BOT_CREATION_FAILED
+ BOT_BOT_READONLY
+ BOT_BOT_ADDED
+ BOT_BOT_ANY_CHANGES
+ BOT_BOT_CHANGED
+ BOT_BOT_DELETED
+ BOT_BOTLIST_HEADER
+ BOT_BOTLIST_EMPTY
+ BOT_ASSIGN_SYNTAX
+ BOT_ASSIGN_READONLY
+ BOT_ASSIGN_ALREADY
+ BOT_ASSIGN_ASSIGNED
+ BOT_UNASSIGN_SYNTAX
+ BOT_UNASSIGN_UNASSIGNED
+ BOT_INFO_SYNTAX
+ BOT_INFO_NOT_FOUND
+ BOT_INFO_BOT_HEADER
+ BOT_INFO_BOT_MASK
+ BOT_INFO_BOT_REALNAME
+ BOT_INFO_BOT_CREATED
+ BOT_INFO_BOT_USAGE
+ BOT_INFO_CHAN_HEADER
+ BOT_INFO_CHAN_BOT
+ BOT_INFO_CHAN_BOT_NONE
+ BOT_INFO_CHAN_KICK_BADWORDS
+ BOT_INFO_CHAN_KICK_BOLDS
+ BOT_INFO_CHAN_KICK_CAPS_ON
+ BOT_INFO_CHAN_KICK_CAPS_OFF
+ BOT_INFO_CHAN_KICK_COLORS
+ BOT_INFO_CHAN_KICK_FLOOD_ON
+ BOT_INFO_CHAN_KICK_FLOOD_OFF
+ BOT_INFO_CHAN_KICK_REPEAT_ON
+ BOT_INFO_CHAN_KICK_REPEAT_OFF
+ BOT_INFO_CHAN_KICK_REVERSES
+ BOT_INFO_CHAN_KICK_UNDERLINES
+ BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ BOT_INFO_CHAN_KICK_BOLDS_BAN
+ BOT_INFO_CHAN_KICK_CAPS_BAN
+ BOT_INFO_CHAN_KICK_COLORS_BAN
+ BOT_INFO_CHAN_KICK_FLOOD_BAN
+ BOT_INFO_CHAN_KICK_REPEAT_BAN
+ BOT_INFO_CHAN_KICK_REVERSES_BAN
+ BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ BOT_INFO_ACTIVE
+ BOT_INFO_INACTIVE
+ BOT_INFO_CHAN_OPTIONS
+ BOT_INFO_OPT_DONTKICKOPS
+ BOT_INFO_OPT_DONTKICKVOICES
+ BOT_INFO_OPT_FANTASY
+ BOT_INFO_OPT_SYMBIOSIS
+ BOT_INFO_OPT_NONE
+ BOT_SET_SYNTAX
+ BOT_SET_DISABLED
+ BOT_SET_UNKNOWN
+ BOT_SET_DONTKICKOPS_SYNTAX
+ BOT_SET_DONTKICKOPS_ON
+ BOT_SET_DONTKICKOPS_OFF
+ BOT_SET_DONTKICKVOICES_SYNTAX
+ BOT_SET_DONTKICKVOICES_ON
+ BOT_SET_DONTKICKVOICES_OFF
+ BOT_SET_FANTASY_SYNTAX
+ BOT_SET_FANTASY_ON
+ BOT_SET_FANTASY_OFF
+ BOT_SET_SYMBIOSIS_SYNTAX
+ BOT_SET_SYMBIOSIS_ON
+ BOT_SET_SYMBIOSIS_OFF
+ BOT_KICK_SYNTAX
+ BOT_KICK_DISABLED
+ BOT_KICK_UNKNOWN
+ BOT_KICK_NO_COLORS
+ BOT_KICK_BAD_TTB
+ BOT_KICK_BADWORDS_ON
+ BOT_KICK_BADWORDS_ON_BAN
+ BOT_KICK_BADWORDS_OFF
+ BOT_KICK_BOLDS_ON
+ BOT_KICK_BOLDS_ON_BAN
+ BOT_KICK_BOLDS_OFF
+ BOT_KICK_CAPS_ON
+ BOT_KICK_CAPS_ON_BAN
+ BOT_KICK_CAPS_OFF
+ BOT_KICK_COLORS_ON
+ BOT_KICK_COLORS_ON_BAN
+ BOT_KICK_COLORS_OFF
+ BOT_KICK_FLOOD_ON
+ BOT_KICK_FLOOD_ON_BAN
+ BOT_KICK_FLOOD_OFF
+ BOT_KICK_REPEAT_ON
+ BOT_KICK_REPEAT_ON_BAN
+ BOT_KICK_REPEAT_OFF
+ BOT_KICK_REVERSES_ON
+ BOT_KICK_REVERSES_ON_BAN
+ BOT_KICK_REVERSES_OFF
+ BOT_KICK_UNDERLINES_ON
+ BOT_KICK_UNDERLINES_ON_BAN
+ BOT_KICK_UNDERLINES_OFF
+ BOT_BADWORDS_SYNTAX
+ BOT_BADWORDS_DISABLED
+ BOT_BADWORDS_REACHED_LIMIT
+ BOT_BADWORDS_ALREADY_EXISTS
+ BOT_BADWORDS_ADDED
+ BOT_BADWORDS_NO_SUCH_ENTRY
+ BOT_BADWORDS_NOT_FOUND
+ BOT_BADWORDS_NO_MATCH
+ BOT_BADWORDS_DELETED
+ BOT_BADWORDS_DELETED_ONE
+ BOT_BADWORDS_DELETED_SEVERAL
+ BOT_BADWORDS_LIST_EMPTY
+ BOT_BADWORDS_LIST_HEADER
+ BOT_BADWORDS_LIST_FORMAT
+ BOT_SAY_SYNTAX
+ BOT_ACT_SYNTAX
+ BOT_HELP
+ BOT_HELP_BOTLIST
+ BOT_HELP_ASSIGN
+ BOT_HELP_UNASSIGN
+ BOT_HELP_INFO
+ BOT_HELP_SET
+ BOT_HELP_SET_DONTKICKOPS
+ BOT_HELP_SET_DONTKICKVOICES
+ BOT_HELP_SET_FANTASY
+ BOT_HELP_SET_SYMBIOSIS
+ BOT_HELP_KICK
+ BOT_HELP_KICK_BADWORDS
+ BOT_HELP_KICK_BOLDS
+ BOT_HELP_KICK_CAPS
+ BOT_HELP_KICK_COLORS
+ BOT_HELP_KICK_FLOOD
+ BOT_HELP_KICK_REPEAT
+ BOT_HELP_KICK_REVERSES
+ BOT_HELP_KICK_UNDERLINES
+ BOT_HELP_BADWORDS
+ BOT_HELP_SAY
+ BOT_HELP_ACT
+ BOT_SERVADMIN_HELP
+ BOT_SERVADMIN_HELP_BOT
+ CHAN_LEVEL_ASSIGN
+ CHAN_LEVEL_BADWORDS
+ CHAN_LEVEL_FANTASIA
+ CHAN_LEVEL_NOKICK
+ CHAN_SENDPASS_SYNTAX
+ CHAN_SENDPASS_UNAVAILABLE
+ CHAN_SENDPASS_SUBJECT
+ CHAN_SENDPASS_HEAD
+ CHAN_SENDPASS_LINE_1
+ CHAN_SENDPASS_LINE_2
+ CHAN_SENDPASS_LINE_3
+ CHAN_SENDPASS_LINE_4
+ CHAN_SENDPASS_LINE_5
+ CHAN_SENDPASS_OK
+ HELP_HELP
+ MAIL_DISABLED
+ MAIL_INVALID
+ MAIL_LATER
+ NICK_REGISTER_SYNTAX_EMAIL
+ NICK_IDENTIFY_EMAIL_REQUIRED
+ NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ NICK_SENDPASS_SYNTAX
+ NICK_SENDPASS_UNAVAILABLE
+ NICK_SENDPASS_SUBJECT
+ NICK_SENDPASS_HEAD
+ NICK_SENDPASS_LINE_1
+ NICK_SENDPASS_LINE_2
+ NICK_SENDPASS_LINE_3
+ NICK_SENDPASS_LINE_4
+ NICK_SENDPASS_LINE_5
+ NICK_SENDPASS_OK
+ OPER_STATS_BOTSERV_MEM
+ OPER_CHANLIST_HEADER
+ OPER_CHANLIST_RECORD
+ OPER_CHANLIST_END
+ OPER_USERLIST_HEADER
+ OPER_USERLIST_HEADER_CHAN
+ OPER_USERLIST_RECORD
+ OPER_USERLIST_END
+ OPER_HELP_CHANLIST
+ OPER_HELP_USERLIST
+
+Version 4.3
+-----------
+Modified strings:
+ DISCONNECT_NOW
+ NICK_INFO_SYNTAX
+ CHAN_AKICK_SYNTAX
+ CHAN_INFO_SYNTAX
+ NICK_HELP_INFO
+ CHAN_HELP_SET
+ CHAN_HELP_AKICK
+ CHAN_HELP_INFO
+ OPER_HELP
+
+New strings:
+ BAD_EXPIRY_TIME
+ FORCENICKCHANGE_...
+ NICK_INFO_ADDRESS_ONLINE...
+ CHAN_AKICK_ENFORCE_DONE
+ CHAN_INFO_SUCCESSOR
+ CHAN_INFO_NO_SUCCESSOR
+ CHAN_INFO_ENTRYMSG
+ CHAN_INFO_NO_EXPIRE
+ OPER_STATS_BYTES_...
+ OPER_STATS_SESSIONS_MEM
+ OPER_KILLCLONES_...
+ OPER_ROTATELOG_...
+ OPER_EXCEPTION_...
+ OPER_SESSION_...
+ OPER_HELP_EXCEPTION
+ OPER_HELP_SESSION
+ NICK_SERVADMIN_HELP_INFO
+ CHAN_SERVADMIN_HELP_INFO
+ OPER_HELP_KILLCLONES
+ OPER_HELP_ROTATELOG
diff --git a/Makefile b/Makefile
new file mode 100644
index 000000000..3e0d689c2
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,174 @@
+# Makefile for Epona.
+#
+# Epona (c) 2000-2002 PegSoft
+# Contact us at epona@pegsoft.net
+#
+# This program is free but copyrighted software; see the file COPYING for
+# details.
+#
+# Based on the original code of Services by Andy Church.
+
+include Makefile.inc
+
+###########################################################################
+########################## Configuration section ##########################
+
+# Note that changing any of these options (or, in fact, anything in this
+# file) will automatically cause a full rebuild of Services.
+
+# Compilation options:
+# -DCLEAN_COMPILE Attempt to compile without any warnings (note that
+# this may reduce performance)
+# -DSTREAMLINED Leave out "fancy" options to enhance performance
+
+CDEFS =
+
+# Add any extra flags you want here. The default line enables warnings and
+# debugging symbols on GCC. If you have a non-GCC compiler, you may want
+# to comment it out or change it.
+
+MORE_CFLAGS = -Wall -g
+
+
+######################## End configuration section ########################
+###########################################################################
+
+
+CFLAGS = $(CDEFS) $(BASE_CFLAGS) $(MORE_CFLAGS)
+
+
+OBJS = actions.o botserv.o channels.o chanserv.o commands.o compat.o converter.o \
+ config.o datafiles.o encrypt.o helpserv.o hostserv.o init.o language.o list.o log.o mail.o main.o \
+ memory.o memoserv.o messages.o misc.o modules.o news.o nickserv.o operserv.o \
+ process.o protocol.o proxy.o send.o sessions.o slist.o sockutil.o \
+ timeout.o users.o \
+ $(VSNPRINTF_O) $(RDB_O) $(MYSQL_O)
+SRCS = actions.c botserv.c channels.c chanserv.c commands.c compat.c converter.c \
+ config.c datafiles.c encrypt.c helpserv.c hostserv.c init.c language.c list.c log.c mail.c main.c \
+ memory.c memoserv.c messages.c misc.c modules.c news.c nickserv.c operserv.c \
+ process.c protocol.c proxy.c send.c sessions.c slist.c sockutil.c \
+ timeout.c users.c \
+ $(VSNPRINTF_C) $(RDB_C) $(MYSQL_C)
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
+
+
+all: $(PROGRAM) languages modules
+ @echo Now run \"$(MAKE) install\" to install Services.
+
+myclean:
+ rm -f *.o $(PROGRAM) a.out
+
+
+clean: myclean
+ (cd lang ; $(MAKE) spotless)
+ rm -f language.h
+ (cd modules ; $(MAKE) clean)
+
+spotless: myclean
+ (cd lang ; $(MAKE) spotless)
+ (cd modules ; rm -f *.so Makefile.inc)
+ rm -f config.cache configure.log sysconf.h Makefile.inc language.h version.h *~
+
+distclean: spotless
+
+install: $(PROGRAM) languages
+ $(INSTALL) services $(BINDEST)/services
+ rm -f $(BINDEST)/listnicks $(BINDEST)/listchans
+ ln $(BINDEST)/services $(BINDEST)/listnicks
+ ln $(BINDEST)/services $(BINDEST)/listchans
+ (cd lang ; $(MAKE) install)
+ $(CP_ALL) data/* $(DATDEST)
+ test -d $(DATDEST)/backups || mkdir $(DATDEST)/backups
+ test -d $(DATDEST)/logs || mkdir $(DATDEST)/logs
+ @if [ "$(MODULE_PATH)" ] ; then \
+ (cd modules ; $(MAKE) install) ; \
+ fi
+ @if [ "$(RUNGROUP)" ] ; then \
+ echo chgrp -R $(RUNGROUP) $(DATDEST) ; \
+ chgrp -R $(RUNGROUP) $(DATDEST) ; \
+ echo chmod -R g+rw $(DATDEST) ; \
+ chmod -R g+rw $(DATDEST) ; \
+ echo find $(DATDEST) -type d -exec chmod g+xs \'\{\}\' \\\; ; \
+ find $(DATDEST) -type d -exec chmod g+xs '{}' \; ; \
+ fi
+ @echo ""
+ @echo "Don't forget to create/update your services.conf file! See"
+ @echo "the README for details."
+ @echo ""
+
+###########################################################################
+
+$(PROGRAM): version.h $(OBJS)
+ $(CC) $(LFLAGS) $(OBJS) $(LIBS) $(MLIBS) -o $@ $(ELIBS)
+
+languages: FRC
+ (cd lang ; $(MAKE) CFLAGS="$(CFLAGS)")
+
+modules: FRC
+ @if [ "$(MODULE_PATH)" ] ; then \
+ (cd modules ; ./configure ; $(MAKE) CFLAGS="$(CFLAGS)") \
+ fi
+
+# Catch any changes in compilation options at the top of this file
+$(OBJS): Makefile
+
+actions.o: actions.c services.h
+botserv.o: botserv.c services.h pseudo.h
+channels.o: channels.c services.h
+chanserv.o: chanserv.c services.h pseudo.h
+commands.o: commands.c services.h commands.h language.h
+compat.o: compat.c services.h
+config.o: config.c services.h
+converter.o: converter.c services.h datafiles.h
+datafiles.o: datafiles.c services.h datafiles.h
+encrypt.o: encrypt.c encrypt.h sysconf.h
+init.o: init.c services.h
+hostserv.o: hostserv.c services.h pseudo.h
+language.o: language.c services.h language.h
+list.o: list.c services.h
+log.o: log.c services.h pseudo.h
+mail.o: mail.c services.h language.h
+main.o: main.c services.h timeout.h version.h
+memory.o: memory.c services.h
+memoserv.o: memoserv.c services.h pseudo.h
+messages.o: messages.c services.h messages.h language.h
+misc.o: misc.c services.h language.h
+news.o: news.c services.h pseudo.h
+nickserv.o: nickserv.c services.h pseudo.h
+operserv.o: operserv.c services.h pseudo.h
+process.o: process.c services.h messages.h
+protocol.o: protocol.c services.h
+proxy.o: proxy.c services.h pseudo.h
+send.o: send.c services.h
+sessions.o: sessions.c services.h pseudo.h
+slist.o: slist.c services.h slist.h
+sockutil.o: sockutil.c services.h
+timeout.o: timeout.c services.h timeout.h
+users.o: users.c services.h
+vsnprintf.o: vsnprintf.c
+
+
+services.h: sysconf.h config.h extern.h
+ touch $@
+
+extern.h: slist.h
+ touch $@
+
+pseudo.h: commands.h language.h timeout.h encrypt.h datafiles.h slist.h
+ touch $@
+
+version.h: Makefile version.sh version.log services.h pseudo.h messages.h $(SRCS)
+ sh version.sh
+
+language.h: lang/language.h
+ cp -p lang/language.h .
+
+lang/language.h: lang/Makefile lang/index
+ (cd lang ; $(MAKE) language.h)
+
+
+###########################################################################
+
+FRC:
diff --git a/actions.c b/actions.c
new file mode 100644
index 000000000..b24c86ae4
--- /dev/null
+++ b/actions.c
@@ -0,0 +1,93 @@
+/* Various routines to perform simple actions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: actions.c,v 1.6 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+/* Note a bad password attempt for the given user. If they've used up
+ * their limit, toss them off.
+ */
+
+void bad_password(User * u)
+{
+ time_t now = time(NULL);
+
+ if (!BadPassLimit)
+ return;
+
+ if (BadPassTimeout > 0 && u->invalid_pw_time > 0
+ && u->invalid_pw_time < now - BadPassTimeout)
+ u->invalid_pw_count = 0;
+ u->invalid_pw_count++;
+ u->invalid_pw_time = now;
+ if (u->invalid_pw_count >= BadPassLimit)
+#ifdef IRC_BAHAMUT
+ send_cmd(NULL, "SVSKILL %s :%s", u->nick,
+ "Too many invalid passwords");
+#else
+ kill_user(NULL, u->nick, "Too many invalid passwords");
+#endif
+}
+
+/*************************************************************************/
+
+void change_user_mode(User * u, char *modes, char *arg)
+{
+#ifndef IRC_HYBRID
+ int ac = 1;
+ char *av[2];
+
+ av[0] = modes;
+ if (arg) {
+ av[1] = arg;
+ ac++;
+ }
+#ifdef IRC_BAHAMUT
+ send_cmd(ServerName, "SVSMODE %s %ld %s%s%s", u->nick, u->timestamp,
+ av[0], (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+#else
+ send_cmd(ServerName, "SVSMODE %s %s%s%s", u->nick, av[0],
+ (ac == 2 ? " " : ""), (ac == 2 ? av[1] : ""));
+#endif
+ set_umode(u, ac, av);
+#endif
+}
+
+/*************************************************************************/
+
+/* Remove a user from the IRC network. `source' is the nick which should
+ * generate the kill, or NULL for a server-generated kill.
+ */
+
+void kill_user(const char *source, const char *user, const char *reason)
+{
+ char *av[2];
+ char buf[BUFSIZE];
+
+ if (!user || !*user)
+ return;
+ if (!source || !*source)
+ source = ServerName;
+ if (!reason)
+ reason = "";
+ snprintf(buf, sizeof(buf), "%s (%s)", source, reason);
+ av[0] = sstrdup(user);
+ av[1] = buf;
+ send_cmd(source, "KILL %s :%s", user, av[1]);
+ do_kill(source, 2, av);
+ free(av[0]);
+}
+
+/*************************************************************************/
diff --git a/bin/checklang b/bin/checklang
new file mode 100755
index 000000000..bcabe0d88
--- /dev/null
+++ b/bin/checklang
@@ -0,0 +1,16 @@
+#!/bin/bash
+#
+# $Id: checklang,v 1.1 2003/07/16 04:34:04 dane Exp $
+#
+
+if [ ! -f en_us.l ]; then
+ echo "*** You must run this script on the lang directory."
+ echo ""
+ exit 1
+fi
+
+for lang in $(ls *.l)
+do
+ echo "*** CHECKING $lang ***"
+ ./obs.pl $lang
+done
diff --git a/bin/cp-recursive b/bin/cp-recursive
new file mode 100755
index 000000000..e51230db7
--- /dev/null
+++ b/bin/cp-recursive
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+if [ $1 = "-t" ] ; then
+ shift
+fi
+if [ ! "$2" ] ; then
+ echo >&2 Usage: $0 '<sourcedir> <targetdir>'
+ exit 1
+fi
+if [ -d "$1" ] ; then
+ dir="$1"
+else
+ dir="`echo $1 | sed 's#\(.*\)/.*#\1#'`"
+fi
+while [ "$2" ] ; do
+ shift
+done
+if [ ! -d $1 ] ; then
+ mkdir -p $1 || exit 1
+fi
+/bin/tar -Ccf $dir - . | /bin/tar -Cxf $1 -
diff --git a/bin/fixlang b/bin/fixlang
new file mode 100755
index 000000000..1a1ea875a
--- /dev/null
+++ b/bin/fixlang
@@ -0,0 +1,17 @@
+#!/bin/bash
+#
+# $Id: fixlang,v 1.1 2003/07/16 04:34:04 dane Exp $
+#
+
+if [ ! -f en_us.l ]; then
+ echo "*** You must run this script on the lang directory."
+ echo ""
+ exit 1
+fi
+
+for lang in $(ls *.l)
+do
+ echo "*** CHECKING $lang ***"
+ ./fixlang.pl $lang
+ mv fixed.l $lang
+done
diff --git a/bin/getanope b/bin/getanope
new file mode 100755
index 000000000..58f4c0dc7
--- /dev/null
+++ b/bin/getanope
@@ -0,0 +1,42 @@
+#!/bin/bash
+#
+# $Id: getanope,v 1.2 2003/11/24 20:23:28 dane Exp $
+#
+
+MODULE="anope-dev"
+BRANCH=""
+
+if [ "$1" == "" ]; then
+ DST="$MODULE"
+else
+ DST="$1"
+fi
+
+let cnt="$(echo $CVSROOT | grep anope | wc -l)"
+if [ $cnt -eq 0 ]; then
+ echo "*** Environment variable CVSROOT is not set. Please set it"
+ echo "*** if you have a developer account with write access."
+ echo ""
+ echo "*** Assuming anonymous access. If prompted for a password,"
+ echo "*** just press RETURN to continue."
+ echo ""
+ export CVSROOT=":pserver:pubcvs@zero.org:/home/cvs/anope"
+
+ let login="$(grep "pubcvs@zero.org" ~/.cvspass 2> /dev/null | grep anope | wc -l)"
+
+ if [ $login -eq 0 ]; then
+ cvs -d$CVSROOT login
+ fi
+fi
+
+echo "Checking out $MODULE"
+
+if [ "$BRANCH" == "" ]; then
+ cvs -z3 -d$CVSROOT checkout -d$DST $MODULE
+else
+ cvs -z3 -d$CVSROOT checkout -r$BRANCH -d$DST $MODULE
+fi
+
+echo "*** All done!"
+
+exit 0
diff --git a/bin/langtool.pl b/bin/langtool.pl
new file mode 100755
index 000000000..c1072760c
--- /dev/null
+++ b/bin/langtool.pl
@@ -0,0 +1,239 @@
+#!/usr/bin/perl
+#
+# Ribosome's all in one language tool
+# 1) Compares to check for missing lines
+# 2) Compares to check for equal lines
+# 3) Fixes (on request) missing lines
+# 4) Checks for errors in lines
+# 5) Checks for long lines (>60 characters)
+#
+
+# Check to see if we have received arguments
+if (!$ARGV[0]) {
+print "Usage: $0 [language file]\n";
+exit;
+}
+
+# If yes, set $sourcefile to the language filename
+$testagainst = $ARGV[0];
+
+# Set $sourcefile to en_us language file
+$sourcefile = "en_us.l";
+
+# Number of Keys in File, Number of Equal Lines, Number of Missing Lines
+# Fixed Lines (optional) and Number of Format Error Lines, Number of Long Lines
+my $numberlines = 0;
+my $equallines = 0;
+my $missinglines = 0;
+my $fixedlines = 0;
+my $errorline = 0;
+my $longlines = 0;
+
+# Array to hold the lines from the source file and explosion array for long line check
+
+my @sourcearray;
+my @explosion;
+
+# Create associative arrays which will contain keys and definitions
+# One for the control source and one for what is being tested against
+
+my %sourcehash= ();
+my %testhash= ();
+
+# Check if Files Exist
+
+if (! -f $sourcefile) {
+print "Critical Error: The source file does not exist or is unreadable.\nNote: This tool must be run from the language directory.\n";
+exit;
+}
+
+if (! -f $testagainst) {
+print "Critical Error: The language file does not exist or is unreadable\n";
+exit;
+}
+###########################################
+# Function to load sourcefile into memory #
+###########################################
+
+sub load_sourcefile {
+
+ my $_key; # This variable will hold the key
+ my $_def; # This variable will hold the definition
+ my $line; # This variable will hold the current line
+
+ open (SOURCEFILE, "< $sourcefile"); # Open the source file
+ while (<SOURCEFILE>) { # For each line the source file
+ $line = $_; # $line is set to the line in the source file
+
+ # Skip comments
+ if (/^#/) { # This checks for # which indicates comment
+ next; # If detected, the next line is skipped to
+ }
+
+ # Start of a key
+ if (/^[A-Z]/) { # Checks to see if the line is a key
+ chomp($line); # Removes things that shouldn't be at the end
+ push (@sourcearray, $line); # Puts the line into the source array
+ # If a key is defined, load definition into the hash
+ if ($_key ne undef) { # If the key is defined
+ $sourcehash{$_key} = $_def; # Add the definition to the associative array
+ }
+ $_key=$line; # Set the key to the line
+ $_def=""; # Reset the definition
+ next; # Move onto the next line
+ }
+
+ if ($_key ne undef) { # If the key is set already
+ $_def.=$line; # The definition is the current line
+ }
+
+ $sourcehash{$_key} = $_def; # Load the definition into the associative array
+ } # End of while which reads lines
+
+ close (SOURCEFILE); # Close the source file
+
+} # End of load_sourcefile function
+
+#################################################
+# Function to load testagainst file into memory #
+#################################################
+
+sub load_testagainst {
+
+ my $_key; # This variable will hold the key
+ my $_def; # This variable will hold the definition
+ my $line; # This variable will hold the current line
+
+ open (TESTAGAINSTFILE, "< $testagainst"); # Open the file containing the control lines
+ while (<TESTAGAINSTFILE>) { # For each line in the file
+ $line = $_; # $line is set to the lines value
+
+
+ # Skip comments
+ if (/^#/) { # This checks for # which indicates comment
+ next; # If detected, the next line is skipped to
+ }
+
+ # Start of a key
+ if (/^[A-Z]/) { # Checks to see if the line is a key
+ chomp($line); # Removes things that shouldn't be at the end
+
+
+ if ($_key ne undef) { # If the key is defined
+ $testhash{$_key} = $_def; # Add the definition to the associative array
+ }
+ $_key=$line; # Set the key to the line
+ $_def=""; # Reset the definition
+ next; # Move onto the next line
+ }
+
+ if ($_key ne undef) { # If the key is set already
+ $_def.=$line; # The definition is the current line
+ }
+
+ $testhash{$_key} = $_def; # Load the definition into the associative array
+ } # End of while which reads lines
+ close (TESTAGAINSTFILE); # Close the source file
+
+}
+
+
+sub get_format { # Function to get the formatting from a string
+ my $fmt="";
+ my $str=shift; # Get the input
+
+ while ($str =~ m/%\w/g) {
+ $fmt .= $&;
+ }
+
+ return $fmt; # Return the formatting
+}
+
+
+load_sourcefile; # Call function to load the source file
+load_testagainst; # Call function to load the test file
+
+if (!grep(/^LANG_NAME/,%testhash)) {
+print "Critical Error: $ARGV[0] is not a valid language file!\n";
+exit;
+}
+
+open (LOG,"> langcheck.log"); # Open logfile for writing
+
+foreach $sourcearray (@sourcearray) { # For each key stored in the source array
+ my $_key=$_; # Store key from source array in $_key
+
+ if ((get_format($sourcehash{$sourcearray})) ne (get_format($testhash{$sourcearray}))) {
+ if ($sourcearray !~ STRFTIME ) {
+ $errorline++;
+ print LOG "FORMAT: $sourcearray - (expecting '".get_format($sourcehash{$sourcearray})."' and got '".get_format($testhash{$sourcearray})."')\n";
+ } }
+
+ if ($testhash{$sourcearray} eq $sourcehash{$sourcearray} ) {
+ # If the definitions between the source and the test are equal
+ $equallines++; # Number of equal lines increases
+ print LOG "EQUAL: $sourcearray\n"; # Line is written to logfile
+ }
+
+ if (!grep(/^$sourcearray/,%testhash)) { # If the key is found in the testhash associative array
+ $missinglines++; # Increase missing lines
+ print LOG "MISSING: $sourcearray\n"; # Line is written to logfile
+ }
+
+ @explosion = split(/\n/, $testhash{$sourcearray});
+ foreach $explosion (@explosion) {
+ $explosion =~ s/\002//g;
+ $explosion =~ s/\037//g;
+ if (length($explosion) > 61) {
+ print LOG "LONGLINE: $sourcearray (".substr($explosion,1,30)."...)\n";
+ $longlines++;
+ }
+ }
+
+$numberlines++; # Increase the number of lines tested by 1
+}
+close (LOG); # Close the logfile
+
+
+#########################
+# Show the test results #
+#########################
+
+print "Calculation Results:\n";
+print "----------------------------------\n";
+print "[$numberlines] line(s) were compared\n";
+print "[$equallines] line(s) were found to equal their $sourcefile counterpart(s)\n";
+print "[$missinglines] line(s) were found to be missing\n";
+print "[$longlines] line(s) were found to be long (>60 chars)\n";
+print "[$errorline] line(s) were found to have formatting errors\n";
+print "The specific details of the test have been saved in langcheck.log\n";
+
+if ($missinglines) { # If missing lines exist
+print "----------------------------------\n";
+print "Missing line(s) have been detected in this test, would you like to fix the file?\n";
+print "This automatically inserts values from the control file ($sourcefile) for the missing values\n";
+print "y/N? (Default: No) ";
+
+my $input = <STDIN>; # Ask if the file should be fixed
+if ((substr($input,0,1) eq "y") || (substr($input,0,1) eq "Y")) { # If Yes...
+
+open (FIX, ">> $testagainst"); # Open the file and append changes
+
+foreach $sourcearray (@sourcearray) { # For each key stored in the source array
+ my $_key=$_; # Store key from source array in $_key
+
+ if (!grep(/^$sourcearray/,%testhash)) { # If the key is not found in the testhash associative array
+ print FIX "$sourcearray\n$sourcehash{$sourcearray}"; # Add the line(s) to the language file
+ $fixedlines++; # Increase the fixed line count
+ }
+}
+
+close (FIX); # Close file after fixing
+
+print "Fixing Compete. [$fixedlines] line(s) fixed.\n";
+exit; # And Exit!
+}
+ # Otherwise, quit without fixing
+print "Exiting. The language file has NOT been fixed.\n";
+
+}
diff --git a/bin/makepatch b/bin/makepatch
new file mode 100755
index 000000000..ed01d1b1b
--- /dev/null
+++ b/bin/makepatch
@@ -0,0 +1,83 @@
+#!/bin/bash
+# Daniel Engel (dane@zero.org)
+#
+# Creates a patch from any version of Anope to another within the
+# same CVS module (in this case, anope-rel). Usage:
+#
+# ./anope-mkpatch 1.5.1 1.5.5
+#
+# The earliest version you can use is 1.5.1 (the first CVS tag)
+#
+# Feel free to improve this script at will.
+#
+CVSROOT=":pserver:pubcvs@zero.org:/home/cvs/anope"
+MODULE="anope-dev"
+OLD="$1"
+NEW="$2"
+NAME="$1-$2.diff"
+
+echo "*** Note: This script is able to create patches from one version of 1.5.x"
+echo "*** to anoter. The earliest valid version is 1.5.1, and you can only make"
+echo "*** a patch between two released versions (i.e. no -rnum versions)"
+echo ""
+
+if [[ $OLD == "" ]]; then
+ echo "*** Usage: $0 [OLD] [NEW]"
+ exit 0
+fi
+
+
+if [[ $NEW == "" ]]; then
+ echo "*** Usage: $0 [OLD] [NEW]"
+ exit 0
+fi
+
+OLD="anope-$OLD"
+NEW="anope-$NEW"
+
+if [[ -d $OLD ]]; then
+ echo "*** Directory $OLD already exists... aborting."
+ exit 0
+fi
+
+if [[ -d $NEW ]]; then
+ echo "*** Directory $OLD already exists... aborting."
+ exit 0
+fi
+
+echo "*** Issuing the CVS login, when prompted for a password, just press RETURN..."
+cvs -d $CVSROOT login
+
+if [[ $? -ne 0 ]]; then
+ echo "*** ERROR: CVS login failed... aborting."
+ exit 0
+fi
+
+TOLD="$(echo $OLD | sed 's/\./_/g')"
+TNEW="$(echo $NEW | sed 's/\./_/g')"
+
+echo "*** Cheking out $MODULE ($TOLD)"
+cvs -d $CVSROOT checkout -r $TOLD -d $OLD $MODULE > /dev/null 2>&1
+if [[ $? -ne 0 ]]; then
+ echo "*** ERROR: Unable to checkout $MODULE ($TNEW)... aborting."
+ exit 0
+fi
+
+echo "*** Cheking out $MODULE ($TNEW)"
+cvs -d $CVSROOT checkout -r $TNEW -d $NEW $MODULE > /dev/null 2>&1
+if [[ $? -ne 0 ]]; then
+ echo "*** ERROR: Unable to checkout $MODULE ($TNEW)... aborting."
+ exit 0
+fi
+
+# I wish i could use cvsrmadm here, but not everybody has it :(
+echo "*** Removing CVS control files"
+find $OLD -name CVS -exec rm -rf {} \; > /dev/null 2>&1
+find $NEW -name CVS -exec rm -rf {} \; > /dev/null 2>&1
+
+echo "*** Creating the patch..."
+diff -urN $OLD $NEW > $NAME
+
+echo "*** Done! The patch is $NAME";
+echo "*** You might want to clean things up with:"
+echo "*** rm -rf $OLD $NEW"
diff --git a/bin/mydbgen b/bin/mydbgen
new file mode 100755
index 000000000..e78b025c9
--- /dev/null
+++ b/bin/mydbgen
@@ -0,0 +1,194 @@
+#!/bin/sh
+#
+
+# Location of the .sql file with the schema
+DBFILE="data/tables.sql"
+
+# Schema Version
+SVER="1"
+
+# Local Version, defaults to 0
+LVER="0"
+
+TFILE="/tmp/.anopedb.$$"
+
+if [ "`eval echo -n 'a'`" = "-n a" ] ; then
+ c="\c"
+else
+ n="-n"
+fi
+
+if [ ! -f $DBFILE ] ; then
+ echo "Error: Required file $DBFILE is inaccessible!";
+ exit
+fi
+
+echo ""
+echo "This script will guide you through the process of configuring your Anope"
+echo "installation to make use of MySQL support. This script must be used for both"
+echo "new installs as well as for upgrading for users who have a previous version"
+echo "of Anope installed"
+
+while [ -z "$SQLHOST" ] ; do
+ echo ""
+ echo "What is the hostname of your MySQL server?"
+ echo $n "-> $c"
+ read cc
+ if [ ! -z "$cc" ] ; then
+ SQLHOST=$cc
+ fi
+done
+
+while [ -z "$SQLUSER" ] ; do
+ echo ""
+ echo "What is your MySQL username?"
+ echo $n "-> $c"
+ read cc
+ if [ ! -z "$cc" ] ; then
+ SQLUSER=$cc
+ fi
+done
+
+OLD_TTY=`stty -g`
+
+echo ""
+echo "What is your MySQL password?"
+echo $n "-> $c"
+stty -echo echonl
+read cc
+if [ ! -z "$cc" ] ; then
+ SQLPASS=$cc
+fi
+stty $OLD_TTY
+
+mysqlshow -h$SQLHOST -u$SQLUSER -p$SQLPASS >/dev/null 2>&1
+if test "$?" = "1" ; then
+ echo "Error: Unable to login, verify your login/password and hostname"
+ exit
+fi
+
+while [ -z "$SQLDB" ] ; do
+ echo ""
+ echo "What is the name of the Anope SQL database?"
+ echo $n "-> $c"
+ read cc
+ if [ ! -z "$cc" ] ; then
+ SQLDB=$cc
+ fi
+done
+
+MYSQLSHOW="mysqlshow -h$SQLHOST -u$SQLUSER -p$SQLPASS $SQLDB"
+MYSQL="mysql -h$SQLHOST -u$SQLUSER -p$SQLPASS $SQLDB"
+
+echo ""
+
+$MYSQLHOW >/dev/null 2>&1
+if test "$?" = "1" ; then
+ echo "It appears that database does not exist. Or that you don't have the"
+ echo "correct credentials to access it. Please verify that you have entered"
+ echo "the correct values."
+ exit
+fi
+
+
+res="$($MYSQL -Bs -e "show tables like 'anope_os_core'" | wc -l)"
+if test "$res" = "0" ; then
+ echo -n "Unable to find Anope schema, creating... "
+ mysql -h$SQLHOST -u$SQLUSER -p$SQLPASS $SQLDB < $DBFILE
+ if test "$?" = "0" ; then
+ echo "done!"
+ else
+ echo "failed!"
+ FAILED="$FAILED 'schema creation'"
+ fi
+else
+ # Introduced on Anope 1.6.0 -> Table anope_info
+ res="$($MYSQL -Bs -e "show tables like 'anope_info'" | wc -l)"
+ if test "$res" = "0" ; then
+ echo -n "Unable to find Anope info table, creating... "
+ echo "CREATE TABLE anope_info (version int, date datetime) TYPE=MyISAM" > $TFILE
+ mysql -h$SQLHOST -u$SQLUSER -p$SQLPASS $SQLDB < $TFILE >/dev/null 2>&1
+ if test "$?" = "0" ; then
+ echo "done!"
+
+ else
+ echo "failed!"
+ FAILED="$FAILED 'anope_info table'"
+ fi
+ else
+ LVER="$($MYSQL -sB -e "select version from anope_info")"
+ if test "x$LVER" = "x" ; then
+ LVER=0
+ fi
+ fi
+
+ # Introduced on Anope 1.5.14.5 -> anope_cs_info.memomax
+ res="$($MYSQL -Bs -e "describe anope_cs_info memomax" 2> /dev/null | wc -l)"
+ if test "$res" = "0" ; then
+ echo -n "Unable to find anope_cs_info.memomax, altering... "
+ echo "ALTER TABLE anope_cs_info ADD memomax smallint unsigned NOT NULL default 0" > $TFILE
+ mysql -h$SQLHOST -u$SQLUSER -p$SQLPASS $SQLDB < $TFILE >/dev/null 2>&1
+ if test "$?" = "0" ; then
+ echo "done!"
+
+ else
+ echo "failed!"
+ FAILED="$FAILED 'anope_cs_info.ttb alter'"
+ fi
+ fi
+
+ # Introduced on Anope 1.5.14.5 -> anope_cs_info.ttb
+ res="$($MYSQL -Bs -e "describe anope_cs_info ttb" | wc -l)"
+ if test "$res" = "0" ; then
+ echo -n "Unable to find anope_cs_info.ttb, altering... "
+ echo "ALTER TABLE anope_cs_info ADD ttb smallint NOT NULL default 0" > $TFILE
+ mysql -h$SQLHOST -u$SQLUSER -p$SQLPASS $SQLDB < $TFILE >/dev/null 2>&1
+ if test "$?" = "0" ; then
+ echo "done!"
+
+ else
+ echo "failed!"
+ FAILED="$FAILED 'anope_cs_info.ttb alter'"
+ fi
+ fi
+
+
+fi
+
+# Insert initial version number. This will have to be redesigned for 1.7
+if [ $LVER -ne $SVER ]; then
+echo -n "Inserting initial version number... "
+$MYSQL -Bs -e "delete from anope_info"
+echo "INSERT INTO anope_info (version, date) VALUES ($SVER, now())" > $TFILE
+$MYSQL < $TFILE >/dev/null 2>&1
+if test "$?" = "0" ; then
+ echo "done!"
+else
+ echo "failed!"
+ FAILED="$FAILED 'version insert'"
+fi
+fi
+
+rm -f $TFILE
+if test "x$FAILED" = "x" ; then
+ # Try to find out more about this installation
+ SQLSOCK="$(mysql_config --socket 2> /dev/null)"
+ SQLPORT="$(mysql_config --port 2> /dev/null)"
+ echo ""
+ echo "Your MySQL setup is complete and your Anope schema is up to date. Make"
+ echo "sure you configure MySQL on your services.conf file prior to launching"
+ echo "Anope with MySQL support. Your configuration values are:"
+ echo ""
+ echo "MysqlHost \"$SQLHOST\""
+ echo "MysqlUser \"$SQLUSER\""
+ echo "MysqlPass \"$SQLPASS\""
+ echo "MysqlName \"$SQLDB\""
+ echo "MysqlSock \"$SQLSOCK\""
+ echo "MysqlPort \"$SQLPORT\""
+ echo ""
+else
+ echo "The following operations failed:"
+ echo "$FAILED"
+fi
+
+exit
diff --git a/bin/putanope b/bin/putanope
new file mode 100755
index 000000000..d07017dc3
--- /dev/null
+++ b/bin/putanope
@@ -0,0 +1,104 @@
+#!/bin/sh
+#
+# $Id: putanope,v 1.14 2003/12/02 23:02:28 joris Exp $
+#
+
+CTRL="version.log"
+MODULE="anope-dev"
+TMP="/tmp/putanope.$$"
+TMP2="/tmp/putanope2.$$"
+
+# We need an editor for the log entry
+if [ "$EDITOR" == "" ]; then
+ EDITOR="vi"
+fi
+
+# Use default target, or provided?
+if [ "$1" == "" ]; then
+ DST="$MODULE"
+else
+ DST="$1"
+fi
+
+# Find where to run the rest of the script from.
+if [ ! -d $DST ]; then
+ cd ..
+ if [ ! -d $DST ]; then
+ cd ..
+ if [ ! -d $DST ]; then
+ echo "*** Directory $DST does not exist, what's going on?"
+ echo ""
+ exit 1
+ fi
+ fi
+fi
+
+# CVSROOT dosnt need to be set, just read it form the CVS file :-)
+CVSROOT=`cat ${DST}/CVS/Root`
+
+cd $DST
+
+# source control file
+. $CTRL
+
+# Version arithmetics
+CVER="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}"
+let minor="$(echo $VERSION_BUILD)"
+let new="$minor + 1"
+NVER="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${new}"
+
+# Greet the developer
+echo ""
+echo "*** Using CVSROOT: $CVSROOT"
+echo "*** Using module : $MODULE"
+echo "*** Current ver : $CVER"
+echo "*** Updated ver : $NVER"
+echo ""
+echo "*** Make sure you have updated Changes, Changes.conf, and"
+echo "*** Changes.lang acordingly before you proceed."
+echo -n "*** Ready to continue? (RETURN if so, CTRL-C otherwise) "
+read FOO
+
+cat > $TMP2 <<EOF
+# Anope commit utility. Please use this template for your commits.
+# Add Mantis bugs separated by spaces. The note part is free form.
+BUILD : $NVER
+BUGS :
+NOTES :
+EOF
+
+$EDITOR $TMP2
+
+echo "*** Ready to commit, please verify:"
+echo ""
+grep -v "^#" $TMP2
+echo ""
+echo -n "*** Perform commit? (RETURN if so, CTRL-C otherwise) "
+read FOO
+
+echo "*** Running indent..."
+for source in *.c
+do
+ indent -kr -nut $source
+done
+
+# Clean up indent backup files
+rm -f *~
+
+echo "*** Bumping the version number..."
+sed "s/VERSION_BUILD=\"$VERSION_BUILD\"/VERSION_BUILD=\"$new\"/" $CTRL > $TMP
+cat $TMP > $CTRL
+
+TS="$(date '+%F %R')"
+grep -v "^#" $TMP2 > $TMP
+echo "VTAG : cvs checkout -D \"$TS\" $MODULE" >> $TMP
+
+cd ..
+
+cvs -d$CVSROOT commit -F $TMP $DST
+
+rm -f $TMP $TMP2
+
+echo "*** Done!"
+
+exit 0
diff --git a/botserv.c b/botserv.c
new file mode 100644
index 000000000..ddbfdf856
--- /dev/null
+++ b/botserv.c
@@ -0,0 +1,2512 @@
+/* BotServ functions
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: botserv.c,v 1.46 2004/03/14 14:15:34 certus Exp $
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+
+/**
+ * RFC: defination of a valid nick
+ * nickname = ( letter / special ) *8( letter / digit / special / "-" )
+ * letter = %x41-5A / %x61-7A ; A-Z / a-z
+ * digit = %x30-39 ; 0-9
+ * special = %x5B-60 / %x7B-7D ; "[", "]", "\", "`", "_", "^", "{", "|", "}"
+ **/
+#define isvalidnick(c) ( isalnum(c) || ((c) >='\x5B' && (c) <='\x60') || ((c) >='\x7B' && (c) <='\x7D') || (c)=='-' )
+
+
+/*************************************************************************/
+
+BotInfo *botlists[256]; /* Hash list of bots */
+int nbots = 0;
+
+/*************************************************************************/
+
+static BotInfo *makebot(char *nick);
+static UserData *get_user_data(Channel * c, User * u);
+static void unassign(User * u, ChannelInfo * ci);
+
+static void check_ban(ChannelInfo * ci, User * u, int ttbtype);
+static void bot_kick(ChannelInfo * ci, User * u, int message, ...);
+static void bot_raw_ban(User * requester, ChannelInfo * ci, char *nick,
+ char *reason);
+static void bot_raw_kick(User * requester, ChannelInfo * ci, char *nick,
+ char *reason);
+static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode,
+ char *nick);
+static void bot_raw_unban(ChannelInfo * ci, char *nick);
+
+static int do_help(User * u);
+static int do_bot(User * u);
+static int do_botlist(User * u);
+static int do_assign(User * u);
+static int do_unassign(User * u);
+static int do_info(User * u);
+static int do_set(User * u);
+static int do_kickcmd(User * u);
+static int do_badwords(User * u);
+static int do_say(User * u);
+static int do_act(User * u);
+void moduleAddBotServCmds(void);
+/*************************************************************************/
+/* *INDENT-OFF* */
+void moduleAddBotServCmds(void) {
+ Command *c;
+ c = createCommand("HELP",do_help,NULL, -1,-1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("BOTLIST", do_botlist, NULL, BOT_HELP_BOTLIST, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("ASSIGN", do_assign, NULL, BOT_HELP_ASSIGN, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("UNASSIGN", do_unassign, NULL, BOT_HELP_UNASSIGN, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("INFO", do_info, NULL, BOT_HELP_INFO, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("SET", do_set, NULL, BOT_HELP_SET,-1, BOT_SERVADMIN_HELP_SET,BOT_SERVADMIN_HELP_SET, BOT_SERVADMIN_HELP_SET); addCoreCommand(BOTSERV,c);
+ c = createCommand("SET DONTKICKOPS", NULL, NULL, BOT_HELP_SET_DONTKICKOPS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("SET DONTKICKVOICES", NULL, NULL, BOT_HELP_SET_DONTKICKVOICES, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("SET FANTASY", NULL, NULL, BOT_HELP_SET_FANTASY, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("SET GREET", NULL, NULL, BOT_HELP_SET_GREET, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("SET SYMBIOSIS", NULL, NULL, BOT_HELP_SET_SYMBIOSIS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("KICK", do_kickcmd, NULL, BOT_HELP_KICK, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("KICK BADWORDS", NULL, NULL, BOT_HELP_KICK_BADWORDS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("KICK BOLDS", NULL, NULL, BOT_HELP_KICK_BOLDS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("KICK CAPS", NULL, NULL, BOT_HELP_KICK_CAPS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("KICK COLORS", NULL, NULL, BOT_HELP_KICK_COLORS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("KICK FLOOD", NULL, NULL, BOT_HELP_KICK_FLOOD, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("KICK REPEAT", NULL, NULL, BOT_HELP_KICK_REPEAT, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("KICK REVERSES", NULL, NULL, BOT_HELP_KICK_REVERSES, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("KICK UNDERLINES", NULL, NULL, BOT_HELP_KICK_UNDERLINES, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("BADWORDS", do_badwords, NULL, BOT_HELP_BADWORDS, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("SAY", do_say, NULL, BOT_HELP_SAY, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+ c = createCommand("ACT", do_act, NULL, BOT_HELP_ACT, -1,-1,-1,-1); addCoreCommand(BOTSERV,c);
+
+ /* Services admins commands */
+ c = createCommand("BOT", do_bot, is_services_admin, -1,-1, BOT_SERVADMIN_HELP_BOT,BOT_SERVADMIN_HELP_BOT, BOT_SERVADMIN_HELP_BOT); addCoreCommand(BOTSERV,c);
+ c = createCommand("SET NOBOT", NULL, NULL, -1,-1, BOT_SERVADMIN_HELP_SET_NOBOT,BOT_SERVADMIN_HELP_SET_NOBOT, BOT_SERVADMIN_HELP_SET_NOBOT); addCoreCommand(BOTSERV,c);
+ c = createCommand("SET PRIVATE", NULL, NULL, -1,-1, BOT_SERVADMIN_HELP_SET_PRIVATE,BOT_SERVADMIN_HELP_SET_PRIVATE, BOT_SERVADMIN_HELP_SET_PRIVATE); addCoreCommand(BOTSERV,c);
+}
+/* *INDENT-ON* */
+/*************************************************************************/
+/*************************************************************************/
+
+/* Return information on memory use. Assumes pointers are valid. */
+
+void get_botserv_stats(long *nrec, long *memuse)
+{
+ long count = 0, mem = 0;
+ int i;
+ BotInfo *bi;
+
+ for (i = 0; i < 256; i++) {
+ for (bi = botlists[i]; bi; bi = bi->next) {
+ count++;
+ mem += sizeof(*bi);
+ mem += strlen(bi->nick) + 1;
+ mem += strlen(bi->user) + 1;
+ mem += strlen(bi->host) + 1;
+ mem += strlen(bi->real) + 1;
+ }
+ }
+
+ *nrec = count;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* BotServ initialization. */
+
+void bs_init(void)
+{
+ Command *cmd;
+ moduleAddBotServCmds();
+ cmd = findCommand(BOTSERV, "SET SYMBIOSIS");
+ if (cmd)
+ cmd->help_param1 = s_ChanServ;
+}
+
+/*************************************************************************/
+
+/* Main BotServ routine. */
+
+void botserv(User * u, char *buf)
+{
+ char *cmd, *s;
+
+ cmd = strtok(buf, " ");
+
+ if (!cmd) {
+ return;
+ } else if (stricmp(cmd, "\1PING") == 0) {
+ if (!(s = strtok(NULL, "")))
+ s = "\1";
+ notice(s_BotServ, u->nick, "\1PING %s", s);
+ } else if (skeleton) {
+ notice_lang(s_BotServ, u, SERVICE_OFFLINE, s_BotServ);
+ } else {
+ mod_run_cmd(s_BotServ, u, BOTSERV, cmd);
+ }
+
+}
+
+/*************************************************************************/
+
+/* Handles all messages sent to bots. (Currently only answers to pings ;) */
+
+void botmsgs(User * u, BotInfo * bi, char *buf)
+{
+ char *cmd = strtok(buf, " ");
+ char *s;
+
+ if (!cmd || !u)
+ return;
+
+ if (!stricmp(cmd, "\1PING")) {
+ if (!(s = strtok(NULL, "")))
+ s = "\1";
+ notice(bi->nick, u->nick, "\1PING %s", s);
+ }
+}
+
+/*************************************************************************/
+
+/* Handles all messages that are sent to registered channels where a
+ * bot is on.
+ *
+ */
+
+void botchanmsgs(User * u, ChannelInfo * ci, char *buf)
+{
+ int c;
+ int16 cstatus = 0;
+ char *cmd;
+ UserData *ud;
+
+ if (!u)
+ return;
+
+ /* Answer to ping if needed, without breaking the buffer. */
+ if (!strnicmp(buf, "\1PING", 5))
+ notice(ci->bi->nick, u->nick, buf);
+
+ /* If it's a /me, cut the CTCP part at the beginning (not
+ * at the end, because one character just doesn't matter,
+ * but the ACTION may create strange behaviours with the
+ * caps or badwords kickers */
+ if (!strnicmp(buf, "\1ACTION ", 8))
+ buf += 8;
+
+ /* Now we can make kicker stuff. We try to order the checks
+ * from the fastest one to the slowest one, since there's
+ * no need to process other kickers if an user is kicked before
+ * the last kicker check.
+ *
+ * But FIRST we check whether the user is protected in any
+ * way.
+ */
+
+ /* We first retrieve the user status on the channel if needed */
+ if (ci->botflags & (BS_DONTKICKOPS | BS_DONTKICKVOICES))
+ cstatus = chan_get_user_status(ci->c, u);
+
+ if (buf && !check_access(u, ci, CA_NOKICK) &&
+#ifdef HAS_HALFOP
+#if defined(IRC_UNREAL) || defined (IRC_VIAGRA)
+ (!(ci->botflags & BS_DONTKICKOPS)
+ || !(cstatus & (CUS_HALFOP | CUS_OP | CUS_OWNER | CUS_PROTECT)))
+# elif defined (IRC_ULTIMATE3)
+ (!(ci->botflags & BS_DONTKICKOPS)
+ || !(cstatus & (CUS_HALFOP | CUS_OP | CUS_PROTECT)))
+# else
+ (!(ci->botflags & BS_DONTKICKOPS)
+ || !(cstatus & (CUS_HALFOP | CUS_OP)))
+# endif
+#else
+ (!(ci->botflags & BS_DONTKICKOPS) || !(cstatus & CUS_OP))
+#endif
+ && (!(ci->botflags & BS_DONTKICKVOICES) || !(cstatus & CUS_VOICE))) {
+ /* Bolds kicker */
+ if ((ci->botflags & BS_KICK_BOLDS) && strchr(buf, 2)) {
+ check_ban(ci, u, TTB_BOLDS);
+ bot_kick(ci, u, BOT_REASON_BOLD);
+ return;
+ }
+
+ /* Color kicker */
+ if ((ci->botflags & BS_KICK_COLORS) && strchr(buf, 3)) {
+ check_ban(ci, u, TTB_COLORS);
+ bot_kick(ci, u, BOT_REASON_COLOR);
+ return;
+ }
+
+ /* Reverses kicker */
+ if ((ci->botflags & BS_KICK_REVERSES) && strchr(buf, 22)) {
+ check_ban(ci, u, TTB_REVERSES);
+ bot_kick(ci, u, BOT_REASON_REVERSE);
+ return;
+ }
+
+ /* Underlines kicker */
+ if ((ci->botflags & BS_KICK_UNDERLINES) && strchr(buf, 31)) {
+ check_ban(ci, u, TTB_UNDERLINES);
+ bot_kick(ci, u, BOT_REASON_UNDERLINE);
+ return;
+ }
+
+ /* Caps kicker */
+ if ((ci->botflags & BS_KICK_CAPS)
+ && ((c = strlen(buf)) >= ci->capsmin)) {
+ int i = 0;
+ char *s = buf;
+
+ do {
+ if (isupper(*s))
+ i++;
+ } while (*s++);
+
+ if (i >= ci->capsmin && i * 100 / c >= ci->capspercent) {
+ check_ban(ci, u, TTB_CAPS);
+ bot_kick(ci, u, BOT_REASON_CAPS);
+ return;
+ }
+ }
+
+ /* Bad words kicker */
+ if (ci->botflags & BS_KICK_BADWORDS) {
+ int i;
+ int mustkick = 0;
+ BadWord *bw;
+
+ for (i = 0, bw = ci->badwords; i < ci->bwcount; i++, bw++) {
+ if (!bw->in_use)
+ continue;
+
+ if (bw->type == BW_ANY && stristr(buf, bw->word)) {
+ mustkick = 1;
+ } else if (bw->type == BW_SINGLE) {
+ int len = strlen(bw->word);
+
+ if (!stricmp(buf, bw->word)) {
+ mustkick = 1;
+ /* two next if are quite odd isn't it? =) */
+ } else if ((strchr(buf, ' ') == buf + len)
+ && (stristr(buf, bw->word) == buf)) {
+ mustkick = 1;
+ } else
+ if ((strrchr(buf, ' ') ==
+ buf + strlen(buf) - len - 1)
+ && (stristr(buf, bw->word) ==
+ buf + strlen(buf) - len)) {
+ mustkick = 1;
+ } else {
+ char *wordbuf = scalloc(len + 3, 1);
+
+ wordbuf[0] = ' ';
+ wordbuf[len + 1] = ' ';
+ wordbuf[len + 2] = '\0';
+ memcpy(wordbuf + 1, bw->word, len);
+
+ if (stristr(buf, wordbuf))
+ mustkick = 1;
+ }
+ } else if (bw->type == BW_START) {
+ int len = strlen(bw->word);
+
+ if (!strnicmp(buf, bw->word, len)) {
+ mustkick = 1;
+ } else {
+ char *wordbuf = scalloc(len + 2, 1);
+
+ memcpy(wordbuf + 1, bw->word, len);
+ wordbuf[0] = ' ';
+ wordbuf[len + 1] = '\0';
+
+ if (stristr(buf, wordbuf))
+ mustkick = 1;
+
+ free(wordbuf);
+ }
+ } else if (bw->type == BW_END) {
+ int len = strlen(bw->word);
+
+ if (!strnicmp(buf + strlen(buf) - len, bw->word, len)) {
+ mustkick = 1;
+ } else {
+ char *wordbuf = scalloc(len + 2, 1);
+
+ memcpy(wordbuf, bw->word, len);
+ wordbuf[len] = ' ';
+ wordbuf[len + 1] = '\0';
+
+ if (stristr(buf, wordbuf))
+ mustkick = 1;
+
+ free(wordbuf);
+ }
+ }
+
+ if (mustkick) {
+ check_ban(ci, u, TTB_BADWORDS);
+ if (BSGentleBWReason)
+ bot_kick(ci, u, BOT_REASON_BADWORD_GENTLE);
+ else
+ bot_kick(ci, u, BOT_REASON_BADWORD, bw->word);
+ return;
+ }
+ }
+ }
+
+ /* Flood kicker */
+ if (ci->botflags & BS_KICK_FLOOD) {
+ time_t now = time(NULL);
+
+ ud = get_user_data(ci->c, u);
+ if (!ud)
+ return;
+
+ if (now - ud->last_start > ci->floodsecs) {
+ ud->last_start = time(NULL);
+ ud->lines = 0;
+ }
+
+ ud->lines++;
+ if (ud->lines >= ci->floodlines) {
+ check_ban(ci, u, TTB_FLOOD);
+ bot_kick(ci, u, BOT_REASON_FLOOD);
+ return;
+ }
+ }
+
+ /* Repeat kicker */
+ if (ci->botflags & BS_KICK_REPEAT) {
+ ud = get_user_data(ci->c, u);
+ if (!ud)
+ return;
+
+ if (ud->lastline && stricmp(ud->lastline, buf)) {
+ free(ud->lastline);
+ ud->lastline = sstrdup(buf);
+ ud->times = 0;
+ } else {
+ if (!ud->lastline)
+ ud->lastline = sstrdup(buf);
+ ud->times++;
+ }
+
+ if (ud->times >= ci->repeattimes) {
+ check_ban(ci, u, TTB_REPEAT);
+ bot_kick(ci, u, BOT_REASON_REPEAT);
+ return;
+ }
+ }
+ }
+
+
+ /* return if the user is on the ignore list */
+ if (get_ignore(u->nick) != NULL) {
+ return;
+ }
+
+ /* Fantaisist commands */
+
+ if (buf && (ci->botflags & BS_FANTASY) && *buf == '!'
+ && check_access(u, ci, CA_FANTASIA)) {
+ cmd = strtok(buf, " ");
+
+ if (cmd) {
+#if defined(IRC_UNREAL) || defined (IRC_VIAGRA)
+ if (!stricmp(cmd, "!deowner")) {
+ if (is_founder(u, ci))
+ bot_raw_mode(u, ci, "-q", u->nick);
+ } else
+#endif
+ if (!stricmp(cmd, "!kb")) {
+ char *target = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+
+ if (!target && check_access(u, ci, CA_BANME)) {
+ bot_raw_ban(u, ci, u->nick, "Requested");
+ } else if (target && check_access(u, ci, CA_BAN)) {
+ if (!stricmp(target, ci->bi->nick)) {
+ bot_raw_ban(u, ci, u->nick, "Oops!");
+ } else {
+ if (!reason)
+ bot_raw_ban(u, ci, target, "Requested");
+ else
+ bot_raw_ban(u, ci, target, reason);
+ }
+ }
+ } else if ((!stricmp(cmd, "!kick")) || (!stricmp(cmd, "!k"))) {
+ char *target = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+
+ if (!target && check_access(u, ci, CA_KICKME)) {
+ bot_raw_kick(u, ci, u->nick, "Requested");
+ } else if (target && check_access(u, ci, CA_KICK)) {
+ if (!stricmp(target, ci->bi->nick))
+ bot_raw_kick(u, ci, u->nick, "Oops!");
+ else if (!reason)
+ bot_raw_kick(u, ci, target, "Requested");
+ else
+ bot_raw_kick(u, ci, target, reason);
+ }
+#if defined(IRC_UNREAL) || defined (IRC_VIAGRA)
+ } else if (!stricmp(cmd, "!owner")) {
+ if (is_founder(u, ci))
+ bot_raw_mode(u, ci, "+q", u->nick);
+#endif
+ } else if (!stricmp(cmd, "!seen")) {
+ char *target = strtok(NULL, " ");
+ char buf[BUFSIZE];
+
+ if (target) {
+ User *u2;
+ NickAlias *na;
+ ChanAccess *access;
+
+ if (!stricmp(ci->bi->nick, target)) {
+ /* If we look for the bot */
+ snprintf(buf, sizeof(buf),
+ getstring(u->na, BOT_SEEN_BOT), u->nick);
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name,
+ buf);
+ } else if (!(na = findnick(target))
+ || (na->status & NS_VERBOTEN)) {
+ /* If the nick is not registered or forbidden */
+ snprintf(buf, sizeof(buf),
+ getstring(u->na, BOT_SEEN_UNKNOWN),
+ target);
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name,
+ buf);
+ } else if ((u2 = nc_on_chan(ci->c, na->nc))) {
+ /* If the nick we're looking for is on the channel,
+ * there are three possibilities: it's yourself,
+ * it's the nick we look for, it's an alias of the
+ * nick we look for.
+ */
+ if (u == u2 || (u->na && u->na->nc == na->nc))
+ snprintf(buf, sizeof(buf),
+ getstring(u->na, BOT_SEEN_YOU),
+ u->nick);
+ else if (!stricmp(u2->nick, target))
+ snprintf(buf, sizeof(buf),
+ getstring(u->na, BOT_SEEN_ON_CHANNEL),
+ u2->nick);
+ else
+ snprintf(buf, sizeof(buf),
+ getstring(u->na,
+ BOT_SEEN_ON_CHANNEL_AS),
+ target, u2->nick);
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name,
+ buf);
+ } else if ((access = get_access_entry(na->nc, ci))) {
+ /* User is on the access list but not present actually.
+ Special case: if access->last_seen is 0 it's that we
+ never seen the user.
+ */
+ if (access->last_seen) {
+ char durastr[192];
+ duration(u->na, durastr, sizeof(durastr),
+ time(NULL) - access->last_seen);
+ snprintf(buf, sizeof(buf),
+ getstring(u->na, BOT_SEEN_ON), target,
+ durastr);
+ } else {
+ snprintf(buf, sizeof(buf),
+ getstring(u->na, BOT_SEEN_NEVER),
+ target);
+ }
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name,
+ buf);
+ } else {
+ /* All other cases */
+ snprintf(buf, sizeof(buf),
+ getstring(u->na, BOT_SEEN_UNKNOWN),
+ target);
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name,
+ buf);
+ }
+ }
+ } else if (!stricmp(cmd, "!unban")
+ && check_access(u, ci, CA_UNBAN)) {
+ char *target = strtok(NULL, " ");
+
+ if (!target)
+ bot_raw_unban(ci, u->nick);
+ else
+ bot_raw_unban(ci, target);
+ } else {
+ CSModeUtil *util = csmodeutils;
+
+ do {
+ if (!stricmp(cmd, util->bsname)) {
+ char *target = strtok(NULL, " ");
+
+ if (!target
+ && check_access(u, ci, util->levelself))
+ bot_raw_mode(u, ci, util->mode, u->nick);
+ else if (target
+ && check_access(u, ci, util->level))
+ bot_raw_mode(u, ci, util->mode, target);
+ }
+ } while ((++util)->name != NULL);
+ }
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* Load/save data files. */
+
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ if (!forceload) \
+ fatal("Read error on %s", BotDBName); \
+ failed = 1; \
+ break; \
+ } \
+} while (0)
+
+void load_bs_dbase(void)
+{
+ dbFILE *f;
+ int c, ver;
+ int16 tmp16;
+ int32 tmp32;
+ BotInfo *bi;
+ int failed = 0;
+
+ if (!(f = open_db(s_BotServ, BotDBName, "r", BOT_VERSION)))
+ return;
+
+ ver = get_file_version(f);
+
+ while (!failed && (c = getc_db(f)) != 0) {
+ char *s;
+
+ if (c != 1)
+ fatal("Invalid format in %s %d", BotDBName, c);
+
+ SAFE(read_string(&s, f));
+ bi = makebot(s);
+ free(s);
+ SAFE(read_string(&bi->user, f));
+ SAFE(read_string(&bi->host, f));
+ SAFE(read_string(&bi->real, f));
+ if (ver >= 10) {
+ SAFE(read_int16(&tmp16, f));
+ bi->flags = tmp16;
+ }
+ SAFE(read_int32(&tmp32, f));
+ bi->created = tmp32;
+ SAFE(read_int16(&tmp16, f));
+ bi->chancount = tmp16;
+ }
+
+ close_db(f);
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ restore_db(f); \
+ log_perror("Write error on %s", BotDBName); \
+ if (time(NULL) - lastwarn > WarningTimeout) { \
+ wallops(NULL, "Write error on %s: %s", BotDBName, \
+ strerror(errno)); \
+ lastwarn = time(NULL); \
+ } \
+ return; \
+ } \
+} while (0)
+
+void save_bs_dbase(void)
+{
+ dbFILE *f;
+ BotInfo *bi;
+ static time_t lastwarn = 0;
+ int i;
+
+ if (!(f = open_db(s_BotServ, BotDBName, "w", BOT_VERSION)))
+ return;
+
+ for (i = 0; i < 256; i++) {
+ for (bi = botlists[i]; bi; bi = bi->next) {
+ SAFE(write_int8(1, f));
+ SAFE(write_string(bi->nick, f));
+ SAFE(write_string(bi->user, f));
+ SAFE(write_string(bi->host, f));
+ SAFE(write_string(bi->real, f));
+ SAFE(write_int16(bi->flags, f));
+ SAFE(write_int32(bi->created, f));
+ SAFE(write_int16(bi->chancount, f));
+ }
+ }
+ SAFE(write_int8(0, f));
+
+ close_db(f);
+
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+void save_bs_rdb_dbase(void)
+{
+#ifdef USE_RDB
+ int i;
+ BotInfo *bi;
+
+ if (!rdb_open())
+ return;
+
+ rdb_clear_table("anope_bs_core");
+
+ for (i = 0; i < 256; i++) {
+ for (bi = botlists[i]; bi; bi = bi->next) {
+ rdb_save_bs_core(bi);
+ }
+ }
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+
+/* Inserts a bot in the bot list. I can't be much explicit mh? */
+
+static void insert_bot(BotInfo * bi)
+{
+ BotInfo *ptr, *prev;
+
+ for (prev = NULL, ptr = botlists[tolower(*bi->nick)];
+ ptr != NULL && stricmp(ptr->nick, bi->nick) < 0;
+ prev = ptr, ptr = ptr->next);
+ bi->prev = prev;
+ bi->next = ptr;
+ if (!prev)
+ botlists[tolower(*bi->nick)] = bi;
+ else
+ prev->next = bi;
+ if (ptr)
+ ptr->prev = bi;
+}
+
+/*************************************************************************/
+
+static BotInfo *makebot(char *nick)
+{
+ BotInfo *bi;
+
+ bi = scalloc(sizeof(BotInfo), 1);
+ bi->nick = sstrdup(nick);
+ bi->lastmsg = time(NULL);
+ insert_bot(bi);
+ nbots++;
+ return bi;
+}
+
+/*************************************************************************/
+
+static void change_bot_nick(BotInfo * bi, char *newnick)
+{
+ if (bi->next)
+ bi->next->prev = bi->prev;
+ if (bi->prev)
+ bi->prev->next = bi->next;
+ else
+ botlists[tolower(*bi->nick)] = bi->next;
+
+ if (bi->nick)
+ free(bi->nick);
+ bi->nick = sstrdup(newnick);
+
+ insert_bot(bi);
+}
+
+/*************************************************************************/
+
+static int delbot(BotInfo * bi)
+{
+ cs_remove_bot(bi);
+
+ if (bi->next)
+ bi->next->prev = bi->prev;
+ if (bi->prev)
+ bi->prev->next = bi->next;
+ else
+ botlists[tolower(*bi->nick)] = bi->next;
+
+ nbots--;
+
+ free(bi->nick);
+ free(bi->user);
+ free(bi->host);
+ free(bi->real);
+
+ free(bi);
+
+ return 1;
+}
+
+/*************************************************************************/
+
+BotInfo *findbot(char *nick)
+{
+ BotInfo *bi;
+
+ if (!nick || !*nick)
+ return NULL;
+
+ for (bi = botlists[tolower(*nick)]; bi; bi = bi->next)
+ if (!stricmp(nick, bi->nick))
+ return bi;
+
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Unassign a bot from a channel. Assumes u, ci and ci->bi are not NULL */
+
+static void unassign(User * u, ChannelInfo * ci)
+{
+ if (ci->c && ci->c->usercount >= BSMinUsers) {
+ send_cmd(ci->bi->nick, "PART %s :UNASSIGN from %s", ci->name,
+ u->nick);
+ }
+ ci->bi->chancount--;
+ ci->bi = NULL;
+}
+
+/*************************************************************************/
+
+/* Returns ban data associated with an user if it exists, allocates it
+ otherwise. */
+
+static BanData *get_ban_data(Channel * c, User * u)
+{
+ char mask[BUFSIZE];
+ BanData *bd, *next;
+ time_t now = time(NULL);
+
+ if (!c || !u)
+ return NULL;
+
+ snprintf(mask, sizeof(mask), "%s@%s", u->username, GetHost(u));
+
+ for (bd = c->bd; bd; bd = next) {
+ if (now - bd->last_use > BSKeepData) {
+ if (bd->next)
+ bd->next->prev = bd->prev;
+ if (bd->prev)
+ bd->prev->next = bd->next;
+ else
+ c->bd = bd->next;
+ if (bd->mask)
+ free(bd->mask);
+ next = bd->next;
+ free(bd);
+ continue;
+ }
+ if (!stricmp(bd->mask, mask)) {
+ bd->last_use = now;
+ return bd;
+ }
+ next = bd->next;
+ }
+
+ /* If we fall here it is that we haven't found the record */
+ bd = scalloc(sizeof(BanData), 1);
+ bd->mask = sstrdup(mask);
+ bd->last_use = now;
+
+ bd->prev = NULL;
+ bd->next = c->bd;
+ if (bd->next)
+ bd->next->prev = bd;
+ c->bd = bd;
+
+ return bd;
+}
+
+/*************************************************************************/
+
+/* Returns BotServ data associated with an user on a given channel.
+ * Allocates it if necessary.
+ */
+
+static UserData *get_user_data(Channel * c, User * u)
+{
+ struct c_userlist *user;
+
+ if (!c || !u)
+ return NULL;
+
+ for (user = c->users; user; user = user->next) {
+ if (user->user == u) {
+ if (user->ud) {
+ time_t now = time(NULL);
+
+ /* Checks whether data is obsolete */
+ if (now - user->ud->last_use > BSKeepData) {
+ if (user->ud->lastline)
+ free(user->ud->lastline);
+ /* We should not free and realloc, but reset to 0
+ instead. */
+ memset(user->ud, 0, sizeof(UserData));
+ user->ud->last_use = now;
+ }
+
+ return user->ud;
+ } else {
+ user->ud = scalloc(sizeof(UserData), 1);
+ user->ud->last_use = time(NULL);
+ return user->ud;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Makes the bot join a channel and op himself. */
+
+void bot_join(ChannelInfo * ci)
+{
+ int i;
+
+ if (!ci || !ci->c || !ci->bi)
+ return;
+
+ if (BSSmartJoin) {
+ /* We check for bans */
+ int count = ci->c->bancount;
+ if (count) {
+ char botmask[BUFSIZE];
+ char **bans = scalloc(sizeof(char *) * count, 1);
+ char *av[3];
+
+ memcpy(bans, ci->c->bans, sizeof(char *) * count);
+ snprintf(botmask, sizeof(botmask), "%s!%s@%s", ci->bi->nick,
+ ci->bi->user, ci->bi->host);
+
+ av[0] = ci->c->name;
+ av[1] = sstrdup("-b");
+ for (i = 0; i < count; i++) {
+ if (match_wild_nocase(ci->c->bans[i], botmask)) {
+ send_cmd(ci->bi->nick, "MODE %s -b %s", ci->name,
+ bans[i]);
+ av[2] = sstrdup(bans[i]);
+ do_cmode(ci->bi->nick, 3, av);
+ free(av[2]);
+ }
+ }
+ free(av[1]);
+ free(bans);
+ }
+
+ /* Should we be invited? */
+ if ((ci->c->mode & CMODE_i)
+ || (ci->c->limit && ci->c->usercount >= ci->c->limit))
+ send_cmd(NULL, "NOTICE @%s :%s invited %s into the channel.",
+ ci->c->name, ci->bi->nick, ci->bi->nick);
+ }
+#ifdef IRC_BAHAMUT
+ send_cmd(ci->bi->nick, "SJOIN %ld %s", ci->c->creation_time,
+ ci->c->name);
+#elif defined(IRC_HYBRID)
+ send_cmd(NULL, "SJOIN %ld %s + :%s", time(NULL), ci->c->name,
+ ci->bi->nick);
+#else
+ send_cmd(ci->bi->nick, "JOIN %s", ci->c->name);
+#endif
+
+#if defined(IRC_UNREAL) || defined (IRC_VIAGRA)
+ send_cmd(ci->bi->nick, "MODE %s +ao %s %s", ci->c->name, ci->bi->nick,
+ ci->bi->nick);
+#elif defined(IRC_PTLINK)
+ /* PTLinks requieres an IRCop to u-line changes, so use ChanServ */
+ send_cmd(s_ChanServ, "MODE %s +ao %s %s", ci->c->name, ci->bi->nick,
+ ci->bi->nick);
+#else
+ send_cmd(ci->bi->nick, "MODE %s +o %s", ci->c->name, ci->bi->nick);
+#endif
+}
+
+/*************************************************************************/
+
+/* This makes the bot rejoin all channel he is on when he gets killed
+ * or changed.
+ */
+
+void bot_rejoin_all(BotInfo * bi)
+{
+ int i;
+ ChannelInfo *ci;
+
+ for (i = 0; i < 256; i++)
+ for (ci = chanlists[i]; ci; ci = ci->next)
+ if (ci->bi == bi && ci->c && (ci->c->usercount >= BSMinUsers))
+ bot_join(ci);
+}
+
+/*************************************************************************/
+
+/* This makes a ban if the user has to have one. In every cases it increments
+ the kick count for the user. */
+
+static void check_ban(ChannelInfo * ci, User * u, int ttbtype)
+{
+ BanData *bd = get_ban_data(ci->c, u);
+
+ if (!bd)
+ return;
+
+ bd->ttb[ttbtype]++;
+ if (bd->ttb[ttbtype] == ci->ttb[ttbtype]) {
+ char *av[3];
+ char mask[BUFSIZE];
+
+ bd->ttb[ttbtype] = 0;
+
+ av[0] = ci->name;
+ av[1] = sstrdup("+b");
+ get_idealban(ci, u, mask, sizeof(mask));
+ av[2] = mask;
+ send_cmd(ci->bi->nick, "MODE %s +b %s", av[0], av[2]);
+ do_cmode(ci->bi->nick, 3, av);
+ free(av[1]);
+ }
+}
+
+/*************************************************************************/
+
+/* This makes a bot kick an user. Works somewhat like notice_lang in fact ;) */
+
+static void bot_kick(ChannelInfo * ci, User * u, int message, ...)
+{
+ va_list args;
+ char buf[1024];
+ const char *fmt;
+ char *av[3];
+
+ if (!ci || !ci->bi || !ci->c || !u)
+ return;
+
+ va_start(args, message);
+ fmt = getstring(u->na, message);
+ if (!fmt)
+ return;
+ vsnprintf(buf, sizeof(buf), fmt, args);
+
+ av[0] = ci->name;
+ av[1] = u->nick;
+ av[2] = buf;
+ send_cmd(ci->bi->nick, "KICK %s %s :%s", av[0], av[1], av[2]);
+ do_kick(ci->bi->nick, 3, av);
+}
+
+/*************************************************************************/
+
+/* Makes a simple ban and kicks the target */
+
+static void bot_raw_ban(User * requester, ChannelInfo * ci, char *nick,
+ char *reason)
+{
+ char *av[3];
+ char mask[BUFSIZE];
+ User *u = finduser(nick);
+
+ if (!u)
+ return;
+
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ if (is_protected(u) && (requester != u)) {
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name,
+ getstring2(NULL, PERMISSION_DENIED));
+ return;
+ }
+#endif
+
+ if ((ci->flags & CI_PEACE) && stricmp(requester->nick, nick)
+ && (get_access(u, ci) >= get_access(requester, ci)))
+ return;
+
+#if defined (IRC_ULTIMATE) || defined(IRC_ULTIMATE3) || defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_HYBRID)
+ if (is_excepted(ci, u) == 1) {
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name,
+ getstring2(NULL, BOT_EXCEPT));
+ return;
+ }
+#endif
+
+ av[0] = ci->name;
+ av[1] = sstrdup("+b");
+ get_idealban(ci, u, mask, sizeof(mask));
+ av[2] = mask;
+ send_cmd(ci->bi->nick, "MODE %s +b %s", av[0], av[2]);
+ do_cmode(ci->bi->nick, 3, av);
+ free(av[1]);
+
+ av[0] = ci->name;
+ av[1] = nick;
+
+ if (!reason) {
+ av[2] = ci->bi->nick;
+ } else {
+ if (strlen(reason) > 200)
+ reason[200] = '\0';
+ av[2] = reason;
+ }
+
+ send_cmd(ci->bi->nick, "KICK %s %s :%s", av[0], av[1], av[2]);
+ do_kick(ci->bi->nick, 3, av);
+}
+
+/*************************************************************************/
+
+/* Makes a kick with a "dynamic" reason ;) */
+
+static void bot_raw_kick(User * requester, ChannelInfo * ci, char *nick,
+ char *reason)
+{
+ char *av[3];
+ User *u = finduser(nick);
+
+ if (!u || !is_on_chan(ci->c, u))
+ return;
+
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ if (is_protected(u) && (requester != u)) {
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name,
+ getstring2(NULL, PERMISSION_DENIED));
+ return;
+ }
+#endif
+
+ if ((ci->flags & CI_PEACE) && stricmp(requester->nick, nick)
+ && (get_access(u, ci) >= get_access(requester, ci)))
+ return;
+
+ av[0] = ci->name;
+ av[1] = nick;
+
+ if (!reason) {
+ av[2] = ci->bi->nick;
+ } else {
+ if (strlen(reason) > 200)
+ reason[200] = '\0';
+ av[2] = reason;
+ }
+
+ send_cmd(ci->bi->nick, "KICK %s %s :%s", av[0], av[1], av[2]);
+ do_kick(ci->bi->nick, 3, av);
+}
+
+/*************************************************************************/
+
+/* Makes a mode operation on a channel for a nick */
+
+static void bot_raw_mode(User * requester, ChannelInfo * ci, char *mode,
+ char *nick)
+{
+ char *av[3];
+ User *u = finduser(nick);
+
+ if (!u || !is_on_chan(ci->c, u))
+ return;
+
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ if (is_protected(u) && *mode == '-' && (requester != u)) {
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name,
+ getstring2(NULL, PERMISSION_DENIED));
+ return;
+ }
+#endif
+
+ if (*mode == '-' && (ci->flags & CI_PEACE)
+ && stricmp(requester->nick, nick)
+ && (get_access(u, ci) >= get_access(requester, ci)))
+ return;
+
+ av[0] = ci->name;
+ av[1] = mode;
+ av[2] = nick;
+
+ send_cmd(ci->bi->nick, "MODE %s %s %s", av[0], av[1], av[2]);
+ do_cmode(ci->bi->nick, 3, av);
+}
+
+/*************************************************************************/
+
+/* Removes all bans for a nick on a channel */
+
+static void bot_raw_unban(ChannelInfo * ci, char *nick)
+{
+#ifndef IRC_BAHAMUT
+ int count, i;
+ char *av[3], **bans;
+ User *u;
+#endif
+
+ if (!ci || !ci->c || !ci->bi || !nick)
+ return;
+#ifndef IRC_BAHAMUT
+ if (!(u = finduser(nick)))
+ return;
+#else
+ if (!finduser(nick))
+ return;
+#endif
+
+#ifndef IRC_BAHAMUT
+ av[0] = ci->name;
+ av[1] = sstrdup("-b");
+
+ count = ci->c->bancount;
+ bans = scalloc(sizeof(char *) * count, 1);
+ memcpy(bans, ci->c->bans, sizeof(char *) * count);
+
+ for (i = 0; i < count; i++) {
+ if (match_usermask(bans[i], u)) {
+ send_cmd(ci->bi->nick, "MODE %s -b %s", ci->name, bans[i]);
+ av[2] = bans[i];
+ do_cmode(ci->bi->nick, 3, av);
+ }
+ }
+ free(bans);
+ free(av[1]);
+#else
+ send_cmd(ServerName, "SVSMODE %s -b %s", ci->name, nick);
+#endif
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+static int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_BotServ, u, BOT_HELP, BSMinUsers);
+ if (is_services_oper(u))
+ notice_help(s_BotServ, u, BOT_SERVADMIN_HELP);
+ moduleDisplayHelp(4, u);
+ } else {
+ mod_help_cmd(s_BotServ, u, BOTSERV, cmd);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_bot(User * u)
+{
+ BotInfo *bi;
+ char *cmd = strtok(NULL, " ");
+ char *ch = NULL;
+
+ if (!cmd)
+ syntax_error(s_BotServ, u, "BOT", BOT_BOT_SYNTAX);
+ else if (!stricmp(cmd, "ADD")) {
+ char *nick = strtok(NULL, " ");
+ char *user = strtok(NULL, " ");
+ char *host = strtok(NULL, " ");
+ char *real = strtok(NULL, "");
+
+ if (!nick || !user || !host || !real)
+ syntax_error(s_BotServ, u, "BOT", BOT_BOT_SYNTAX);
+ else if (readonly)
+ notice_lang(s_BotServ, u, BOT_BOT_READONLY);
+ else if (findbot(nick))
+ notice_lang(s_BotServ, u, BOT_BOT_ALREADY_EXISTS, nick);
+ else {
+ User *u2;
+ NickAlias *na;
+
+ /**
+ * Check the nick is valid re RFC 2812
+ **/
+ if (isdigit(nick[0]) || nick[0] == '-') {
+ notice_lang(s_BotServ, u, BOT_BAD_NICK);
+ return MOD_CONT;
+ }
+ for (ch = nick; *ch && (ch - nick) < NICKMAX; ch++) {
+ if (!isvalidnick(*ch)) {
+ notice_lang(s_BotServ, u, BOT_BAD_NICK);
+ return MOD_CONT;
+ }
+ }
+ if (!isValidHost(host, 3)) {
+ notice_lang(s_BotServ, u, BOT_BAD_HOST);
+ return MOD_CONT;
+ }
+ for (ch = user; *ch && (ch - user) < USERMAX; ch++) {
+ if (!isalnum(*ch)) {
+ notice_lang(s_BotServ, u, BOT_BAD_IDENT);
+ return MOD_CONT;
+ }
+ }
+
+ /**
+ * Check the host is valid re RFC 2812
+ **/
+
+ /* Check whether it's a services client's nick and return if so - Certus */
+
+ if ((s_NickServ && (stricmp(nick, s_NickServ) == 0))
+ || (s_NickServAlias && !stricmp(nick, s_NickServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_ChanServ && (stricmp(nick, s_ChanServ) == 0))
+ || (s_ChanServAlias
+ && !stricmp(nick, s_ChanServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_MemoServ && (stricmp(nick, s_MemoServ) == 0))
+ || (s_MemoServAlias
+ && !stricmp(nick, s_MemoServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_BotServ && (stricmp(nick, s_BotServ) == 0))
+ || (s_BotServAlias
+ && !stricmp(nick, s_BotServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_HelpServ && (stricmp(nick, s_HelpServ) == 0))
+ || (s_HelpServAlias
+ && !stricmp(nick, s_HelpServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_OperServ && (stricmp(nick, s_OperServ) == 0))
+ || (s_OperServAlias
+ && !stricmp(nick, s_OperServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else
+ if ((s_GlobalNoticer
+ && (stricmp(nick, s_GlobalNoticer) == 0))
+ || (s_GlobalNoticerAlias
+ && !stricmp(nick, s_GlobalNoticerAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_HostServ && (stricmp(nick, s_HostServ) == 0))
+ || (s_HostServAlias
+ && !stricmp(nick, s_HostServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ }
+
+ /* We check whether the nick is registered, and drop it if so. */
+ if ((na = findnick(nick))) {
+ if (NSSecureAdmins && nick_is_services_admin(na->nc)
+ && !is_services_root(u)) {
+ notice_lang(s_BotServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+ delnick(na);
+ }
+
+ bi = makebot(nick);
+ if (!bi) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ }
+
+ bi->user = sstrdup(user);
+ bi->host = sstrdup(host);
+ bi->real = sstrdup(real);
+ bi->created = time(NULL);
+ bi->chancount = 0;
+
+ /* We check whether user with this nick is online, and kill it if so */
+ if ((u2 = finduser(nick)))
+ kill_user(s_BotServ, u2->nick,
+ "This nick is now used by Services");
+
+ /* We make the bot online, ready to serve */
+#if defined(IRC_UNREAL) || defined (IRC_VIAGRA)
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+qS", 1);
+#elif defined(IRC_ULTIMATE) || defined (IRC_ULTIMATE3)
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+pS", 1);
+#else
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+", 1);
+#endif
+
+ notice_lang(s_BotServ, u, BOT_BOT_ADDED, bi->nick, bi->user,
+ bi->host, bi->real);
+ }
+ } else if (!stricmp(cmd, "CHANGE")) {
+ char *oldnick = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+ char *user = strtok(NULL, " ");
+ char *host = strtok(NULL, " ");
+ char *real = strtok(NULL, "");
+
+ if (!oldnick || !nick)
+ syntax_error(s_BotServ, u, "BOT", BOT_BOT_SYNTAX);
+ else if (readonly)
+ notice_lang(s_BotServ, u, BOT_BOT_READONLY);
+ else if (!(bi = findbot(oldnick)))
+ notice_lang(s_BotServ, u, BOT_DOES_NOT_EXIST, oldnick);
+ else {
+ User *u2;
+ NickAlias *na;
+
+ /* Checks whether there *are* changes.
+ * Case sensitive because we may want to change just the case.
+ * And we must finally check that the nick is not already
+ * taken by another bot.
+ */
+ if (!strcmp(bi->nick, nick)
+ && ((user) ? !strcmp(bi->user, user) : 1)
+ && ((host) ? !strcmp(bi->host, host) : 1)
+ && ((real) ? !strcmp(bi->real, real) : 1)) {
+ notice_lang(s_BotServ, u, BOT_BOT_ANY_CHANGES);
+ return MOD_CONT;
+ }
+
+ /* Check whether it's a services client's nick and return if so - Certus */
+ if ((s_NickServ && !stricmp(nick, s_NickServ))
+ || (s_NickServAlias && !stricmp(nick, s_NickServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_ChanServ && !stricmp(nick, s_ChanServ))
+ || (s_ChanServAlias
+ && !stricmp(nick, s_ChanServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_MemoServ && !stricmp(nick, s_MemoServ))
+ || (s_MemoServAlias
+ && !stricmp(nick, s_MemoServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_BotServ && !stricmp(nick, s_BotServ))
+ || (s_BotServAlias
+ && !stricmp(nick, s_BotServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_HelpServ && !stricmp(nick, s_HelpServ))
+ || (s_HelpServAlias
+ && !stricmp(nick, s_HelpServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_OperServ && !stricmp(nick, s_OperServ))
+ || (s_OperServAlias
+ && !stricmp(nick, s_OperServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_GlobalNoticer && !stricmp(nick, s_GlobalNoticer))
+ || (s_GlobalNoticerAlias
+ && !stricmp(nick, s_GlobalNoticerAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ } else if ((s_HostServ && !stricmp(nick, s_HostServ))
+ || (s_HostServAlias
+ && !stricmp(nick, s_HostServAlias))) {
+ notice_lang(s_BotServ, u, BOT_BOT_CREATION_FAILED);
+ return MOD_CONT;
+ }
+
+ /**
+ * Check the nick is valid re RFC 2812
+ **/
+ if (isdigit(nick[0]) || nick[0] == '-') {
+ notice_lang(s_BotServ, u, BOT_BAD_NICK);
+ return MOD_CONT;
+ }
+ for (ch = nick; *ch && (ch - nick) < NICKMAX; ch++) {
+ if (!isvalidnick(*ch)) {
+ notice_lang(s_BotServ, u, BOT_BAD_NICK);
+ return MOD_CONT;
+ }
+ }
+ if (!isValidHost(host, 3)) {
+ notice_lang(s_BotServ, u, BOT_BAD_HOST);
+ return MOD_CONT;
+ }
+
+ for (ch = user; *ch && (ch - user) < USERMAX; ch++) {
+ if (!isalnum(*ch)) {
+ notice_lang(s_BotServ, u, BOT_BAD_IDENT);
+ return MOD_CONT;
+ }
+ }
+
+ if (stricmp(bi->nick, nick) && findbot(nick)) {
+ notice_lang(s_BotServ, u, BOT_BOT_ALREADY_EXISTS, nick);
+ return MOD_CONT;
+ }
+
+ if (stricmp(bi->nick, nick)) {
+ /* The new nick is really different, so we remove the Q line for
+ the old nick. */
+#ifndef IRC_HYBRID
+ send_cmd(NULL, "UNSQLINE %s", bi->nick);
+#endif
+
+ /* We check whether the nick is registered, and drop it if so */
+ if ((na = findnick(nick)))
+ delnick(na);
+
+ /* We check whether user with this nick is online, and kill it if so */
+ if ((u2 = finduser(nick)))
+ kill_user(s_BotServ, u2->nick,
+ "This nick is now used by Services");
+ }
+
+ if (strcmp(nick, bi->nick))
+ change_bot_nick(bi, nick);
+
+ if (user && strcmp(user, bi->user)) {
+ free(bi->user);
+ bi->user = sstrdup(user);
+ }
+ if (host && strcmp(host, bi->host)) {
+ free(bi->host);
+ bi->host = sstrdup(host);
+ }
+ if (real && strcmp(real, bi->real)) {
+ free(bi->real);
+ bi->real = sstrdup(real);
+ }
+
+ /* If only the nick changes, we just make the bot change his nick,
+ else we must make it quit and rejoin. */
+ if (!user)
+ send_cmd(oldnick, "NICK %s", bi->nick);
+ else {
+ send_cmd(oldnick, "QUIT :Quit: Be right back");
+#if defined(IRC_UNREAL)
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+qS", 1);
+#elif defined(IRC_ULTIMATE)
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+pS", 1);
+#else
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+", 1);
+#endif
+ bot_rejoin_all(bi);
+ }
+
+ notice_lang(s_BotServ, u, BOT_BOT_CHANGED, oldnick, bi->nick,
+ bi->user, bi->host, bi->real);
+ }
+ } else if (!stricmp(cmd, "DEL")) {
+ char *nick = strtok(NULL, " ");
+
+ if (!nick)
+ syntax_error(s_BotServ, u, "BOT", BOT_BOT_SYNTAX);
+ else if (readonly)
+ notice_lang(s_BotServ, u, BOT_BOT_READONLY);
+ else if (!(bi = findbot(nick)))
+ notice_lang(s_BotServ, u, BOT_DOES_NOT_EXIST, nick);
+ else {
+ send_cmd(bi->nick,
+ "QUIT :Quit: Help! I'm being deleted by %s!",
+ u->nick);
+#ifndef IRC_HYBRID
+ send_cmd(NULL, "UNSQLINE %s", bi->nick);
+#endif
+ delbot(bi);
+
+ notice_lang(s_BotServ, u, BOT_BOT_DELETED, nick);
+ }
+ } else if (!stricmp(cmd, "LIST"))
+ do_botlist(u);
+ else
+ syntax_error(s_BotServ, u, "BOT", BOT_BOT_SYNTAX);
+
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_botlist(User * u)
+{
+ int i, count = 0;
+ BotInfo *bi;
+
+ if (!nbots) {
+ notice_lang(s_BotServ, u, BOT_BOTLIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ for (i = 0; i < 256; i++) {
+ for (bi = botlists[i]; bi; bi = bi->next) {
+ if (!(bi->flags & BI_PRIVATE)) {
+ if (!count)
+ notice_lang(s_BotServ, u, BOT_BOTLIST_HEADER);
+ count++;
+ notice_user(s_BotServ, u, " %-15s (%s@%s)", bi->nick,
+ bi->user, bi->host);
+ }
+ }
+ }
+
+ if (is_oper(u) && count < nbots) {
+ notice_lang(s_BotServ, u, BOT_BOTLIST_PRIVATE_HEADER);
+
+ for (i = 0; i < 256; i++) {
+ for (bi = botlists[i]; bi; bi = bi->next) {
+ if (bi->flags & BI_PRIVATE) {
+ notice_user(s_BotServ, u, " %-15s (%s@%s)",
+ bi->nick, bi->user, bi->host);
+ count++;
+ }
+ }
+ }
+ }
+
+ if (!count)
+ notice_lang(s_BotServ, u, BOT_BOTLIST_EMPTY);
+ else
+ notice_lang(s_BotServ, u, BOT_BOTLIST_FOOTER, count);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_assign(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+ BotInfo *bi;
+ ChannelInfo *ci;
+
+ if (readonly)
+ notice_lang(s_BotServ, u, BOT_ASSIGN_READONLY);
+ else if (!chan || !nick)
+ syntax_error(s_BotServ, u, "ASSIGN", BOT_ASSIGN_SYNTAX);
+ else if (!(bi = findbot(nick)))
+ notice_lang(s_BotServ, u, BOT_DOES_NOT_EXIST, nick);
+ else if (bi->flags & BI_PRIVATE && !is_oper(u))
+ notice_lang(s_BotServ, u, PERMISSION_DENIED);
+ else if (!(ci = cs_findchan(chan)))
+ notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan);
+ else if (ci->flags & CI_VERBOTEN)
+ notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan);
+ else if ((ci->bi) && (stricmp(ci->bi->nick, nick) == 0))
+ notice_lang(s_BotServ, u, BOT_ASSIGN_ALREADY, ci->bi->nick, chan);
+ else if ((ci->botflags & BS_NOBOT)
+ || (!check_access(u, ci, CA_ASSIGN) && !is_services_admin(u)))
+ notice_lang(s_BotServ, u, PERMISSION_DENIED);
+ else {
+ if (ci->bi)
+ unassign(u, ci);
+ ci->bi = bi;
+ bi->chancount++;
+ if (ci->c && ci->c->usercount >= BSMinUsers) {
+ bot_join(ci);
+ }
+ notice_lang(s_BotServ, u, BOT_ASSIGN_ASSIGNED, bi->nick, ci->name);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_unassign(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ ChannelInfo *ci;
+
+ if (readonly)
+ notice_lang(s_BotServ, u, BOT_ASSIGN_READONLY);
+ else if (!chan)
+ syntax_error(s_BotServ, u, "UNASSIGN", BOT_UNASSIGN_SYNTAX);
+ else if (!(ci = cs_findchan(chan)))
+ notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan);
+ else if (ci->flags & CI_VERBOTEN)
+ notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan);
+ else if (!is_services_admin(u) && !check_access(u, ci, CA_ASSIGN))
+ notice_lang(s_BotServ, u, ACCESS_DENIED);
+ else {
+ if (ci->bi)
+ unassign(u, ci);
+ notice_lang(s_BotServ, u, BOT_UNASSIGN_UNASSIGNED, ci->name);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static void send_bot_channels(User * u, BotInfo * bi)
+{
+ int i;
+ ChannelInfo *ci;
+ char buf[307], *end;
+
+ *buf = 0;
+ end = buf;
+
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ if (ci->bi == bi) {
+ if (strlen(buf) + strlen(ci->name) > 300) {
+ notice_user(s_BotServ, u, buf);
+ *buf = 0;
+ end = buf;
+ }
+ end +=
+ snprintf(end, sizeof(buf) - (end - buf), " %s ",
+ ci->name);
+ }
+ }
+ }
+
+ if (*buf)
+ notice_user(s_BotServ, u, buf);
+ return;
+}
+
+static int do_info(User * u)
+{
+ BotInfo *bi;
+ ChannelInfo *ci;
+ char *query = strtok(NULL, " ");
+
+ int need_comma = 0, is_servadmin = is_services_admin(u);
+ char buf[BUFSIZE], *end;
+ const char *commastr = getstring(u->na, COMMA_SPACE);
+
+ if (!query)
+ syntax_error(s_BotServ, u, "INFO", BOT_INFO_SYNTAX);
+ else if ((bi = findbot(query))) {
+ char buf[BUFSIZE];
+ struct tm *tm;
+
+ notice_lang(s_BotServ, u, BOT_INFO_BOT_HEADER, bi->nick);
+ notice_lang(s_BotServ, u, BOT_INFO_BOT_MASK, bi->user, bi->host);
+ notice_lang(s_BotServ, u, BOT_INFO_BOT_REALNAME, bi->real);
+ tm = localtime(&bi->created);
+ strftime_lang(buf, sizeof(buf), u, STRFTIME_DATE_TIME_FORMAT, tm);
+ notice_lang(s_BotServ, u, BOT_INFO_BOT_CREATED, buf);
+ notice_lang(s_BotServ, u, BOT_INFO_BOT_OPTIONS,
+ getstring(u->na,
+ (bi->
+ flags & BI_PRIVATE) ? BOT_INFO_OPT_PRIVATE :
+ BOT_INFO_OPT_NONE));
+ notice_lang(s_BotServ, u, BOT_INFO_BOT_USAGE, bi->chancount);
+
+ if (is_services_admin(u))
+ send_bot_channels(u, bi);
+ } else if ((ci = cs_findchan(query))) {
+ if (!is_servadmin && !is_founder(u, ci)) {
+ notice_lang(s_BotServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_HEADER, ci->name);
+ if (ci->bi)
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_BOT, ci->bi->nick);
+ else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_BOT_NONE);
+
+ if (ci->botflags & BS_KICK_BADWORDS) {
+ if (ci->ttb[TTB_BADWORDS])
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_BADWORDS_BAN,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->ttb[TTB_BADWORDS]);
+ else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_BADWORDS,
+ getstring(u->na, BOT_INFO_ACTIVE));
+ } else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_BADWORDS,
+ getstring(u->na, BOT_INFO_INACTIVE));
+ if (ci->botflags & BS_KICK_BOLDS) {
+ if (ci->ttb[TTB_BOLDS])
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_BOLDS_BAN,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->ttb[TTB_BOLDS]);
+ else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_BOLDS,
+ getstring(u->na, BOT_INFO_ACTIVE));
+ } else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_BOLDS,
+ getstring(u->na, BOT_INFO_INACTIVE));
+ if (ci->botflags & BS_KICK_CAPS) {
+ if (ci->ttb[TTB_CAPS])
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_CAPS_BAN,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->ttb[TTB_CAPS], ci->capsmin,
+ ci->capspercent);
+ else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_CAPS_ON,
+ getstring(u->na, BOT_INFO_ACTIVE), ci->capsmin,
+ ci->capspercent);
+ } else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_CAPS_OFF,
+ getstring(u->na, BOT_INFO_INACTIVE));
+ if (ci->botflags & BS_KICK_COLORS) {
+ if (ci->ttb[TTB_COLORS])
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_COLORS_BAN,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->ttb[TTB_COLORS]);
+ else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_COLORS,
+ getstring(u->na, BOT_INFO_ACTIVE));
+ } else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_COLORS,
+ getstring(u->na, BOT_INFO_INACTIVE));
+ if (ci->botflags & BS_KICK_FLOOD) {
+ if (ci->ttb[TTB_FLOOD])
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_FLOOD_BAN,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->ttb[TTB_FLOOD], ci->floodlines,
+ ci->floodsecs);
+ else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_FLOOD_ON,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->floodlines, ci->floodsecs);
+ } else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_FLOOD_OFF,
+ getstring(u->na, BOT_INFO_INACTIVE));
+ if (ci->botflags & BS_KICK_REPEAT) {
+ if (ci->ttb[TTB_REPEAT])
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_REPEAT_BAN,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->ttb[TTB_REPEAT], ci->repeattimes);
+ else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_REPEAT_ON,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->repeattimes);
+ } else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_REPEAT_OFF,
+ getstring(u->na, BOT_INFO_INACTIVE));
+ if (ci->botflags & BS_KICK_REVERSES) {
+ if (ci->ttb[TTB_REVERSES])
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_REVERSES_BAN,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->ttb[TTB_REVERSES]);
+ else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_REVERSES,
+ getstring(u->na, BOT_INFO_ACTIVE));
+ } else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_REVERSES,
+ getstring(u->na, BOT_INFO_INACTIVE));
+ if (ci->botflags & BS_KICK_UNDERLINES) {
+ if (ci->ttb[TTB_UNDERLINES])
+ notice_lang(s_BotServ, u,
+ BOT_INFO_CHAN_KICK_UNDERLINES_BAN,
+ getstring(u->na, BOT_INFO_ACTIVE),
+ ci->ttb[TTB_UNDERLINES]);
+ else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_UNDERLINES,
+ getstring(u->na, BOT_INFO_ACTIVE));
+ } else
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_KICK_UNDERLINES,
+ getstring(u->na, BOT_INFO_INACTIVE));
+
+ end = buf;
+ *end = 0;
+ if (ci->botflags & BS_DONTKICKOPS) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s",
+ getstring(u->na, BOT_INFO_OPT_DONTKICKOPS));
+ need_comma = 1;
+ }
+ if (ci->botflags & BS_DONTKICKVOICES) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, BOT_INFO_OPT_DONTKICKVOICES));
+ need_comma = 1;
+ }
+ if (ci->botflags & BS_FANTASY) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, BOT_INFO_OPT_FANTASY));
+ need_comma = 1;
+ }
+ if (ci->botflags & BS_GREET) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, BOT_INFO_OPT_GREET));
+ need_comma = 1;
+ }
+ if (ci->botflags & BS_NOBOT) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, BOT_INFO_OPT_NOBOT));
+ need_comma = 1;
+ }
+ if (ci->botflags & BS_SYMBIOSIS) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, BOT_INFO_OPT_SYMBIOSIS));
+ need_comma = 1;
+ }
+ notice_lang(s_BotServ, u, BOT_INFO_CHAN_OPTIONS,
+ *buf ? buf : getstring(u->na, BOT_INFO_OPT_NONE));
+
+ } else
+ notice_lang(s_BotServ, u, BOT_INFO_NOT_FOUND, query);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *option = strtok(NULL, " ");
+ char *value = strtok(NULL, " ");
+ int is_servadmin = is_services_admin(u);
+
+ ChannelInfo *ci;
+
+ if (readonly)
+ notice_lang(s_BotServ, u, BOT_SET_DISABLED);
+ else if (!chan || !option || !value)
+ syntax_error(s_BotServ, u, "SET", BOT_SET_SYNTAX);
+ else if (is_servadmin && !stricmp(option, "PRIVATE")) {
+ BotInfo *bi;
+
+ if ((bi = findbot(chan))) {
+ if (!stricmp(value, "ON")) {
+ bi->flags |= BI_PRIVATE;
+ notice_lang(s_BotServ, u, BOT_SET_PRIVATE_ON, bi->nick);
+ } else if (!stricmp(value, "OFF")) {
+ bi->flags &= ~BI_PRIVATE;
+ notice_lang(s_BotServ, u, BOT_SET_PRIVATE_OFF, bi->nick);
+ } else {
+ syntax_error(s_BotServ, u, "SET PRIVATE",
+ BOT_SET_PRIVATE_SYNTAX);
+ }
+ } else {
+ notice_lang(s_BotServ, u, BOT_DOES_NOT_EXIST, chan);
+ }
+ return MOD_CONT;
+ } else if (!(ci = cs_findchan(chan)))
+ notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan);
+ else if (ci->flags & CI_VERBOTEN)
+ notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan);
+ else if (!is_servadmin && !check_access(u, ci, CA_SET))
+ notice_lang(s_BotServ, u, ACCESS_DENIED);
+ else {
+ if (!stricmp(option, "DONTKICKOPS")) {
+ if (!stricmp(value, "ON")) {
+ ci->botflags |= BS_DONTKICKOPS;
+ notice_lang(s_BotServ, u, BOT_SET_DONTKICKOPS_ON,
+ ci->name);
+ } else if (!stricmp(value, "OFF")) {
+ ci->botflags &= ~BS_DONTKICKOPS;
+ notice_lang(s_BotServ, u, BOT_SET_DONTKICKOPS_OFF,
+ ci->name);
+ } else {
+ syntax_error(s_BotServ, u, "SET DONTKICKOPS",
+ BOT_SET_DONTKICKOPS_SYNTAX);
+ }
+ } else if (!stricmp(option, "DONTKICKVOICES")) {
+ if (!stricmp(value, "ON")) {
+ ci->botflags |= BS_DONTKICKVOICES;
+ notice_lang(s_BotServ, u, BOT_SET_DONTKICKVOICES_ON,
+ ci->name);
+ } else if (!stricmp(value, "OFF")) {
+ ci->botflags &= ~BS_DONTKICKVOICES;
+ notice_lang(s_BotServ, u, BOT_SET_DONTKICKVOICES_OFF,
+ ci->name);
+ } else {
+ syntax_error(s_BotServ, u, "SET DONTKICKVOICES",
+ BOT_SET_DONTKICKVOICES_SYNTAX);
+ }
+ } else if (!stricmp(option, "FANTASY")) {
+ if (!stricmp(value, "ON")) {
+ ci->botflags |= BS_FANTASY;
+ notice_lang(s_BotServ, u, BOT_SET_FANTASY_ON, ci->name);
+ } else if (!stricmp(value, "OFF")) {
+ ci->botflags &= ~BS_FANTASY;
+ notice_lang(s_BotServ, u, BOT_SET_FANTASY_OFF, ci->name);
+ } else {
+ syntax_error(s_BotServ, u, "SET FANTASY",
+ BOT_SET_FANTASY_SYNTAX);
+ }
+ } else if (!stricmp(option, "GREET")) {
+ if (!stricmp(value, "ON")) {
+ ci->botflags |= BS_GREET;
+ notice_lang(s_BotServ, u, BOT_SET_GREET_ON, ci->name);
+ } else if (!stricmp(value, "OFF")) {
+ ci->botflags &= ~BS_GREET;
+ notice_lang(s_BotServ, u, BOT_SET_GREET_OFF, ci->name);
+ } else {
+ syntax_error(s_BotServ, u, "SET GREET",
+ BOT_SET_GREET_SYNTAX);
+ }
+ } else if (is_servadmin && !stricmp(option, "NOBOT")) {
+ if (!stricmp(value, "ON")) {
+ ci->botflags |= BS_NOBOT;
+ if (ci->bi)
+ unassign(u, ci);
+ notice_lang(s_BotServ, u, BOT_SET_NOBOT_ON, ci->name);
+ } else if (!stricmp(value, "OFF")) {
+ ci->botflags &= ~BS_NOBOT;
+ notice_lang(s_BotServ, u, BOT_SET_NOBOT_OFF, ci->name);
+ } else {
+ syntax_error(s_BotServ, u, "SET NOBOT",
+ BOT_SET_NOBOT_SYNTAX);
+ }
+ } else if (!stricmp(option, "SYMBIOSIS")) {
+ if (!stricmp(value, "ON")) {
+ ci->botflags |= BS_SYMBIOSIS;
+ notice_lang(s_BotServ, u, BOT_SET_SYMBIOSIS_ON, ci->name);
+ } else if (!stricmp(value, "OFF")) {
+ ci->botflags &= ~BS_SYMBIOSIS;
+ notice_lang(s_BotServ, u, BOT_SET_SYMBIOSIS_OFF, ci->name);
+ } else {
+ syntax_error(s_BotServ, u, "SET SYMBIOSIS",
+ BOT_SET_SYMBIOSIS_SYNTAX);
+ }
+ } else {
+ notice_help(s_BotServ, u, BOT_SET_UNKNOWN, option);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_kickcmd(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *option = strtok(NULL, " ");
+ char *value = strtok(NULL, " ");
+ char *ttb = strtok(NULL, " ");
+
+ ChannelInfo *ci;
+
+ if (readonly)
+ notice_lang(s_BotServ, u, BOT_KICK_DISABLED);
+ else if (!chan || !option || !value)
+ syntax_error(s_BotServ, u, "KICK", BOT_KICK_SYNTAX);
+ else if (stricmp(value, "ON") && stricmp(value, "OFF"))
+ syntax_error(s_BotServ, u, "KICK", BOT_KICK_SYNTAX);
+ else if (!(ci = cs_findchan(chan)))
+ notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan);
+ else if (ci->flags & CI_VERBOTEN)
+ notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan);
+ else if (!is_services_admin(u) && !check_access(u, ci, CA_SET))
+ notice_lang(s_BotServ, u, ACCESS_DENIED);
+ else {
+ if (!stricmp(option, "BADWORDS")) {
+ if (!stricmp(value, "ON")) {
+ if (ttb) {
+ ci->ttb[TTB_BADWORDS] = atol(ttb);
+ if (ci->ttb[TTB_BADWORDS] < 0) {
+ notice_lang(s_BotServ, u, BOT_KICK_BAD_TTB, ttb);
+ return MOD_CONT;
+ }
+ } else
+ ci->ttb[TTB_BADWORDS] = 0;
+ ci->botflags |= BS_KICK_BADWORDS;
+ if (ci->ttb[TTB_BADWORDS])
+ notice_lang(s_BotServ, u, BOT_KICK_BADWORDS_ON_BAN,
+ ci->ttb[TTB_BADWORDS]);
+ else
+ notice_lang(s_BotServ, u, BOT_KICK_BADWORDS_ON);
+ } else {
+ ci->botflags &= ~BS_KICK_BADWORDS;
+ notice_lang(s_BotServ, u, BOT_KICK_BADWORDS_OFF);
+ }
+ } else if (!stricmp(option, "BOLDS")) {
+ if (!stricmp(value, "ON")) {
+ if (ttb) {
+ ci->ttb[TTB_BOLDS] = atol(ttb);
+ if (ci->ttb[TTB_BOLDS] < 0) {
+ notice_lang(s_BotServ, u, BOT_KICK_BAD_TTB, ttb);
+ return MOD_CONT;
+ }
+ } else
+ ci->ttb[TTB_BOLDS] = 0;
+ ci->botflags |= BS_KICK_BOLDS;
+ if (ci->ttb[TTB_BOLDS])
+ notice_lang(s_BotServ, u, BOT_KICK_BOLDS_ON_BAN,
+ ci->ttb[TTB_BOLDS]);
+ else
+ notice_lang(s_BotServ, u, BOT_KICK_BOLDS_ON);
+ } else {
+ ci->botflags &= ~BS_KICK_BOLDS;
+ notice_lang(s_BotServ, u, BOT_KICK_BOLDS_OFF);
+ }
+ } else if (!stricmp(option, "CAPS")) {
+ if (!stricmp(value, "ON")) {
+ char *min = strtok(NULL, " ");
+ char *percent = strtok(NULL, " ");
+
+ if (ttb) {
+ ci->ttb[TTB_CAPS] = atol(ttb);
+ if (ci->ttb[TTB_CAPS] < 0) {
+ notice_lang(s_BotServ, u, BOT_KICK_BAD_TTB, ttb);
+ return MOD_CONT;
+ }
+ } else
+ ci->ttb[TTB_CAPS] = 0;
+
+ if (!min)
+ ci->capsmin = 10;
+ else
+ ci->capsmin = atol(min);
+ if (ci->capsmin < 1)
+ ci->capsmin = 10;
+
+ if (!percent)
+ ci->capspercent = 25;
+ else
+ ci->capspercent = atol(percent);
+ if (ci->capspercent < 1 || ci->capspercent > 100)
+ ci->capspercent = 25;
+
+ ci->botflags |= BS_KICK_CAPS;
+ if (ci->ttb[TTB_CAPS])
+ notice_lang(s_BotServ, u, BOT_KICK_CAPS_ON_BAN,
+ ci->capsmin, ci->capspercent,
+ ci->ttb[TTB_CAPS]);
+ else
+ notice_lang(s_BotServ, u, BOT_KICK_CAPS_ON,
+ ci->capsmin, ci->capspercent);
+ } else {
+ ci->botflags &= ~BS_KICK_CAPS;
+ notice_lang(s_BotServ, u, BOT_KICK_CAPS_OFF);
+ }
+ } else if (!stricmp(option, "COLORS")) {
+ if (!stricmp(value, "ON")) {
+ if (ttb) {
+ ci->ttb[TTB_COLORS] = atol(ttb);
+ if (ci->ttb[TTB_COLORS] < 0) {
+ notice_lang(s_BotServ, u, BOT_KICK_BAD_TTB, ttb);
+ return MOD_CONT;
+ }
+ } else
+ ci->ttb[TTB_COLORS] = 0;
+ ci->botflags |= BS_KICK_COLORS;
+ if (ci->ttb[TTB_COLORS])
+ notice_lang(s_BotServ, u, BOT_KICK_COLORS_ON_BAN,
+ ci->ttb[TTB_COLORS]);
+ else
+ notice_lang(s_BotServ, u, BOT_KICK_COLORS_ON);
+ } else {
+ ci->botflags &= ~BS_KICK_COLORS;
+ notice_lang(s_BotServ, u, BOT_KICK_COLORS_OFF);
+ }
+ } else if (!stricmp(option, "FLOOD")) {
+ if (!stricmp(value, "ON")) {
+ char *lines = strtok(NULL, " ");
+ char *secs = strtok(NULL, " ");
+
+ if (ttb) {
+ ci->ttb[TTB_FLOOD] = atol(ttb);
+ if (ci->ttb[TTB_FLOOD] < 0) {
+ notice_lang(s_BotServ, u, BOT_KICK_BAD_TTB, ttb);
+ return MOD_CONT;
+ }
+ } else
+ ci->ttb[TTB_FLOOD] = 0;
+
+ if (!lines)
+ ci->floodlines = 6;
+ else
+ ci->floodlines = atol(lines);
+ if (ci->floodlines < 2)
+ ci->floodlines = 6;
+
+ if (!secs)
+ ci->floodsecs = 10;
+ else
+ ci->floodsecs = atol(secs);
+ if (ci->floodsecs < 1 || ci->floodsecs > BSKeepData)
+ ci->floodsecs = 10;
+
+ ci->botflags |= BS_KICK_FLOOD;
+ if (ci->ttb[TTB_FLOOD])
+ notice_lang(s_BotServ, u, BOT_KICK_FLOOD_ON_BAN,
+ ci->floodlines, ci->floodsecs,
+ ci->ttb[TTB_FLOOD]);
+ else
+ notice_lang(s_BotServ, u, BOT_KICK_FLOOD_ON,
+ ci->floodlines, ci->floodsecs);
+ } else {
+ ci->botflags &= ~BS_KICK_FLOOD;
+ notice_lang(s_BotServ, u, BOT_KICK_FLOOD_OFF);
+ }
+ } else if (!stricmp(option, "REPEAT")) {
+ if (!stricmp(value, "ON")) {
+ char *times = strtok(NULL, " ");
+
+ if (ttb) {
+ ci->ttb[TTB_REPEAT] = atol(ttb);
+ if (ci->ttb[TTB_REPEAT] < 0) {
+ notice_lang(s_BotServ, u, BOT_KICK_BAD_TTB, ttb);
+ return MOD_CONT;
+ }
+ } else
+ ci->ttb[TTB_REPEAT] = 0;
+
+ if (!times)
+ ci->repeattimes = 3;
+ else
+ ci->repeattimes = atol(times);
+ if (ci->repeattimes < 2)
+ ci->repeattimes = 3;
+
+ ci->botflags |= BS_KICK_REPEAT;
+ if (ci->ttb[TTB_REPEAT])
+ notice_lang(s_BotServ, u, BOT_KICK_REPEAT_ON_BAN,
+ ci->repeattimes, ci->ttb[TTB_REPEAT]);
+ else
+ notice_lang(s_BotServ, u, BOT_KICK_REPEAT_ON,
+ ci->repeattimes);
+ } else {
+ ci->botflags &= ~BS_KICK_REPEAT;
+ notice_lang(s_BotServ, u, BOT_KICK_REPEAT_OFF);
+ }
+ } else if (!stricmp(option, "REVERSES")) {
+ if (!stricmp(value, "ON")) {
+ if (ttb) {
+ ci->ttb[TTB_REVERSES] = atol(ttb);
+ if (ci->ttb[TTB_REVERSES] < 0) {
+ notice_lang(s_BotServ, u, BOT_KICK_BAD_TTB, ttb);
+ return MOD_CONT;
+ }
+ } else
+ ci->ttb[TTB_REVERSES] = 0;
+ ci->botflags |= BS_KICK_REVERSES;
+ if (ci->ttb[TTB_REVERSES])
+ notice_lang(s_BotServ, u, BOT_KICK_REVERSES_ON_BAN,
+ ci->ttb[TTB_REVERSES]);
+ else
+ notice_lang(s_BotServ, u, BOT_KICK_REVERSES_ON);
+ } else {
+ ci->botflags &= ~BS_KICK_REVERSES;
+ notice_lang(s_BotServ, u, BOT_KICK_REVERSES_OFF);
+ }
+ } else if (!stricmp(option, "UNDERLINES")) {
+ if (!stricmp(value, "ON")) {
+ if (ttb) {
+ ci->ttb[TTB_UNDERLINES] = atol(ttb);
+ if (ci->ttb[TTB_UNDERLINES] < 0) {
+ notice_lang(s_BotServ, u, BOT_KICK_BAD_TTB, ttb);
+ return MOD_CONT;
+ }
+ } else
+ ci->ttb[TTB_UNDERLINES] = 0;
+ ci->botflags |= BS_KICK_UNDERLINES;
+ if (ci->ttb[TTB_UNDERLINES])
+ notice_lang(s_BotServ, u, BOT_KICK_UNDERLINES_ON_BAN,
+ ci->ttb[TTB_UNDERLINES]);
+ else
+ notice_lang(s_BotServ, u, BOT_KICK_UNDERLINES_ON);
+ } else {
+ ci->botflags &= ~BS_KICK_UNDERLINES;
+ notice_lang(s_BotServ, u, BOT_KICK_UNDERLINES_OFF);
+ }
+ } else
+ notice_help(s_BotServ, u, BOT_KICK_UNKNOWN, option);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int badwords_del_callback(User * u, int num, va_list args)
+{
+ BadWord *bw;
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *last = va_arg(args, int *);
+ if (num < 1 || num > ci->bwcount)
+ return 0;
+ *last = num;
+
+ bw = &ci->badwords[num - 1];
+ if (bw->word)
+ free(bw->word);
+ bw->word = NULL;
+ bw->in_use = 0;
+
+ return 1;
+}
+
+static int badwords_list(User * u, int index, ChannelInfo * ci,
+ int *sent_header)
+{
+ BadWord *bw = &ci->badwords[index];
+
+ if (!bw->in_use)
+ return 0;
+ if (!*sent_header) {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_LIST_HEADER, ci->name);
+ *sent_header = 1;
+ }
+
+ notice_lang(s_BotServ, u, BOT_BADWORDS_LIST_FORMAT, index + 1,
+ bw->word,
+ ((bw->type ==
+ BW_SINGLE) ? "(SINGLE)" : ((bw->type ==
+ BW_START) ? "(START)"
+ : ((bw->type ==
+ BW_END) ? "(END)" : "")))
+ );
+ return 1;
+}
+
+static int badwords_list_callback(User * u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *sent_header = va_arg(args, int *);
+ if (num < 1 || num > ci->bwcount)
+ return 0;
+ return badwords_list(u, num - 1, ci, sent_header);
+}
+
+static int do_badwords(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *cmd = strtok(NULL, " ");
+ char *word = strtok(NULL, "");
+ ChannelInfo *ci;
+ BadWord *bw;
+
+ int i;
+ int need_args = (cmd
+ && (!stricmp(cmd, "LIST") || !stricmp(cmd, "CLEAR")));
+
+ if (!cmd || (need_args ? 0 : !word)) {
+ syntax_error(s_BotServ, u, "BADWORDS", BOT_BADWORDS_SYNTAX);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!check_access(u, ci, CA_BADWORDS)
+ && (!need_args || !is_services_admin(u))) {
+ notice_lang(s_BotServ, u, ACCESS_DENIED);
+ } else if (stricmp(cmd, "ADD") == 0) {
+
+ char *opt, *pos;
+ int type = BW_ANY;
+
+ if (readonly) {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_DISABLED);
+ return MOD_CONT;
+ }
+
+ pos = strrchr(word, ' ');
+ if (pos) {
+ opt = pos + 1;
+ if (*opt) {
+ if (!stricmp(opt, "SINGLE"))
+ type = BW_SINGLE;
+ else if (!stricmp(opt, "START"))
+ type = BW_START;
+ else if (!stricmp(opt, "END"))
+ type = BW_END;
+ if (type != BW_ANY)
+ *pos = 0;
+ }
+ }
+
+ for (bw = ci->badwords, i = 0; i < ci->bwcount; bw++, i++) {
+ if (bw->word && !stricmp(bw->word, word)) {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_ALREADY_EXISTS,
+ bw->word, ci->name);
+ return MOD_CONT;
+ }
+ }
+
+ for (i = 0; i < ci->bwcount; i++) {
+ if (!ci->badwords[i].in_use)
+ break;
+ }
+ if (i == ci->bwcount) {
+ if (i < BSBadWordsMax) {
+ ci->bwcount++;
+ ci->badwords =
+ srealloc(ci->badwords, sizeof(BadWord) * ci->bwcount);
+ } else {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_REACHED_LIMIT,
+ BSBadWordsMax);
+ return MOD_CONT;
+ }
+ }
+ bw = &ci->badwords[i];
+ bw->in_use = 1;
+ bw->word = sstrdup(word);
+ bw->type = type;
+
+ notice_lang(s_BotServ, u, BOT_BADWORDS_ADDED, bw->word, ci->name);
+
+ } else if (stricmp(cmd, "DEL") == 0) {
+
+ if (readonly) {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_DISABLED);
+ return MOD_CONT;
+ }
+
+ /* Special case: is it a number/list? Only do search if it isn't. */
+ if (isdigit(*word) && strspn(word, "1234567890,-") == strlen(word)) {
+ int count, deleted, last = -1;
+ deleted =
+ process_numlist(word, &count, badwords_del_callback, u, ci,
+ &last);
+ if (!deleted) {
+ if (count == 1) {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_NO_SUCH_ENTRY,
+ last, ci->name);
+ } else {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_NO_MATCH,
+ ci->name);
+ }
+ } else if (deleted == 1) {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_DELETED_ONE,
+ ci->name);
+ } else {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_DELETED_SEVERAL,
+ deleted, ci->name);
+ }
+ } else {
+ for (i = 0; i < ci->bwcount; i++) {
+ if (ci->badwords[i].in_use
+ && !stricmp(ci->badwords[i].word, word))
+ break;
+ }
+ if (i == ci->bwcount) {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_NOT_FOUND, word,
+ chan);
+ return MOD_CONT;
+ }
+ bw = &ci->badwords[i];
+ notice_lang(s_BotServ, u, BOT_BADWORDS_DELETED, bw->word,
+ ci->name);
+ if (bw->word)
+ free(bw->word);
+ bw->word = NULL;
+ bw->in_use = 0;
+ }
+
+ } else if (stricmp(cmd, "LIST") == 0) {
+ int sent_header = 0;
+
+ if (ci->bwcount == 0) {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_LIST_EMPTY, chan);
+ return MOD_CONT;
+ }
+ if (word && strspn(word, "1234567890,-") == strlen(word)) {
+ process_numlist(word, NULL, badwords_list_callback, u, ci,
+ &sent_header);
+ } else {
+ for (i = 0; i < ci->bwcount; i++) {
+ if (!(ci->badwords[i].in_use))
+ continue;
+ if (word && ci->badwords[i].word
+ && !match_wild_nocase(word, ci->badwords[i].word))
+ continue;
+ badwords_list(u, i, ci, &sent_header);
+ }
+ }
+ if (!sent_header)
+ notice_lang(s_BotServ, u, BOT_BADWORDS_NO_MATCH, chan);
+
+ } else if (stricmp(cmd, "CLEAR") == 0) {
+
+ if (readonly) {
+ notice_lang(s_BotServ, u, BOT_BADWORDS_DISABLED);
+ return MOD_CONT;
+ }
+
+ for (i = 0; i < ci->bwcount; i++)
+ if (ci->badwords[i].word)
+ free(ci->badwords[i].word);
+
+ free(ci->badwords);
+ ci->badwords = NULL;
+ ci->bwcount = 0;
+
+ notice_lang(s_BotServ, u, BOT_BADWORDS_CLEAR);
+
+ } else {
+ syntax_error(s_BotServ, u, "BADWORDS", BOT_BADWORDS_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_say(User * u)
+{
+ ChannelInfo *ci;
+
+ char *chan = strtok(NULL, " ");
+ char *text = strtok(NULL, "");
+
+ if (!chan || !text)
+ syntax_error(s_BotServ, u, "SAY", BOT_SAY_SYNTAX);
+ else if (!(ci = cs_findchan(chan)))
+ notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan);
+ else if (ci->flags & CI_VERBOTEN)
+ notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan);
+ else if (!ci->bi)
+ notice_help(s_BotServ, u, BOT_NOT_ASSIGNED);
+ else if (!ci->c || ci->c->usercount < BSMinUsers)
+ notice_lang(s_BotServ, u, BOT_NOT_ON_CHANNEL, ci->name);
+ else if (!check_access(u, ci, CA_SAY))
+ notice_lang(s_BotServ, u, ACCESS_DENIED);
+ else {
+ if (text[0] != '\001') {
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%s", ci->name, text);
+ ci->bi->lastmsg = time(NULL);
+ if (logchan && LogBot)
+ send_cmd(ci->bi->nick, "PRIVMSG %s :SAY %s %s %s",
+ LogChannel, u->nick, ci->name, text);
+ } else {
+ syntax_error(s_BotServ, u, "SAY", BOT_SAY_SYNTAX);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_act(User * u)
+{
+ ChannelInfo *ci;
+
+ char *chan = strtok(NULL, " ");
+ char *text = strtok(NULL, "");
+
+ if (!chan || !text)
+ syntax_error(s_BotServ, u, "ACT", BOT_ACT_SYNTAX);
+ else if (!(ci = cs_findchan(chan)))
+ notice_lang(s_BotServ, u, CHAN_X_NOT_REGISTERED, chan);
+ else if (ci->flags & CI_VERBOTEN)
+ notice_lang(s_BotServ, u, CHAN_X_FORBIDDEN, chan);
+ else if (!ci->bi)
+ notice_help(s_BotServ, u, BOT_NOT_ASSIGNED);
+ else if (!ci->c || ci->c->usercount < BSMinUsers)
+ notice_lang(s_BotServ, u, BOT_NOT_ON_CHANNEL, ci->name);
+ else if (!check_access(u, ci, CA_SAY))
+ notice_lang(s_BotServ, u, ACCESS_DENIED);
+ else {
+ send_cmd(ci->bi->nick, "PRIVMSG %s :%cACTION %s%c", ci->name, 1,
+ text, 1);
+ ci->bi->lastmsg = time(NULL);
+ if (logchan && LogBot)
+ send_cmd(ci->bi->nick, "PRIVMSG %s :ACT %s %s %s", LogChannel,
+ u->nick, ci->name, text);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
diff --git a/channels.c b/channels.c
new file mode 100644
index 000000000..485e9a020
--- /dev/null
+++ b/channels.c
@@ -0,0 +1,1595 @@
+/* Channel-handling routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: channels.c,v 1.36 2004/03/11 16:50:01 rob Exp $
+ *
+ */
+
+#include "services.h"
+#include "language.h"
+
+Channel *chanlist[1024];
+
+#define HASH(chan) ((chan)[1] ? ((chan)[1]&31)<<5 | ((chan)[2]&31) : 0)
+
+static void add_ban(Channel * chan, char *mask);
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_HYBRID)
+static void add_exception(Channel * chan, char *mask);
+#endif
+static void chan_adduser2(User * user, Channel * c);
+static Channel *chan_create(const char *chan);
+static void chan_delete(Channel * c);
+static void del_ban(Channel * chan, char *mask);
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_HYBRID)
+static void del_exception(Channel * chan, char *mask);
+#endif
+#ifdef HAS_FMODE
+static char *get_flood(Channel * chan);
+#endif
+static char *get_key(Channel * chan);
+static char *get_limit(Channel * chan);
+#ifdef HAS_LMODE
+static char *get_redirect(Channel * chan);
+#endif
+static Channel *join_user_update(User * user, Channel * chan, char *name);
+#ifdef HAS_FMODE
+static void set_flood(Channel * chan, char *value);
+#endif
+static void set_key(Channel * chan, char *value);
+static void set_limit(Channel * chan, char *value);
+#ifdef HAS_LMODE
+static void set_redirect(Channel * chan, char *value);
+#endif
+void do_mass_mode(char *modes);
+
+/*************************************************************************/
+/* *INDENT-OFF* */
+
+CBMode cbmodes[128] = {
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 },
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3)
+ { CMODE_A, CBM_NO_USER_MLOCK, NULL, NULL },
+#else
+ { 0 }, /* A */
+#endif
+ { 0 }, /* B */
+#ifdef IRC_UNREAL
+ { CMODE_C, 0, NULL, NULL },
+#else
+ { 0 }, /* C */
+#endif
+ { 0 }, /* D */
+ { 0 }, /* E */
+ { 0 }, /* F */
+#ifdef IRC_UNREAL
+ { CMODE_G, 0, NULL, NULL },
+ { CMODE_H, CBM_NO_USER_MLOCK, NULL, NULL },
+#else
+ { 0 }, /* G */
+ { 0 }, /* H */
+#endif
+#ifdef IRC_ULTIMATE
+ { CMODE_I },
+#else
+ { 0 }, /* I */
+#endif
+ { 0 }, /* J */
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3)
+ { CMODE_K, 0, NULL, NULL },
+#else
+ { 0 }, /* K */
+#endif
+#ifdef HAS_LMODE
+ { CMODE_L, 0, set_redirect, cs_set_redirect },
+#else
+ { 0 }, /* L */
+#endif
+#ifdef IRC_BAHAMUT
+ { CMODE_M },
+#else
+ { 0 }, /* M */
+#endif
+#if defined (IRC_UNREAL) || defined (IRC_ULTIMATE3) || defined (IRC_PTLINK)
+ { CMODE_N, 0, NULL, NULL },
+#else
+ { 0 }, /* N */
+#endif
+#if defined(IRC_BAHAMUT) || defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3)
+ { CMODE_O, CBM_NO_USER_MLOCK, NULL, NULL },
+#else
+ { 0 }, /* O */
+#endif
+ { 0 }, /* P */
+#ifdef IRC_UNREAL
+ { CMODE_Q, 0, NULL, NULL },
+#else
+ { 0 }, /* Q */
+#endif
+#ifndef IRC_HYBRID
+ { CMODE_R, 0, NULL, NULL }, /* R */
+#else
+ { 0 },
+#endif
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined (IRC_ULTIMATE3) || defined (IRC_PTLINK)
+ { CMODE_S, 0, NULL, NULL },
+#else
+ { 0 }, /* S */
+#endif
+ { 0 }, /* T */
+ { 0 }, /* U */
+#ifdef IRC_UNREAL
+ { CMODE_V, 0, NULL, NULL },
+#else
+ { 0 }, /* V */
+#endif
+ { 0 }, /* W */
+ { 0 }, /* X */
+ { 0 }, /* Y */
+ { 0 }, /* Z */
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+#ifdef IRC_HYBRID
+ { CMODE_a, 0, NULL, NULL },
+#else
+ { 0 }, /* a */
+#endif
+ { 0 }, /* b */
+#if defined(IRC_BAHAMUT) || defined(IRC_UNREAL) || defined (IRC_PTLINK)
+ { CMODE_c, 0, NULL, NULL },
+#else
+ { 0 }, /* c */
+#endif
+#ifdef IRC_PTLINK
+ { CMODE_d, 0, NULL, NULL },
+#else
+ { 0 }, /* d */
+#endif
+ { 0 }, /* e */
+#ifdef HAS_FMODE
+ { CMODE_f, 0, set_flood, cs_set_flood },
+#else
+ { 0 }, /* f */
+#endif
+ { 0 }, /* g */
+ { 0 }, /* h */
+ { CMODE_i, 0, NULL, NULL },
+ { 0 }, /* j */
+ { CMODE_k, 0, set_key, cs_set_key },
+ { CMODE_l, CBM_MINUS_NO_ARG, set_limit, cs_set_limit },
+ { CMODE_m, 0, NULL, NULL },
+ { CMODE_n, 0, NULL, NULL },
+ { 0 }, /* o */
+ { CMODE_p, 0, NULL, NULL },
+#ifdef IRC_PTLINK
+ { CMODE_q, 0, NULL, NULL },
+#else
+ { 0 }, /* q */
+#endif
+#ifndef IRC_HYBRID
+ { CMODE_r, CBM_NO_MLOCK, NULL, NULL },
+#else
+ { 0 },
+#endif
+ { CMODE_s, 0, NULL, NULL },
+ { CMODE_t, 0, NULL, NULL },
+#ifdef IRC_UNREAL
+ { CMODE_u, 0, NULL, NULL },
+#else
+ { 0 },
+#endif
+ { 0 }, /* v */
+ { 0 }, /* w */
+#ifdef IRC_ULTIMATE
+ { CMODE_x },
+#else
+ { 0 }, /* x */
+#endif
+ { 0 }, /* y */
+#ifdef IRC_UNREAL
+ { CMODE_z, 0, NULL, NULL },
+#else
+ { 0 }, /* z */
+#endif
+ { 0 }, { 0 }, { 0 }, { 0 }
+};
+
+CBModeInfo cbmodeinfos[] = {
+#if defined(IRC_HYBRID)
+ { 'a', CMODE_a, 0, NULL, NULL },
+#endif
+#if defined(IRC_BAHAMUT) || defined(IRC_UNREAL) || defined(IRC_PTLINK)
+ { 'c', CMODE_c, 0, NULL, NULL },
+#endif
+#if defined(IRC_PTLINK)
+ { 'd', CMODE_d, 0, NULL, NULL },
+#endif
+#ifdef HAS_FMODE
+ { 'f', CMODE_f, 0, get_flood, cs_get_flood },
+#endif
+ { 'i', CMODE_i, 0, NULL, NULL },
+ { 'k', CMODE_k, 0, get_key, cs_get_key },
+ { 'l', CMODE_l, CBM_MINUS_NO_ARG, get_limit, cs_get_limit },
+ { 'm', CMODE_m, 0, NULL, NULL },
+ { 'n', CMODE_n, 0, NULL, NULL },
+ { 'p', CMODE_p, 0, NULL, NULL },
+#ifdef IRC_PTLINK
+ { 'q', CMODE_q, 0, NULL, NULL },
+#endif
+#ifndef IRC_HYBRID
+ { 'r', CMODE_r, 0, NULL, NULL },
+#endif
+ { 's', CMODE_s, 0, NULL, NULL },
+ { 't', CMODE_t, 0, NULL, NULL },
+#ifdef IRC_UNREAL
+ { 'u', CMODE_u, 0, NULL, NULL },
+#endif
+#ifdef IRC_ULTIMATE
+ { 'x', CMODE_x, 0, NULL, NULL },
+#endif
+#ifdef IRC_UNREAL
+ { 'z', CMODE_z, 0, NULL, NULL },
+#endif
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_PTLINK)
+ { 'A', CMODE_A, 0, NULL, NULL },
+#endif
+#ifdef IRC_UNREAL
+ { 'C', CMODE_C, 0, NULL, NULL },
+ { 'G', CMODE_G, 0, NULL, NULL },
+ { 'H', CMODE_H, 0, NULL, NULL },
+#endif
+#ifdef IRC_ULTIMATE
+ { 'I', CMODE_I, 0, NULL, NULL },
+#endif
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_PTLINK) || defined(IRC_ULTIMATE3)
+ { 'K', CMODE_K, 0, NULL, NULL },
+#endif
+#ifdef HAS_LMODE
+ { 'L', CMODE_L, 0, get_redirect, cs_get_redirect },
+#endif
+#ifdef IRC_BAHAMUT
+#ifndef IRC_ULTIMATE3
+ { 'M', CMODE_M, 0, NULL, NULL },
+#endif
+#endif
+#if defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_PTLINK)
+ { 'N', CMODE_N, 0, NULL, NULL },
+#endif
+#if defined(IRC_BAHAMUT) || defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3)
+ { 'O', CMODE_O, 0, NULL, NULL },
+#endif
+#ifdef IRC_UNREAL
+ { 'Q', CMODE_Q, 0, NULL, NULL },
+#endif
+#ifndef IRC_HYBRID
+ { 'R', CMODE_R, 0, NULL, NULL },
+#endif
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_PTLINK)
+ { 'S', CMODE_S, 0, NULL, NULL },
+#endif
+#ifdef IRC_UNREAL
+ { 'V', CMODE_V, 0, NULL, NULL },
+#endif
+ { 0 }
+};
+
+static CMMode cmmodes[128] = {
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL },
+ { NULL },
+ { add_ban, del_ban },
+ { NULL },
+ { NULL },
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_HYBRID)
+ { add_exception, del_exception },
+#endif
+ { NULL },
+ { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL },
+ { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }
+};
+
+ #if defined(IRC_BAHAMUT) || defined(IRC_HYBRID) || defined(IRC_PTLINK)
+
+static char csmodes[128] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0,
+ #if defined(IRC_ULTIMATE3) || defined(IRC_HYBRID)
+ 'a', /* (33) * Channel Admins */
+ #else
+ 0,
+ #endif
+ 0, 0, 0,
+ #ifdef IRC_ULTIMATE3
+ 'h', /* (37) % Channel halfops */
+ #else
+ 0,
+ #endif
+ 0, 0, 0, 0, 0,
+
+ 'v', 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 'o', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+#endif
+
+static CUMode cumodes[128] = {
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 }, { 0 },
+
+ { 0 },
+
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ { CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_op },
+#else
+#if defined(IRC_ULTIMATE3)
+ { CUS_PROTECT, CUF_PROTECT_BOTSERV, check_valid_admin },
+#else
+ { 0 }, /* a */
+#endif
+#endif
+ { 0 }, /* b */
+ { 0 }, /* c */
+ { 0 }, /* d */
+ { 0 }, /* e */
+ { 0 }, /* f */
+ { 0 }, /* g */
+#ifdef HAS_HALFOP
+ { CUS_HALFOP, 0, check_valid_op },
+#else
+ { 0 }, /* h */
+#endif
+ { 0 }, /* i */
+ { 0 }, /* j */
+ { 0 }, /* k */
+ { 0 }, /* l */
+ { 0 }, /* m */
+ { 0 }, /* n */
+ { CUS_OP, CUF_PROTECT_BOTSERV, check_valid_op },
+ { 0 }, /* p */
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ { CUS_OWNER, 0, check_valid_op },
+#else
+ { 0 }, /* q */
+#endif
+ { 0 }, /* r */
+ { 0 }, /* s */
+ { 0 }, /* t */
+ { 0 }, /* u */
+ { CUS_VOICE, 0, NULL },
+ { 0 }, /* w */
+ { 0 }, /* x */
+ { 0 }, /* y */
+ { 0 }, /* z */
+ { 0 }, { 0 }, { 0 }, { 0 }, { 0 }
+};
+
+/* *INDENT-ON* */
+/*************************************************************************/
+/**************************** External Calls *****************************/
+/*************************************************************************/
+
+void chan_deluser(User * user, Channel * c)
+{
+ struct c_userlist *u;
+
+ if (c->ci)
+ update_cs_lastseen(user, c->ci);
+
+ for (u = c->users; u && u->user != user; u = u->next);
+ if (!u)
+ return;
+
+ if (u->ud) {
+ if (u->ud->lastline)
+ free(u->ud->lastline);
+ free(u->ud);
+ }
+
+ if (u->next)
+ u->next->prev = u->prev;
+ if (u->prev)
+ u->prev->next = u->next;
+ else
+ c->users = u->next;
+ free(u);
+ c->usercount--;
+
+ if (s_BotServ && c->ci && c->ci->bi && c->usercount == BSMinUsers - 1) {
+ send_cmd(c->ci->bi->nick, "PART %s", c->name);
+ }
+
+ if (!c->users)
+ chan_delete(c);
+}
+
+/*************************************************************************/
+
+/* Returns a fully featured binary modes string. If complete is 0, the
+ * eventual parameters won't be added to the string.
+ */
+
+char *chan_get_modes(Channel * chan, int complete, int plus)
+{
+ static char res[BUFSIZE];
+ char *end = res;
+
+ if (chan->mode) {
+ int n = 0;
+ CBModeInfo *cbmi = cbmodeinfos;
+
+ do {
+ if (chan->mode & cbmi->flag)
+ *end++ = cbmi->mode;
+ } while ((++cbmi)->flag != 0 && ++n < sizeof(res) - 1);
+
+ if (complete) {
+ cbmi = cbmodeinfos;
+
+ do {
+ if (cbmi->getvalue && (chan->mode & cbmi->flag) &&
+ (plus || !(cbmi->flags & CBM_MINUS_NO_ARG))) {
+ char *value = cbmi->getvalue(chan);
+
+ if (value) {
+ *end++ = ' ';
+ while (*value)
+ *end++ = *value++;
+ }
+ }
+ } while ((++cbmi)->flag != 0 && ++n < sizeof(res) - 1);
+ }
+ }
+
+ *end = 0;
+
+ return res;
+}
+
+/*************************************************************************/
+
+/* Retrieves the status of an user on a channel */
+
+int chan_get_user_status(Channel * chan, User * user)
+{
+ struct u_chanlist *uc;
+
+ for (uc = user->chans; uc; uc = uc->next)
+ if (uc->chan == chan)
+ return uc->status;
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Has the given user the given status on the given channel? :p */
+
+int chan_has_user_status(Channel * chan, User * user, int16 status)
+{
+ struct u_chanlist *uc;
+
+ for (uc = user->chans; uc; uc = uc->next)
+ if (uc->chan == chan)
+ return (uc->status & status);
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Remove the status of an user on a channel */
+
+void chan_remove_user_status(Channel * chan, User * user, int16 status)
+{
+ struct u_chanlist *uc;
+
+ for (uc = user->chans; uc; uc = uc->next) {
+ if (uc->chan == chan) {
+ uc->status &= ~status;
+ break;
+ }
+ }
+}
+
+/*************************************************************************/
+
+void chan_set_modes(const char *source, Channel * chan, int ac, char **av,
+ int check)
+{
+ int add = 1;
+ int servermode = !!strchr(source, '.');
+ char *modes = av[0], mode;
+ CBMode *cbm;
+ CMMode *cmm;
+ CUMode *cum;
+
+ if (debug)
+ alog("debug: Changing modes for %s to %s", chan->name,
+ merge_args(ac, av));
+
+ ac--;
+
+ while ((mode = *modes++)) {
+
+ switch (mode) {
+ case '+':
+ add = 1;
+ continue;
+ case '-':
+ add = 0;
+ continue;
+ }
+
+ if (((int) mode) < 0) {
+ if (debug)
+ alog("Debug: Malformed mode detected on %s.", chan->name);
+ continue;
+ }
+
+ if ((cum = &cumodes[(int) mode])->status != 0) {
+ User *user;
+
+ if (ac == 0) {
+ alog("channel: mode %c%c with no parameter (?) for channel %s", add ? '+' : '-', mode, chan->name);
+ continue;
+ }
+ ac--;
+ av++;
+
+ if ((cum->flags & CUF_PROTECT_BOTSERV) && !add) {
+ BotInfo *bi;
+
+ if ((bi = findbot(*av))) {
+ send_cmd(bi->nick, "MODE %s +%c %s", chan->name, mode,
+ bi->nick);
+ continue;
+ }
+ }
+
+ if (!(user = finduser(*av))) {
+ alog("channel: MODE %s %c%c for nonexistent user %s",
+ chan->name, (add ? '+' : '-'), mode, *av);
+ continue;
+ }
+
+ if (debug)
+ alog("debug: Setting %c%c on %s for %s", (add ? '+' : '-'),
+ mode, chan->name, user->nick);
+
+ if (add) {
+ if (check && cum->is_valid
+ && !cum->is_valid(user, chan, servermode))
+ continue;
+ chan_set_user_status(chan, user, cum->status);
+ } else {
+ chan_remove_user_status(chan, user, cum->status);
+ }
+ } else if ((cbm = &cbmodes[(int) mode])->flag != 0) {
+ if (add)
+ chan->mode |= cbm->flag;
+ else
+ chan->mode &= ~cbm->flag;
+
+ if (cbm->setvalue) {
+ if (add || !(cbm->flags & CBM_MINUS_NO_ARG)) {
+ if (ac == 0) {
+ alog("channel: mode %c%c with no parameter (?) for channel %s", add ? '+' : '-', mode, chan->name);
+ continue;
+ }
+ ac--;
+ av++;
+ }
+ cbm->setvalue(chan, add ? *av : NULL);
+ }
+ } else if ((cmm = &cmmodes[(int) mode])->addmask) {
+ if (ac == 0) {
+ alog("channel: mode %c%c with no parameter (?) for channel %s", add ? '+' : '-', mode, chan->name);
+ continue;
+ }
+
+ ac--;
+ av++;
+ add ? cmm->addmask(chan, *av) : cmm->delmask(chan, *av);
+ }
+ }
+
+ if (check)
+ check_modes(chan);
+}
+
+/*************************************************************************/
+
+/* Set the status of an user on a channel */
+
+void chan_set_user_status(Channel * chan, User * user, int16 status)
+{
+ struct u_chanlist *uc;
+
+ if (HelpChannel && status == CUS_OP
+ && !stricmp(chan->name, HelpChannel))
+ change_user_mode(user, "+h", NULL);
+
+ for (uc = user->chans; uc; uc = uc->next) {
+ if (uc->chan == chan) {
+ uc->status |= status;
+ break;
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* Return the Channel structure corresponding to the named channel, or NULL
+ * if the channel was not found. chan is assumed to be non-NULL and valid
+ * (i.e. pointing to a channel name of 2 or more characters). */
+
+Channel *findchan(const char *chan)
+{
+ Channel *c;
+
+ if (debug >= 3)
+ alog("debug: findchan(%p)", chan);
+ c = chanlist[HASH(chan)];
+ while (c) {
+ if (stricmp(c->name, chan) == 0)
+ return c;
+ c = c->next;
+ }
+ if (debug >= 3)
+ alog("debug: findchan(%s) -> %p", chan, c);
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Iterate over all channels in the channel list. Return NULL at end of
+ * list.
+ */
+
+static Channel *current;
+static int next_index;
+
+Channel *firstchan(void)
+{
+ next_index = 0;
+ while (next_index < 1024 && current == NULL)
+ current = chanlist[next_index++];
+ if (debug >= 3)
+ alog("debug: firstchan() returning %s",
+ current ? current->name : "NULL (end of list)");
+ return current;
+}
+
+Channel *nextchan(void)
+{
+ if (current)
+ current = current->next;
+ if (!current && next_index < 1024) {
+ while (next_index < 1024 && current == NULL)
+ current = chanlist[next_index++];
+ }
+ if (debug >= 3)
+ alog("debug: nextchan() returning %s",
+ current ? current->name : "NULL (end of list)");
+ return current;
+}
+
+/*************************************************************************/
+
+/* Return statistics. Pointers are assumed to be valid. */
+
+void get_channel_stats(long *nrec, long *memuse)
+{
+ long count = 0, mem = 0;
+ Channel *chan;
+ struct c_userlist *cu;
+ BanData *bd;
+ int i, j;
+
+ for (i = 0; i < 1024; i++) {
+ for (chan = chanlist[i]; chan; chan = chan->next) {
+ count++;
+ mem += sizeof(*chan);
+ if (chan->topic)
+ mem += strlen(chan->topic) + 1;
+ if (chan->key)
+ mem += strlen(chan->key) + 1;
+#ifdef HAS_FMODE
+ if (chan->flood)
+ mem += strlen(chan->flood) + 1;
+#endif
+#ifdef HAS_LMODE
+ if (chan->redirect)
+ mem += strlen(chan->redirect) + 1;
+#endif
+ mem += sizeof(char *) * chan->bansize;
+ for (j = 0; j < chan->bancount; j++) {
+ if (chan->bans[j])
+ mem += strlen(chan->bans[j]) + 1;
+ }
+#if defined (IRC_ULTIMATE) || defined (IRC_UNREAL) || defined (IRC_ULTIMATE3) || defined(IRC_HYBRID)
+ mem += sizeof(char *) * chan->exceptsize;
+ for (j = 0; j < chan->exceptcount; j++) {
+ if (chan->excepts[j])
+ mem += strlen(chan->excepts[j]) + 1;
+ }
+#endif
+ for (cu = chan->users; cu; cu = cu->next) {
+ mem += sizeof(*cu);
+ if (cu->ud) {
+ mem += sizeof(*cu->ud);
+ if (cu->ud->lastline)
+ mem += strlen(cu->ud->lastline) + 1;
+ }
+ }
+ for (bd = chan->bd; bd; bd = bd->next) {
+ if (bd->mask)
+ mem += strlen(bd->mask) + 1;
+ mem += sizeof(*bd);
+ }
+ }
+ }
+ *nrec = count;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+
+/* Is the given nick on the given channel? */
+
+int is_on_chan(Channel * c, User * u)
+{
+ struct u_chanlist *uc;
+
+ for (uc = u->chans; uc; uc = uc->next)
+ if (uc->chan == c)
+ return 1;
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Is the given nick on the given channel?
+ This function supports links. */
+
+User *nc_on_chan(Channel * c, NickCore * nc)
+{
+ struct c_userlist *u;
+
+ if (!c || !nc)
+ return NULL;
+
+ for (u = c->users; u; u = u->next) {
+ if (u->user->na && u->user->na->nc == nc
+ && nick_recognized(u->user))
+ return u->user;
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+/*************************** Message Handling ****************************/
+/*************************************************************************/
+
+/* Handle a JOIN command.
+ * av[0] = channels to join
+ */
+
+void do_join(const char *source, int ac, char **av)
+{
+ User *user;
+ char *s, *t;
+ struct u_chanlist *c, *nextc;
+
+ user = finduser(source);
+ if (!user) {
+ alog("user: JOIN from nonexistent user %s: %s", source,
+ merge_args(ac, av));
+ return;
+ }
+
+ t = av[0];
+ while (*(s = t)) {
+ t = s + strcspn(s, ",");
+ if (*t)
+ *t++ = 0;
+ if (debug)
+ alog("debug: %s joins %s", source, s);
+
+ if (*s == '0') {
+ c = user->chans;
+ while (c) {
+ nextc = c->next;
+ chan_deluser(user, c->chan);
+ free(c);
+ c = nextc;
+ }
+ user->chans = NULL;
+ continue;
+ }
+
+ /* Make sure check_kick comes before chan_adduser, so banned users
+ * don't get to see things like channel keys. */
+ if (check_kick(user, s))
+ continue;
+
+/* chan_adduser(user, s); */
+ join_user_update(user, findchan(s), s);
+
+
+/* c = scalloc(sizeof(*c), 1);
+ c->next = user->chans;
+ if (user->chans)
+ user->chans->prev = c;
+ user->chans = c;
+ c->chan = findchan(s); */
+ }
+}
+
+/*************************************************************************/
+
+/* Handle a KICK command.
+ * av[0] = channel
+ * av[1] = nick(s) being kicked
+ * av[2] = reason
+ */
+
+void do_kick(const char *source, int ac, char **av)
+{
+ BotInfo *bi;
+ ChannelInfo *ci;
+ User *user;
+ char *s, *t;
+ struct u_chanlist *c;
+
+ t = av[1];
+ while (*(s = t)) {
+ t = s + strcspn(s, ",");
+ if (*t)
+ *t++ = 0;
+
+ /* If it is the bot that is being kicked, we make it rejoin the
+ * channel and stop immediately.
+ * --lara
+ */
+ if (s_BotServ && (bi = findbot(s)) && (ci = cs_findchan(av[0]))) {
+ bot_join(ci);
+ continue;
+ }
+
+ user = finduser(s);
+ if (!user) {
+ alog("user: KICK for nonexistent user %s on %s: %s", s, av[0],
+ merge_args(ac - 2, av + 2));
+ continue;
+ }
+ if (debug)
+ alog("debug: kicking %s from %s", s, av[0]);
+ for (c = user->chans; c && stricmp(av[0], c->chan->name) != 0;
+ c = c->next);
+ if (c) {
+ chan_deluser(user, c->chan);
+ if (c->next)
+ c->next->prev = c->prev;
+ if (c->prev)
+ c->prev->next = c->next;
+ else
+ user->chans = c->next;
+ free(c);
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* Handle a PART command.
+ * av[0] = channels to leave
+ * av[1] = reason (optional)
+ */
+
+void do_part(const char *source, int ac, char **av)
+{
+ User *user;
+ char *s, *t;
+ struct u_chanlist *c;
+
+ user = finduser(source);
+ if (!user) {
+ alog("user: PART from nonexistent user %s: %s", source,
+ merge_args(ac, av));
+ return;
+ }
+ t = av[0];
+ while (*(s = t)) {
+ t = s + strcspn(s, ",");
+ if (*t)
+ *t++ = 0;
+ if (debug)
+ alog("debug: %s leaves %s", source, s);
+ for (c = user->chans; c && stricmp(s, c->chan->name) != 0;
+ c = c->next);
+ if (c) {
+ if (!c->chan) {
+ alog("user: BUG parting %s: channel entry found but c->chan NULL", s);
+ return;
+ }
+ chan_deluser(user, c->chan);
+ if (c->next)
+ c->next->prev = c->prev;
+ if (c->prev)
+ c->prev->next = c->next;
+ else
+ user->chans = c->next;
+ free(c);
+ }
+ }
+}
+
+/*************************************************************************/
+
+#if defined(IRC_BAHAMUT) || defined(IRC_HYBRID) || defined(IRC_PTLINK)
+
+/* Handle a SJOIN command.
+
+ On channel creation, syntax is:
+
+ av[0] = timestamp
+ av[1] = channel name
+ av[2|3|4] = modes \ depends of whether the modes k and l
+ av[3|4|5] = users / are set or not.
+
+ When a single user joins an (existing) channel, it is:
+
+ av[0] = timestamp
+ av[1] = user
+
+*/
+
+void do_sjoin(const char *source, int ac, char **av)
+{
+ Channel *c;
+ User *user;
+
+ int is_sqlined = 0;
+
+ /* Double check to avoid unknown modes that need parameters */
+ if (ac >= 4 && ac <= 6) {
+ char *s, *end, cubuf[CHAN_MAX_SYMBOLS + 2], *end2,
+ *cumodes[CHAN_MAX_SYMBOLS + 1];
+
+ c = findchan(av[1]);
+#ifndef IRC_HYBRID
+#ifndef IRC_PTLINK
+ if (!c)
+ is_sqlined = check_chan_sqline(av[1]);
+#endif
+#endif
+
+ cubuf[0] = '+';
+ cumodes[0] = cubuf;
+
+ /* We make all the users join */
+ s = av[ac - 1]; /* Users are always the last element */
+
+ while (*s) {
+ end = strchr(s, ' ');
+ if (end)
+ *end = 0;
+
+ end2 = cubuf + 1;
+ while (csmodes[(int) *s] != 0)
+ *end2++ = csmodes[(int) *s++];
+ *end2 = 0;
+
+ user = finduser(s);
+ if (!user) {
+ alog("user: SJOIN for nonexistent user %s on %s", s,
+ av[1]);
+ return;
+ }
+
+ if (is_sqlined && !is_oper(user)) {
+ send_cmd(s_OperServ, "KICK %s %s :Q-Lined", av[1], s);
+ } else {
+ if (!check_kick(user, av[1])) {
+ /* Make the user join; if the channel does not exist it
+ * will be created there. This ensures that the channel
+ * is not created to be immediately destroyed, and
+ * that the locked key or topic is not shown to anyone
+ * who joins the channel when empty.
+ */
+ c = join_user_update(user, c, av[1]);
+
+ /* We update user mode on the channel */
+ if (end2 - cubuf > 1) {
+ int i;
+
+ for (i = 1; i < end2 - cubuf; i++)
+ cumodes[i] = user->nick;
+ chan_set_modes(source, c, 1 + (end2 - cubuf - 1),
+ cumodes, 1);
+ }
+ }
+ }
+
+ if (!end)
+ break;
+ s = end + 1;
+ }
+
+ if (c) {
+ /* Set the timestamp */
+ c->creation_time = strtoul(av[0], NULL, 10);
+ /* We now update the channel mode. */
+ chan_set_modes(source, c, ac - 3, &av[2], 1);
+ }
+ } else if (ac == 2) {
+ user = finduser(source);
+ if (!user) {
+ alog("user: SJOIN for nonexistent user %s on %s", source,
+ av[1]);
+ return;
+ }
+
+ if (check_kick(user, av[1]))
+ return;
+
+ c = findchan(av[1]);
+#ifndef IRC_HYBRID
+#ifndef IRC_PTLINK
+ if (!c)
+ is_sqlined = check_chan_sqline(av[1]);
+#endif
+#endif
+ if (is_sqlined && !is_oper(user)) {
+ send_cmd(s_OperServ, "KICK %s %s :Q-Lined", av[1], user->nick);
+ } else {
+ c = join_user_update(user, c, av[1]);
+ c->creation_time = strtoul(av[0], NULL, 10);
+ }
+ }
+}
+
+#endif
+
+/*************************************************************************/
+
+/* Handle a channel MODE command. */
+
+void do_cmode(const char *source, int ac, char **av)
+{
+ Channel *chan;
+ ChannelInfo *ci = NULL;
+
+ chan = findchan(av[0]);
+ if (!chan) {
+ ci = cs_findchan(av[0]);
+ if (!(ci && (ci->flags & CI_VERBOTEN)))
+ alog("channel: MODE %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ return;
+ }
+
+ /* This shouldn't trigger on +o, etc. */
+ if (strchr(source, '.') && !av[1][strcspn(av[1], "bovahq")]) {
+ if (time(NULL) != chan->server_modetime) {
+ chan->server_modecount = 0;
+ chan->server_modetime = time(NULL);
+ }
+ chan->server_modecount++;
+ }
+
+ ac--;
+ av++;
+ chan_set_modes(source, chan, ac, av, 1);
+}
+
+/*************************************************************************/
+
+/* Handle a TOPIC command. */
+
+void do_topic(const char *source, int ac, char **av)
+{
+ Channel *c = findchan(av[0]);
+ time_t topic_time = strtoul(av[2], NULL, 10);
+
+ if (!c) {
+ alog("channel: TOPIC %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ return;
+ }
+
+ if (check_topiclock(c, topic_time))
+ return;
+
+ if (c->topic) {
+ free(c->topic);
+ c->topic = NULL;
+ }
+ if (ac > 3 && *av[3])
+ c->topic = sstrdup(av[3]);
+
+ strscpy(c->topic_setter, av[1], sizeof(c->topic_setter));
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+}
+
+/*************************************************************************/
+/**************************** Internal Calls *****************************/
+/*************************************************************************/
+
+static void add_ban(Channel * chan, char *mask)
+{
+ if (s_BotServ && BSSmartJoin && chan->ci && chan->ci->bi
+ && chan->usercount >= BSMinUsers) {
+ char botmask[BUFSIZE];
+ BotInfo *bi = chan->ci->bi;
+
+ snprintf(botmask, sizeof(botmask), "%s!%s@%s", bi->nick, bi->user,
+ bi->host);
+ if (match_wild_nocase(mask, botmask)) {
+ send_cmd(bi->nick, "MODE %s -b %s", chan->name, mask);
+ return;
+ }
+ }
+
+ if (chan->bancount >= chan->bansize) {
+ chan->bansize += 8;
+ chan->bans = srealloc(chan->bans, sizeof(char *) * chan->bansize);
+ }
+ chan->bans[chan->bancount++] = sstrdup(mask);
+
+ if (debug)
+ alog("debug: Added ban %s to channel %s", mask, chan->name);
+}
+
+/*************************************************************************/
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_HYBRID)
+
+static void add_exception(Channel * chan, char *mask)
+{
+ if (chan->exceptcount >= chan->exceptsize) {
+ chan->exceptsize += 8;
+ chan->excepts =
+ srealloc(chan->excepts, sizeof(char *) * chan->exceptsize);
+ }
+ chan->excepts[chan->exceptcount++] = sstrdup(mask);
+
+ if (debug)
+ alog("debug: Added except %s to channel %s", mask, chan->name);
+}
+
+#endif
+
+/*************************************************************************/
+
+/* Add/remove a user to/from a channel, creating or deleting the channel as
+ * necessary. If creating the channel, restore mode lock and topic as
+ * necessary. Also check for auto-opping and auto-voicing.
+ * Modified, so ignored users won't get any status via services -certus */
+
+
+static void chan_adduser2(User * user, Channel * c)
+{
+ struct c_userlist *u;
+ char *chan = c->name;
+
+ if (get_ignore(user->nick) == NULL) {
+
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ if (check_should_owner(user, chan)) {
+ chan_set_user_status(c, user, CUS_OWNER | CUS_OP);
+ } else
+#endif
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_ULTIMATE3)
+ if (check_should_protect(user, chan)) {
+ chan_set_user_status(c, user, CUS_PROTECT | CUS_OP);
+ } else
+#endif
+ if (check_should_op(user, chan)) {
+ chan_set_user_status(c, user, CUS_OP);
+ } else
+#ifdef HAS_HALFOP
+ if (check_should_halfop(user, chan)) {
+ chan_set_user_status(c, user, CUS_HALFOP);
+ } else
+#endif
+ if (check_should_voice(user, chan)) {
+ chan_set_user_status(c, user, CUS_VOICE);
+ }
+ }
+
+ u = scalloc(sizeof(struct c_userlist), 1);
+ u->next = c->users;
+ if (c->users)
+ c->users->prev = u;
+ c->users = u;
+ u->user = user;
+ c->usercount++;
+
+ if (get_ignore(user->nick) == NULL) {
+ if (c->ci && (check_access(user, c->ci, CA_MEMO))
+ && (c->ci->memos.memocount > 0)) {
+ if (c->ci->memos.memocount == 1) {
+ notice_lang(s_MemoServ, user, MEMO_X_ONE_NOTICE,
+ c->ci->memos.memocount, c->ci->name);
+ } else {
+ notice_lang(s_MemoServ, user, MEMO_X_MANY_NOTICE,
+ c->ci->memos.memocount, c->ci->name);
+ }
+ }
+
+ if (c->ci && c->ci->entry_message)
+ notice_user(whosends(c->ci), user, "%s", c->ci->entry_message);
+
+ if (s_BotServ && c->ci && c->ci->bi) {
+ if (c->usercount == BSMinUsers)
+ bot_join(c->ci);
+ if (c->usercount >= BSMinUsers && (c->ci->botflags & BS_GREET)
+ && user->na && user->na->nc->greet
+ && check_access(user, c->ci, CA_GREET)) {
+ send_cmd(c->ci->bi->nick, "PRIVMSG %s :[%s] %s", c->name,
+ user->na->nick, user->na->nc->greet);
+ c->ci->bi->lastmsg = time(NULL);
+ }
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* This creates the channel structure (was originally in
+ chan_adduser, but splitted to make it more efficient to use for
+ SJOINs). */
+
+static Channel *chan_create(const char *chan)
+{
+ Channel *c;
+ Channel **list;
+
+ if (debug)
+ alog("debug: Creating channel %s", chan);
+ /* Allocate pre-cleared memory */
+ c = scalloc(sizeof(Channel), 1);
+ strscpy(c->name, chan, sizeof(c->name));
+ list = &chanlist[HASH(c->name)];
+ c->next = *list;
+ if (*list)
+ (*list)->prev = c;
+ *list = c;
+ c->creation_time = time(NULL);
+ /* Store ChannelInfo pointer in channel record */
+ c->ci = cs_findchan(chan);
+ if (c->ci)
+ c->ci->c = c;
+ /* Restore locked modes and saved topic */
+ if (c->ci) {
+ check_modes(c);
+ restore_topic(chan);
+ stick_all(c->ci);
+ }
+
+ return c;
+}
+
+/*************************************************************************/
+
+/* This destroys the channel structure, freeing everything in it. */
+
+static void chan_delete(Channel * c)
+{
+ BanData *bd, *next;
+ int i;
+
+ if (debug)
+ alog("debug: Deleting channel %s", c->name);
+
+ for (bd = c->bd; bd; bd = next) {
+ if (bd->mask)
+ free(bd->mask);
+ next = bd->next;
+ free(bd);
+ }
+
+ if (c->ci)
+ c->ci->c = NULL;
+
+ if (c->topic)
+ free(c->topic);
+
+ if (c->key)
+ free(c->key);
+#ifdef HAS_FMODE
+ if (c->flood)
+ free(c->flood);
+#endif
+#ifdef HAS_LMODE
+ if (c->redirect)
+ free(c->redirect);
+#endif
+
+ for (i = 0; i < c->bancount; ++i) {
+ if (c->bans[i])
+ free(c->bans[i]);
+ else
+ alog("channel: BUG freeing %s: bans[%d] is NULL!", c->name, i);
+ }
+ if (c->bansize)
+ free(c->bans);
+
+#if defined (IRC_ULTIMATE) || defined (IRC_UNREAL) || defined (IRC_ULTIMATE3) || defined(IRC_HYBRID)
+ for (i = 0; i < c->exceptcount; ++i) {
+ if (c->excepts[i])
+ free(c->excepts[i]);
+ else
+ alog("channel: BUG freeing %s: exceps[%d] is NULL!", c->name,
+ i);
+ }
+ if (c->exceptsize)
+ free(c->excepts);
+#endif
+
+ if (c->next)
+ c->next->prev = c->prev;
+ if (c->prev)
+ c->prev->next = c->next;
+ else
+ chanlist[HASH(c->name)] = c->next;
+
+ free(c);
+}
+
+/*************************************************************************/
+
+static void del_ban(Channel * chan, char *mask)
+{
+ char **s = chan->bans;
+ int i = 0;
+ AutoKick *akick;
+
+ while (i < chan->bancount && strcmp(*s, mask) != 0) {
+ i++;
+ s++;
+ }
+
+ if (i < chan->bancount) {
+ chan->bancount--;
+ if (i < chan->bancount)
+ memmove(s, s + 1, sizeof(char *) * (chan->bancount - i));
+
+ if (debug)
+ alog("debug: Deleted ban %s from channel %s", mask,
+ chan->name);
+ }
+
+ if (chan->ci && (akick = is_stuck(chan->ci, mask)))
+ stick_mask(chan->ci, akick);
+}
+
+/*************************************************************************/
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_HYBRID)
+
+static void del_exception(Channel * chan, char *mask)
+{
+ int reset = 0, i;
+ for (i = 0; i <= chan->exceptcount; i++) {
+ if (chan->excepts[i] == mask) {
+ reset = 1;
+ }
+ if (reset) {
+ if (i == chan->exceptcount)
+ chan->excepts[i] = NULL;
+ else
+ chan->excepts[i] = chan->excepts[i + 1];
+ }
+ }
+ chan->exceptcount--;
+ if (debug)
+ alog("debug: Deleted except %s to channel %s", mask, chan->name);
+}
+
+#endif
+
+/*************************************************************************/
+
+#ifdef HAS_FMODE
+
+static char *get_flood(Channel * chan)
+{
+ return chan->flood;
+}
+
+#endif
+
+/*************************************************************************/
+
+static char *get_key(Channel * chan)
+{
+ return chan->key;
+}
+
+/*************************************************************************/
+
+static char *get_limit(Channel * chan)
+{
+ static char limit[16];
+
+ if (chan->limit == 0)
+ return NULL;
+
+ snprintf(limit, sizeof(limit), "%lu", chan->limit);
+ return limit;
+}
+
+/*************************************************************************/
+
+#ifdef HAS_LMODE
+
+static char *get_redirect(Channel * chan)
+{
+ return chan->redirect;
+}
+
+#endif
+
+/*************************************************************************/
+
+static Channel *join_user_update(User * user, Channel * chan, char *name)
+{
+ struct u_chanlist *c;
+
+ /* If it's a new channel, so we need to create it first. */
+ if (!chan)
+ chan = chan_create(name);
+
+ if (debug)
+ alog("debug: %s joins %s", user->nick, chan->name);
+
+ c = scalloc(sizeof(*c), 1);
+ c->next = user->chans;
+ if (user->chans)
+ user->chans->prev = c;
+ user->chans = c;
+ c->chan = chan;
+
+ chan_adduser2(user, chan);
+
+ return chan;
+}
+
+/*************************************************************************/
+
+#ifdef HAS_FMODE
+
+static void set_flood(Channel * chan, char *value)
+{
+ if (chan->flood)
+ free(chan->flood);
+ chan->flood = value ? sstrdup(value) : NULL;
+
+ if (debug)
+ alog("debug: Flood of channel %s set to %s", chan->name,
+ chan->flood ? chan->flood : "no flood settings");
+}
+
+#endif
+
+/*************************************************************************/
+
+static void set_key(Channel * chan, char *value)
+{
+ if (chan->key)
+ free(chan->key);
+ chan->key = value ? sstrdup(value) : NULL;
+
+ if (debug)
+ alog("debug: Key of channel %s set to %s", chan->name,
+ chan->key ? chan->key : "no key");
+}
+
+/*************************************************************************/
+
+static void set_limit(Channel * chan, char *value)
+{
+ chan->limit = value ? strtoul(value, NULL, 10) : 0;
+
+ if (debug)
+ alog("debug: Limit of channel %s set to %u", chan->name,
+ chan->limit);
+}
+
+/*************************************************************************/
+
+#ifdef HAS_LMODE
+
+static void set_redirect(Channel * chan, char *value)
+{
+ if (chan->redirect)
+ free(chan->redirect);
+ chan->redirect = value ? sstrdup(value) : NULL;
+
+ if (debug)
+ alog("debug: Redirect of channel %s set to %s", chan->name,
+ chan->redirect ? chan->redirect : "no redirect");
+}
+
+#endif
+
+void do_mass_mode(char *modes)
+{
+ int ac, i;
+ char **av;
+ Channel *c;
+ char *myModes;
+
+ if (!modes) {
+ return;
+ }
+
+ /* Prevent modes being altered by split_buf */
+ myModes = sstrdup(modes);
+ ac = split_buf(myModes, &av, 1);
+
+ for (i = 0; i < 1024; i++) {
+ for (c = chanlist[i]; c; c = c->next) {
+ if (c->bouncy_modes) {
+ return;
+ } else {
+ send_cmd(s_OperServ, "MODE %s %s", c->name, modes);
+ chan_set_modes(s_OperServ, c, ac, av, 1);
+ }
+ }
+ }
+}
+
+/*************************************************************************/
diff --git a/chanserv.c b/chanserv.c
new file mode 100644
index 000000000..796a7817a
--- /dev/null
+++ b/chanserv.c
@@ -0,0 +1,6187 @@
+/* ChanServ functions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: chanserv.c,v 1.55 2004/03/17 20:08:49 ribosome Exp $
+ *
+ */
+
+/*************************************************************************/
+
+#include "services.h"
+#include "pseudo.h"
+
+/*************************************************************************/
+/* *INDENT-OFF* */
+
+ChannelInfo *chanlists[256];
+
+static int def_levels[][2] = {
+ { CA_AUTOOP, 5 },
+ { CA_AUTOVOICE, 3 },
+ { CA_AUTODEOP, -1 },
+ { CA_NOJOIN, -2 },
+ { CA_INVITE, 5 },
+ { CA_AKICK, 10 },
+ { CA_SET, ACCESS_INVALID },
+ { CA_CLEAR, ACCESS_INVALID },
+ { CA_UNBAN, 5 },
+ { CA_OPDEOP, 5 },
+ { CA_ACCESS_LIST, 1 },
+ { CA_ACCESS_CHANGE, 10 },
+ { CA_MEMO, 10 },
+ { CA_ASSIGN, ACCESS_INVALID },
+ { CA_BADWORDS, 10 },
+ { CA_NOKICK, 1 },
+ { CA_FANTASIA, 3 },
+ { CA_SAY, 5 },
+ { CA_GREET, 5 },
+ { CA_VOICEME, 3 },
+ { CA_VOICE, 5 },
+ { CA_GETKEY, 5 },
+ { CA_AUTOHALFOP, 4 },
+ { CA_AUTOPROTECT, 10 },
+ { CA_OPDEOPME, 5 },
+ { CA_HALFOPME, 4 },
+ { CA_HALFOP, 5 },
+ { CA_PROTECTME, 10 },
+ { CA_PROTECT, ACCESS_INVALID },
+ { CA_KICKME, 5 },
+ { CA_KICK, 5 },
+ { CA_SIGNKICK, ACCESS_INVALID },
+ { CA_BANME, 5 },
+ { CA_BAN, 5 },
+ { CA_TOPIC, ACCESS_INVALID },
+ { CA_INFO, ACCESS_INVALID },
+ { -1 }
+};
+
+typedef struct {
+ int what;
+ char *name;
+ int desc;
+} LevelInfo;
+static LevelInfo levelinfo[] = {
+ { CA_AUTODEOP, "AUTODEOP", CHAN_LEVEL_AUTODEOP },
+#ifdef HAS_HALFOP
+ { CA_AUTOHALFOP, "AUTOHALFOP", CHAN_LEVEL_AUTOHALFOP },
+#endif
+ { CA_AUTOOP, "AUTOOP", CHAN_LEVEL_AUTOOP },
+#ifdef IRC_UNREAL
+ { CA_AUTOPROTECT, "AUTOPROTECT", CHAN_LEVEL_AUTOPROTECT },
+#endif
+#ifdef IRC_VIAGRA
+ { CA_AUTOPROTECT, "AUTOPROTECT", CHAN_LEVEL_AUTOPROTECT },
+#endif
+#ifdef IRC_ULTIMATE3
+ { CA_AUTOPROTECT, "AUTOADMIN", CHAN_LEVEL_AUTOPROTECT },
+#endif
+ { CA_AUTOVOICE, "AUTOVOICE", CHAN_LEVEL_AUTOVOICE },
+ { CA_NOJOIN, "NOJOIN", CHAN_LEVEL_NOJOIN },
+ { CA_SIGNKICK, "SIGNKICK", CHAN_LEVEL_SIGNKICK },
+
+ { CA_ACCESS_LIST, "ACC-LIST", CHAN_LEVEL_ACCESS_LIST },
+ { CA_ACCESS_CHANGE, "ACC-CHANGE", CHAN_LEVEL_ACCESS_CHANGE },
+ { CA_AKICK, "AKICK", CHAN_LEVEL_AKICK },
+ { CA_SET, "SET", CHAN_LEVEL_SET },
+
+ { CA_BAN, "BAN", CHAN_LEVEL_BAN },
+ { CA_BANME, "BANME", CHAN_LEVEL_BANME },
+ { CA_CLEAR, "CLEAR", CHAN_LEVEL_CLEAR },
+ { CA_GETKEY, "GETKEY", CHAN_LEVEL_GETKEY },
+#ifdef HAS_HALFOP
+ { CA_HALFOP, "HALFOP", CHAN_LEVEL_HALFOP },
+ { CA_HALFOPME, "HALFOPME", CHAN_LEVEL_HALFOPME },
+#endif
+ { CA_INFO, "INFO", CHAN_LEVEL_INFO },
+ { CA_KICK, "KICK", CHAN_LEVEL_KICK },
+ { CA_KICKME, "KICKME", CHAN_LEVEL_KICKME },
+ { CA_INVITE, "INVITE", CHAN_LEVEL_INVITE },
+ { CA_OPDEOP, "OPDEOP", CHAN_LEVEL_OPDEOP },
+ { CA_OPDEOPME, "OPDEOPME", CHAN_LEVEL_OPDEOPME },
+#ifdef IRC_UNREAL
+ { CA_PROTECT, "PROTECT", CHAN_LEVEL_PROTECT },
+ { CA_PROTECTME, "PROTECTME", CHAN_LEVEL_PROTECTME },
+#endif
+#ifdef IRC_VIAGRA
+ { CA_PROTECT, "PROTECT", CHAN_LEVEL_PROTECT },
+ { CA_PROTECTME, "PROTECTME", CHAN_LEVEL_PROTECTME },
+#endif
+#ifdef IRC_ULTIMATE3
+ { CA_PROTECT, "ADMIN", CHAN_LEVEL_PROTECT },
+ { CA_PROTECTME, "ADMINME", CHAN_LEVEL_PROTECTME },
+#endif
+ { CA_TOPIC, "TOPIC", CHAN_LEVEL_TOPIC },
+ { CA_UNBAN, "UNBAN", CHAN_LEVEL_UNBAN },
+ { CA_VOICE, "VOICE", CHAN_LEVEL_VOICE },
+ { CA_VOICEME, "VOICEME", CHAN_LEVEL_VOICEME },
+
+ { CA_MEMO, "MEMO", CHAN_LEVEL_MEMO },
+
+ { CA_ASSIGN, "ASSIGN", CHAN_LEVEL_ASSIGN },
+ { CA_BADWORDS, "BADWORDS", CHAN_LEVEL_BADWORDS },
+ { CA_FANTASIA, "FANTASIA", CHAN_LEVEL_FANTASIA },
+ { CA_GREET, "GREET", CHAN_LEVEL_GREET },
+ { CA_NOKICK, "NOKICK", CHAN_LEVEL_NOKICK },
+ { CA_SAY, "SAY", CHAN_LEVEL_SAY },
+
+ { -1 }
+};
+static int levelinfo_maxwidth = 0;
+
+CSModeUtil csmodeutils[] = {
+ { "DEOP", "!deop", "-o", CI_OPNOTICE, CA_OPDEOP, CA_OPDEOPME },
+ { "OP", "!op", "+o", CI_OPNOTICE, CA_OPDEOP, CA_OPDEOPME },
+ { "DEVOICE", "!devoice", "-v", 0 , CA_VOICE, CA_VOICEME },
+ { "VOICE", "!voice", "+v", 0 , CA_VOICE, CA_VOICEME },
+#ifdef HAS_HALFOP
+ { "DEHALFOP", "!dehalfop", "-h", 0 , CA_HALFOP, CA_HALFOPME },
+ { "HALFOP", "!halfop", "+h", 0 , CA_HALFOP, CA_HALFOPME },
+#endif
+#ifdef IRC_UNREAL
+ { "DEPROTECT", "!deprotect", "-a", 0 , CA_PROTECT, CA_PROTECTME },
+ { "PROTECT", "!protect", "+a", 0 , CA_PROTECT, CA_PROTECTME },
+#endif
+#ifdef IRC_VIAGRA
+ { "DEPROTECT", "!deprotect", "-a", 0 , CA_PROTECT, CA_PROTECTME },
+ { "PROTECT", "!protect", "+a", 0 , CA_PROTECT, CA_PROTECTME },
+#endif
+#ifdef IRC_ULTIMATE3
+ { "DEPROTECT", "!deadmin", "-a", 0 , CA_PROTECT, CA_PROTECTME },
+ { "PROTECT", "!admin", "+a", 0 , CA_PROTECT, CA_PROTECTME },
+#endif
+
+ { NULL }
+};
+
+int xop_msgs[4][14] = {
+ { CHAN_AOP_SYNTAX,
+ CHAN_AOP_DISABLED,
+ CHAN_AOP_NICKS_ONLY,
+ CHAN_AOP_ADDED,
+ CHAN_AOP_MOVED,
+ CHAN_AOP_NO_SUCH_ENTRY,
+ CHAN_AOP_NOT_FOUND,
+ CHAN_AOP_NO_MATCH,
+ CHAN_AOP_DELETED,
+ CHAN_AOP_DELETED_ONE,
+ CHAN_AOP_DELETED_SEVERAL,
+ CHAN_AOP_LIST_EMPTY,
+ CHAN_AOP_LIST_HEADER,
+ CHAN_AOP_CLEAR
+ },
+ { CHAN_SOP_SYNTAX,
+ CHAN_SOP_DISABLED,
+ CHAN_SOP_NICKS_ONLY,
+ CHAN_SOP_ADDED,
+ CHAN_SOP_MOVED,
+ CHAN_SOP_NO_SUCH_ENTRY,
+ CHAN_SOP_NOT_FOUND,
+ CHAN_SOP_NO_MATCH,
+ CHAN_SOP_DELETED,
+ CHAN_SOP_DELETED_ONE,
+ CHAN_SOP_DELETED_SEVERAL,
+ CHAN_SOP_LIST_EMPTY,
+ CHAN_SOP_LIST_HEADER,
+ CHAN_SOP_CLEAR
+ },
+ { CHAN_VOP_SYNTAX,
+ CHAN_VOP_DISABLED,
+ CHAN_VOP_NICKS_ONLY,
+ CHAN_VOP_ADDED,
+ CHAN_VOP_MOVED,
+ CHAN_VOP_NO_SUCH_ENTRY,
+ CHAN_VOP_NOT_FOUND,
+ CHAN_VOP_NO_MATCH,
+ CHAN_VOP_DELETED,
+ CHAN_VOP_DELETED_ONE,
+ CHAN_VOP_DELETED_SEVERAL,
+ CHAN_VOP_LIST_EMPTY,
+ CHAN_VOP_LIST_HEADER,
+ CHAN_VOP_CLEAR
+ },
+ { CHAN_HOP_SYNTAX,
+ CHAN_HOP_DISABLED,
+ CHAN_HOP_NICKS_ONLY,
+ CHAN_HOP_ADDED,
+ CHAN_HOP_MOVED,
+ CHAN_HOP_NO_SUCH_ENTRY,
+ CHAN_HOP_NOT_FOUND,
+ CHAN_HOP_NO_MATCH,
+ CHAN_HOP_DELETED,
+ CHAN_HOP_DELETED_ONE,
+ CHAN_HOP_DELETED_SEVERAL,
+ CHAN_HOP_LIST_EMPTY,
+ CHAN_HOP_LIST_HEADER,
+ CHAN_HOP_CLEAR
+ }
+};
+
+/* *INDENT-ON* */
+/*************************************************************************/
+
+static void alpha_insert_chan(ChannelInfo * ci);
+static ChannelInfo *makechan(const char *chan);
+static int delchan(ChannelInfo * ci);
+static void reset_levels(ChannelInfo * ci);
+static int is_real_founder(User * user, ChannelInfo * ci);
+static int is_identified(User * user, ChannelInfo * ci);
+static void make_unidentified(User * u, ChannelInfo * ci);
+
+static int do_help(User * u);
+static int do_register(User * u);
+static int do_identify(User * u);
+static int do_logout(User * u);
+static int do_drop(User * u);
+static int do_set(User * u);
+static int do_set_founder(User * u, ChannelInfo * ci, char *param);
+static int do_set_successor(User * u, ChannelInfo * ci, char *param);
+static int do_set_password(User * u, ChannelInfo * ci, char *param);
+static int do_set_desc(User * u, ChannelInfo * ci, char *param);
+static int do_set_url(User * u, ChannelInfo * ci, char *param);
+static int do_set_email(User * u, ChannelInfo * ci, char *param);
+static int do_set_entrymsg(User * u, ChannelInfo * ci, char *param);
+static int do_set_bantype(User * u, ChannelInfo * ci, char *param);
+static int do_set_mlock(User * u, ChannelInfo * ci, char *param);
+static int do_set_keeptopic(User * u, ChannelInfo * ci, char *param);
+static int do_set_topiclock(User * u, ChannelInfo * ci, char *param);
+static int do_set_private(User * u, ChannelInfo * ci, char *param);
+static int do_set_secureops(User * u, ChannelInfo * ci, char *param);
+static int do_set_securefounder(User * u, ChannelInfo * ci, char *param);
+static int do_set_restricted(User * u, ChannelInfo * ci, char *param);
+static int do_set_secure(User * u, ChannelInfo * ci, char *param);
+static int do_set_signkick(User * u, ChannelInfo * ci, char *param);
+static int do_set_opnotice(User * u, ChannelInfo * ci, char *param);
+static int do_set_xop(User * u, ChannelInfo * ci, char *param);
+static int do_set_peace(User * u, ChannelInfo * ci, char *param);
+static int do_set_noexpire(User * u, ChannelInfo * ci, char *param);
+static int do_xop(User * u, char *xname, int xlev, int *xmsgs);
+static int do_aop(User * u);
+#ifdef HAS_HALFOP
+static int do_hop(User * u);
+#endif
+static int do_sop(User * u);
+static int do_vop(User * u);
+static int do_access(User * u);
+static int do_akick(User * u);
+static int do_info(User * u);
+static int do_list(User * u);
+static int do_invite(User * u);
+static int do_levels(User * u);
+static int do_util(User * u, CSModeUtil * util);
+static int do_op(User * u);
+static int do_deop(User * u);
+static int do_voice(User * u);
+static int do_devoice(User * u);
+#ifdef HAS_HALFOP
+static int do_halfop(User * u);
+static int do_dehalfop(User * u);
+#endif
+#ifdef IRC_UNREAL
+static int do_protect(User * u);
+static int do_deprotect(User * u);
+static int do_owner(User * u);
+static int do_deowner(User * u);
+#endif
+#ifdef IRC_VIAGRA
+static int do_protect(User * u);
+static int do_deprotect(User * u);
+static int do_owner(User * u);
+static int do_deowner(User * u);
+#endif
+#ifdef IRC_ULTIMATE3
+static int do_protect(User * u);
+static int do_deprotect(User * u);
+#endif
+static int do_cs_kick(User * u);
+static int do_ban(User * u);
+static int do_cs_topic(User * u);
+static int do_unban(User * u);
+static int do_clear(User * u);
+static int do_getkey(User * u);
+static int do_getpass(User * u);
+static int do_sendpass(User * u);
+static int do_forbid(User * u);
+static int do_suspend(User * u);
+static int do_unsuspend(User * u);
+static int do_status(User * u);
+void moduleAddChanServCmds(void);
+/*************************************************************************/
+/* *INDENT-OFF* */
+void moduleAddChanServCmds(void) {
+ Command *c;
+ c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("REGISTER", do_register, NULL, CHAN_HELP_REGISTER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("IDENTIFY", do_identify, NULL, CHAN_HELP_IDENTIFY, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("LOGOUT", do_logout, NULL, -1,CHAN_HELP_LOGOUT, CHAN_SERVADMIN_HELP_LOGOUT,CHAN_SERVADMIN_HELP_LOGOUT, CHAN_SERVADMIN_HELP_LOGOUT); addCoreCommand(CHANSERV,c);
+ c = createCommand("DROP", do_drop, NULL, -1,CHAN_HELP_DROP, CHAN_SERVADMIN_HELP_DROP,CHAN_SERVADMIN_HELP_DROP, CHAN_SERVADMIN_HELP_DROP); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET", do_set, NULL, CHAN_HELP_SET,-1, CHAN_SERVADMIN_HELP_SET,CHAN_SERVADMIN_HELP_SET, CHAN_SERVADMIN_HELP_SET); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET FOUNDER", NULL, NULL, CHAN_HELP_SET_FOUNDER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET SUCCESSOR", NULL, NULL, CHAN_HELP_SET_SUCCESSOR, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET PASSWORD", NULL, NULL, CHAN_HELP_SET_PASSWORD, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET DESC", NULL, NULL, CHAN_HELP_SET_DESC, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET URL", NULL, NULL, CHAN_HELP_SET_URL, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET EMAIL", NULL, NULL, CHAN_HELP_SET_EMAIL, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET ENTRYMSG", NULL, NULL, CHAN_HELP_SET_ENTRYMSG, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET BANTYPE", NULL, NULL, CHAN_HELP_SET_BANTYPE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET PRIVATE", NULL, NULL, CHAN_HELP_SET_PRIVATE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET KEEPTOPIC", NULL, NULL, CHAN_HELP_SET_KEEPTOPIC, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET TOPICLOCK", NULL, NULL, CHAN_HELP_SET_TOPICLOCK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET MLOCK", NULL, NULL, CHAN_HELP_SET_MLOCK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET RESTRICTED", NULL, NULL, CHAN_HELP_SET_RESTRICTED, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET SECURE", NULL, NULL, CHAN_HELP_SET_SECURE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET SECUREOPS", NULL, NULL, CHAN_HELP_SET_SECUREOPS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET SECUREFOUNDER", NULL, NULL, CHAN_HELP_SET_SECUREFOUNDER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET SIGNKICK", NULL, NULL, CHAN_HELP_SET_SIGNKICK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET OPNOTICE", NULL, NULL, CHAN_HELP_SET_OPNOTICE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET XOP", NULL, NULL, CHAN_HELP_SET_XOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET PEACE", NULL, NULL, CHAN_HELP_SET_PEACE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SET NOEXPIRE", NULL, NULL, -1, -1,CHAN_SERVADMIN_HELP_SET_NOEXPIRE,CHAN_SERVADMIN_HELP_SET_NOEXPIRE,CHAN_SERVADMIN_HELP_SET_NOEXPIRE); addCoreCommand(CHANSERV,c);
+ c = createCommand("AOP", do_aop, NULL, CHAN_HELP_AOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+#ifdef HAS_HALFOP
+ c = createCommand("HOP", do_hop, NULL, CHAN_HELP_HOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+#endif
+ c = createCommand("SOP", do_sop, NULL, CHAN_HELP_SOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("VOP", do_vop, NULL, CHAN_HELP_VOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("ACCESS", do_access, NULL, CHAN_HELP_ACCESS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("ACCESS LEVELS", NULL, NULL, CHAN_HELP_ACCESS_LEVELS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("AKICK", do_akick, NULL, CHAN_HELP_AKICK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("LEVELS", do_levels, NULL, CHAN_HELP_LEVELS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("INFO", do_info, NULL, CHAN_HELP_INFO,-1, CHAN_SERVADMIN_HELP_INFO, CHAN_SERVADMIN_HELP_INFO,CHAN_SERVADMIN_HELP_INFO); addCoreCommand(CHANSERV,c);
+ c = createCommand("LIST", do_list, NULL, -1,CHAN_HELP_LIST, CHAN_SERVADMIN_HELP_LIST,CHAN_SERVADMIN_HELP_LIST, CHAN_SERVADMIN_HELP_LIST); addCoreCommand(CHANSERV,c);
+ c = createCommand("OP", do_op, NULL, CHAN_HELP_OP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("DEOP", do_deop, NULL, CHAN_HELP_DEOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("VOICE", do_voice, NULL, CHAN_HELP_VOICE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("DEVOICE", do_devoice, NULL, CHAN_HELP_DEVOICE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+#ifdef HAS_HALFOP
+ c = createCommand("HALFOP", do_halfop, NULL, CHAN_HELP_HALFOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("DEHALFOP", do_dehalfop, NULL, CHAN_HELP_DEHALFOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+#endif
+#ifdef IRC_UNREAL
+ c = createCommand("PROTECT", do_protect, NULL, CHAN_HELP_PROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("DEPROTECT",do_deprotect,NULL, CHAN_HELP_DEPROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("OWNER", do_owner, NULL, CHAN_HELP_OWNER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("DEOWNER", do_deowner, NULL, CHAN_HELP_DEOWNER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+#endif
+#ifdef IRC_VIAGRA
+ c = createCommand("PROTECT", do_protect, NULL, CHAN_HELP_PROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("DEPROTECT",do_deprotect,NULL, CHAN_HELP_DEPROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("OWNER", do_owner, NULL, CHAN_HELP_OWNER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("DEOWNER", do_deowner, NULL, CHAN_HELP_DEOWNER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+#endif
+#ifdef IRC_ULTIMATE3
+ c = createCommand("ADMIN", do_protect, NULL, CHAN_HELP_PROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("DEADMIN",do_deprotect,NULL, CHAN_HELP_DEPROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+#endif
+ c = createCommand("KICK", do_cs_kick, NULL, CHAN_HELP_KICK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("BAN", do_ban, NULL, CHAN_HELP_BAN, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("TOPIC", do_cs_topic, NULL, CHAN_HELP_TOPIC, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("INVITE", do_invite, NULL, CHAN_HELP_INVITE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("UNBAN", do_unban, NULL, CHAN_HELP_UNBAN, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("CLEAR", do_clear, NULL, CHAN_HELP_CLEAR, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("GETKEY", do_getkey, NULL, CHAN_HELP_GETKEY, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("SENDPASS", do_sendpass, NULL, CHAN_HELP_SENDPASS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
+ c = createCommand("GETPASS", do_getpass, is_services_admin, -1,-1, CHAN_SERVADMIN_HELP_GETPASS,CHAN_SERVADMIN_HELP_GETPASS, CHAN_SERVADMIN_HELP_GETPASS); addCoreCommand(CHANSERV,c);
+ c = createCommand("FORBID", do_forbid, is_services_admin, -1,-1, CHAN_SERVADMIN_HELP_FORBID,CHAN_SERVADMIN_HELP_FORBID, CHAN_SERVADMIN_HELP_FORBID); addCoreCommand(CHANSERV,c);
+ c = createCommand("SUSPEND", do_suspend, is_services_admin, -1,-1, CHAN_SERVADMIN_HELP_SUSPEND,CHAN_SERVADMIN_HELP_SUSPEND, CHAN_SERVADMIN_HELP_SUSPEND); addCoreCommand(CHANSERV,c);
+ c = createCommand("UNSUSPEND", do_unsuspend, is_services_admin, -1,-1, CHAN_SERVADMIN_HELP_UNSUSPEND,CHAN_SERVADMIN_HELP_UNSUSPEND, CHAN_SERVADMIN_HELP_UNSUSPEND); addCoreCommand(CHANSERV,c);
+ c = createCommand("STATUS", do_status, is_services_admin, -1,-1, CHAN_SERVADMIN_HELP_STATUS,CHAN_SERVADMIN_HELP_STATUS, CHAN_SERVADMIN_HELP_STATUS); addCoreCommand(CHANSERV,c);
+}
+
+/* *INDENT-ON* */
+/*************************************************************************/
+/*************************************************************************/
+
+/* Returns modes for mlock in a nice way. */
+
+static char *get_mlock_modes(ChannelInfo * ci, int complete)
+{
+ static char res[BUFSIZE];
+
+ char *end = res;
+
+ if (ci->mlock_on || ci->mlock_off) {
+ int n = 0;
+ CBModeInfo *cbmi = cbmodeinfos;
+
+ if (ci->mlock_on) {
+ *end++ = '+';
+ n++;
+
+ do {
+ if (ci->mlock_on & cbmi->flag)
+ *end++ = cbmi->mode;
+ } while ((++cbmi)->flag != 0 && ++n < sizeof(res) - 1);
+
+ cbmi = cbmodeinfos;
+ }
+
+ if (ci->mlock_off) {
+ *end++ = '-';
+ n++;
+
+ do {
+ if (ci->mlock_off & cbmi->flag)
+ *end++ = cbmi->mode;
+ } while ((++cbmi)->flag != 0 && ++n < sizeof(res) - 1);
+
+ cbmi = cbmodeinfos;
+ }
+
+ if (ci->mlock_on && complete) {
+ do {
+ if (cbmi->csgetvalue && (ci->mlock_on & cbmi->flag)) {
+ char *value = cbmi->csgetvalue(ci);
+
+ if (value) {
+ *end++ = ' ';
+ while (*value)
+ *end++ = *value++;
+ }
+ }
+ } while ((++cbmi)->flag != 0 && ++n < sizeof(res) - 1);
+ }
+ }
+
+ *end = 0;
+
+ return res;
+}
+
+/* Display total number of registered channels and info about each; or, if
+ * a specific channel is given, display information about that channel
+ * (like /msg ChanServ INFO <channel>). If count_only != 0, then only
+ * display the number of registered channels (the channel parameter is
+ * ignored).
+ */
+
+void listchans(int count_only, const char *chan)
+{
+ int count = 0;
+ ChannelInfo *ci;
+ int i;
+
+ if (count_only) {
+
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = ci->next)
+ count++;
+ }
+ printf("%d channels registered.\n", count);
+
+ } else if (chan) {
+
+ struct tm *tm;
+ char buf[BUFSIZE];
+
+ if (!(ci = cs_findchan(chan))) {
+ printf("Channel %s not registered.\n", chan);
+ return;
+ }
+ if (ci->flags & CI_VERBOTEN) {
+ printf("Channel %s is FORBIDden.\n", ci->name);
+ } else {
+ printf("Information about channel %s:\n", ci->name);
+ printf(" Founder: %s\n", ci->founder->display);
+ printf(" Description: %s\n", ci->desc);
+ tm = localtime(&ci->time_registered);
+ strftime(buf, sizeof(buf),
+ getstring(NULL, STRFTIME_DATE_TIME_FORMAT), tm);
+ printf(" Registered: %s\n", buf);
+ tm = localtime(&ci->last_used);
+ strftime(buf, sizeof(buf),
+ getstring(NULL, STRFTIME_DATE_TIME_FORMAT), tm);
+ printf(" Last used: %s\n", buf);
+ if (ci->last_topic) {
+ printf(" Last topic: %s\n", ci->last_topic);
+ printf(" Topic set by: %s\n", ci->last_topic_setter);
+ }
+ if (ci->url)
+ printf(" URL: %s\n", ci->url);
+ if (ci->email)
+ printf(" E-mail address: %s\n", ci->email);
+ printf(" Options: ");
+ if (!ci->flags) {
+ printf("None\n");
+ } else {
+ int need_comma = 0;
+ static const char commastr[] = ", ";
+ if (ci->flags & CI_PRIVATE) {
+ printf("Private");
+ need_comma = 1;
+ }
+ if (ci->flags & CI_KEEPTOPIC) {
+ printf("%sTopic Retention",
+ need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ if (ci->flags & CI_TOPICLOCK) {
+ printf("%sTopic Lock", need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ if (ci->flags & CI_SECUREOPS) {
+ printf("%sSecure Ops", need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ if (ci->flags & CI_RESTRICTED) {
+ printf("%sRestricted Access",
+ need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ if (ci->flags & CI_SECURE) {
+ printf("%sSecure", need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ if (ci->flags & CI_NO_EXPIRE) {
+ printf("%sNo Expire", need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ printf("\n");
+ }
+ if (ci->mlock_on || ci->mlock_off)
+ printf(" Mode lock: %s\n", get_mlock_modes(ci, 1));
+ }
+
+ } else {
+
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ printf(" %s %-20s %s\n",
+ ci->flags & CI_NO_EXPIRE ? "!" : " ", ci->name,
+ ci->
+ flags & CI_VERBOTEN ? "Disallowed (FORBID)" : ci->
+ desc);
+ count++;
+ }
+ }
+ printf("%d channels registered.\n", count);
+
+ }
+}
+
+/*************************************************************************/
+
+/* Return information on memory use. Assumes pointers are valid. */
+
+void get_chanserv_stats(long *nrec, long *memuse)
+{
+ long count = 0, mem = 0;
+ int i, j;
+ ChannelInfo *ci;
+
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ count++;
+ mem += sizeof(*ci);
+ if (ci->desc)
+ mem += strlen(ci->desc) + 1;
+ if (ci->url)
+ mem += strlen(ci->url) + 1;
+ if (ci->email)
+ mem += strlen(ci->email) + 1;
+ mem += ci->accesscount * sizeof(ChanAccess);
+ mem += ci->akickcount * sizeof(AutoKick);
+ for (j = 0; j < ci->akickcount; j++) {
+ if (!(ci->akick[j].flags & AK_ISNICK)
+ && ci->akick[j].u.mask)
+ mem += strlen(ci->akick[j].u.mask) + 1;
+ if (ci->akick[j].reason)
+ mem += strlen(ci->akick[j].reason) + 1;
+ if (ci->akick[j].creator)
+ mem += strlen(ci->akick[j].creator) + 1;
+ }
+ if (ci->mlock_key)
+ mem += strlen(ci->mlock_key) + 1;
+#ifdef HAS_FMODE
+ if (ci->mlock_flood)
+ mem += strlen(ci->mlock_flood) + 1;
+#endif
+#ifdef HAS_LMODE
+ if (ci->mlock_redirect)
+ mem += strlen(ci->mlock_redirect) + 1;
+#endif
+ if (ci->last_topic)
+ mem += strlen(ci->last_topic) + 1;
+ if (ci->entry_message)
+ mem += strlen(ci->entry_message) + 1;
+ if (ci->forbidby)
+ mem += strlen(ci->forbidby) + 1;
+ if (ci->forbidreason)
+ mem += strlen(ci->forbidreason) + 1;
+ if (ci->levels)
+ mem += sizeof(*ci->levels) * CA_SIZE;
+ mem += ci->memos.memocount * sizeof(Memo);
+ for (j = 0; j < ci->memos.memocount; j++) {
+ if (ci->memos.memos[j].text)
+ mem += strlen(ci->memos.memos[j].text) + 1;
+ }
+ if (ci->ttb)
+ mem += sizeof(*ci->ttb) * TTB_SIZE;
+ mem += ci->bwcount * sizeof(BadWord);
+ for (j = 0; j < ci->bwcount; j++)
+ if (ci->badwords[j].word)
+ mem += strlen(ci->badwords[j].word) + 1;
+ }
+ }
+ *nrec = count;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* ChanServ initialization. */
+
+void cs_init(void)
+{
+ Command *cmd;
+ moduleAddChanServCmds();
+ cmd = findCommand(CHANSERV, "REGISTER");
+ if (cmd)
+ cmd->help_param1 = s_NickServ;
+ cmd = findCommand(CHANSERV, "SET SECURE");
+ if (cmd)
+ cmd->help_param1 = s_NickServ;
+ cmd = findCommand(CHANSERV, "SET SUCCESSOR");
+ if (cmd)
+ cmd->help_param1 = (char *) (long) CSMaxReg;
+}
+
+/*************************************************************************/
+
+/* Main ChanServ routine. */
+
+void chanserv(User * u, char *buf)
+{
+ char *cmd, *s;
+
+ cmd = strtok(buf, " ");
+
+ if (!cmd) {
+ return;
+ } else if (stricmp(cmd, "\1PING") == 0) {
+ if (!(s = strtok(NULL, "")))
+ s = "\1";
+ notice(s_ChanServ, u->nick, "\1PING %s", s);
+ } else if (skeleton) {
+ notice_lang(s_ChanServ, u, SERVICE_OFFLINE, s_ChanServ);
+ } else {
+ mod_run_cmd(s_ChanServ, u, CHANSERV, cmd);
+ }
+}
+
+/*************************************************************************/
+
+/* Load/save data files. */
+
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ if (!forceload) \
+ fatal("Read error on %s", ChanDBName); \
+ failed = 1; \
+ break; \
+ } \
+} while (0)
+
+void load_cs_dbase(void)
+{
+ dbFILE *f;
+ int ver, i, j, c;
+ ChannelInfo *ci, **last, *prev;
+ int failed = 0;
+
+ if (!(f = open_db(s_ChanServ, ChanDBName, "r", CHAN_VERSION)))
+ return;
+
+ ver = get_file_version(f);
+
+ for (i = 0; i < 256 && !failed; i++) {
+ int16 tmp16;
+ int32 tmp32;
+ int n_levels;
+ char *s;
+ NickAlias *na;
+
+ last = &chanlists[i];
+ prev = NULL;
+ while ((c = getc_db(f)) != 0) {
+ if (c != 1)
+ fatal("Invalid format in %s", ChanDBName);
+ ci = scalloc(sizeof(ChannelInfo), 1);
+ *last = ci;
+ last = &ci->next;
+ ci->prev = prev;
+ prev = ci;
+ SAFE(read_buffer(ci->name, f));
+ SAFE(read_string(&s, f));
+ if (s) {
+ if (ver >= 13)
+ ci->founder = findcore(s);
+ else {
+ na = findnick(s);
+ if (na)
+ ci->founder = na->nc;
+ else
+ ci->founder = NULL;
+ }
+ free(s);
+ } else
+ ci->founder = NULL;
+ if (ver >= 7) {
+ SAFE(read_string(&s, f));
+ if (s) {
+ if (ver >= 13)
+ ci->successor = findcore(s);
+ else {
+ na = findnick(s);
+ if (na)
+ ci->successor = na->nc;
+ else
+ ci->successor = NULL;
+ }
+ free(s);
+ } else
+ ci->successor = NULL;
+ } else {
+ ci->successor = NULL;
+ }
+ SAFE(read_buffer(ci->founderpass, f));
+ SAFE(read_string(&ci->desc, f));
+ if (!ci->desc)
+ ci->desc = sstrdup("");
+ SAFE(read_string(&ci->url, f));
+ SAFE(read_string(&ci->email, f));
+ SAFE(read_int32(&tmp32, f));
+ ci->time_registered = tmp32;
+ SAFE(read_int32(&tmp32, f));
+ ci->last_used = tmp32;
+ SAFE(read_string(&ci->last_topic, f));
+ SAFE(read_buffer(ci->last_topic_setter, f));
+ SAFE(read_int32(&tmp32, f));
+ ci->last_topic_time = tmp32;
+ SAFE(read_int32(&ci->flags, f));
+#ifdef USE_ENCRYPTION
+ if (!(ci->flags & (CI_ENCRYPTEDPW | CI_VERBOTEN))) {
+ if (debug)
+ alog("debug: %s: encrypting password for %s on load",
+ s_ChanServ, ci->name);
+ if (encrypt_in_place(ci->founderpass, PASSMAX) < 0)
+ fatal("%s: load database: Can't encrypt %s password!",
+ s_ChanServ, ci->name);
+ ci->flags |= CI_ENCRYPTEDPW;
+ }
+#else
+ if (ci->flags & CI_ENCRYPTEDPW) {
+ /* Bail: it makes no sense to continue with encrypted
+ * passwords, since we won't be able to verify them */
+ fatal("%s: load database: password for %s encrypted "
+ "but encryption disabled, aborting",
+ s_ChanServ, ci->name);
+ }
+#endif
+ /* Leaveops cleanup */
+ if (ver <= 13 && (ci->flags & 0x00000020))
+ ci->flags &= ~0x00000020;
+ /* Temporary flags cleanup */
+ ci->flags &= ~CI_INHABIT;
+
+ if (ver >= 9) {
+ SAFE(read_string(&ci->forbidby, f));
+ SAFE(read_string(&ci->forbidreason, f));
+ } else {
+ ci->forbidreason = NULL;
+ ci->forbidby = NULL;
+ }
+ if (ver >= 9)
+ SAFE(read_int16(&tmp16, f));
+ else
+ tmp16 = CSDefBantype;
+ ci->bantype = tmp16;
+ SAFE(read_int16(&tmp16, f));
+ n_levels = tmp16;
+ ci->levels = scalloc(2 * CA_SIZE, 1);
+ reset_levels(ci);
+ for (j = 0; j < n_levels; j++) {
+ if (j < CA_SIZE)
+ SAFE(read_int16(&ci->levels[j], f));
+ else
+ SAFE(read_int16(&tmp16, f));
+ }
+ /* To avoid levels list silly hacks */
+ if (ver < 10)
+ ci->levels[CA_OPDEOPME] = ci->levels[CA_OPDEOP];
+ if (ver < 11) {
+ ci->levels[CA_KICKME] = ci->levels[CA_OPDEOP];
+ ci->levels[CA_KICK] = ci->levels[CA_OPDEOP];
+ }
+ if (ver < 15) {
+
+ /* Old Ultimate levels import */
+ /* We now conveniently use PROTECT internals for Ultimate's ADMIN support - ShadowMaster */
+ /* Doh, must of course be done before we change the values were trying to import - ShadowMaster */
+ ci->levels[CA_AUTOPROTECT] = ci->levels[32];
+ ci->levels[CA_PROTECTME] = ci->levels[33];
+ ci->levels[CA_PROTECT] = ci->levels[34];
+
+ ci->levels[CA_BANME] = ci->levels[CA_OPDEOP];
+ ci->levels[CA_BAN] = ci->levels[CA_OPDEOP];
+ ci->levels[CA_TOPIC] = ACCESS_INVALID;
+
+
+ }
+
+ SAFE(read_int16(&ci->accesscount, f));
+ if (ci->accesscount) {
+ ci->access = scalloc(ci->accesscount, sizeof(ChanAccess));
+ for (j = 0; j < ci->accesscount; j++) {
+ SAFE(read_int16(&ci->access[j].in_use, f));
+ if (ci->access[j].in_use) {
+ SAFE(read_int16(&ci->access[j].level, f));
+ SAFE(read_string(&s, f));
+ if (s) {
+ if (ver >= 13)
+ ci->access[j].nc = findcore(s);
+ else {
+ na = findnick(s);
+ if (na)
+ ci->access[j].nc = na->nc;
+ else
+ ci->access[j].nc = NULL;
+ }
+ free(s);
+ }
+ if (ci->access[j].nc == NULL)
+ ci->access[j].in_use = 0;
+ if (ver >= 11) {
+ SAFE(read_int32(&tmp32, f));
+ ci->access[j].last_seen = tmp32;
+ } else {
+ ci->access[j].last_seen = 0; /* Means we have never seen the user */
+ }
+ }
+ }
+ } else {
+ ci->access = NULL;
+ }
+
+ SAFE(read_int16(&ci->akickcount, f));
+ if (ci->akickcount) {
+ ci->akick = scalloc(ci->akickcount, sizeof(AutoKick));
+ for (j = 0; j < ci->akickcount; j++) {
+ if (ver >= 15) {
+ SAFE(read_int16(&ci->akick[j].flags, f));
+ } else {
+ SAFE(read_int16(&tmp16, f));
+ if (tmp16)
+ ci->akick[j].flags |= AK_USED;
+ }
+ if (ci->akick[j].flags & AK_USED) {
+ if (ver < 15) {
+ SAFE(read_int16(&tmp16, f));
+ if (tmp16)
+ ci->akick[j].flags |= AK_ISNICK;
+ }
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & AK_ISNICK) {
+ if (ver >= 13) {
+ ci->akick[j].u.nc = findcore(s);
+ } else {
+ na = findnick(s);
+ if (na)
+ ci->akick[j].u.nc = na->nc;
+ else
+ ci->akick[j].u.nc = NULL;
+ }
+ if (!ci->akick[j].u.nc)
+ ci->akick[j].flags &= ~AK_USED;
+ free(s);
+ } else {
+ ci->akick[j].u.mask = s;
+ }
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & AK_USED)
+ ci->akick[j].reason = s;
+ else if (s)
+ free(s);
+ if (ver >= 9) {
+ SAFE(read_string(&s, f));
+ if (ci->akick[j].flags & AK_USED) {
+ ci->akick[j].creator = s;
+ } else if (s) {
+ free(s);
+ }
+ SAFE(read_int32(&tmp32, f));
+ if (ci->akick[j].flags & AK_USED)
+ ci->akick[j].addtime = tmp32;
+ } else {
+ ci->akick[j].creator = NULL;
+ ci->akick[j].addtime = 0;
+ }
+ }
+
+ /* Bugfix */
+ if ((ver == 15) && ci->akick[j].flags > 8) {
+ ci->akick[j].flags = 0;
+ ci->akick[j].u.nc = NULL;
+ ci->akick[j].u.nc = NULL;
+ ci->akick[j].addtime = 0;
+ ci->akick[j].creator = NULL;
+ ci->akick[j].reason = NULL;
+ }
+ }
+ } else {
+ ci->akick = NULL;
+ }
+
+ if (ver >= 10) {
+ SAFE(read_int32(&ci->mlock_on, f));
+ SAFE(read_int32(&ci->mlock_off, f));
+ } else {
+ SAFE(read_int16(&tmp16, f));
+ ci->mlock_on = tmp16;
+ SAFE(read_int16(&tmp16, f));
+ ci->mlock_off = tmp16;
+ }
+ SAFE(read_int32(&ci->mlock_limit, f));
+ SAFE(read_string(&ci->mlock_key, f));
+ if (ver >= 10) {
+#ifdef HAS_FMODE
+ SAFE(read_string(&ci->mlock_flood, f));
+#else
+ SAFE(read_string(&s, f));
+ if (s)
+ free(s);
+#endif
+#ifdef HAS_LMODE
+ SAFE(read_string(&ci->mlock_redirect, f));
+#else
+ SAFE(read_string(&s, f));
+ if (s)
+ free(s);
+#endif
+ }
+
+ SAFE(read_int16(&ci->memos.memocount, f));
+ SAFE(read_int16(&ci->memos.memomax, f));
+ if (ci->memos.memocount) {
+ Memo *memos;
+ memos = scalloc(sizeof(Memo) * ci->memos.memocount, 1);
+ ci->memos.memos = memos;
+ for (j = 0; j < ci->memos.memocount; j++, memos++) {
+ SAFE(read_int32(&memos->number, f));
+ SAFE(read_int16(&memos->flags, f));
+ SAFE(read_int32(&tmp32, f));
+ memos->time = tmp32;
+ SAFE(read_buffer(memos->sender, f));
+ SAFE(read_string(&memos->text, f));
+ }
+ }
+
+ SAFE(read_string(&ci->entry_message, f));
+
+ ci->c = NULL;
+
+ /* Some cleanup */
+ if (ver <= 11) {
+ /* Cleanup: Founder must be != than successor */
+ if (!(ci->flags & CI_VERBOTEN)
+ && ci->successor == ci->founder) {
+ alog("Warning: founder and successor of %s are equal. Cleaning up.", ci->name);
+ ci->successor = NULL;
+ }
+ }
+
+ /* BotServ options */
+
+ if (ver >= 8) {
+ int n_ttb;
+
+ SAFE(read_string(&s, f));
+ if (s) {
+ ci->bi = findbot(s);
+ free(s);
+ } else
+ ci->bi = NULL;
+
+ SAFE(read_int32(&tmp32, f));
+ ci->botflags = tmp32;
+ SAFE(read_int16(&tmp16, f));
+ n_ttb = tmp16;
+ ci->ttb = scalloc(2 * TTB_SIZE, 1);
+ for (j = 0; j < n_ttb; j++) {
+ if (j < TTB_SIZE)
+ SAFE(read_int16(&ci->ttb[j], f));
+ else
+ SAFE(read_int16(&tmp16, f));
+ }
+ for (j = n_ttb; j < TTB_SIZE; j++)
+ ci->ttb[j] = 0;
+ SAFE(read_int16(&tmp16, f));
+ ci->capsmin = tmp16;
+ SAFE(read_int16(&tmp16, f));
+ ci->capspercent = tmp16;
+ SAFE(read_int16(&tmp16, f));
+ ci->floodlines = tmp16;
+ SAFE(read_int16(&tmp16, f));
+ ci->floodsecs = tmp16;
+ SAFE(read_int16(&tmp16, f));
+ ci->repeattimes = tmp16;
+
+ SAFE(read_int16(&ci->bwcount, f));
+ if (ci->bwcount) {
+ ci->badwords = scalloc(ci->bwcount, sizeof(BadWord));
+ for (j = 0; j < ci->bwcount; j++) {
+ SAFE(read_int16(&ci->badwords[j].in_use, f));
+ if (ci->badwords[j].in_use) {
+ SAFE(read_string(&ci->badwords[j].word, f));
+ SAFE(read_int16(&ci->badwords[j].type, f));
+ }
+ }
+ } else {
+ ci->badwords = NULL;
+ }
+ } else {
+ ci->bi = NULL;
+ ci->botflags = 0;
+ ci->ttb = scalloc(2 * TTB_SIZE, 1);
+ for (j = 0; j < TTB_SIZE; j++)
+ ci->ttb[j] = 0;
+ ci->bwcount = 0;
+ ci->badwords = NULL;
+ }
+
+ } /* while (getc_db(f) != 0) */
+
+ *last = NULL;
+
+ } /* for (i) */
+
+ close_db(f);
+
+ /* Check for non-forbidden channels with no founder.
+ Makes also other essential tasks. */
+ for (i = 0; i < 256; i++) {
+ ChannelInfo *next;
+ for (ci = chanlists[i]; ci; ci = next) {
+ next = ci->next;
+ if (!(ci->flags & CI_VERBOTEN) && !ci->founder) {
+ alog("%s: database load: Deleting founderless channel %s",
+ s_ChanServ, ci->name);
+ delchan(ci);
+ continue;
+ }
+ if (ver < 13) {
+ ChanAccess *access, *access2;
+ AutoKick *akick, *akick2;
+ int k;
+
+ if (ci->flags & CI_VERBOTEN)
+ continue;
+ /* Need to regenerate the channel count for the founder */
+ ci->founder->channelcount++;
+ /* Check for eventual double entries in access/akick lists. */
+ for (j = 0, access = ci->access; j < ci->accesscount;
+ j++, access++) {
+ if (!access->in_use)
+ continue;
+ for (k = 0, access2 = ci->access; k < j;
+ k++, access2++) {
+ if (access2->in_use && access2->nc == access->nc) {
+ alog("%s: deleting %s channel access entry of %s because it is already in the list (this is OK).", s_ChanServ, access->nc->display, ci->name);
+ memset(access, 0, sizeof(ChanAccess));
+ break;
+ }
+ }
+ }
+ for (j = 0, akick = ci->akick; j < ci->akickcount;
+ j++, akick++) {
+ if (!(akick->flags & AK_USED)
+ || !(akick->flags & AK_ISNICK))
+ continue;
+ for (k = 0, akick2 = ci->akick; k < j; k++, akick2++) {
+ if ((akick2->flags & AK_USED)
+ && (akick2->flags & AK_ISNICK)
+ && akick2->u.nc == akick->u.nc) {
+ alog("%s: deleting %s channel akick entry of %s because it is already in the list (this is OK).", s_ChanServ, akick->u.nc->display, ci->name);
+ if (akick->reason)
+ free(akick->reason);
+ if (akick->creator)
+ free(akick->creator);
+ memset(akick, 0, sizeof(AutoKick));
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ restore_db(f); \
+ log_perror("Write error on %s", ChanDBName); \
+ if (time(NULL) - lastwarn > WarningTimeout) { \
+ wallops(NULL, "Write error on %s: %s", ChanDBName, \
+ strerror(errno)); \
+ lastwarn = time(NULL); \
+ } \
+ return; \
+ } \
+} while (0)
+
+void save_cs_dbase(void)
+{
+ dbFILE *f;
+ int i, j;
+ ChannelInfo *ci;
+ Memo *memos;
+ static time_t lastwarn = 0;
+
+ if (!(f = open_db(s_ChanServ, ChanDBName, "w", CHAN_VERSION)))
+ return;
+
+ for (i = 0; i < 256; i++) {
+ int16 tmp16;
+
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ SAFE(write_int8(1, f));
+ SAFE(write_buffer(ci->name, f));
+ if (ci->founder)
+ SAFE(write_string(ci->founder->display, f));
+ else
+ SAFE(write_string(NULL, f));
+ if (ci->successor)
+ SAFE(write_string(ci->successor->display, f));
+ else
+ SAFE(write_string(NULL, f));
+ SAFE(write_buffer(ci->founderpass, f));
+ SAFE(write_string(ci->desc, f));
+ SAFE(write_string(ci->url, f));
+ SAFE(write_string(ci->email, f));
+ SAFE(write_int32(ci->time_registered, f));
+ SAFE(write_int32(ci->last_used, f));
+ SAFE(write_string(ci->last_topic, f));
+ SAFE(write_buffer(ci->last_topic_setter, f));
+ SAFE(write_int32(ci->last_topic_time, f));
+ SAFE(write_int32(ci->flags, f));
+ SAFE(write_string(ci->forbidby, f));
+ SAFE(write_string(ci->forbidreason, f));
+ SAFE(write_int16(ci->bantype, f));
+
+ tmp16 = CA_SIZE;
+ SAFE(write_int16(tmp16, f));
+ for (j = 0; j < CA_SIZE; j++)
+ SAFE(write_int16(ci->levels[j], f));
+
+ SAFE(write_int16(ci->accesscount, f));
+ for (j = 0; j < ci->accesscount; j++) {
+ SAFE(write_int16(ci->access[j].in_use, f));
+ if (ci->access[j].in_use) {
+ SAFE(write_int16(ci->access[j].level, f));
+ SAFE(write_string(ci->access[j].nc->display, f));
+ SAFE(write_int32(ci->access[j].last_seen, f));
+ }
+ }
+
+ SAFE(write_int16(ci->akickcount, f));
+ for (j = 0; j < ci->akickcount; j++) {
+ SAFE(write_int16(ci->akick[j].flags, f));
+ if (ci->akick[j].flags & AK_USED) {
+ if (ci->akick[j].flags & AK_ISNICK)
+ SAFE(write_string(ci->akick[j].u.nc->display, f));
+ else
+ SAFE(write_string(ci->akick[j].u.mask, f));
+ SAFE(write_string(ci->akick[j].reason, f));
+ SAFE(write_string(ci->akick[j].creator, f));
+ SAFE(write_int32(ci->akick[j].addtime, f));
+ }
+ }
+
+ SAFE(write_int32(ci->mlock_on, f));
+ SAFE(write_int32(ci->mlock_off, f));
+ SAFE(write_int32(ci->mlock_limit, f));
+ SAFE(write_string(ci->mlock_key, f));
+#ifdef HAS_FMODE
+ SAFE(write_string(ci->mlock_flood, f));
+#else
+ SAFE(write_string(NULL, f));
+#endif
+#ifdef HAS_LMODE
+ SAFE(write_string(ci->mlock_redirect, f));
+#else
+ SAFE(write_string(NULL, f));
+#endif
+
+ SAFE(write_int16(ci->memos.memocount, f));
+ SAFE(write_int16(ci->memos.memomax, f));
+ memos = ci->memos.memos;
+ for (j = 0; j < ci->memos.memocount; j++, memos++) {
+ SAFE(write_int32(memos->number, f));
+ SAFE(write_int16(memos->flags, f));
+ SAFE(write_int32(memos->time, f));
+ SAFE(write_buffer(memos->sender, f));
+ SAFE(write_string(memos->text, f));
+ }
+
+ SAFE(write_string(ci->entry_message, f));
+
+ if (ci->bi)
+ SAFE(write_string(ci->bi->nick, f));
+ else
+ SAFE(write_string(NULL, f));
+
+ SAFE(write_int32(ci->botflags, f));
+
+ tmp16 = TTB_SIZE;
+ SAFE(write_int16(tmp16, f));
+ for (j = 0; j < TTB_SIZE; j++)
+ SAFE(write_int16(ci->ttb[j], f));
+
+ SAFE(write_int16(ci->capsmin, f));
+ SAFE(write_int16(ci->capspercent, f));
+ SAFE(write_int16(ci->floodlines, f));
+ SAFE(write_int16(ci->floodsecs, f));
+ SAFE(write_int16(ci->repeattimes, f));
+
+ SAFE(write_int16(ci->bwcount, f));
+ for (j = 0; j < ci->bwcount; j++) {
+ SAFE(write_int16(ci->badwords[j].in_use, f));
+ if (ci->badwords[j].in_use) {
+ SAFE(write_string(ci->badwords[j].word, f));
+ SAFE(write_int16(ci->badwords[j].type, f));
+ }
+ }
+ } /* for (chanlists[i]) */
+
+ SAFE(write_int8(0, f));
+
+ } /* for (i) */
+
+ close_db(f);
+
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+void save_cs_rdb_dbase(void)
+{
+#ifdef USE_RDB
+ int i;
+ ChannelInfo *ci;
+
+ if (!rdb_open())
+ return;
+
+ rdb_tag_table("anope_cs_info");
+ rdb_scrub_table("anope_ms_info", "serv='CHAN'");
+ rdb_clear_table("anope_cs_access");
+ rdb_clear_table("anope_cs_levels");
+ rdb_clear_table("anope_cs_akicks");
+ rdb_clear_table("anope_cs_badwords");
+
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ rdb_save_cs_info(ci);
+ } /* for (chanlists[i]) */
+ } /* for (i) */
+
+ rdb_scrub_table("anope_cs_info", "active='0'");
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+
+/* Check the current modes on a channel; if they conflict with a mode lock,
+ * fix them. */
+
+void check_modes(Channel * c)
+{
+ char modebuf[64], argbuf[BUFSIZE], *end = modebuf, *end2 = argbuf;
+ uint32 modes;
+ ChannelInfo *ci;
+ CBModeInfo *cbmi;
+ CBMode *cbm;
+
+ if (c->bouncy_modes)
+ return;
+
+ /* Check for mode bouncing */
+ if (c->server_modecount >= 3 && c->chanserv_modecount >= 3) {
+ wallops(NULL, "Warning: unable to set modes on channel %s. "
+ "Are your servers' U:lines configured correctly?",
+ c->name);
+ alog("%s: Bouncy modes on channel %s", s_ChanServ, c->name);
+ c->bouncy_modes = 1;
+ return;
+ }
+
+ if (c->chanserv_modetime != time(NULL)) {
+ c->chanserv_modecount = 0;
+ c->chanserv_modetime = time(NULL);
+ }
+ c->chanserv_modecount++;
+
+ if (!(ci = c->ci)) {
+#ifndef IRC_HYBRID
+ if (c->mode & CMODE_r) {
+ c->mode &= ~CMODE_r;
+ send_cmd(whosends(ci), "MODE %s -r", c->name);
+ }
+#endif
+ return;
+ }
+
+ modes = ~c->mode & ci->mlock_on;
+
+ *end++ = '+';
+ cbmi = cbmodeinfos;
+
+ do {
+ if (modes & cbmi->flag) {
+ *end++ = cbmi->mode;
+ c->mode |= cbmi->flag;
+
+ /* Add the eventual parameter and modify the Channel structure */
+ if (cbmi->getvalue && cbmi->csgetvalue) {
+ char *value = cbmi->csgetvalue(ci);
+
+ cbm = &cbmodes[(int) cbmi->mode];
+ cbm->setvalue(c, value);
+
+ if (value) {
+ *end2++ = ' ';
+ while (*value)
+ *end2++ = *value++;
+ }
+ }
+ } else if (cbmi->getvalue && cbmi->csgetvalue
+ && (ci->mlock_on & cbmi->flag)
+ && (c->mode & cbmi->flag)) {
+ char *value = cbmi->getvalue(c);
+ char *csvalue = cbmi->csgetvalue(ci);
+
+ /* Lock and actual values don't match, so fix the mode */
+ if (value && csvalue && strcmp(value, csvalue)) {
+ *end++ = cbmi->mode;
+
+ cbm = &cbmodes[(int) cbmi->mode];
+ cbm->setvalue(c, csvalue);
+
+ *end2++ = ' ';
+ while (*csvalue)
+ *end2++ = *csvalue++;
+ }
+ }
+ } while ((++cbmi)->flag != 0);
+
+ if (*(end - 1) == '+')
+ end--;
+
+ modes = c->mode & ci->mlock_off;
+
+ if (modes) {
+ *end++ = '-';
+ cbmi = cbmodeinfos;
+
+ do {
+ if (modes & cbmi->flag) {
+ *end++ = cbmi->mode;
+ c->mode &= ~cbmi->flag;
+
+ /* Add the eventual parameter and clean up the Channel structure */
+ if (cbmi->getvalue) {
+ cbm = &cbmodes[(int) cbmi->mode];
+
+ if (!(cbm->flags & CBM_MINUS_NO_ARG)) {
+ char *value = cbmi->getvalue(c);
+
+ if (value) {
+ *end2++ = ' ';
+ while (*value)
+ *end2++ = *value++;
+ }
+ }
+
+ cbm->setvalue(c, NULL);
+ }
+ }
+ } while ((++cbmi)->flag != 0);
+ }
+
+ if (end == modebuf)
+ return;
+
+ *end = 0;
+ *end2 = 0;
+
+ send_cmd(whosends(ci), "MODE %s %s%s", c->name, modebuf,
+ (end2 == argbuf ? "" : argbuf));
+}
+
+/*************************************************************************/
+
+#ifdef IRC_ULTIMATE3
+
+
+int check_valid_admin(User * user, Channel * chan, int servermode)
+{
+ if (!chan->ci)
+ return 1;
+
+ /* They will be kicked; no need to deop, no need to update our internal struct too */
+ if (chan->ci->flags & CI_VERBOTEN)
+ return 0;
+
+ if (servermode && !check_access(user, chan->ci, CA_AUTOPROTECT)) {
+ notice_lang(s_ChanServ, user, CHAN_IS_REGISTERED, s_ChanServ);
+ send_cmd(whosends(chan->ci), "MODE %s -a %s", chan->name,
+ user->nick);
+ return 0;
+ }
+
+ if (check_access(user, chan->ci, CA_AUTODEOP)) {
+ send_cmd(whosends(chan->ci), "MODE %s -a %s", chan->name,
+ user->nick);
+ return 0;
+ }
+
+ return 1;
+}
+#endif
+
+/*************************************************************************/
+
+/* Check whether a user is allowed to be opped on a channel; if they
+ * aren't, deop them. If serverop is 1, the +o was done by a server.
+ * Return 1 if the user is allowed to be opped, 0 otherwise. */
+
+int check_valid_op(User * user, Channel * chan, int servermode)
+{
+ if (!chan->ci)
+ return 1;
+
+ /* They will be kicked; no need to deop, no need to update our internal struct too */
+ if (chan->ci->flags & CI_VERBOTEN)
+ return 0;
+
+ if (servermode && !check_access(user, chan->ci, CA_AUTOOP)) {
+ notice_lang(s_ChanServ, user, CHAN_IS_REGISTERED, s_ChanServ);
+#ifdef HAS_HALFOP
+# if defined(IRC_UNREAL)
+ if (check_access(user, chan->ci, CA_AUTOHALFOP)) {
+ send_cmd(whosends(chan->ci), "MODE %s -aoq %s %s %s",
+ chan->name, user->nick, user->nick, user->nick);
+ } else {
+ send_cmd(whosends(chan->ci), "MODE %s -ahoq %s %s %s %s",
+ chan->name, user->nick, user->nick, user->nick,
+ user->nick);
+ }
+# elif defined(IRC_ULTIMATE3)
+ if (check_access(user, chan->ci, CA_AUTOHALFOP)) {
+ send_cmd(whosends(chan->ci), "MODE %s -ao %s %s",
+ chan->name, user->nick, user->nick);
+ } else {
+ send_cmd(whosends(chan->ci), "MODE %s -aoh %s %s %s",
+ chan->name, user->nick, user->nick, user->nick);
+ }
+# else
+ if (check_access(user, chan->ci, CA_AUTOHALFOP)) {
+ send_cmd(whosends(chan->ci), "MODE %s -o %s", chan->name,
+ user->nick);
+ } else {
+ send_cmd(whosends(chan->ci), "MODE %s -ho %s %s", chan->name,
+ user->nick, user->nick);
+ }
+# endif
+#else
+ send_cmd(whosends(chan->ci), "MODE %s -o %s", chan->name,
+ user->nick);
+#endif
+ return 0;
+ }
+
+ if (check_access(user, chan->ci, CA_AUTODEOP)) {
+#ifdef HAS_HALFOP
+# ifdef IRC_UNREAL
+ send_cmd(whosends(chan->ci), "MODE %s -ahoq %s %s %s %s",
+ chan->name, user->nick, user->nick, user->nick,
+ user->nick);
+# else
+ send_cmd(whosends(chan->ci), "MODE %s -ho %s %s", chan->name,
+ user->nick, user->nick);
+# endif
+#else
+ send_cmd(whosends(chan->ci), "MODE %s -o %s", chan->name,
+ user->nick);
+#endif
+ return 0;
+ }
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Check whether a user should be opped on a channel, and if so, do it.
+ * Return 1 if the user was opped, 0 otherwise. (Updates the channel's
+ * last used time if the user was opped.) */
+
+int check_should_op(User * user, const char *chan)
+{
+ ChannelInfo *ci = cs_findchan(chan);
+
+ if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
+ return 0;
+
+ if ((ci->flags & CI_SECURE) && !nick_identified(user))
+ return 0;
+
+ if (check_access(user, ci, CA_AUTOOP)) {
+ send_cmd(whosends(ci), "MODE %s +o %s", chan, user->nick);
+ return 1;
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Check whether a user should be voiced on a channel, and if so, do it.
+ * Return 1 if the user was voiced, 0 otherwise. */
+
+int check_should_voice(User * user, const char *chan)
+{
+ ChannelInfo *ci = cs_findchan(chan);
+
+ if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
+ return 0;
+
+ if ((ci->flags & CI_SECURE) && !nick_identified(user))
+ return 0;
+
+ if (check_access(user, ci, CA_AUTOVOICE)) {
+ send_cmd(whosends(ci), "MODE %s +v %s", chan, user->nick);
+ return 1;
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+#ifdef HAS_HALFOP
+
+int check_should_halfop(User * user, const char *chan)
+{
+ ChannelInfo *ci = cs_findchan(chan);
+
+ if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
+ return 0;
+
+ if (check_access(user, ci, CA_AUTOHALFOP)) {
+ send_cmd(whosends(ci), "MODE %s +h %s", chan, user->nick);
+ return 1;
+ }
+
+ return 0;
+}
+
+#endif
+
+/*************************************************************************/
+
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+
+int check_should_owner(User * user, const char *chan)
+{
+ ChannelInfo *ci = cs_findchan(chan);
+
+ if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
+ return 0;
+
+ if (((ci->flags & CI_SECUREFOUNDER) && is_real_founder(user, ci))
+ || (!(ci->flags & CI_SECUREFOUNDER) && is_founder(user, ci))) {
+ send_cmd(whosends(ci), "MODE %s +oq %s %s", chan, user->nick,
+ user->nick);
+ return 1;
+ }
+
+ return 0;
+}
+
+#endif
+
+/*************************************************************************/
+
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_ULTIMATE3)
+
+int check_should_protect(User * user, const char *chan)
+{
+ ChannelInfo *ci = cs_findchan(chan);
+
+ if (!ci || (ci->flags & CI_VERBOTEN) || *chan == '+')
+ return 0;
+
+ if (check_access(user, ci, CA_AUTOPROTECT)) {
+ send_cmd(whosends(ci), "MODE %s +oa %s %s", chan, user->nick,
+ user->nick);
+ return 1;
+ }
+
+ return 0;
+}
+
+#endif
+
+/*************************************************************************/
+
+/* Tiny helper routine to get ChanServ out of a channel after it went in. */
+
+static void timeout_leave(Timeout * to)
+{
+ char *chan = to->data;
+ ChannelInfo *ci = cs_findchan(chan);
+
+ if (ci) /* Check cos the channel may be dropped in the meantime */
+ ci->flags &= ~CI_INHABIT;
+
+ send_cmd(s_ChanServ, "PART %s", chan);
+ free(to->data);
+}
+
+
+/* Check whether a user is permitted to be on a channel. If so, return 0;
+ * else, kickban the user with an appropriate message (could be either
+ * AKICK or restricted access) and return 1. Note that this is called
+ * _before_ the user is added to internal channel lists (so do_kick() is
+ * not called).
+ */
+
+int check_kick(User * user, char *chan)
+{
+ ChannelInfo *ci = cs_findchan(chan);
+ Channel *c;
+ AutoKick *akick;
+ int i;
+ NickCore *nc;
+ char *av[3];
+ char mask[BUFSIZE];
+ const char *reason;
+ Timeout *t;
+
+ if (!ci)
+ return 0;
+
+ if (is_oper(user) || is_services_admin(user))
+ return 0;
+
+ if (ci->flags & CI_VERBOTEN) {
+ get_idealban(ci, user, mask, sizeof(mask));
+ reason =
+ ci->forbidreason ? ci->forbidreason : getstring(user->na,
+ CHAN_MAY_NOT_BE_USED);
+ goto kick;
+ }
+
+ if (ci->flags & CI_SUSPENDED) {
+ get_idealban(ci, user, mask, sizeof(mask));
+ reason =
+ ci->forbidreason ? ci->forbidreason : getstring(user->na,
+ CHAN_MAY_NOT_BE_USED);
+ goto kick;
+ }
+
+ if (nick_recognized(user))
+ nc = user->na->nc;
+ else
+ nc = NULL;
+
+#if defined (IRC_ULTIMATE) || defined(IRC_ULTIMATE3) || defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_HYBRID)
+ /*
+ * Before we go through akick lists, see if they're excepted FIRST
+ * We cannot kick excempted users that are akicked or not on the channel access list
+ * as that will start services <-> server wars which ends up as a DoS against services.
+ *
+ * UltimateIRCd 3.x at least informs channel staff when a joining user is matching an exempt.
+ */
+ if (is_excepted(ci, user) == 1) {
+ return 0;
+ }
+#endif
+
+ for (akick = ci->akick, i = 0; i < ci->akickcount; akick++, i++) {
+ if (!(akick->flags & AK_USED))
+ continue;
+ if ((akick->flags & AK_ISNICK && akick->u.nc == nc)
+ || (!(akick->flags & AK_ISNICK)
+ && match_usermask(akick->u.mask, user))) {
+ if (debug >= 2)
+ alog("debug: %s matched akick %s", user->nick,
+ (akick->flags & AK_ISNICK) ? akick->u.nc->
+ display : akick->u.mask);
+ if (akick->flags & AK_ISNICK)
+ get_idealban(ci, user, mask, sizeof(mask));
+ else
+ strcpy(mask, akick->u.mask);
+ reason = akick->reason ? akick->reason : CSAutokickReason;
+ goto kick;
+ }
+ }
+
+ if (check_access(user, ci, CA_NOJOIN)) {
+ get_idealban(ci, user, mask, sizeof(mask));
+ reason = getstring(user->na, CHAN_NOT_ALLOWED_TO_JOIN);
+ goto kick;
+ }
+
+ return 0;
+
+ kick:
+ if (debug)
+ alog("debug: channel: AutoKicking %s!%s@%s from %s", user->nick,
+ user->username, GetHost(user), chan);
+
+ /* Remember that the user has not been added to our channel user list
+ * yet, so we check whether the channel does not exist OR has no user
+ * on it (before SJOIN would have created the channel structure, while
+ * JOIN would not). */
+ /* Don't check for CI_INHABIT before for the Channel record cos else
+ * c may be NULL even if it exists */
+ if ((!(c = findchan(chan)) || c->usercount == 0)
+ && !(ci->flags & CI_INHABIT)) {
+#if defined(IRC_BAHAMUT)
+ send_cmd(s_ChanServ, "SJOIN %lu %s",
+ (c ? c->creation_time : time(NULL)), chan);
+#elif defined(IRC_HYBRID)
+ send_cmd(NULL, "SJOIN %ld %s + :@%s",
+ time(NULL), chan, s_ChanServ);
+#else
+ send_cmd(s_ChanServ, "JOIN %s", chan);
+#endif
+ t = add_timeout(CSInhabit, timeout_leave, 0);
+ t->data = sstrdup(chan);
+ ci->flags |= CI_INHABIT;
+ }
+
+ if (c) {
+ av[0] = chan;
+ av[1] = sstrdup("+b");
+ av[2] = mask;
+ do_cmode(whosends(ci), 3, av);
+ free(av[1]);
+ }
+
+ send_cmd(whosends(ci), "MODE %s +b %s %lu", chan, mask, time(NULL));
+ send_cmd(whosends(ci), "KICK %s %s :%s", chan, user->nick, reason);
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Record the current channel topic in the ChannelInfo structure. */
+
+void record_topic(const char *chan)
+{
+ Channel *c;
+ ChannelInfo *ci;
+
+ if (readonly)
+ return;
+ c = findchan(chan);
+ if (!c || !(ci = c->ci))
+ return;
+ if (ci->last_topic)
+ free(ci->last_topic);
+ if (c->topic)
+ ci->last_topic = sstrdup(c->topic);
+ else
+ ci->last_topic = NULL;
+ strscpy(ci->last_topic_setter, c->topic_setter, NICKMAX);
+ ci->last_topic_time = c->topic_time;
+}
+
+/*************************************************************************/
+
+/* Restore the topic in a channel when it's created, if we should. */
+
+void restore_topic(const char *chan)
+{
+ Channel *c = findchan(chan);
+ ChannelInfo *ci;
+
+ if (!c || !(ci = c->ci) || !(ci->flags & CI_KEEPTOPIC))
+ return;
+ if (c->topic)
+ free(c->topic);
+ if (ci->last_topic) {
+ c->topic = sstrdup(ci->last_topic);
+ strscpy(c->topic_setter, ci->last_topic_setter, NICKMAX);
+ c->topic_time = ci->last_topic_time;
+ } else {
+ c->topic = NULL;
+ strscpy(c->topic_setter, s_ChanServ, NICKMAX);
+ }
+#ifdef IRC_HYBRID
+ if (whosends(ci) == s_ChanServ) {
+ send_cmd(NULL, "SJOIN %ld %s + :%s", time(NULL), chan, s_ChanServ);
+ send_cmd(NULL, "MODE %s +o %s", chan, s_ChanServ);
+ }
+ send_cmd(whosends(ci), "TOPIC %s :%s", chan, c->topic ? c->topic : "");
+ if (whosends(ci) == s_ChanServ) {
+ send_cmd(s_ChanServ, "PART %s", chan);
+ }
+#else
+ send_cmd(whosends(ci), "TOPIC %s %s %lu :%s", c->name, c->topic_setter,
+ c->topic_time, c->topic ? c->topic : "");
+#endif
+}
+
+/*************************************************************************/
+
+/* See if the topic is locked on the given channel, and return 1 (and fix
+ * the topic) if so. */
+
+int check_topiclock(Channel * c, time_t topic_time)
+{
+ ChannelInfo *ci;
+
+ if (!(ci = c->ci) || !(ci->flags & CI_TOPICLOCK))
+ return 0;
+
+ if (c->topic)
+ free(c->topic);
+ if (ci->last_topic)
+ c->topic = sstrdup(ci->last_topic);
+ else
+ c->topic = NULL;
+
+ strscpy(c->topic_setter, ci->last_topic_setter, NICKMAX);
+#ifdef IRC_UNREAL
+ /* Because older timestamps are rejected */
+ c->topic_time = topic_time + 1;
+#else
+ c->topic_time = ci->last_topic_time;
+#endif
+
+#ifdef IRC_HYBRID
+ if (whosends(ci) == s_ChanServ) {
+ send_cmd(NULL, "SJOIN %ld %s + :%s", time(NULL), c->name,
+ s_ChanServ);
+ send_cmd(NULL, "MODE %s +o %s", c->name, s_ChanServ);
+ }
+ send_cmd(whosends(ci), "TOPIC %s :%s", c->name,
+ c->topic ? c->topic : "");
+ if (whosends(ci) == s_ChanServ) {
+ send_cmd(s_ChanServ, "PART %s", c->name);
+ }
+#else
+ send_cmd(whosends(ci), "TOPIC %s %s %lu :%s", c->name, c->topic_setter,
+ c->topic_time, c->topic ? c->topic : "");
+#endif
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Remove all channels which have expired. */
+
+void expire_chans()
+{
+ ChannelInfo *ci, *next;
+ int i;
+ time_t now = time(NULL);
+
+ if (!CSExpire)
+ return;
+
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = next) {
+ next = ci->next;
+ if (!ci->c && now - ci->last_used >= CSExpire
+ && !(ci->flags & (CI_VERBOTEN | CI_NO_EXPIRE))) {
+ alog("Expiring channel %s (founder: %s)", ci->name,
+ (ci->founder ? ci->founder->display : "(none)"));
+ delchan(ci);
+ }
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* Remove a (deleted or expired) nickname from all channel lists. */
+
+void cs_remove_nick(const NickCore * nc)
+{
+ int i, j;
+ ChannelInfo *ci, *next;
+ ChanAccess *ca;
+ AutoKick *akick;
+
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = next) {
+ next = ci->next;
+ if (ci->founder == nc) {
+ if (ci->successor) {
+ NickCore *nc2 = ci->successor;
+ if (!nick_is_services_admin(nc2) && nc2->channelmax > 0
+ && nc2->channelcount >= nc2->channelmax) {
+ alog("%s: Successor (%s) of %s owns too many channels, " "deleting channel", s_ChanServ, nc2->display, ci->name);
+ delchan(ci);
+ continue;
+ } else {
+ alog("%s: Transferring foundership of %s from deleted " "nick %s to successor %s", s_ChanServ, ci->name, nc->display, nc2->display);
+ ci->founder = nc2;
+ ci->successor = NULL;
+ nc2->channelcount++;
+#ifdef USE_RDB
+ if (rdb_open()) {
+ rdb_cs_set_founder(ci->name, nc2->display);
+ rdb_close();
+ }
+#endif
+ }
+ } else {
+ alog("%s: Deleting channel %s owned by deleted nick %s", s_ChanServ, ci->name, nc->display);
+#ifndef IRC_HYBRID
+ /* Maybe move this to delchan() ? */
+ if ((ci->c) && (ci->c->mode & CMODE_r)) {
+ ci->c->mode &= ~CMODE_r;
+ send_cmd(whosends(ci), "MODE %s -r", ci->name);
+ }
+#endif
+
+ delchan(ci);
+ continue;
+ }
+ }
+
+ if (ci->successor == nc)
+ ci->successor = NULL;
+
+ for (ca = ci->access, j = ci->accesscount; j > 0; ca++, j--) {
+ if (ca->in_use && ca->nc == nc) {
+ ca->in_use = 0;
+ ca->nc = NULL;
+ }
+ }
+
+ for (akick = ci->akick, j = ci->akickcount; j > 0;
+ akick++, j--) {
+ if ((akick->flags & AK_USED) && (akick->flags & AK_ISNICK)
+ && akick->u.nc == nc) {
+ if (akick->creator) {
+ free(akick->creator);
+ akick->creator = NULL;
+ }
+ if (akick->reason) {
+ free(akick->reason);
+ akick->reason = NULL;
+ }
+ akick->flags = 0;
+ akick->u.nc = NULL;
+ }
+ }
+ }
+ }
+#ifdef USE_RDB
+ if (rdb_open()) {
+ rdb_cs_deluser(nc->display);
+ rdb_close();
+ }
+#endif
+}
+
+/*************************************************************************/
+
+/* Removes any reference to a bot */
+
+void cs_remove_bot(const BotInfo * bi)
+{
+ int i;
+ ChannelInfo *ci;
+
+ for (i = 0; i < 256; i++)
+ for (ci = chanlists[i]; ci; ci = ci->next)
+ if (ci->bi == bi)
+ ci->bi = NULL;
+}
+
+/*************************************************************************/
+
+/* Return the ChannelInfo structure for the given channel, or NULL if the
+ * channel isn't registered. */
+
+ChannelInfo *cs_findchan(const char *chan)
+{
+ ChannelInfo *ci;
+
+ for (ci = chanlists[tolower(chan[1])]; ci; ci = ci->next) {
+ if (stricmp(ci->name, chan) == 0)
+ return ci;
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Return 1 if the user's access level on the given channel falls into the
+ * given category, 0 otherwise. Note that this may seem slightly confusing
+ * in some cases: for example, check_access(..., CA_NOJOIN) returns true if
+ * the user does _not_ have access to the channel (i.e. matches the NOJOIN
+ * criterion). */
+
+int check_access(User * user, ChannelInfo * ci, int what)
+{
+ int level = get_access(user, ci);
+ int limit = ci->levels[what];
+
+ /* Resetting the last used time */
+ if (level > 0)
+ ci->last_used = time(NULL);
+
+ if (level == ACCESS_FOUNDER)
+ return (what == CA_AUTODEOP || what == CA_NOJOIN) ? 0 : 1;
+ /* Hacks to make flags work */
+ if (what == CA_AUTODEOP && (ci->flags & CI_SECUREOPS) && level == 0)
+ return 1;
+ if (limit == ACCESS_INVALID)
+ return 0;
+ if (what == CA_AUTODEOP || what == CA_NOJOIN)
+ return level <= ci->levels[what];
+ else
+ return level >= ci->levels[what];
+}
+
+/*************************************************************************/
+/*********************** ChanServ private routines ***********************/
+/*************************************************************************/
+
+/* Insert a channel alphabetically into the database. */
+
+static void alpha_insert_chan(ChannelInfo * ci)
+{
+ ChannelInfo *ptr, *prev;
+ char *chan = ci->name;
+
+ for (prev = NULL, ptr = chanlists[tolower(chan[1])];
+ ptr != NULL && stricmp(ptr->name, chan) < 0;
+ prev = ptr, ptr = ptr->next);
+ ci->prev = prev;
+ ci->next = ptr;
+ if (!prev)
+ chanlists[tolower(chan[1])] = ci;
+ else
+ prev->next = ci;
+ if (ptr)
+ ptr->prev = ci;
+}
+
+/*************************************************************************/
+
+/* Add a channel to the database. Returns a pointer to the new ChannelInfo
+ * structure if the channel was successfully registered, NULL otherwise.
+ * Assumes channel does not already exist. */
+
+static ChannelInfo *makechan(const char *chan)
+{
+ int i;
+ ChannelInfo *ci;
+
+ ci = scalloc(sizeof(ChannelInfo), 1);
+ strscpy(ci->name, chan, CHANMAX);
+ ci->time_registered = time(NULL);
+ reset_levels(ci);
+ ci->ttb = scalloc(2 * TTB_SIZE, 1);
+ for (i = 0; i < TTB_SIZE; i++)
+ ci->ttb[i] = 0;
+ alpha_insert_chan(ci);
+ return ci;
+}
+
+/*************************************************************************/
+
+/* Remove a channel from the ChanServ database. Return 1 on success, 0
+ * otherwise. */
+
+static int delchan(ChannelInfo * ci)
+{
+ int i;
+ NickCore *nc = ci->founder;
+
+ if (ci->bi) {
+ ci->bi->chancount--;
+ }
+ if (ci->c) {
+ if (ci->bi && ci->c->usercount >= BSMinUsers) {
+ send_cmd(ci->bi->nick, "PART %s", ci->c->name);
+ }
+ ci->c->ci = NULL;
+ }
+#ifdef USE_RDB
+ if (rdb_open()) {
+ rdb_cs_delchan(ci);
+ rdb_close();
+ }
+#endif
+ if (ci->next)
+ ci->next->prev = ci->prev;
+ if (ci->prev)
+ ci->prev->next = ci->next;
+ else
+ chanlists[tolower(ci->name[1])] = ci->next;
+ if (ci->desc)
+ free(ci->desc);
+ if (ci->mlock_key)
+ free(ci->mlock_key);
+#ifdef HAS_FMODE
+ if (ci->mlock_flood)
+ free(ci->mlock_flood);
+#endif
+#ifdef HAS_LMODE
+ if (ci->mlock_redirect)
+ free(ci->mlock_redirect);
+#endif
+ if (ci->last_topic)
+ free(ci->last_topic);
+ if (ci->forbidby)
+ free(ci->forbidby);
+ if (ci->forbidreason)
+ free(ci->forbidreason);
+ if (ci->access)
+ free(ci->access);
+ for (i = 0; i < ci->akickcount; i++) {
+ if (!(ci->akick[i].flags & AK_ISNICK) && ci->akick[i].u.mask)
+ free(ci->akick[i].u.mask);
+ if (ci->akick[i].reason)
+ free(ci->akick[i].reason);
+ if (ci->akick[i].creator)
+ free(ci->akick[i].creator);
+ }
+ if (ci->akick)
+ free(ci->akick);
+ if (ci->levels)
+ free(ci->levels);
+ if (ci->memos.memos) {
+ for (i = 0; i < ci->memos.memocount; i++) {
+ if (ci->memos.memos[i].text)
+ free(ci->memos.memos[i].text);
+ }
+ free(ci->memos.memos);
+ }
+ if (ci->ttb)
+ free(ci->ttb);
+ for (i = 0; i < ci->bwcount; i++) {
+ if (ci->badwords[i].word)
+ free(ci->badwords[i].word);
+ }
+ if (ci->badwords)
+ free(ci->badwords);
+ free(ci);
+ if (nc)
+ nc->channelcount--;
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Reset channel access level values to their default state. */
+
+static void reset_levels(ChannelInfo * ci)
+{
+ int i;
+
+ if (ci->levels)
+ free(ci->levels);
+ ci->levels = scalloc(CA_SIZE * sizeof(*ci->levels), 1);
+ for (i = 0; def_levels[i][0] >= 0; i++)
+ ci->levels[def_levels[i][0]] = def_levels[i][1];
+}
+
+/*************************************************************************/
+
+/* Does the given user have founder access to the channel? */
+
+int is_founder(User * user, ChannelInfo * ci)
+{
+ if (user->isSuperAdmin) {
+ return 1;
+ }
+
+ if (user->na && user->na->nc == ci->founder) {
+ if ((nick_identified(user)
+ || (nick_recognized(user) && !(ci->flags & CI_SECURE))))
+ return 1;
+ }
+ if (is_identified(user, ci))
+ return 1;
+ return 0;
+}
+
+/*************************************************************************/
+
+static int is_real_founder(User * user, ChannelInfo * ci)
+{
+ if (user->isSuperAdmin) {
+ return 1;
+ }
+
+ if (user->na && user->na->nc == ci->founder) {
+ if ((nick_identified(user)
+ || (nick_recognized(user) && !(ci->flags & CI_SECURE))))
+ return 1;
+ }
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Has the given user password-identified as founder for the channel? */
+
+static int is_identified(User * user, ChannelInfo * ci)
+{
+ struct u_chaninfolist *c;
+
+ for (c = user->founder_chans; c; c = c->next) {
+ if (c->chan == ci)
+ return 1;
+ }
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Returns the ChanAccess entry for an user */
+
+ChanAccess *get_access_entry(NickCore * nc, ChannelInfo * ci)
+{
+ ChanAccess *access;
+ int i;
+
+ for (access = ci->access, i = 0; i < ci->accesscount; access++, i++)
+ if (access->in_use && access->nc == nc)
+ return access;
+
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Return the access level the given user has on the channel. If the
+ * channel doesn't exist, the user isn't on the access list, or the channel
+ * is CS_SECURE and the user hasn't IDENTIFY'd with NickServ, return 0. */
+
+int get_access(User * user, ChannelInfo * ci)
+{
+ ChanAccess *access;
+
+ if (!ci)
+ return 0;
+
+ if (is_founder(user, ci))
+ return ACCESS_FOUNDER;
+
+ if (!user->na)
+ return 0;
+
+ if (nick_identified(user)
+ || (nick_recognized(user) && !(ci->flags & CI_SECURE)))
+ if ((access = get_access_entry(user->na->nc, ci)))
+ return access->level;
+
+ return 0;
+}
+
+/*************************************************************************/
+
+void update_cs_lastseen(User * user, ChannelInfo * ci)
+{
+ ChanAccess *access;
+
+ if (!ci || !user->na)
+ return;
+
+ if (is_founder(user, ci) || nick_identified(user)
+ || (nick_recognized(user) && !(ci->flags & CI_SECURE)))
+ if ((access = get_access_entry(user->na->nc, ci)))
+ access->last_seen = time(NULL);
+}
+
+/*************************************************************************/
+
+/* Returns the best ban possible for an user depending of the bantype
+ value. */
+
+int get_idealban(ChannelInfo * ci, User * u, char *ret, int retlen)
+{
+ char *mask;
+
+ if (!ci || !u || !ret || retlen == 0)
+ return 0;
+
+ switch (ci->bantype) {
+ case 0:
+ snprintf(ret, retlen, "*!%s@%s", GetIdent(u), GetHost(u));
+ return 1;
+ case 1:
+ snprintf(ret, retlen, "*!%s%s@%s",
+ (strlen(GetIdent(u)) <
+ (*(GetIdent(u)) ==
+ '~' ? USERMAX + 1 : USERMAX) ? "*" : ""),
+ (*(GetIdent(u)) == '~' ? GetIdent(u) + 1 : GetIdent(u)),
+ GetHost(u));
+ return 1;
+ case 2:
+ snprintf(ret, retlen, "*!*@%s", GetHost(u));
+ return 1;
+ case 3:
+ mask = create_mask(u);
+ snprintf(ret, retlen, "*!%s", mask);
+ free(mask);
+ return 1;
+
+ default:
+ return 0;
+ }
+}
+
+/*************************************************************************/
+
+static void make_unidentified(User * u, ChannelInfo * ci)
+{
+ struct u_chaninfolist *uci;
+
+ if (!u || !ci)
+ return;
+
+ for (uci = u->founder_chans; uci; uci = uci->next) {
+ if (uci->chan == ci) {
+ if (uci->next)
+ uci->next->prev = uci->prev;
+ if (uci->prev)
+ uci->prev->next = uci->next;
+ else
+ u->founder_chans = uci->next;
+ free(uci);
+ break;
+ }
+ }
+}
+
+/*************************************************************************/
+
+#ifdef HAS_FMODE
+
+char *cs_get_flood(ChannelInfo * ci)
+{
+ return ci->mlock_flood;
+}
+
+#endif
+
+/*************************************************************************/
+
+char *cs_get_key(ChannelInfo * ci)
+{
+ return ci->mlock_key;
+}
+
+/*************************************************************************/
+
+char *cs_get_limit(ChannelInfo * ci)
+{
+ static char limit[16];
+
+ if (ci->mlock_limit == 0)
+ return NULL;
+
+ snprintf(limit, sizeof(limit), "%lu", ci->mlock_limit);
+ return limit;
+}
+
+/*************************************************************************/
+
+#ifdef HAS_LMODE
+
+char *cs_get_redirect(ChannelInfo * ci)
+{
+ return ci->mlock_redirect;
+}
+
+#endif
+
+/*************************************************************************/
+
+#ifdef HAS_FMODE
+
+void cs_set_flood(ChannelInfo * ci, char *value)
+{
+ char *dp, *end;
+
+ if (ci->mlock_flood)
+ free(ci->mlock_flood);
+
+ /* This looks ugly, but it works ;) */
+ if (value && *value != ':'
+ && (strtoul((*value == '*' ? value + 1 : value), &dp, 10) > 0)
+ && (*dp == ':') && (*(++dp) != 0) && (strtoul(dp, &end, 10) > 0)
+ && (*end == 0)) {
+ ci->mlock_flood = sstrdup(value);
+ } else {
+ ci->mlock_on &= ~CMODE_f;
+ ci->mlock_flood = NULL;
+ }
+}
+
+#endif
+
+/*************************************************************************/
+
+void cs_set_key(ChannelInfo * ci, char *value)
+{
+ if (ci->mlock_key)
+ free(ci->mlock_key);
+
+ /* Don't allow keys with a coma */
+ if (value && *value != ':' && !strchr(value, ',')) {
+ ci->mlock_key = sstrdup(value);
+ } else {
+ ci->mlock_on &= ~CMODE_k;
+ ci->mlock_key = NULL;
+ }
+}
+
+/*************************************************************************/
+
+void cs_set_limit(ChannelInfo * ci, char *value)
+{
+ ci->mlock_limit = value ? strtoul(value, NULL, 10) : 0;
+
+ if (ci->mlock_limit <= 0)
+ ci->mlock_on &= ~CMODE_l;
+}
+
+/*************************************************************************/
+
+#ifdef HAS_LMODE
+
+void cs_set_redirect(ChannelInfo * ci, char *value)
+{
+ if (ci->mlock_redirect)
+ free(ci->mlock_redirect);
+
+ /* Don't allow keys with a coma */
+ if (value && *value == '#') {
+ ci->mlock_redirect = sstrdup(value);
+ } else {
+ ci->mlock_on &= ~CMODE_L;
+ ci->mlock_redirect = NULL;
+ }
+}
+
+#endif
+
+int get_access_level(ChannelInfo * ci, NickAlias * na)
+{
+ ChanAccess *access;
+ int num;
+
+ if (na->nc == ci->founder) {
+ return ACCESS_FOUNDER;
+ }
+
+ for (num = 0; num < ci->accesscount; num++) {
+
+ access = &ci->access[num];
+
+ if (!access->in_use)
+ return 0;
+
+ if (access->nc == na->nc) {
+ return access->level;
+ }
+
+ }
+
+ return 0;
+
+}
+
+char *get_xop_level(int level)
+{
+
+ if (level < ACCESS_VOP) {
+ return "Err";
+#ifdef HAS_HALFOP
+ } else if (level < ACCESS_HOP) {
+ return "VOP";
+ } else if (level < ACCESS_AOP) {
+ return "HOP";
+#else
+ } else if (level < ACCESS_AOP) {
+ return "VOP";
+#endif
+ } else if (level < ACCESS_SOP) {
+ return "AOP";
+ } else if (level < ACCESS_FOUNDER) {
+ return "SOP";
+ } else {
+ return "Founder";
+ }
+
+}
+
+/*************************************************************************/
+/*********************** ChanServ command routines ***********************/
+/*************************************************************************/
+
+static int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_ChanServ, u, CHAN_HELP);
+#ifdef IRC_UNREAL
+ notice_help(s_ChanServ, u, CHAN_HELP_UNREAL);
+#endif
+#ifdef IRC_VIAGRA
+ notice_help(s_ChanServ, u, CHAN_HELP_UNREAL);
+#endif
+#ifdef IRC_ULTIMATE
+ notice_help(s_ChanServ, u, CHAN_HELP_ULTIMATE);
+#endif
+#ifdef IRC_ULTIMATE3
+ notice_help(s_ChanServ, u, CHAN_HELP_ULTIMATE3);
+#endif
+ if (CSExpire >= 86400)
+ notice_help(s_ChanServ, u, CHAN_HELP_EXPIRES,
+ CSExpire / 86400);
+ if (is_services_oper(u))
+ notice_help(s_ChanServ, u, CHAN_SERVADMIN_HELP);
+ moduleDisplayHelp(2, u);
+ } else if (stricmp(cmd, "LEVELS DESC") == 0) {
+ int i;
+ notice_help(s_ChanServ, u, CHAN_HELP_LEVELS_DESC);
+ if (!levelinfo_maxwidth) {
+ for (i = 0; levelinfo[i].what >= 0; i++) {
+ int len = strlen(levelinfo[i].name);
+ if (len > levelinfo_maxwidth)
+ levelinfo_maxwidth = len;
+ }
+ }
+ for (i = 0; levelinfo[i].what >= 0; i++) {
+ notice_help(s_ChanServ, u, CHAN_HELP_LEVELS_DESC_FORMAT,
+ levelinfo_maxwidth, levelinfo[i].name,
+ getstring(u->na, levelinfo[i].desc));
+ }
+ } else {
+ mod_help_cmd(s_ChanServ, u, CHANSERV, cmd);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_register(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *pass = strtok(NULL, " ");
+ char *desc = strtok(NULL, "");
+ NickCore *nc;
+ Channel *c;
+ ChannelInfo *ci;
+ struct u_chaninfolist *uc;
+ int is_servadmin = is_services_admin(u);
+#ifdef USE_ENCRYPTION
+ char founderpass[PASSMAX + 1];
+#endif
+
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_REGISTER_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) {
+ notice_lang(s_ChanServ, u, OPER_DEFCON_DENIED);
+ return MOD_CONT;
+ }
+
+ if (!desc) {
+ syntax_error(s_ChanServ, u, "REGISTER", CHAN_REGISTER_SYNTAX);
+ } else if (*chan == '&') {
+ notice_lang(s_ChanServ, u, CHAN_REGISTER_NOT_LOCAL);
+ } else if (!u->na || !(nc = u->na->nc)) {
+ notice_lang(s_ChanServ, u, CHAN_MUST_REGISTER_NICK, s_NickServ);
+ } else if (!nick_recognized(u)) {
+ notice_lang(s_ChanServ, u, CHAN_MUST_IDENTIFY_NICK, s_NickServ,
+ s_NickServ);
+ } else if ((ci = cs_findchan(chan)) != NULL) {
+ if (ci->flags & CI_VERBOTEN) {
+ alog("%s: Attempt to register FORBIDden channel %s by %s!%s@%s", s_ChanServ, ci->name, u->nick, u->username, GetHost(u));
+ notice_lang(s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_ALREADY_REGISTERED, chan);
+ }
+ } else if (!stricmp(chan, "#")) {
+ notice_lang(s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan);
+ } else if (!(c = findchan(chan))
+ || !chan_has_user_status(c, u, CUS_OP)) {
+ notice_lang(s_ChanServ, u, CHAN_MUST_BE_CHANOP);
+
+ } else if (!is_servadmin && nc->channelmax > 0
+ && nc->channelcount >= nc->channelmax) {
+ notice_lang(s_ChanServ, u,
+ nc->channelcount >
+ nc->
+ channelmax ? CHAN_EXCEEDED_CHANNEL_LIMIT :
+ CHAN_REACHED_CHANNEL_LIMIT, nc->channelmax);
+
+ } else if (!(ci = makechan(chan))) {
+ alog("%s: makechan() failed for REGISTER %s", s_ChanServ, chan);
+ notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED);
+
+#ifdef USE_ENCRYPTION
+ } else if (strscpy(founderpass, pass, PASSMAX + 1),
+ encrypt_in_place(founderpass, PASSMAX) < 0) {
+ alog("%s: Couldn't encrypt password for %s (REGISTER)",
+ s_ChanServ, chan);
+ notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED);
+ delchan(ci);
+#endif
+
+ } else {
+ c->ci = ci;
+ ci->c = c;
+ ci->bantype = CSDefBantype;
+ ci->flags = CSDefFlags;
+#ifdef IRC_HYBRID
+ ci->mlock_on = CMODE_n | CMODE_t;
+#else
+ ci->mlock_on = CMODE_n | CMODE_t | CMODE_r;
+#endif
+ ci->memos.memomax = MSMaxMemos;
+ ci->last_used = ci->time_registered;
+ ci->founder = nc;
+#ifdef USE_ENCRYPTION
+ if (strlen(pass) > PASSMAX)
+ notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX);
+ memset(pass, 0, strlen(pass));
+ memcpy(ci->founderpass, founderpass, PASSMAX);
+ ci->flags |= CI_ENCRYPTEDPW;
+#else
+ if (strlen(pass) > PASSMAX - 1) /* -1 for null byte */
+ notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX - 1);
+ strscpy(ci->founderpass, pass, PASSMAX);
+#endif
+ ci->desc = sstrdup(desc);
+ if (c->topic) {
+ ci->last_topic = sstrdup(c->topic);
+ strscpy(ci->last_topic_setter, c->topic_setter, NICKMAX);
+ ci->last_topic_time = c->topic_time;
+ }
+ ci->bi = NULL;
+ ci->botflags = BSDefFlags;
+ ci->founder->channelcount++;
+ alog("%s: Channel '%s' registered by %s!%s@%s", s_ChanServ, chan,
+ u->nick, u->username, GetHost(u));
+ notice_lang(s_ChanServ, u, CHAN_REGISTERED, chan, u->nick);
+#ifndef USE_ENCRYPTION
+ notice_lang(s_ChanServ, u, CHAN_PASSWORD_IS, ci->founderpass);
+#endif
+ uc = scalloc(sizeof(*uc), 1);
+ uc->next = u->founder_chans;
+ uc->prev = NULL;
+ if (u->founder_chans)
+ u->founder_chans->prev = uc;
+ u->founder_chans = uc;
+ uc->chan = ci;
+ /* Implement new mode lock */
+ check_modes(c);
+#ifdef IRC_ULTIMATE3
+ send_cmd(s_ChanServ, "MODE %s +a %s", chan, u->nick);
+#endif
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_identify(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *pass = strtok(NULL, " ");
+ ChannelInfo *ci;
+ struct u_chaninfolist *uc;
+
+ if (!pass) {
+ syntax_error(s_ChanServ, u, "IDENTIFY", CHAN_IDENTIFY_SYNTAX);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!nick_identified(u)) {
+ notice_lang(s_ChanServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ } else if (is_founder(u, ci)) {
+ notice_lang(s_ChanServ, u, NICK_ALREADY_IDENTIFIED);
+ } else {
+ int res;
+
+ if ((res = check_password(pass, ci->founderpass)) == 1) {
+ if (!is_identified(u, ci)) {
+ uc = scalloc(sizeof(*uc), 1);
+ uc->next = u->founder_chans;
+ if (u->founder_chans)
+ u->founder_chans->prev = uc;
+ u->founder_chans = uc;
+ uc->chan = ci;
+ alog("%s: %s!%s@%s identified for %s", s_ChanServ, u->nick,
+ u->username, GetHost(u), ci->name);
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_IDENTIFY_SUCCEEDED, chan);
+ } else if (res < 0) {
+ alog("%s: check_password failed for %s", s_ChanServ, ci->name);
+ notice_lang(s_ChanServ, u, CHAN_IDENTIFY_FAILED);
+ } else {
+ alog("%s: Failed IDENTIFY for %s by %s!%s@%s",
+ s_ChanServ, ci->name, u->nick, u->username, GetHost(u));
+ notice_lang(s_ChanServ, u, PASSWORD_INCORRECT);
+ bad_password(u);
+ }
+
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_logout(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+ ChannelInfo *ci;
+ User *u2 = NULL;
+ int is_servadmin = is_services_admin(u);
+
+ if (!chan || (!nick && !is_servadmin)) {
+ syntax_error(s_ChanServ, u, "LOGOUT",
+ (!is_servadmin ? CHAN_LOGOUT_SYNTAX :
+ CHAN_LOGOUT_SERVADMIN_SYNTAX));
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (!is_servadmin & (ci->flags & CI_VERBOTEN)) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (nick && !(u2 = finduser(nick))) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, nick);
+ } else if (!is_servadmin && u2 != u && !is_real_founder(u, ci)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else {
+ if (u2) {
+ make_unidentified(u2, ci);
+ notice_lang(s_ChanServ, u, CHAN_LOGOUT_SUCCEEDED, nick, chan);
+ } else {
+ int i;
+ for (i = 0; i < 1024; i++)
+ for (u2 = userlist[i]; u2; u2 = u2->next)
+ make_unidentified(u2, ci);
+ notice_lang(s_ChanServ, u, CHAN_LOGOUT_ALL_SUCCEEDED, chan);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_drop(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ ChannelInfo *ci;
+ int is_servadmin = is_services_admin(u);
+
+ if (readonly && !is_servadmin) {
+ notice_lang(s_ChanServ, u, CHAN_DROP_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "DROP", CHAN_DROP_SYNTAX);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (!is_servadmin && (ci->flags & CI_VERBOTEN)) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!is_servadmin && (ci->flags & CI_SUSPENDED)) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!is_servadmin
+ && (ci->
+ flags & CI_SECUREFOUNDER ? !is_real_founder(u,
+ ci) :
+ !is_founder(u, ci))) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else {
+ int level = get_access(u, ci);
+
+ if (readonly) /* in this case we know they're a Services admin */
+ notice_lang(s_ChanServ, u, READ_ONLY_MODE);
+#ifndef IRC_HYBRID
+ if (ci->c) {
+ ci->c->mode &= ~CMODE_r;
+ send_cmd(whosends(ci), "MODE %s -r", ci->name);
+ }
+#endif
+ alog("%s: Channel %s dropped by %s!%s@%s (founder: %s)",
+ s_ChanServ, ci->name, u->nick, u->username, GetHost(u),
+ (ci->founder ? ci->founder->display : "(none)"));
+
+ delchan(ci);
+
+ /* We must make sure that the Services admin has not normally the right to
+ * drop the channel before issuing the wallops.
+ */
+ if (WallDrop && is_servadmin && level < ACCESS_FOUNDER)
+ wallops(s_ChanServ, "\2%s\2 used DROP on channel \2%s\2",
+ u->nick, chan);
+
+ notice_lang(s_ChanServ, u, CHAN_DROPPED, chan);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Main SET routine. Calls other routines as follows:
+ * do_set_command(User *command_sender, ChannelInfo *ci, char *param);
+ * The parameter passed is the first space-delimited parameter after the
+ * option name, except in the case of DESC, TOPIC, and ENTRYMSG, in which
+ * it is the entire remainder of the line. Additional parameters beyond
+ * the first passed in the function call can be retrieved using
+ * strtok(NULL, toks).
+ */
+static int do_set(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *cmd = strtok(NULL, " ");
+ char *param;
+ ChannelInfo *ci;
+ int is_servadmin = is_services_admin(u);
+
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_SET_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (cmd) {
+ if (stricmp(cmd, "DESC") == 0 || stricmp(cmd, "ENTRYMSG") == 0)
+ param = strtok(NULL, "");
+ else
+ param = strtok(NULL, " ");
+ } else {
+ param = NULL;
+ }
+
+ if (!param && (!cmd || (stricmp(cmd, "SUCCESSOR") != 0 &&
+ stricmp(cmd, "URL") != 0 &&
+ stricmp(cmd, "EMAIL") != 0 &&
+ stricmp(cmd, "ENTRYMSG") != 0))) {
+ syntax_error(s_ChanServ, u, "SET", CHAN_SET_SYNTAX);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!is_servadmin && !check_access(u, ci, CA_SET)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else if (stricmp(cmd, "FOUNDER") == 0) {
+ if (!is_servadmin
+ && (ci->
+ flags & CI_SECUREFOUNDER ? !is_real_founder(u,
+ ci) :
+ !is_founder(u, ci))) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else {
+ do_set_founder(u, ci, param);
+ }
+ } else if (stricmp(cmd, "SUCCESSOR") == 0) {
+ if (!is_servadmin
+ && (ci->
+ flags & CI_SECUREFOUNDER ? !is_real_founder(u,
+ ci) :
+ !is_founder(u, ci))) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else {
+ do_set_successor(u, ci, param);
+ }
+ } else if (stricmp(cmd, "PASSWORD") == 0) {
+ if (!is_servadmin
+ && (ci->
+ flags & CI_SECUREFOUNDER ? !is_real_founder(u,
+ ci) :
+ !is_founder(u, ci))) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else {
+ do_set_password(u, ci, param);
+ }
+ } else if (stricmp(cmd, "DESC") == 0) {
+ do_set_desc(u, ci, param);
+ } else if (stricmp(cmd, "URL") == 0) {
+ do_set_url(u, ci, param);
+ } else if (stricmp(cmd, "EMAIL") == 0) {
+ do_set_email(u, ci, param);
+ } else if (stricmp(cmd, "ENTRYMSG") == 0) {
+ do_set_entrymsg(u, ci, param);
+ } else if (stricmp(cmd, "TOPIC") == 0) {
+ notice_lang(s_ChanServ, u, OBSOLETE_COMMAND, "TOPIC");
+ } else if (stricmp(cmd, "BANTYPE") == 0) {
+ do_set_bantype(u, ci, param);
+ } else if (stricmp(cmd, "MLOCK") == 0) {
+ do_set_mlock(u, ci, param);
+ } else if (stricmp(cmd, "KEEPTOPIC") == 0) {
+ do_set_keeptopic(u, ci, param);
+ } else if (stricmp(cmd, "TOPICLOCK") == 0) {
+ do_set_topiclock(u, ci, param);
+ } else if (stricmp(cmd, "PRIVATE") == 0) {
+ do_set_private(u, ci, param);
+ } else if (stricmp(cmd, "SECUREOPS") == 0) {
+ do_set_secureops(u, ci, param);
+ } else if (stricmp(cmd, "SECUREFOUNDER") == 0) {
+ if (!is_servadmin
+ && (ci->
+ flags & CI_SECUREFOUNDER ? !is_real_founder(u,
+ ci) :
+ !is_founder(u, ci))) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else {
+ do_set_securefounder(u, ci, param);
+ }
+ } else if (stricmp(cmd, "RESTRICTED") == 0) {
+ do_set_restricted(u, ci, param);
+ } else if (stricmp(cmd, "SECURE") == 0) {
+ do_set_secure(u, ci, param);
+ } else if (stricmp(cmd, "SIGNKICK") == 0) {
+ do_set_signkick(u, ci, param);
+ } else if (stricmp(cmd, "OPNOTICE") == 0) {
+ do_set_opnotice(u, ci, param);
+ } else if (stricmp(cmd, "XOP") == 0) {
+ do_set_xop(u, ci, param);
+ } else if (stricmp(cmd, "PEACE") == 0) {
+ do_set_peace(u, ci, param);
+ } else if (stricmp(cmd, "NOEXPIRE") == 0) {
+ do_set_noexpire(u, ci, param);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_SET_UNKNOWN_OPTION, cmd);
+ notice_lang(s_ChanServ, u, MORE_INFO, s_ChanServ, "SET");
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_founder(User * u, ChannelInfo * ci, char *param)
+{
+ NickAlias *na = findnick(param);
+ NickCore *nc, *nc0 = ci->founder;
+
+ if (!na) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_REGISTERED, param);
+ return MOD_CONT;
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, param);
+ return MOD_CONT;
+ }
+
+ nc = na->nc;
+ if (nc->channelmax > 0 && nc->channelcount >= nc->channelmax
+ && !is_services_admin(u)) {
+ notice_lang(s_ChanServ, u, CHAN_SET_FOUNDER_TOO_MANY_CHANS, param);
+ return MOD_CONT;
+ }
+
+ alog("%s: Changing founder of %s from %s to %s by %s!%s@%s",
+ s_ChanServ, ci->name, ci->founder->display, nc->display, u->nick,
+ u->username, GetHost(u));
+
+ /* Founder and successor must not be the same group */
+ if (nc == ci->successor)
+ ci->successor = NULL;
+
+ nc0->channelcount--;
+ ci->founder = nc;
+ nc->channelcount++;
+
+ notice_lang(s_ChanServ, u, CHAN_FOUNDER_CHANGED, ci->name, param);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_successor(User * u, ChannelInfo * ci, char *param)
+{
+ NickAlias *na;
+ NickCore *nc;
+
+ if (param) {
+ na = findnick(param);
+
+ if (!na) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_REGISTERED, param);
+ return MOD_CONT;
+ }
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, param);
+ return MOD_CONT;
+ }
+ if (na->nc == ci->founder) {
+ notice_lang(s_ChanServ, u, CHAN_SUCCESSOR_IS_FOUNDER, param,
+ ci->name);
+ return MOD_CONT;
+ }
+ nc = na->nc;
+
+ } else {
+ nc = NULL;
+ }
+
+ alog("%s: Changing successor of %s from %s to %s by %s!%s@%s",
+ s_ChanServ, ci->name,
+ (ci->successor ? ci->successor->display : "none"),
+ (nc ? nc->display : "none"), u->nick, u->username, GetHost(u));
+
+ ci->successor = nc;
+
+ if (nc)
+ notice_lang(s_ChanServ, u, CHAN_SUCCESSOR_CHANGED, ci->name,
+ param);
+ else
+ notice_lang(s_ChanServ, u, CHAN_SUCCESSOR_UNSET, ci->name);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_password(User * u, ChannelInfo * ci, char *param)
+{
+#ifdef USE_ENCRYPTION
+ int len = strlen(param);
+
+ if (len > PASSMAX) {
+ len = PASSMAX;
+ param[len] = 0;
+ notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX);
+ }
+
+ if (encrypt(param, len, ci->founderpass, PASSMAX) < 0) {
+ memset(param, 0, strlen(param));
+ alog("%s: Failed to encrypt password for %s (set)", s_ChanServ,
+ ci->name);
+ notice_lang(s_ChanServ, u, CHAN_SET_PASSWORD_FAILED);
+ return MOD_CONT;
+ }
+
+ memset(param, 0, strlen(param));
+ notice_lang(s_ChanServ, u, CHAN_PASSWORD_CHANGED, ci->name);
+
+#else /* !USE_ENCRYPTION */
+ if (strlen(param) > PASSMAX - 1) /* -1 for null byte */
+ notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX - 1);
+ strscpy(ci->founderpass, param, PASSMAX);
+ notice_lang(s_ChanServ, u, CHAN_PASSWORD_CHANGED_TO, ci->name,
+ ci->founderpass);
+#endif /* USE_ENCRYPTION */
+
+ if (get_access(u, ci) < ACCESS_FOUNDER) {
+ alog("%s: %s!%s@%s set password as Services admin for %s",
+ s_ChanServ, u->nick, u->username, GetHost(u), ci->name);
+ if (WallSetpass)
+ wallops(s_ChanServ,
+ "\2%s\2 set password as Services admin for channel \2%s\2",
+ u->nick, ci->name);
+ } else {
+ alog("%s: %s!%s@%s changed password of %s (founder: %s)",
+ s_ChanServ, u->nick, u->username, GetHost(u),
+ ci->name, ci->founder->display);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_desc(User * u, ChannelInfo * ci, char *param)
+{
+ if (ci->desc)
+ free(ci->desc);
+ ci->desc = sstrdup(param);
+ notice_lang(s_ChanServ, u, CHAN_DESC_CHANGED, ci->name, param);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_url(User * u, ChannelInfo * ci, char *param)
+{
+ if (ci->url)
+ free(ci->url);
+ if (param) {
+ ci->url = sstrdup(param);
+ notice_lang(s_ChanServ, u, CHAN_URL_CHANGED, ci->name, param);
+ } else {
+ ci->url = NULL;
+ notice_lang(s_ChanServ, u, CHAN_URL_UNSET, ci->name);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_email(User * u, ChannelInfo * ci, char *param)
+{
+ if (ci->email)
+ free(ci->email);
+ if (param) {
+ ci->email = sstrdup(param);
+ notice_lang(s_ChanServ, u, CHAN_EMAIL_CHANGED, ci->name, param);
+ } else {
+ ci->email = NULL;
+ notice_lang(s_ChanServ, u, CHAN_EMAIL_UNSET, ci->name);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_entrymsg(User * u, ChannelInfo * ci, char *param)
+{
+ if (ci->entry_message)
+ free(ci->entry_message);
+ if (param) {
+ ci->entry_message = sstrdup(param);
+ notice_lang(s_ChanServ, u, CHAN_ENTRY_MSG_CHANGED, ci->name,
+ param);
+ } else {
+ ci->entry_message = NULL;
+ notice_lang(s_ChanServ, u, CHAN_ENTRY_MSG_UNSET, ci->name);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_mlock(User * u, ChannelInfo * ci, char *param)
+{
+ int add = -1; /* 1 if adding, 0 if deleting, -1 if neither */
+ unsigned char mode;
+ CBMode *cbm;
+
+ if (checkDefCon(DEFCON_NO_MLOCK_CHANGE)) {
+ notice_lang(s_ChanServ, u, OPER_DEFCON_DENIED);
+ return MOD_CONT;
+ }
+
+ /* Reinitialize everything */
+#ifdef IRC_HYBRID
+ ci->mlock_on = 0;
+#else
+ ci->mlock_on = CMODE_r;
+#endif
+ ci->mlock_off = ci->mlock_limit = 0;
+ ci->mlock_key = NULL;
+#ifdef HAS_FMODE
+ ci->mlock_flood = NULL;
+#endif
+#ifdef HAS_LMODE
+ ci->mlock_redirect = NULL;
+#endif
+
+ while ((mode = *param++)) {
+ switch (mode) {
+ case '+':
+ add = 1;
+ continue;
+ case '-':
+ add = 0;
+ continue;
+ default:
+ if (add < 0)
+ continue;
+ }
+
+ if ((int) mode < 128 && (cbm = &cbmodes[(int) mode])->flag != 0) {
+ if ((cbm->flags & CBM_NO_MLOCK)
+ || ((cbm->flags & CBM_NO_USER_MLOCK) && !is_oper(u))) {
+ notice_lang(s_ChanServ, u, CHAN_SET_MLOCK_IMPOSSIBLE_CHAR,
+ mode);
+ } else if (add) {
+ ci->mlock_on |= cbm->flag;
+ ci->mlock_off &= ~cbm->flag;
+ if (cbm->cssetvalue)
+ cbm->cssetvalue(ci, strtok(NULL, " "));
+ } else {
+ ci->mlock_off |= cbm->flag;
+ if (ci->mlock_on & cbm->flag) {
+ ci->mlock_on &= ~cbm->flag;
+ if (cbm->cssetvalue)
+ cbm->cssetvalue(ci, NULL);
+ }
+ }
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_SET_MLOCK_UNKNOWN_CHAR, mode);
+ }
+ } /* while (*param) */
+
+#ifdef HAS_LMODE
+ /* We can't mlock +L if +l is not mlocked as well. */
+ if ((ci->mlock_on & CMODE_L) && !(ci->mlock_on & CMODE_l)) {
+ ci->mlock_on &= ~CMODE_L;
+ free(ci->mlock_redirect);
+ notice_lang(s_ChanServ, u, CHAN_SET_MLOCK_L_REQUIRED);
+ }
+#endif
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3)
+ /* We can't mlock +K if +i is not mlocked as well. */
+ if ((ci->mlock_on & CMODE_K) && !(ci->mlock_on & CMODE_i)) {
+ ci->mlock_on &= ~CMODE_K;
+ notice_lang(s_ChanServ, u, CHAN_SET_MLOCK_K_REQUIRED);
+ }
+#endif
+
+ /* Since we always enforce mode r there is no way to have no
+ * mode lock at all.
+ */
+#if defined(IRC_HYBRID)
+ /* James: Hybrid doesn't HAVE mode r, so now you have to check :P */
+ if (get_mlock_modes(ci, 0))
+#endif
+ notice_lang(s_ChanServ, u, CHAN_MLOCK_CHANGED, ci->name,
+ get_mlock_modes(ci, 0));
+
+
+ /* Implement the new lock. */
+ if (ci->c)
+ check_modes(ci->c);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_bantype(User * u, ChannelInfo * ci, char *param)
+{
+ char *endptr;
+
+ int16 bantype = strtol(param, &endptr, 10);
+
+ if (*endptr != 0 || bantype < 0 || bantype > 3) {
+ notice_lang(s_ChanServ, u, CHAN_SET_BANTYPE_INVALID, param);
+ } else {
+ ci->bantype = bantype;
+ notice_lang(s_ChanServ, u, CHAN_SET_BANTYPE_CHANGED, ci->name,
+ ci->bantype);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_keeptopic(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_KEEPTOPIC;
+ notice_lang(s_ChanServ, u, CHAN_SET_KEEPTOPIC_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_KEEPTOPIC;
+ notice_lang(s_ChanServ, u, CHAN_SET_KEEPTOPIC_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET KEEPTOPIC",
+ CHAN_SET_KEEPTOPIC_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_topiclock(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_TOPICLOCK;
+ notice_lang(s_ChanServ, u, CHAN_SET_TOPICLOCK_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_TOPICLOCK;
+ notice_lang(s_ChanServ, u, CHAN_SET_TOPICLOCK_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET TOPICLOCK",
+ CHAN_SET_TOPICLOCK_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_private(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_PRIVATE;
+ notice_lang(s_ChanServ, u, CHAN_SET_PRIVATE_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_PRIVATE;
+ notice_lang(s_ChanServ, u, CHAN_SET_PRIVATE_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET PRIVATE",
+ CHAN_SET_PRIVATE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_secureops(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_SECUREOPS;
+ notice_lang(s_ChanServ, u, CHAN_SET_SECUREOPS_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_SECUREOPS;
+ notice_lang(s_ChanServ, u, CHAN_SET_SECUREOPS_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET SECUREOPS",
+ CHAN_SET_SECUREOPS_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_securefounder(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_SECUREFOUNDER;
+ notice_lang(s_ChanServ, u, CHAN_SET_SECUREFOUNDER_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_SECUREFOUNDER;
+ notice_lang(s_ChanServ, u, CHAN_SET_SECUREFOUNDER_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET SECUREFOUNDER",
+ CHAN_SET_SECUREFOUNDER_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_restricted(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_RESTRICTED;
+ if (ci->levels[CA_NOJOIN] < 0)
+ ci->levels[CA_NOJOIN] = 0;
+ notice_lang(s_ChanServ, u, CHAN_SET_RESTRICTED_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_RESTRICTED;
+ if (ci->levels[CA_NOJOIN] >= 0)
+ ci->levels[CA_NOJOIN] = -2;
+ notice_lang(s_ChanServ, u, CHAN_SET_RESTRICTED_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET RESTRICTED",
+ CHAN_SET_RESTRICTED_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_secure(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_SECURE;
+ notice_lang(s_ChanServ, u, CHAN_SET_SECURE_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_SECURE;
+ notice_lang(s_ChanServ, u, CHAN_SET_SECURE_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET SECURE", CHAN_SET_SECURE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_signkick(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_SIGNKICK;
+ ci->flags &= ~CI_SIGNKICK_LEVEL;
+ notice_lang(s_ChanServ, u, CHAN_SET_SIGNKICK_ON);
+ } else if (stricmp(param, "LEVEL") == 0) {
+ ci->flags |= CI_SIGNKICK_LEVEL;
+ ci->flags &= ~CI_SIGNKICK;
+ notice_lang(s_ChanServ, u, CHAN_SET_SIGNKICK_LEVEL);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~(CI_SIGNKICK | CI_SIGNKICK_LEVEL);
+ notice_lang(s_ChanServ, u, CHAN_SET_SIGNKICK_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET SIGNKICK",
+ CHAN_SET_SIGNKICK_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_opnotice(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_OPNOTICE;
+ notice_lang(s_ChanServ, u, CHAN_SET_OPNOTICE_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_OPNOTICE;
+ notice_lang(s_ChanServ, u, CHAN_SET_OPNOTICE_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET OPNOTICE",
+ CHAN_SET_OPNOTICE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+#define CHECKLEV(lev) ((ci->levels[(lev)] != ACCESS_INVALID) && (access->level >= ci->levels[(lev)]))
+
+static int do_set_xop(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ if (!(ci->flags & CI_XOP)) {
+ int i;
+ ChanAccess *access;
+
+ for (access = ci->access, i = 0; i < ci->accesscount;
+ access++, i++) {
+ if (!access->in_use)
+ continue;
+ /* This will probably cause wrong levels to be set, but hey,
+ * it's better than losing it altogether.
+ */
+ if (CHECKLEV(CA_AKICK) || CHECKLEV(CA_SET)) {
+ access->level = ACCESS_SOP;
+ } else if (CHECKLEV(CA_AUTOOP) || CHECKLEV(CA_OPDEOP)
+ || CHECKLEV(CA_OPDEOPME)) {
+ access->level = ACCESS_AOP;
+#ifdef HAS_HALFOP
+ } else if (CHECKLEV(CA_AUTOHALFOP) || CHECKLEV(CA_HALFOP)
+ || CHECKLEV(CA_HALFOPME)) {
+ access->level = ACCESS_HOP;
+#endif
+ } else if (CHECKLEV(CA_AUTOVOICE) || CHECKLEV(CA_VOICE)
+ || CHECKLEV(CA_VOICEME)) {
+ access->level = ACCESS_VOP;
+ } else {
+ access->in_use = 0;
+ access->nc = NULL;
+ }
+ }
+
+ reset_levels(ci);
+ ci->flags |= CI_XOP;
+ }
+
+ alog("%s: %s!%s@%s enabled XOP for %s", s_ChanServ, u->nick,
+ u->username, GetHost(u), ci->name);
+ notice_lang(s_ChanServ, u, CHAN_SET_XOP_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_XOP;
+
+ alog("%s: %s!%s@%s disabled XOP for %s", s_ChanServ, u->nick,
+ u->username, GetHost(u), ci->name);
+ notice_lang(s_ChanServ, u, CHAN_SET_XOP_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET XOP", CHAN_SET_XOP_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+#undef CHECKLEV
+
+/*************************************************************************/
+
+static int do_set_peace(User * u, ChannelInfo * ci, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_PEACE;
+ notice_lang(s_ChanServ, u, CHAN_SET_PEACE_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_PEACE;
+ notice_lang(s_ChanServ, u, CHAN_SET_PEACE_OFF);
+ } else {
+ syntax_error(s_ChanServ, u, "SET PEACE", CHAN_SET_PEACE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_noexpire(User * u, ChannelInfo * ci, char *param)
+{
+ if (!is_services_admin(u)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+ if (stricmp(param, "ON") == 0) {
+ ci->flags |= CI_NO_EXPIRE;
+ notice_lang(s_ChanServ, u, CHAN_SET_NOEXPIRE_ON, ci->name);
+ } else if (stricmp(param, "OFF") == 0) {
+ ci->flags &= ~CI_NO_EXPIRE;
+ notice_lang(s_ChanServ, u, CHAN_SET_NOEXPIRE_OFF, ci->name);
+ } else {
+ syntax_error(s_ChanServ, u, "SET NOEXPIRE",
+ CHAN_SET_NOEXPIRE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* `last' is set to the last index this routine was called with
+ * `perm' is incremented whenever a permission-denied error occurs
+ */
+
+static int xop_del(User * u, ChanAccess * access, int *perm, int uacc,
+ int xlev)
+{
+ if (!access->in_use || access->level != xlev)
+ return 0;
+ if (!is_services_admin(u) && uacc <= access->level) {
+ (*perm)++;
+ return 0;
+ }
+ access->nc = NULL;
+ access->in_use = 0;
+ return 1;
+}
+
+static int xop_del_callback(User * u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *last = va_arg(args, int *);
+ int *perm = va_arg(args, int *);
+ int uacc = va_arg(args, int);
+ int xlev = va_arg(args, int);
+
+ if (num < 1 || num > ci->accesscount)
+ return 0;
+ *last = num;
+
+ return xop_del(u, &ci->access[num - 1], perm, uacc, xlev);
+}
+
+
+static int xop_list(User * u, int index, ChannelInfo * ci,
+ int *sent_header, int xlev, int xmsg)
+{
+ ChanAccess *access = &ci->access[index];
+
+ if (!access->in_use || access->level != xlev)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_ChanServ, u, xmsg, ci->name);
+ *sent_header = 1;
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_XOP_LIST_FORMAT, index + 1,
+ access->nc->display);
+ return 1;
+}
+
+static int xop_list_callback(User * u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *sent_header = va_arg(args, int *);
+ int xlev = va_arg(args, int);
+ int xmsg = va_arg(args, int);
+
+ if (num < 1 || num > ci->accesscount)
+ return 0;
+
+ return xop_list(u, num - 1, ci, sent_header, xlev, xmsg);
+}
+
+
+static int do_xop(User * u, char *xname, int xlev, int *xmsgs)
+{
+ char *chan = strtok(NULL, " ");
+ char *cmd = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+
+ ChannelInfo *ci;
+ NickAlias *na;
+ NickCore *nc;
+
+ int i;
+ int change = 0;
+ short ulev;
+ int is_list = (cmd && stricmp(cmd, "LIST") == 0);
+ int is_servadmin = is_services_admin(u);
+ ChanAccess *access;
+
+ /* If CLEAR, we don't need any parameters.
+ * If LIST, we don't *require* any parameters, but we can take any.
+ * If DEL or ADD we require a nick. */
+ if (!cmd || ((is_list || !stricmp(cmd, "CLEAR")) ? 0 : !nick)) {
+ syntax_error(s_ChanServ, u, xname, xmsgs[0]);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!(ci->flags & CI_XOP)) {
+ notice_lang(s_ChanServ, u, CHAN_XOP_ACCESS, s_ChanServ);
+ } else if (stricmp(cmd, "ADD") == 0) {
+ if (readonly) {
+ notice_lang(s_ChanServ, u, xmsgs[1]);
+ return MOD_CONT;
+ }
+
+ ulev = get_access(u, ci);
+
+ if (!is_servadmin && (xlev >= ulev || ulev < ACCESS_AOP)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ na = findnick(nick);
+ if (!na) {
+ notice_lang(s_ChanServ, u, xmsgs[2]);
+ return MOD_CONT;
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, na->nick);
+ return MOD_CONT;
+ }
+
+ nc = na->nc;
+ for (access = ci->access, i = 0; i < ci->accesscount;
+ access++, i++) {
+ if (access->nc == nc) {
+ /**
+ * Patch provided by PopCorn to prevert AOP's reducing SOP's levels
+ **/
+ if ((access->level >= ulev) && (!u->isSuperAdmin)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+ change++;
+ break;
+ }
+ }
+
+ if (!change) {
+ for (i = 0; i < ci->accesscount; i++)
+ if (!ci->access[i].in_use)
+ break;
+
+ if (i == ci->accesscount) {
+ if (i < CSAccessMax) {
+ ci->accesscount++;
+ ci->access =
+ srealloc(ci->access,
+ sizeof(ChanAccess) * ci->accesscount);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_XOP_REACHED_LIMIT,
+ CSAccessMax);
+ return MOD_CONT;
+ }
+ }
+
+ access = &ci->access[i];
+ access->nc = nc;
+ }
+
+ access->in_use = 1;
+ access->level = xlev;
+ access->last_seen = 0;
+
+ alog("%s: %s!%s@%s (level %d) %s access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, GetHost(u), ulev, change ? "changed" : "set", access->level, na->nick, nc->display, ci->name);
+
+ if (!change) {
+ notice_lang(s_ChanServ, u, xmsgs[3], access->nc->display,
+ ci->name);
+ } else {
+ notice_lang(s_ChanServ, u, xmsgs[4], access->nc->display,
+ ci->name);
+ }
+
+ } else if (stricmp(cmd, "DEL") == 0) {
+ if (readonly) {
+ notice_lang(s_ChanServ, u, xmsgs[1]);
+ return MOD_CONT;
+ }
+
+ if (ci->accesscount == 0) {
+ notice_lang(s_ChanServ, u, xmsgs[11], chan);
+ return MOD_CONT;
+ }
+
+ ulev = get_access(u, ci);
+
+ /* Special case: is it a number/list? Only do search if it isn't. */
+ if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) {
+ int count, deleted, last = -1, perm = 0;
+ deleted =
+ process_numlist(nick, &count, xop_del_callback, u, ci,
+ &last, &perm, ulev, xlev);
+ if (!deleted) {
+ if (perm) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else if (count == 1) {
+ notice_lang(s_ChanServ, u, xmsgs[5], last, ci->name);
+ } else {
+ notice_lang(s_ChanServ, u, xmsgs[7], ci->name);
+ }
+ } else if (deleted == 1) {
+ notice_lang(s_ChanServ, u, xmsgs[9], ci->name);
+ } else {
+ notice_lang(s_ChanServ, u, xmsgs[10], deleted, ci->name);
+ }
+ } else {
+ na = findnick(nick);
+ if (!na) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_REGISTERED, nick);
+ return MOD_CONT;
+ }
+ nc = na->nc;
+
+ for (i = 0; i < ci->accesscount; i++)
+ if (ci->access[i].nc == nc && ci->access[i].level == xlev)
+ break;
+
+ if (i == ci->accesscount) {
+ notice_lang(s_ChanServ, u, xmsgs[6], nick, chan);
+ return MOD_CONT;
+ }
+
+ access = &ci->access[i];
+ if (!is_servadmin && ulev <= access->level) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ notice_lang(s_ChanServ, u, xmsgs[8], access->nc->display,
+ ci->name);
+ access->nc = NULL;
+ access->in_use = 0;
+ }
+ }
+ } else if (stricmp(cmd, "LIST") == 0) {
+ int sent_header = 0;
+
+ ulev = get_access(u, ci);
+
+ if (!is_servadmin && ulev < ACCESS_AOP) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ return MOD_CONT;
+ }
+
+ if (ci->accesscount == 0) {
+ notice_lang(s_ChanServ, u, xmsgs[11], ci->name);
+ return MOD_CONT;
+ }
+
+ if (nick && strspn(nick, "1234567890,-") == strlen(nick)) {
+ process_numlist(nick, NULL, xop_list_callback, u, ci,
+ &sent_header, xlev, xmsgs[12]);
+ } else {
+ for (i = 0; i < ci->accesscount; i++) {
+ if (nick && ci->access[i].nc
+ && !match_wild_nocase(nick, ci->access[i].nc->display))
+ continue;
+ xop_list(u, i, ci, &sent_header, xlev, xmsgs[12]);
+ }
+ }
+ if (!sent_header)
+ notice_lang(s_ChanServ, u, xmsgs[7], chan);
+ } else if (stricmp(cmd, "CLEAR") == 0) {
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (ci->accesscount == 0) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_EMPTY, chan);
+ return MOD_CONT;
+ }
+
+ if (!is_servadmin && !is_founder(u, ci)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ for (i = 0; i < ci->accesscount; i++) {
+ if (ci->access[i].in_use && ci->access[i].level == xlev) {
+ ci->access[i].nc = NULL;
+ ci->access[i].in_use = 0;
+ }
+ }
+
+ notice_lang(s_ChanServ, u, xmsgs[13]);
+ } else {
+ syntax_error(s_ChanServ, u, xname, xmsgs[0]);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_aop(User * u)
+{
+ return do_xop(u, "AOP", ACCESS_AOP, xop_msgs[0]);
+}
+
+/*************************************************************************/
+
+#ifdef HAS_HALFOP
+
+static int do_hop(User * u)
+{
+ return do_xop(u, "HOP", ACCESS_HOP, xop_msgs[3]);
+}
+
+#endif
+
+/*************************************************************************/
+
+static int do_sop(User * u)
+{
+ return do_xop(u, "SOP", ACCESS_SOP, xop_msgs[1]);
+}
+
+/*************************************************************************/
+
+static int do_vop(User * u)
+{
+ return do_xop(u, "VOP", ACCESS_VOP, xop_msgs[2]);
+}
+
+/*************************************************************************/
+
+/* `last' is set to the last index this routine was called with
+ * `perm' is incremented whenever a permission-denied error occurs
+ */
+
+static int access_del(User * u, ChanAccess * access, int *perm, int uacc)
+{
+ if (!access->in_use)
+ return 0;
+ if (!is_services_admin(u) && uacc <= access->level) {
+ (*perm)++;
+ return 0;
+ }
+ access->nc = NULL;
+ access->in_use = 0;
+ return 1;
+}
+
+static int access_del_callback(User * u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *last = va_arg(args, int *);
+ int *perm = va_arg(args, int *);
+ int uacc = va_arg(args, int);
+ if (num < 1 || num > ci->accesscount)
+ return 0;
+ *last = num;
+ return access_del(u, &ci->access[num - 1], perm, uacc);
+}
+
+
+static int access_list(User * u, int index, ChannelInfo * ci,
+ int *sent_header)
+{
+ ChanAccess *access = &ci->access[index];
+ char *xop;
+
+ if (!access->in_use)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_HEADER, ci->name);
+ *sent_header = 1;
+ }
+
+ if (ci->flags & CI_XOP) {
+ xop = get_xop_level(access->level);
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_XOP_FORMAT, index + 1,
+ xop, access->nc->display);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_AXS_FORMAT, index + 1,
+ access->level, access->nc->display);
+ }
+ return 1;
+}
+
+static int access_list_callback(User * u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *sent_header = va_arg(args, int *);
+ if (num < 1 || num > ci->accesscount)
+ return 0;
+ return access_list(u, num - 1, ci, sent_header);
+}
+
+
+static int do_access(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *cmd = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+ char *s = strtok(NULL, " ");
+
+ ChannelInfo *ci;
+ NickAlias *na;
+ NickCore *nc;
+ ChanAccess *access;
+
+ int i;
+ short level = 0, ulev;
+ int is_list = (cmd && stricmp(cmd, "LIST") == 0);
+ int is_servadmin = is_services_admin(u);
+
+ /* If LIST, we don't *require* any parameters, but we can take any.
+ * If DEL, we require a nick and no level.
+ * Else (ADD), we require a level (which implies a nick). */
+ if (!cmd || ((is_list || !stricmp(cmd, "CLEAR")) ? 0 :
+ (stricmp(cmd, "DEL") == 0) ? (!nick || s) : !s)) {
+ syntax_error(s_ChanServ, u, "ACCESS", CHAN_ACCESS_SYNTAX);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ /* We still allow LIST in xOP mode, but not others */
+ } else if ((ci->flags & CI_XOP) && !is_list) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_XOP, s_ChanServ);
+ } else if (((is_list && !check_access(u, ci, CA_ACCESS_LIST))
+ || (!is_list && !check_access(u, ci, CA_ACCESS_CHANGE)))
+ && !is_servadmin) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else if (stricmp(cmd, "ADD") == 0) {
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED);
+ return MOD_CONT;
+ }
+
+ level = atoi(s);
+ ulev = get_access(u, ci);
+
+ if (!is_servadmin && level >= ulev) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (level == 0) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_NONZERO);
+ return MOD_CONT;
+ } else if (level <= ACCESS_INVALID || level >= ACCESS_FOUNDER) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_RANGE,
+ ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
+ return MOD_CONT;
+ }
+
+ na = findnick(nick);
+ if (!na) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_NICKS_ONLY);
+ return MOD_CONT;
+ }
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, nick);
+ return MOD_CONT;
+ }
+
+ nc = na->nc;
+ for (access = ci->access, i = 0; i < ci->accesscount;
+ access++, i++) {
+ if (access->nc == nc) {
+ /* Don't allow lowering from a level >= ulev */
+ if (!is_servadmin && access->level >= ulev) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+ if (access->level == level) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_UNCHANGED,
+ access->nc->display, chan, level);
+ return MOD_CONT;
+ }
+ access->level = level;
+ alog("%s: %s!%s@%s (level %d) set access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, GetHost(u), ulev, access->level, na->nick, nc->display, ci->name);
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LEVEL_CHANGED,
+ access->nc->display, chan, level);
+ return MOD_CONT;
+ }
+ }
+
+ for (i = 0; i < ci->accesscount; i++) {
+ if (!ci->access[i].in_use)
+ break;
+ }
+ if (i == ci->accesscount) {
+ if (i < CSAccessMax) {
+ ci->accesscount++;
+ ci->access =
+ srealloc(ci->access,
+ sizeof(ChanAccess) * ci->accesscount);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_REACHED_LIMIT,
+ CSAccessMax);
+ return MOD_CONT;
+ }
+ }
+
+ access = &ci->access[i];
+ access->nc = nc;
+ access->in_use = 1;
+ access->level = level;
+ access->last_seen = 0;
+
+ alog("%s: %s!%s@%s (level %d) set access level %d to %s (group %s) on channel %s", s_ChanServ, u->nick, u->username, GetHost(u), ulev, access->level, na->nick, nc->display, ci->name);
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_ADDED, nc->display,
+ ci->name, access->level);
+ } else if (stricmp(cmd, "DEL") == 0) {
+
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (ci->accesscount == 0) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_EMPTY, chan);
+ return MOD_CONT;
+ }
+
+ /* Special case: is it a number/list? Only do search if it isn't. */
+ if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) {
+ int count, deleted, last = -1, perm = 0;
+ deleted = process_numlist(nick, &count, access_del_callback, u,
+ ci, &last, &perm, get_access(u, ci));
+ if (!deleted) {
+ if (perm) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else if (count == 1) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_NO_SUCH_ENTRY,
+ last, ci->name);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_NO_MATCH,
+ ci->name);
+ }
+ } else if (deleted == 1) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_DELETED_ONE,
+ ci->name);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_DELETED_SEVERAL,
+ deleted, ci->name);
+ }
+ } else {
+ na = findnick(nick);
+ if (!na) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_REGISTERED, nick);
+ return MOD_CONT;
+ }
+ nc = na->nc;
+ for (i = 0; i < ci->accesscount; i++) {
+ if (ci->access[i].nc == nc)
+ break;
+ }
+ if (i == ci->accesscount) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_NOT_FOUND, nick,
+ chan);
+ return MOD_CONT;
+ }
+ access = &ci->access[i];
+ if (!is_servadmin && get_access(u, ci) <= access->level) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_DELETED,
+ access->nc->display, ci->name);
+ alog("%s: %s!%s@%s (level %d) deleted access of %s (group %s) on %s", s_ChanServ, u->nick, u->username, GetHost(u), get_access(u, ci), na->nick, access->nc->display, chan);
+ access->nc = NULL;
+ access->in_use = 0;
+ }
+ }
+ } else if (stricmp(cmd, "LIST") == 0) {
+ int sent_header = 0;
+
+ if (ci->accesscount == 0) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_EMPTY, chan);
+ return MOD_CONT;
+ }
+ if (nick && strspn(nick, "1234567890,-") == strlen(nick)) {
+ process_numlist(nick, NULL, access_list_callback, u, ci,
+ &sent_header);
+ } else {
+ for (i = 0; i < ci->accesscount; i++) {
+ if (nick && ci->access[i].nc
+ && !match_wild_nocase(nick, ci->access[i].nc->display))
+ continue;
+ access_list(u, i, ci, &sent_header);
+ }
+ }
+ if (!sent_header) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_NO_MATCH, chan);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_LIST_FOOTER, ci->name);
+ }
+ } else if (stricmp(cmd, "CLEAR") == 0) {
+
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (!is_servadmin && !is_founder(u, ci)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ free(ci->access);
+ ci->access = NULL;
+ ci->accesscount = 0;
+
+ notice_lang(s_ChanServ, u, CHAN_ACCESS_CLEAR);
+ alog("%s: %s!%s@%s (level %d) cleared access list on %s",
+ s_ChanServ, u->nick, u->username, GetHost(u), get_access(u,
+ ci),
+ chan);
+
+ } else {
+ syntax_error(s_ChanServ, u, "ACCESS", CHAN_ACCESS_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Is the mask stuck? */
+
+AutoKick *is_stuck(ChannelInfo * ci, char *mask)
+{
+ int i;
+ AutoKick *akick;
+
+ for (akick = ci->akick, i = 0; i < ci->akickcount; akick++, i++) {
+ if (!(akick->flags & AK_USED) || (akick->flags & AK_ISNICK)
+ || !(akick->flags & AK_STUCK))
+ continue;
+ /* Example: mask = *!*@*.org and akick->u.mask = *!*@*.epona.org */
+ if (match_wild_nocase(mask, akick->u.mask))
+ return akick;
+#ifdef IRC_DREAMFORGE
+ /* Example: mask = *!*@irc.epona.org and akick->u.mask = *!*@*.epona.org */
+ if (match_wild_nocase(akick->u.mask, mask))
+ return akick;
+#endif
+ }
+
+ return NULL;
+}
+
+/* Ban the stuck mask in a safe manner. */
+
+void stick_mask(ChannelInfo * ci, AutoKick * akick)
+{
+ int i;
+ char *av[2];
+
+ for (i = 0; i < ci->c->bancount; i++) {
+ /* If akick is already covered by a wider ban.
+ Example: c->bans[i] = *!*@*.org and akick->u.mask = *!*@*.epona.org */
+ if (match_wild_nocase(ci->c->bans[i], akick->u.mask))
+ return;
+
+#ifdef IRC_DREAMFORGE
+ /* If akick is wider than a ban already in place.
+ Example: c->bans[i] = *!*@irc.epona.org and akick->u.mask = *!*@*.epona.org */
+ if (match_wild_nocase(akick->u.mask, ci->c->bans[i]))
+ return;
+#endif
+ }
+
+ /* Falling there means set the ban */
+
+ av[0] = sstrdup("+b");
+ av[1] = akick->u.mask;
+ send_cmd(whosends(ci), "MODE %s +b %s", ci->c->name, akick->u.mask);
+ chan_set_modes(s_ChanServ, ci->c, 2, av, 1);
+ free(av[0]);
+}
+
+/* Ban the stuck mask in a safe manner. */
+
+void stick_all(ChannelInfo * ci)
+{
+ int i;
+ char *av[2];
+ AutoKick *akick;
+
+ for (akick = ci->akick, i = 0; i < ci->akickcount; akick++, i++) {
+ if (!(akick->flags & AK_USED) || (akick->flags & AK_ISNICK)
+ || !(akick->flags & AK_STUCK))
+ continue;
+
+ av[0] = sstrdup("+b");
+ av[1] = akick->u.mask;
+ send_cmd(whosends(ci), "MODE %s +b %s", ci->c->name,
+ akick->u.mask);
+ chan_set_modes(s_ChanServ, ci->c, 2, av, 1);
+ free(av[0]);
+ }
+}
+
+/* `last' is set to the last index this routine was called with */
+static int akick_del(User * u, AutoKick * akick)
+{
+ if (!(akick->flags & AK_USED))
+ return 0;
+ if (akick->flags & AK_ISNICK) {
+ akick->u.nc = NULL;
+ } else {
+ free(akick->u.mask);
+ akick->u.mask = NULL;
+ }
+ if (akick->reason) {
+ free(akick->reason);
+ akick->reason = NULL;
+ }
+ if (akick->creator) {
+ free(akick->creator);
+ akick->creator = NULL;
+ }
+ akick->addtime = 0;
+ akick->flags = 0;
+ return 1;
+}
+
+static int akick_del_callback(User * u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *last = va_arg(args, int *);
+ if (num < 1 || num > ci->akickcount)
+ return 0;
+ *last = num;
+ return akick_del(u, &ci->akick[num - 1]);
+}
+
+
+static int akick_list(User * u, int index, ChannelInfo * ci,
+ int *sent_header)
+{
+ AutoKick *akick = &ci->akick[index];
+
+ if (!(akick->flags & AK_USED))
+ return 0;
+ if (!*sent_header) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_HEADER, ci->name);
+ *sent_header = 1;
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_FORMAT, index + 1,
+ ((akick->flags & AK_ISNICK) ? akick->u.nc->
+ display : akick->u.mask),
+ (akick->reason ? akick->
+ reason : getstring(u->na, NO_REASON)));
+ return 1;
+}
+
+static int akick_list_callback(User * u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *sent_header = va_arg(args, int *);
+ if (num < 1 || num > ci->akickcount)
+ return 0;
+ return akick_list(u, num - 1, ci, sent_header);
+}
+
+static int akick_view(User * u, int index, ChannelInfo * ci,
+ int *sent_header)
+{
+ AutoKick *akick = &ci->akick[index];
+ char timebuf[64];
+ struct tm tm;
+
+ if (!(akick->flags & AK_USED))
+ return 0;
+ if (!*sent_header) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_HEADER, ci->name);
+ *sent_header = 1;
+ }
+
+ if (akick->addtime) {
+ tm = *localtime(&akick->addtime);
+ strftime_lang(timebuf, sizeof(timebuf), u,
+ STRFTIME_SHORT_DATE_FORMAT, &tm);
+ } else {
+ snprintf(timebuf, sizeof(timebuf), getstring(u->na, UNKNOWN));
+ }
+
+ notice_lang(s_ChanServ, u,
+ ((akick->
+ flags & AK_STUCK) ? CHAN_AKICK_VIEW_FORMAT_STUCK :
+ CHAN_AKICK_VIEW_FORMAT), index + 1,
+ ((akick->flags & AK_ISNICK) ? akick->u.nc->
+ display : akick->u.mask),
+ akick->creator ? akick->creator : getstring(u->na,
+ UNKNOWN),
+ timebuf,
+ (akick->reason ? akick->
+ reason : getstring(u->na, NO_REASON)));
+ return 1;
+}
+
+static int akick_view_callback(User * u, int num, va_list args)
+{
+ ChannelInfo *ci = va_arg(args, ChannelInfo *);
+ int *sent_header = va_arg(args, int *);
+ if (num < 1 || num > ci->akickcount)
+ return 0;
+ return akick_view(u, num - 1, ci, sent_header);
+}
+
+static int do_akick(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *cmd = strtok(NULL, " ");
+ char *mask = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+ ChannelInfo *ci;
+ AutoKick *akick;
+ int i;
+
+ if (!cmd || (!mask && (!stricmp(cmd, "ADD") || !stricmp(cmd, "STICK")
+ || !stricmp(cmd, "UNSTICK")
+ || !stricmp(cmd, "DEL")))) {
+
+ syntax_error(s_ChanServ, u, "AKICK", CHAN_AKICK_SYNTAX);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!check_access(u, ci, CA_AKICK) && !is_services_admin(u)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else if (stricmp(cmd, "ADD") == 0) {
+
+ NickAlias *na = findnick(mask);
+ NickCore *nc = NULL;
+ char *nick, *user, *host;
+
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (!na) {
+ split_usermask(mask, &nick, &user, &host);
+ mask =
+ scalloc(strlen(nick) + strlen(user) + strlen(host) + 3, 1);
+ sprintf(mask, "%s!%s@%s", nick, user, host);
+ free(nick);
+ free(user);
+ free(host);
+ } else {
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, mask);
+ return MOD_CONT;
+ }
+ nc = na->nc;
+ }
+
+ /* Check excepts BEFORE we get this far */
+#if defined (IRC_ULTIMATE) || defined(IRC_ULTIMATE3) || defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_HYBRID)
+ if (is_excepted_mask(ci, mask) == 1) {
+ notice_lang(s_ChanServ, u, CHAN_EXCEPTED, mask, chan);
+ return MOD_CONT;
+ }
+#endif
+
+ for (akick = ci->akick, i = 0; i < ci->akickcount; akick++, i++) {
+ if (!(akick->flags & AK_USED))
+ continue;
+ if ((akick->flags & AK_ISNICK) ? akick->u.nc == nc
+ : stricmp(akick->u.mask, mask) == 0) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_ALREADY_EXISTS,
+ (akick->flags & AK_ISNICK) ? akick->u.nc->
+ display : akick->u.mask, chan);
+ return MOD_CONT;
+ }
+ }
+
+ for (i = 0; i < ci->akickcount; i++) {
+ if (!(ci->akick[i].flags & AK_USED))
+ break;
+ }
+ if (i == ci->akickcount) {
+ if (ci->akickcount >= CSAutokickMax) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_REACHED_LIMIT,
+ CSAutokickMax);
+ return MOD_CONT;
+ }
+ ci->akickcount++;
+ ci->akick =
+ srealloc(ci->akick, sizeof(AutoKick) * ci->akickcount);
+ }
+ akick = &ci->akick[i];
+ akick->flags = AK_USED;
+ if (nc) {
+ akick->flags |= AK_ISNICK;
+ akick->u.nc = nc;
+ } else {
+ akick->u.mask = mask;
+ }
+ akick->creator = sstrdup(u->nick);
+ akick->addtime = time(NULL);
+ if (reason) {
+ if (strlen(reason) > 200)
+ reason[200] = '\0';
+ akick->reason = sstrdup(reason);
+ } else {
+ akick->reason = NULL;
+ }
+ notice_lang(s_ChanServ, u, CHAN_AKICK_ADDED, mask, chan);
+
+ } else if (stricmp(cmd, "STICK") == 0) {
+ NickAlias *na;
+ NickCore *nc;
+
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (ci->akickcount == 0) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_EMPTY, ci->name);
+ return MOD_CONT;
+ }
+
+ na = findnick(mask);
+ nc = (na ? na->nc : NULL);
+
+ for (akick = ci->akick, i = 0; i < ci->akickcount; akick++, i++) {
+ if (!(akick->flags & AK_USED) || (akick->flags & AK_ISNICK))
+ continue;
+ if (!stricmp(akick->u.mask, mask))
+ break;
+ }
+
+ if (i == ci->akickcount) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_NOT_FOUND, mask,
+ ci->name);
+ return MOD_CONT;
+ }
+
+ akick->flags |= AK_STUCK;
+ notice_lang(s_ChanServ, u, CHAN_AKICK_STUCK, akick->u.mask,
+ ci->name);
+
+ if (ci->c)
+ stick_mask(ci, akick);
+ } else if (stricmp(cmd, "UNSTICK") == 0) {
+ NickAlias *na;
+ NickCore *nc;
+
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (ci->akickcount == 0) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_EMPTY, ci->name);
+ return MOD_CONT;
+ }
+
+ na = findnick(mask);
+ nc = (na ? na->nc : NULL);
+
+ for (akick = ci->akick, i = 0; i < ci->akickcount; akick++, i++) {
+ if (!(akick->flags & AK_USED) || (akick->flags & AK_ISNICK))
+ continue;
+ if (!stricmp(akick->u.mask, mask))
+ break;
+ }
+
+ if (i == ci->akickcount) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_NOT_FOUND, mask,
+ ci->name);
+ return MOD_CONT;
+ }
+
+ akick->flags &= ~AK_STUCK;
+ notice_lang(s_ChanServ, u, CHAN_AKICK_UNSTUCK, akick->u.mask,
+ ci->name);
+
+ } else if (stricmp(cmd, "DEL") == 0) {
+
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (ci->akickcount == 0) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_EMPTY, chan);
+ return MOD_CONT;
+ }
+
+ /* Special case: is it a number/list? Only do search if it isn't. */
+ if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) {
+ int count, deleted, last = -1;
+ deleted = process_numlist(mask, &count, akick_del_callback, u,
+ ci, &last);
+ if (!deleted) {
+ if (count == 1) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_NO_SUCH_ENTRY,
+ last, ci->name);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_NO_MATCH,
+ ci->name);
+ }
+ } else if (deleted == 1) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_DELETED_ONE,
+ ci->name);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_DELETED_SEVERAL,
+ deleted, ci->name);
+ }
+ } else {
+ NickAlias *na = findnick(mask);
+ NickCore *nc = (na ? na->nc : NULL);
+
+ for (akick = ci->akick, i = 0; i < ci->akickcount;
+ akick++, i++) {
+ if (!(akick->flags & AK_USED))
+ continue;
+ if (((akick->flags & AK_ISNICK) && akick->u.nc == nc)
+ || (!(akick->flags & AK_ISNICK)
+ && stricmp(akick->u.mask, mask) == 0))
+ break;
+ }
+ if (i == ci->akickcount) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_NOT_FOUND, mask,
+ chan);
+ return MOD_CONT;
+ }
+ notice_lang(s_ChanServ, u, CHAN_AKICK_DELETED, mask, chan);
+ akick_del(u, akick);
+ }
+
+ } else if (stricmp(cmd, "LIST") == 0) {
+ int sent_header = 0;
+
+ if (ci->akickcount == 0) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_EMPTY, chan);
+ return MOD_CONT;
+ }
+ if (mask && isdigit(*mask) &&
+ strspn(mask, "1234567890,-") == strlen(mask)) {
+ process_numlist(mask, NULL, akick_list_callback, u, ci,
+ &sent_header);
+ } else {
+ for (akick = ci->akick, i = 0; i < ci->akickcount;
+ akick++, i++) {
+ if (!(akick->flags & AK_USED))
+ continue;
+ if (mask) {
+ if (!(akick->flags & AK_ISNICK)
+ && !match_wild_nocase(mask, akick->u.mask))
+ continue;
+ if ((akick->flags & AK_ISNICK)
+ && !match_wild_nocase(mask, akick->u.nc->display))
+ continue;
+ }
+ akick_list(u, i, ci, &sent_header);
+ }
+ }
+ if (!sent_header)
+ notice_lang(s_ChanServ, u, CHAN_AKICK_NO_MATCH, chan);
+
+ } else if (stricmp(cmd, "VIEW") == 0) {
+ int sent_header = 0;
+
+ if (ci->akickcount == 0) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_LIST_EMPTY, chan);
+ return MOD_CONT;
+ }
+ if (mask && isdigit(*mask) &&
+ strspn(mask, "1234567890,-") == strlen(mask)) {
+ process_numlist(mask, NULL, akick_view_callback, u, ci,
+ &sent_header);
+ } else {
+ for (akick = ci->akick, i = 0; i < ci->akickcount;
+ akick++, i++) {
+ if (!(akick->flags & AK_USED))
+ continue;
+ if (mask) {
+ if (!(akick->flags & AK_ISNICK)
+ && !match_wild_nocase(mask, akick->u.mask))
+ continue;
+ if ((akick->flags & AK_ISNICK)
+ && !match_wild_nocase(mask, akick->u.nc->display))
+ continue;
+ }
+ akick_view(u, i, ci, &sent_header);
+ }
+ }
+ if (!sent_header)
+ notice_lang(s_ChanServ, u, CHAN_AKICK_NO_MATCH, chan);
+
+ } else if (stricmp(cmd, "ENFORCE") == 0) {
+ Channel *c = findchan(ci->name);
+ struct c_userlist *cu = NULL;
+ struct c_userlist *next;
+ char *argv[3];
+ int count = 0;
+
+ if (!c) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, ci->name);
+ return MOD_CONT;
+ }
+
+ cu = c->users;
+
+ while (cu) {
+ next = cu->next;
+ if (check_kick(cu->user, c->name)) {
+ argv[0] = sstrdup(c->name);
+ argv[1] = sstrdup(cu->user->nick);
+ argv[2] = sstrdup(CSAutokickReason);
+
+ do_kick(s_ChanServ, 3, argv);
+
+ free(argv[2]);
+ free(argv[1]);
+ free(argv[0]);
+
+ count++;
+ }
+ cu = next;
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_AKICK_ENFORCE_DONE, chan, count);
+
+ } else if (stricmp(cmd, "CLEAR") == 0) {
+
+ if (readonly) {
+ notice_lang(s_ChanServ, u, CHAN_AKICK_DISABLED);
+ return MOD_CONT;
+ }
+
+ for (akick = ci->akick, i = 0; i < ci->akickcount; akick++, i++) {
+ if (!(akick->flags & AK_USED))
+ continue;
+ akick_del(u, akick);
+ }
+
+ free(ci->akick);
+ ci->akick = NULL;
+ ci->akickcount = 0;
+
+ notice_lang(s_ChanServ, u, CHAN_AKICK_CLEAR);
+
+ } else {
+ syntax_error(s_ChanServ, u, "AKICK", CHAN_AKICK_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_levels(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *cmd = strtok(NULL, " ");
+ char *what = strtok(NULL, " ");
+ char *s = strtok(NULL, " ");
+ char *error;
+
+ ChannelInfo *ci;
+ short level;
+ int i;
+
+ /* If SET, we want two extra parameters; if DIS[ABLE] or FOUNDER, we want only
+ * one; else, we want none.
+ */
+ if (!cmd
+ || ((stricmp(cmd, "SET") == 0) ? !s
+ : ((strnicmp(cmd, "DIS", 3) == 0)) ? (!what || s) : !!what)) {
+ syntax_error(s_ChanServ, u, "LEVELS", CHAN_LEVELS_SYNTAX);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (ci->flags & CI_XOP) {
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_XOP);
+ } else if (!is_founder(u, ci) && !is_services_admin(u)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else if (stricmp(cmd, "SET") == 0) {
+ level = strtol(s, &error, 10);
+
+ if (*error != '\0') {
+ syntax_error(s_ChanServ, u, "LEVELS", CHAN_LEVELS_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (level <= ACCESS_INVALID || level >= ACCESS_FOUNDER) {
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_RANGE,
+ ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
+ return MOD_CONT;
+ }
+
+ for (i = 0; levelinfo[i].what >= 0; i++) {
+ if (stricmp(levelinfo[i].name, what) == 0) {
+ ci->levels[levelinfo[i].what] = level;
+
+ alog("%s: %s!%s@%s set level %s on channel %s to %d",
+ s_ChanServ, u->nick, u->username, GetHost(u),
+ levelinfo[i].name, ci->name, level);
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_CHANGED,
+ levelinfo[i].name, chan, level);
+ return MOD_CONT;
+ }
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_UNKNOWN, what, s_ChanServ);
+
+ } else if (stricmp(cmd, "DIS") == 0 || stricmp(cmd, "DISABLE") == 0) {
+ for (i = 0; levelinfo[i].what >= 0; i++) {
+ if (stricmp(levelinfo[i].name, what) == 0) {
+ ci->levels[levelinfo[i].what] = ACCESS_INVALID;
+
+ alog("%s: %s!%s@%s disabled level %s on channel %s",
+ s_ChanServ, u->nick, u->username, GetHost(u),
+ levelinfo[i].name, ci->name);
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_DISABLED,
+ levelinfo[i].name, chan);
+ return MOD_CONT;
+ }
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_UNKNOWN, what, s_ChanServ);
+ } else if (stricmp(cmd, "LIST") == 0) {
+ int i;
+
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_LIST_HEADER, chan);
+
+ if (!levelinfo_maxwidth) {
+ for (i = 0; levelinfo[i].what >= 0; i++) {
+ int len = strlen(levelinfo[i].name);
+ if (len > levelinfo_maxwidth)
+ levelinfo_maxwidth = len;
+ }
+ }
+
+ for (i = 0; levelinfo[i].what >= 0; i++) {
+ int j = ci->levels[levelinfo[i].what];
+
+ if (j == ACCESS_INVALID) {
+ j = levelinfo[i].what;
+
+ if (j == CA_AUTOOP || j == CA_AUTODEOP || j == CA_AUTOVOICE
+ || j == CA_NOJOIN) {
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_LIST_DISABLED,
+ levelinfo_maxwidth, levelinfo[i].name);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_LIST_DISABLED,
+ levelinfo_maxwidth, levelinfo[i].name);
+ }
+ } else if (j == ACCESS_FOUNDER) {
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_LIST_FOUNDER,
+ levelinfo_maxwidth, levelinfo[i].name);
+ } else {
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_LIST_NORMAL,
+ levelinfo_maxwidth, levelinfo[i].name, j);
+ }
+ }
+
+ } else if (stricmp(cmd, "RESET") == 0) {
+ reset_levels(ci);
+
+ alog("%s: %s!%s@%s reset levels definitions on channel %s",
+ s_ChanServ, u->nick, u->username, GetHost(u), ci->name);
+ notice_lang(s_ChanServ, u, CHAN_LEVELS_RESET, chan);
+ } else {
+ syntax_error(s_ChanServ, u, "LEVELS", CHAN_LEVELS_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* SADMINS and users, who have identified for a channel, can now cause it's
+ * Enstry Message and Successor to be displayed by supplying the ALL parameter.
+ * Syntax: INFO channel [ALL]
+ * -TheShadow (29 Mar 1999)
+ */
+
+static int do_info(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *param = strtok(NULL, " ");
+ ChannelInfo *ci;
+ char buf[BUFSIZE], *end;
+ struct tm *tm;
+ int need_comma = 0;
+ const char *commastr = getstring(u->na, COMMA_SPACE);
+ int is_servadmin = is_services_admin(u);
+ int show_all = 0;
+
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "INFO", CHAN_INFO_SYNTAX);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ if (is_oper(u) && ci->forbidby)
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN_OPER, chan,
+ ci->forbidby,
+ (ci->forbidreason ? ci->
+ forbidreason : getstring(u->na, NO_REASON)));
+ else
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!ci->founder) {
+ /* Paranoia... this shouldn't be able to happen */
+ delchan(ci);
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else {
+
+ /* Should we show all fields? Only for sadmins and identified users */
+ if (param && stricmp(param, "ALL") == 0 &&
+ (check_access(u, ci, CA_INFO) || is_servadmin))
+ show_all = 1;
+
+ notice_lang(s_ChanServ, u, CHAN_INFO_HEADER, chan);
+ notice_lang(s_ChanServ, u, CHAN_INFO_NO_FOUNDER,
+ ci->founder->display);
+
+ if (show_all && ci->successor)
+ notice_lang(s_ChanServ, u, CHAN_INFO_NO_SUCCESSOR,
+ ci->successor->display);
+
+ notice_lang(s_ChanServ, u, CHAN_INFO_DESCRIPTION, ci->desc);
+ tm = localtime(&ci->time_registered);
+ strftime_lang(buf, sizeof(buf), u, STRFTIME_DATE_TIME_FORMAT, tm);
+ notice_lang(s_ChanServ, u, CHAN_INFO_TIME_REGGED, buf);
+ tm = localtime(&ci->last_used);
+ strftime_lang(buf, sizeof(buf), u, STRFTIME_DATE_TIME_FORMAT, tm);
+ notice_lang(s_ChanServ, u, CHAN_INFO_LAST_USED, buf);
+ if (ci->last_topic && (show_all || (!(ci->mlock_on & CMODE_s)
+ && (!ci->c
+ || !(ci->c->
+ mode & CMODE_s))))) {
+ notice_lang(s_ChanServ, u, CHAN_INFO_LAST_TOPIC,
+ ci->last_topic);
+ notice_lang(s_ChanServ, u, CHAN_INFO_TOPIC_SET_BY,
+ ci->last_topic_setter);
+ }
+
+ if (ci->entry_message && show_all)
+ notice_lang(s_ChanServ, u, CHAN_INFO_ENTRYMSG,
+ ci->entry_message);
+ if (ci->url)
+ notice_lang(s_ChanServ, u, CHAN_INFO_URL, ci->url);
+ if (ci->email)
+ notice_lang(s_ChanServ, u, CHAN_INFO_EMAIL, ci->email);
+
+ if (show_all) {
+ notice_lang(s_ChanServ, u, CHAN_INFO_BANTYPE, ci->bantype);
+
+ end = buf;
+ *end = 0;
+ if (ci->flags & CI_KEEPTOPIC) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s",
+ getstring(u->na, CHAN_INFO_OPT_KEEPTOPIC));
+ need_comma = 1;
+ }
+ if (ci->flags & CI_OPNOTICE) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, CHAN_INFO_OPT_OPNOTICE));
+ need_comma = 1;
+ }
+ if (ci->flags & CI_PEACE) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, CHAN_INFO_OPT_PEACE));
+ need_comma = 1;
+ }
+ if (ci->flags & CI_PRIVATE) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, CHAN_INFO_OPT_PRIVATE));
+ need_comma = 1;
+ }
+ if (ci->flags & CI_RESTRICTED) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na,
+ CHAN_INFO_OPT_RESTRICTED));
+ need_comma = 1;
+ }
+ if (ci->flags & CI_SECURE) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, CHAN_INFO_OPT_SECURE));
+ need_comma = 1;
+ }
+ if (ci->flags & CI_SECUREOPS) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, CHAN_INFO_OPT_SECUREOPS));
+ need_comma = 1;
+ }
+ if (ci->flags & CI_SECUREFOUNDER) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na,
+ CHAN_INFO_OPT_SECUREFOUNDER));
+ need_comma = 1;
+ }
+ if ((ci->flags & CI_SIGNKICK)
+ || (ci->flags & CI_SIGNKICK_LEVEL)) {
+ end +=
+ snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "", getstring(u->na,
+ CHAN_INFO_OPT_SIGNKICK));
+ need_comma = 1;
+ }
+ if (ci->flags & CI_TOPICLOCK) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, CHAN_INFO_OPT_TOPICLOCK));
+ need_comma = 1;
+ }
+ if (ci->flags & CI_XOP) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, CHAN_INFO_OPT_XOP));
+ need_comma = 1;
+ }
+ notice_lang(s_ChanServ, u, CHAN_INFO_OPTIONS,
+ *buf ? buf : getstring(u->na, CHAN_INFO_OPT_NONE));
+ notice_lang(s_ChanServ, u, CHAN_INFO_MODE_LOCK,
+ get_mlock_modes(ci, 1));
+
+ }
+
+ if ((ci->flags & CI_NO_EXPIRE) && show_all)
+ notice_lang(s_ChanServ, u, CHAN_INFO_NO_EXPIRE);
+ if (ci->flags & CI_SUSPENDED) {
+ notice_lang(s_ChanServ, u, CHAN_X_SUSPENDED, ci->forbidby,
+ (ci->forbidreason ? ci->
+ forbidreason : getstring(u->na, NO_REASON)));
+ }
+
+ if (!show_all && (check_access(u, ci, CA_INFO) || is_servadmin))
+ notice_lang(s_ChanServ, u, NICK_INFO_FOR_MORE, s_ChanServ,
+ ci->name);
+
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_list(User * u)
+{
+ char *pattern = strtok(NULL, " ");
+ ChannelInfo *ci;
+ int nchans, i;
+ char buf[BUFSIZE];
+ int is_servadmin = is_services_admin(u);
+ int count = 0, from = 0, to = 0;
+ char *tmp = NULL;
+ char *s = NULL;
+ char *keyword;
+ int32 matchflags = 0;
+
+
+ if (CSListOpersOnly && (!u || !is_oper(u))) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (!pattern) {
+ syntax_error(s_ChanServ, u, "LIST",
+ is_servadmin ? CHAN_LIST_SERVADMIN_SYNTAX :
+ CHAN_LIST_SYNTAX);
+ } else {
+
+ if (pattern) {
+ if (pattern[0] == '#') {
+ tmp = myStrGetOnlyToken((pattern + 1), '-', 0); /* Read FROM out */
+ if (!tmp) {
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ return MOD_CONT;
+ }
+ }
+ from = atoi(tmp);
+ tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */
+ if (!tmp) {
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ return MOD_CONT;
+ }
+ }
+ to = atoi(tmp);
+ pattern = sstrdup("*");
+ }
+ }
+
+ nchans = 0;
+
+ while (is_servadmin && (keyword = strtok(NULL, " "))) {
+ if (stricmp(keyword, "FORBIDDEN") == 0)
+ matchflags |= CI_VERBOTEN;
+ if (stricmp(keyword, "SUSPENDED") == 0)
+ matchflags |= CI_SUSPENDED;
+ if (stricmp(keyword, "NOEXPIRE") == 0)
+ matchflags |= CI_NO_EXPIRE;
+ }
+
+ notice_lang(s_ChanServ, u, CHAN_LIST_HEADER, pattern);
+ for (i = 0; i < 256; i++) {
+ for (ci = chanlists[i]; ci; ci = ci->next) {
+ if (!is_servadmin && ((ci->flags & CI_PRIVATE)
+ || (ci->flags & CI_VERBOTEN)))
+ continue;
+ if ((matchflags != 0) && !(ci->flags & matchflags))
+ continue;
+
+ if (stricmp(pattern, ci->name) == 0
+ || match_wild_nocase(pattern, ci->name)) {
+ if ((((count + 1 >= from) && (count + 1 <= to))
+ || ((from == 0) && (to == 0)))
+ && (++nchans <= CSListMax)) {
+ char noexpire_char = ' ';
+ if (is_servadmin && (ci->flags & CI_NO_EXPIRE))
+ noexpire_char = '!';
+
+ if (ci->flags & CI_VERBOTEN) {
+ snprintf(buf, sizeof(buf),
+ "%-20s [Forbidden]", ci->name);
+ } else if (ci->flags & CI_SUSPENDED) {
+ snprintf(buf, sizeof(buf),
+ "%-20s [Suspended]", ci->name);
+ } else {
+ snprintf(buf, sizeof(buf), "%-20s %s",
+ ci->name, ci->desc ? ci->desc : "");
+ }
+
+ notice_user(s_ChanServ, u, " %c%s",
+ noexpire_char, buf);
+ }
+ count++;
+ }
+ }
+ }
+ notice_lang(s_ChanServ, u, CHAN_LIST_END,
+ nchans > CSListMax ? CSListMax : nchans, nchans);
+ }
+ return MOD_CONT;
+
+}
+
+/*************************************************************************/
+
+static int do_invite(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ Channel *c;
+ ChannelInfo *ci;
+
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "INVITE", CHAN_INVITE_SYNTAX);
+ } else if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(ci = c->ci)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!u || !check_access(u, ci, CA_INVITE)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ send_cmd(whosends(ci), "INVITE %s %s", u->nick, chan);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* do_util: not a command, but does the job of other */
+
+static int do_util(User * u, CSModeUtil * util)
+{
+ char *av[2];
+ char *chan = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+
+ Channel *c;
+ ChannelInfo *ci;
+ User *u2;
+
+ int is_same;
+
+ if (!chan) {
+ struct u_chanlist *uc;
+
+ av[0] = util->mode;
+ av[1] = u->nick;
+
+ /* Sets the mode to the user on every channels he is on. */
+
+ for (uc = u->chans; uc; uc = uc->next) {
+ if ((ci = uc->chan->ci) && !(ci->flags & CI_VERBOTEN)
+ && check_access(u, ci, util->levelself)) {
+ send_cmd(whosends(ci), "MODE %s %s %s", uc->chan->name,
+ util->mode, u->nick);
+ chan_set_modes(s_ChanServ, uc->chan, 2, av, 1);
+
+ if (util->notice && ci->flags & util->notice)
+ notice(whosends(ci), chan,
+ "%s command used for %s by %s", util->name,
+ u->nick, u->nick);
+ }
+ }
+
+ return MOD_CONT;
+ } else if (!nick) {
+ nick = u->nick;
+ }
+
+ is_same = (nick == u->nick) ? 1 : (stricmp(nick, u->nick) == 0);
+
+ if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(ci = c->ci)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, c->name);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, ci->name);
+ } else if (is_same ? !(u2 = u) : !(u2 = finduser(nick))) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, nick);
+ } else if (!is_on_chan(c, u2)) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_ON_CHAN, u2->nick, c->name);
+ } else if (is_same ? !check_access(u, ci, util->levelself) :
+ !check_access(u, ci, util->level)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else if (*util->mode == '-' && !is_same && (ci->flags & CI_PEACE)
+ && (get_access(u2, ci) >= get_access(u, ci))) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+#if defined (IRC_ULTIMATE) || defined (IRC_ULTIMATE3)
+ } else if (*util->mode == '-' && is_protected(u2)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+#endif
+ } else {
+ send_cmd(whosends(ci), "MODE %s %s %s", c->name, util->mode,
+ u2->nick);
+
+ av[0] = util->mode;
+ av[1] = u2->nick;
+ chan_set_modes(s_ChanServ, c, 2, av, 1);
+
+ if (util->notice && ci->flags & util->notice)
+ notice(whosends(ci), c->name, "%s command used for %s by %s",
+ util->name, u2->nick, u->nick);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_op(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_OP]);
+}
+
+/*************************************************************************/
+
+static int do_deop(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_DEOP]);
+}
+
+/*************************************************************************/
+
+static int do_voice(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_VOICE]);
+}
+
+/*************************************************************************/
+
+static int do_devoice(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_DEVOICE]);
+}
+
+/*************************************************************************/
+
+#ifdef HAS_HALFOP
+
+static int do_halfop(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_HALFOP]);
+}
+
+/*************************************************************************/
+
+static int do_dehalfop(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_DEHALFOP]);
+}
+
+#endif
+
+/*************************************************************************/
+
+#if defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA)
+
+static int do_protect(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_PROTECT]);
+}
+
+/*************************************************************************/
+
+static int do_deprotect(User * u)
+{
+ return do_util(u, &csmodeutils[MUT_DEPROTECT]);
+}
+
+/*************************************************************************/
+#endif
+
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+
+static int do_owner(User * u)
+{
+ char *av[2];
+ char *chan = strtok(NULL, " ");
+
+ Channel *c;
+ ChannelInfo *ci;
+
+ if (!chan) {
+ struct u_chanlist *uc;
+
+ av[0] = sstrdup("+q");
+ av[1] = u->nick;
+
+ /* Sets the mode to the user on every channels he is on. */
+
+ for (uc = u->chans; uc; uc = uc->next) {
+ if ((ci = uc->chan->ci) && !(ci->flags & CI_VERBOTEN)
+ && is_founder(u, ci)) {
+ send_cmd(whosends(ci), "MODE %s %s %s", uc->chan->name,
+ av[0], u->nick);
+ chan_set_modes(s_ChanServ, uc->chan, 2, av, 1);
+ }
+ }
+
+ free(av[0]);
+ return MOD_CONT;
+ }
+
+ if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(ci = c->ci)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, c->name);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, ci->name);
+ } else if (!is_on_chan(c, u)) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_ON_CHAN, u->nick, c->name);
+ } else if (!is_founder(u, ci)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else {
+ send_cmd(whosends(ci), "MODE %s +q %s", c->name, u->nick);
+
+ av[0] = sstrdup("+q");
+ av[1] = u->nick;
+ chan_set_modes(s_ChanServ, c, 2, av, 1);
+ free(av[0]);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_deowner(User * u)
+{
+ char *av[2];
+ char *chan = strtok(NULL, " ");
+
+ Channel *c;
+ ChannelInfo *ci;
+
+ if (!chan) {
+ struct u_chanlist *uc;
+
+ av[0] = sstrdup("-q");
+ av[1] = u->nick;
+
+ /* Sets the mode to the user on every channels he is on. */
+
+ for (uc = u->chans; uc; uc = uc->next) {
+ if ((ci = uc->chan->ci) && !(ci->flags & CI_VERBOTEN)
+ && is_founder(u, ci)) {
+ send_cmd(whosends(ci), "MODE %s %s %s", uc->chan->name,
+ av[0], u->nick);
+ chan_set_modes(s_ChanServ, uc->chan, 2, av, 1);
+ }
+ }
+
+ free(av[0]);
+ return MOD_CONT;
+ }
+
+ if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(ci = c->ci)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, c->name);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, ci->name);
+ } else if (!is_on_chan(c, u)) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_ON_CHAN, u->nick, c->name);
+ } else if (!is_founder(u, ci)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else {
+ send_cmd(whosends(ci), "MODE %s -q %s", c->name, u->nick);
+
+ av[0] = sstrdup("-q");
+ av[1] = u->nick;
+ chan_set_modes(s_ChanServ, c, 2, av, 1);
+ free(av[0]);
+ }
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+static int do_cs_kick(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *params = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+
+ Channel *c;
+ ChannelInfo *ci;
+ User *u2;
+
+ int is_same;
+
+ if (!reason) {
+ reason = "Requested";
+ } else {
+ if (strlen(reason) > 200)
+ reason[200] = '\0';
+ }
+
+ if (!chan) {
+ struct u_chanlist *uc, *next;
+
+ /* Kicks the user on every channels he is on. */
+
+ for (uc = u->chans; uc; uc = next) {
+ next = uc->next;
+ if ((ci = uc->chan->ci) && !(ci->flags & CI_VERBOTEN)
+ && check_access(u, ci, CA_KICKME)) {
+ char *av[3];
+
+ if ((ci->flags & CI_SIGNKICK)
+ || ((ci->flags & CI_SIGNKICK_LEVEL)
+ && !check_access(u, ci, CA_SIGNKICK)))
+ send_cmd(whosends(ci), "KICK %s %s :%s (%s)", ci->name,
+ u->nick, reason, u->nick);
+ else
+ send_cmd(whosends(ci), "KICK %s %s :%s", ci->name,
+ u->nick, reason);
+ av[0] = ci->name;
+ av[1] = u->nick;
+ av[2] = reason;
+ do_kick(s_ChanServ, 3, av);
+ }
+ }
+
+ return MOD_CONT;
+ } else if (!params) {
+ params = u->nick;
+ }
+
+ is_same = (params == u->nick) ? 1 : (stricmp(params, u->nick) == 0);
+
+ if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(ci = c->ci)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (is_same ? !(u2 = u) : !(u2 = finduser(params))) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, params);
+ } else if (!is_on_chan(c, u2)) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_ON_CHAN, u2->nick, c->name);
+ } else if (!is_same ? !check_access(u, ci, CA_KICK) :
+ !check_access(u, ci, CA_KICKME)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else if (!is_same && (ci->flags & CI_PEACE)
+ && (get_access(u2, ci) >= get_access(u, ci))) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+#if defined (IRC_ULTIMATE) || defined (IRC_ULTIMATE3)
+ } else if (is_protected(u2)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+#endif
+ } else {
+ char *av[3];
+
+ if ((ci->flags & CI_SIGNKICK)
+ || ((ci->flags & CI_SIGNKICK_LEVEL)
+ && !check_access(u, ci, CA_SIGNKICK)))
+ send_cmd(whosends(ci), "KICK %s %s :%s (%s)", ci->name, params,
+ reason, u->nick);
+ else
+ send_cmd(whosends(ci), "KICK %s %s :%s", ci->name, params,
+ reason);
+ av[0] = ci->name;
+ av[1] = params;
+ av[2] = reason;
+ do_kick(s_ChanServ, 3, av);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_ban(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *params = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+
+ Channel *c;
+ ChannelInfo *ci;
+ User *u2;
+
+ int is_same;
+
+ if (!reason) {
+ reason = "Requested";
+ } else {
+ if (strlen(reason) > 200)
+ reason[200] = '\0';
+ }
+
+ if (!chan) {
+ struct u_chanlist *uc, *next;
+
+ /* Bans the user on every channels he is on. */
+
+ for (uc = u->chans; uc; uc = next) {
+ next = uc->next;
+ if ((ci = uc->chan->ci) && !(ci->flags & CI_VERBOTEN)
+ && check_access(u, ci, CA_BANME)) {
+ char *av[3];
+ char mask[BUFSIZE];
+
+#if defined (IRC_ULTIMATE) || defined(IRC_ULTIMATE3) || defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_HYBRID)
+ /*
+ * Dont ban/kick the user on channels where he is excepted
+ * to prevent services <-> server wars.
+ */
+ if (is_excepted(ci, u))
+ notice_lang(s_ChanServ, u, CHAN_EXCEPTED,
+ u->nick, ci->name);
+ continue;
+#endif
+ av[0] = sstrdup("+b");
+ get_idealban(ci, u, mask, sizeof(mask));
+ av[1] = mask;
+ send_cmd(whosends(ci), "MODE %s +b %s", uc->chan->name,
+ av[1]);
+ chan_set_modes(s_ChanServ, uc->chan, 2, av, 1);
+ free(av[0]);
+
+ if ((ci->flags & CI_SIGNKICK)
+ || ((ci->flags & CI_SIGNKICK_LEVEL)
+ && !check_access(u, ci, CA_SIGNKICK)))
+ send_cmd(whosends(ci), "KICK %s %s :%s (%s)", ci->name,
+ u->nick, reason, u->nick);
+ else
+ send_cmd(whosends(ci), "KICK %s %s :%s", ci->name,
+ u->nick, reason);
+ av[0] = ci->name;
+ av[1] = u->nick;
+ av[2] = reason;
+ do_kick(s_ChanServ, 3, av);
+ }
+ }
+
+ return MOD_CONT;
+ } else if (!params) {
+ params = u->nick;
+ }
+
+ is_same = (params == u->nick) ? 1 : (stricmp(params, u->nick) == 0);
+
+ if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(ci = c->ci)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (is_same ? !(u2 = u) : !(u2 = finduser(params))) {
+ notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, params);
+ } else if (!is_same ? !check_access(u, ci, CA_BAN) :
+ !check_access(u, ci, CA_BANME)) {
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ } else if (!is_same && (ci->flags & CI_PEACE)
+ && (get_access(u2, ci) >= get_access(u, ci))) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+#if defined (IRC_ULTIMATE) || defined(IRC_ULTIMATE3) || defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_HYBRID)
+ /*
+ * Dont ban/kick the user on channels where he is excepted
+ * to prevent services <-> server wars.
+ */
+ } else if (is_excepted(ci, u2)) {
+ notice_lang(s_ChanServ, u, CHAN_EXCEPTED, u2->nick, ci->name);
+#endif
+ } else {
+ char *av[3];
+ char mask[BUFSIZE];
+
+ av[0] = sstrdup("+b");
+ get_idealban(ci, u2, mask, sizeof(mask));
+ av[1] = mask;
+ send_cmd(whosends(ci), "MODE %s +b %s", c->name, av[1]);
+ chan_set_modes(s_ChanServ, c, 2, av, 1);
+ free(av[0]);
+
+ /* We still allow host banning while not allowing to kick */
+ if (!is_on_chan(c, u2))
+ return MOD_CONT;
+
+ if ((ci->flags & CI_SIGNKICK)
+ || ((ci->flags & CI_SIGNKICK_LEVEL)
+ && !check_access(u, ci, CA_SIGNKICK)))
+ send_cmd(whosends(ci), "KICK %s %s :%s (%s)", ci->name, params,
+ reason, u->nick);
+ else
+ send_cmd(whosends(ci), "KICK %s %s :%s", ci->name, params,
+ reason);
+ av[0] = ci->name;
+ av[1] = params;
+ av[2] = reason;
+ do_kick(s_ChanServ, 3, av);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_cs_topic(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *topic = strtok(NULL, "");
+
+ Channel *c;
+ ChannelInfo *ci;
+
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "TOPIC", CHAN_TOPIC_SYNTAX);
+ } else if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(ci = c->ci)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, c->name);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, ci->name);
+ } else if (!is_services_admin(u) && !check_access(u, ci, CA_TOPIC)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ if (ci->last_topic)
+ free(ci->last_topic);
+ ci->last_topic = topic ? sstrdup(topic) : NULL;
+ strscpy(ci->last_topic_setter, u->nick, NICKMAX);
+ ci->last_topic_time = time(NULL);
+
+ if (c->topic)
+ free(c->topic);
+ c->topic = topic ? sstrdup(topic) : NULL;
+ strscpy(c->topic_setter, u->nick, NICKMAX);
+#if defined(IRC_DREAMFORGE) && !defined(IRC_ULTIMATE) && !defined(IRC_UNREAL)
+ c->topic_time = c->topic_time - 1;
+#else
+ c->topic_time = ci->last_topic_time;
+#endif
+
+ if (is_services_admin(u))
+ alog("%s: %s!%s@%s changed topic of %s as services admin.",
+ s_ChanServ, u->nick, u->username, u->host, c->name);
+#ifdef IRC_HYBRID
+ if (whosends(ci) == s_ChanServ) {
+ send_cmd(NULL, "SJOIN %ld %s + :%s", time(NULL), c->name,
+ s_ChanServ);
+ send_cmd(NULL, "MODE %s +o %s", c->name, s_ChanServ);
+ }
+ send_cmd(whosends(ci), "TOPIC %s :%s", c->name,
+ c->topic ? c->topic : "");
+ if (whosends(ci) == s_ChanServ) {
+ send_cmd(s_ChanServ, "PART %s", c->name);
+ }
+#else
+ send_cmd(whosends(ci), "TOPIC %s %s %lu :%s", c->name, u->nick,
+ c->topic_time, topic ? topic : "");
+#endif
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_unban(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ Channel *c;
+ ChannelInfo *ci;
+
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "UNBAN", CHAN_UNBAN_SYNTAX);
+ } else if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(ci = c->ci)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!check_access(u, ci, CA_UNBAN)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+#ifndef IRC_BAHAMUT
+ int i;
+ char *av[3];
+ /* Save original ban info */
+ int count = c->bancount;
+ char **bans = scalloc(sizeof(char *) * count, 1);
+ memcpy(bans, c->bans, sizeof(char *) * count);
+
+ av[0] = chan;
+ av[1] = sstrdup("-b");
+ for (i = 0; i < count; i++) {
+ if (match_usermask(bans[i], u)) {
+ send_cmd(whosends(ci), "MODE %s -b %s", chan, bans[i]);
+ av[2] = sstrdup(bans[i]);
+ do_cmode(s_ChanServ, 3, av);
+ free(av[2]);
+ }
+ }
+ free(av[1]);
+ free(bans);
+#else
+ send_cmd(ServerName, "SVSMODE %s -b %s", chan, u->nick);
+#endif
+ notice_lang(s_ChanServ, u, CHAN_UNBANNED, chan);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_clear(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ char *what = strtok(NULL, " ");
+ Channel *c;
+ ChannelInfo *ci;
+
+ if (!what) {
+ syntax_error(s_ChanServ, u, "CLEAR", CHAN_CLEAR_SYNTAX);
+ } else if (!(c = findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (!(ci = c->ci)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (!u || !check_access(u, ci, CA_CLEAR)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else if (stricmp(what, "bans") == 0) {
+ char *av[3];
+ int i;
+
+ /* Save original ban info */
+ int count = c->bancount;
+ char **bans = scalloc(sizeof(char *) * count, 1);
+ for (i = 0; i < count; i++)
+ bans[i] = sstrdup(c->bans[i]);
+
+ for (i = 0; i < count; i++) {
+ av[0] = sstrdup(chan);
+ av[1] = sstrdup("-b");
+ av[2] = bans[i];
+ send_cmd(whosends(ci), "MODE %s %s :%s", av[0], av[1], av[2]);
+ do_cmode(s_ChanServ, 3, av);
+ free(av[2]);
+ free(av[1]);
+ free(av[0]);
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_BANS, chan);
+ free(bans);
+#if defined (IRC_ULTIMATE) || defined (IRC_UNREAL) || defined (IRC_ULTIMATE3) || defined(IRC_HYBRID)
+ } else if (stricmp(what, "excepts") == 0) {
+ char *av[3];
+ int i;
+
+ /* Save original except info */
+ int count = c->exceptcount;
+ char **excepts = scalloc(sizeof(char *) * count, 1);
+ for (i = 0; i < count; i++)
+ excepts[i] = sstrdup(c->excepts[i]);
+
+ for (i = 0; i < count; i++) {
+ av[0] = sstrdup(chan);
+ av[1] = sstrdup("-e");
+ av[2] = excepts[i];
+ send_cmd(whosends(ci), "MODE %s %s :%s", av[0], av[1], av[2]);
+ do_cmode(s_ChanServ, 3, av);
+ free(av[2]);
+ free(av[1]);
+ free(av[0]);
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_EXCEPTS, chan);
+ free(excepts);
+#endif
+ } else if (stricmp(what, "modes") == 0) {
+ char buf[BUFSIZE], *end = buf;
+ char *argv[2];
+
+ if (c->mode) {
+ /* Clear modes */
+ send_cmd(s_ChanServ, "MODE %s %s %s", c->name, MODESTOREMOVE,
+ c->key ? c->key : "");
+ argv[0] = sstrdup(MODESTOREMOVE);
+ argv[1] = c->key ? c->key : NULL;
+ chan_set_modes(s_OperServ, c, c->key ? 2 : 1, argv, 0);
+ free(argv[0]);
+ check_modes(c);
+ }
+
+ /* TODO: decide if the above implementation is better than this one. */
+
+ if (0) {
+ CBModeInfo *cbmi = cbmodeinfos;
+ CBMode *cbm;
+
+ do {
+ if (c->mode & cbmi->flag)
+ *end++ = cbmi->mode;
+ } while ((++cbmi)->flag != 0);
+
+ cbmi = cbmodeinfos;
+
+ do {
+ if (cbmi->getvalue && (c->mode & cbmi->flag)
+ && !(cbmi->flags & CBM_MINUS_NO_ARG)) {
+ char *value = cbmi->getvalue(c);
+
+ if (value) {
+ *end++ = ' ';
+ while (*value)
+ *end++ = *value++;
+
+ /* Free the value */
+ cbm = &cbmodes[(int) cbmi->mode];
+ cbm->setvalue(c, NULL);
+ }
+ }
+ } while ((++cbmi)->flag != 0);
+
+ *end = 0;
+
+ send_cmd(whosends(ci), "MODE %s -%s", c->name, buf);
+ c->mode = 0;
+ check_modes(c);
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_MODES, chan);
+ } else if (stricmp(what, "ops") == 0) {
+ char *av[3];
+ struct c_userlist *cu, *next;
+
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ if (!chan_has_user_status(c, cu->user, CUS_OP))
+ continue;
+ av[0] = sstrdup(chan);
+ av[1] = sstrdup("-o");
+ av[2] = sstrdup(cu->user->nick);
+ send_cmd(whosends(ci), "MODE %s %s :%s", av[0], av[1], av[2]);
+ do_cmode(s_ChanServ, 3, av);
+ free(av[2]);
+ free(av[1]);
+ free(av[0]);
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_OPS, chan);
+ } else if (stricmp(what, "voices") == 0) {
+ char *av[3];
+ struct c_userlist *cu, *next;
+
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ if (!chan_has_user_status(c, cu->user, CUS_VOICE))
+ continue;
+ av[0] = sstrdup(chan);
+ av[1] = sstrdup("-v");
+ av[2] = sstrdup(cu->user->nick);
+ send_cmd(whosends(ci), "MODE %s %s :%s", av[0], av[1], av[2]);
+ do_cmode(s_ChanServ, 3, av);
+ free(av[2]);
+ free(av[1]);
+ free(av[0]);
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_VOICES, chan);
+ } else if (stricmp(what, "users") == 0) {
+ char *av[3];
+ struct c_userlist *cu, *next;
+ char buf[256];
+
+ snprintf(buf, sizeof(buf), "CLEAR USERS command from %s", u->nick);
+
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ av[0] = sstrdup(chan);
+ av[1] = sstrdup(cu->user->nick);
+ av[2] = sstrdup(buf);
+ send_cmd(whosends(ci), "KICK %s %s :%s", av[0], av[1], av[2]);
+ do_kick(s_ChanServ, 3, av);
+ free(av[2]);
+ free(av[1]);
+ free(av[0]);
+ }
+ notice_lang(s_ChanServ, u, CHAN_CLEARED_USERS, chan);
+ } else {
+ syntax_error(s_ChanServ, u, "CLEAR", CHAN_CLEAR_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_getkey(User * u)
+{
+ char *chan = strtok(NULL, " ");
+ ChannelInfo *ci;
+
+ if (chan && (ci = cs_findchan(chan)) && !(ci->flags & CI_VERBOTEN)
+ && check_access(u, ci, CA_GETKEY)) {
+ notice_user(s_ChanServ, u, "KEY %s %s", ci->name,
+ (ci->
+ c ? (ci->c->key ? ci->c->key : "NO KEY") : "NO KEY"));
+ } else {
+ notice_user(s_ChanServ, u, "KEY %s ERROR", chan);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_getpass(User * u)
+{
+#ifndef USE_ENCRYPTION
+ char *chan = strtok(NULL, " ");
+ ChannelInfo *ci;
+#endif
+
+ /* Assumes that permission checking has already been done. */
+#ifdef USE_ENCRYPTION
+ notice_lang(s_ChanServ, u, CHAN_GETPASS_UNAVAILABLE);
+#else
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "GETPASS", CHAN_GETPASS_SYNTAX);
+ } else if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else if (CSRestrictGetPass && !is_services_root(u)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else {
+ alog("%s: %s!%s@%s used GETPASS on %s",
+ s_ChanServ, u->nick, u->username, GetHost(u), ci->name);
+ if (WallGetpass) {
+ wallops(s_ChanServ, "\2%s\2 used GETPASS on channel \2%s\2",
+ u->nick, chan);
+ }
+ notice_lang(s_ChanServ, u, CHAN_GETPASS_PASSWORD_IS,
+ chan, ci->founderpass);
+ }
+#endif
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_sendpass(User * u)
+{
+#ifndef USE_ENCRYPTION
+ char *chan = strtok(NULL, " ");
+ ChannelInfo *ci;
+ NickCore *founder;
+#endif
+
+#ifdef USE_ENCRYPTION
+ notice_lang(s_ChanServ, u, CHAN_SENDPASS_UNAVAILABLE);
+#else
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "SENDPASS", CHAN_SENDPASS_SYNTAX);
+ } else if (RestrictMail && !is_oper(u)) {
+ notice_lang(s_ChanServ, u, PERMISSION_DENIED);
+ } else if (!(ci = cs_findchan(chan)) || !(founder = ci->founder)) {
+ notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
+ } else {
+ char buf[BUFSIZE];
+ MailInfo *mail;
+
+ snprintf(buf, sizeof(buf),
+ getstring2(founder, CHAN_SENDPASS_SUBJECT), ci->name);
+ mail = MailBegin(u, founder, buf, s_ChanServ);
+ if (!mail)
+ return MOD_CONT;
+
+ fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_HEAD));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_1),
+ ci->name);
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_2),
+ ci->founderpass);
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_3));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_4));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(founder, CHAN_SENDPASS_LINE_5),
+ NetworkName);
+ fprintf(mail->pipe, "\n.\n");
+
+ MailEnd(mail);
+
+ alog("%s: %s!%s@%s used SENDPASS on %s", s_ChanServ, u->nick,
+ u->username, GetHost(u), chan);
+ notice_lang(s_ChanServ, u, CHAN_SENDPASS_OK, chan);
+ }
+#endif
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_forbid(User * u)
+{
+ ChannelInfo *ci;
+ char *chan = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+
+ Channel *c;
+
+ /* Assumes that permission checking has already been done. */
+ if (!chan || (ForceForbidReason && !reason)) {
+ syntax_error(s_ChanServ, u, "FORBID",
+ (ForceForbidReason ? CHAN_FORBID_SYNTAX_REASON :
+ CHAN_FORBID_SYNTAX));
+ return MOD_CONT;
+ }
+ if (readonly)
+ notice_lang(s_ChanServ, u, READ_ONLY_MODE);
+ if ((ci = cs_findchan(chan)) != NULL)
+ delchan(ci);
+ ci = makechan(chan);
+ if (ci) {
+ ci->flags |= CI_VERBOTEN;
+ ci->forbidby = sstrdup(u->nick);
+ if (reason)
+ ci->forbidreason = sstrdup(reason);
+
+ if ((c = findchan(ci->name))) {
+ struct c_userlist *cu, *next;
+ char *av[3];
+
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+
+ if (is_oper(cu->user))
+ continue;
+
+ av[0] = c->name;
+ av[1] = cu->user->nick;
+ av[2] = reason ? reason : "CHAN_FORBID_REASON";
+ send_cmd(s_ChanServ, "KICK %s %s :%s", av[0], av[1],
+ av[2]);
+ do_kick(s_ChanServ, 3, av);
+ }
+ }
+
+ if (WallForbid)
+ wallops(s_ChanServ, "\2%s\2 used FORBID on channel \2%s\2",
+ u->nick, ci->name);
+
+ alog("%s: %s set FORBID for channel %s", s_ChanServ, u->nick,
+ ci->name);
+ notice_lang(s_ChanServ, u, CHAN_FORBID_SUCCEEDED, chan);
+ } else {
+ alog("%s: Valid FORBID for %s by %s failed", s_ChanServ, ci->name,
+ u->nick);
+ notice_lang(s_ChanServ, u, CHAN_FORBID_FAILED, chan);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_suspend(User * u)
+{
+ ChannelInfo *ci;
+ char *chan = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+
+ Channel *c;
+
+ /* Assumes that permission checking has already been done. */
+ if (!chan || (ForceForbidReason && !reason)) {
+ syntax_error(s_ChanServ, u, "SUSPEND",
+ (ForceForbidReason ? CHAN_SUSPEND_SYNTAX_REASON :
+ CHAN_SUSPEND_SYNTAX));
+ return MOD_CONT;
+ }
+ if (readonly)
+ notice_lang(s_ChanServ, u, READ_ONLY_MODE);
+ if ((ci = cs_findchan(chan)) == NULL)
+ ci = makechan(chan);
+ if (ci) {
+ ci->flags |= CI_SUSPENDED;
+ ci->forbidby = sstrdup(u->nick);
+ if (reason)
+ ci->forbidreason = sstrdup(reason);
+
+ if ((c = findchan(ci->name))) {
+ struct c_userlist *cu, *next;
+ char *av[3];
+
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+
+ if (is_oper(cu->user))
+ continue;
+
+ av[0] = c->name;
+ av[1] = cu->user->nick;
+ av[2] = reason ? reason : "CHAN_SUSPEND_REASON";
+ send_cmd(s_ChanServ, "KICK %s %s :%s", av[0], av[1],
+ av[2]);
+ do_kick(s_ChanServ, 3, av);
+ }
+ }
+
+ if (WallForbid)
+ wallops(s_ChanServ, "\2%s\2 used SUSPEND on channel \2%s\2",
+ u->nick, ci->name);
+
+ alog("%s: %s set SUSPEND for channel %s", s_ChanServ, u->nick,
+ ci->name);
+ notice_lang(s_ChanServ, u, CHAN_SUSPEND_SUCCEEDED, chan);
+ } else {
+ alog("%s: Valid SUSPEND for %s by %s failed", s_ChanServ, ci->name,
+ u->nick);
+ notice_lang(s_ChanServ, u, CHAN_SUSPEND_FAILED, chan);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_unsuspend(User * u)
+{
+ ChannelInfo *ci;
+ char *chan = strtok(NULL, " ");
+
+ /* Assumes that permission checking has already been done. */
+ if (!chan) {
+ syntax_error(s_ChanServ, u, "UNSUSPEND", CHAN_UNSUSPEND_SYNTAX);
+ return MOD_CONT;
+ }
+ if (chan[0] != '#') {
+ notice_lang(s_ChanServ, u, CHAN_UNSUSPEND_ERROR);
+ return MOD_CONT;
+ }
+ if (readonly)
+ notice_lang(s_ChanServ, u, READ_ONLY_MODE);
+
+ ci = cs_findchan(chan);
+
+ if (ci) {
+ ci->flags &= ~CI_SUSPENDED;
+ ci->forbidreason = NULL;
+ ci->forbidby = NULL;
+
+ if (WallForbid)
+ wallops(s_ChanServ, "\2%s\2 used UNSUSPEND on channel \2%s\2",
+ u->nick, ci->name);
+
+ alog("%s: %s set UNSUSPEND for channel %s", s_ChanServ, u->nick,
+ ci->name);
+ notice_lang(s_ChanServ, u, CHAN_UNSUSPEND_SUCCEEDED, chan);
+ } else {
+ alog("%s: Valid UNSUSPEND for %s by %s failed", s_ChanServ,
+ chan, u->nick);
+ notice_lang(s_ChanServ, u, CHAN_UNSUSPEND_FAILED, chan);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_status(User * u)
+{
+ ChannelInfo *ci;
+ User *u2;
+ char *nick, *chan;
+
+ chan = strtok(NULL, " ");
+ nick = strtok(NULL, " ");
+ if (!nick || strtok(NULL, " ")) {
+ notice_user(s_ChanServ, u, "STATUS ERROR Syntax error");
+ return MOD_CONT;
+ }
+ if (!(ci = cs_findchan(chan))) {
+ char *temp = chan;
+ chan = nick;
+ nick = temp;
+ ci = cs_findchan(chan);
+ }
+ if (!ci) {
+ notice_user(s_ChanServ, u,
+ "STATUS ERROR Channel %s not registered", chan);
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_user(s_ChanServ, u, "STATUS ERROR Channel %s forbidden",
+ chan);
+ return MOD_CONT;
+ } else if ((u2 = finduser(nick)) != NULL) {
+ notice_user(s_ChanServ, u, "STATUS %s %s %d", chan, nick,
+ get_access(u2, ci));
+ } else { /* !u2 */
+ notice_user(s_ChanServ, u, "STATUS ERROR Nick %s not online",
+ nick);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
diff --git a/commands.c b/commands.c
new file mode 100644
index 000000000..0e45603eb
--- /dev/null
+++ b/commands.c
@@ -0,0 +1,178 @@
+/* Routines for looking up commands in a *Serv command list.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: commands.c,v 1.13 2003/09/22 21:40:23 rob Exp $
+ *
+ */
+
+#include "services.h"
+#include "commands.h"
+#include "language.h"
+
+/*************************************************************************/
+
+/* Return the Command corresponding to the given name, or NULL if no such
+ * command exists.
+ */
+
+Command *lookup_cmd(Command * list, const char *cmd)
+{
+ Command *c;
+
+ for (c = list; c->name; c++) {
+ if (stricmp(c->name, cmd) == 0)
+ return c;
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Run the routine for the given command, if it exists and the user has
+ * privilege to do so; if not, print an appropriate error message.
+ */
+
+void run_cmd(const char *service, User * u, Command * list,
+ const char *cmd)
+{
+ Command *c = lookup_cmd(list, cmd);
+ do_run_cmd(service, u, c, cmd);
+}
+
+void mod_run_cmd(const char *service, User * u, CommandHash * cmdTable[],
+ const char *cmd)
+{
+ Command *c = findCommand(cmdTable, cmd);
+ do_run_cmd(service, u, c, cmd);
+}
+
+void do_run_cmd(const char *service, User * u, Command * c,
+ const char *cmd)
+{
+ int retVal = 0;
+ Command *current;
+
+ if (c && c->routine) {
+ if ((checkDefCon(DEFCON_OPER_ONLY)
+ || checkDefCon(DEFCON_SILENT_OPER_ONLY)) && !is_oper(u)) {
+ if (!checkDefCon(DEFCON_SILENT_OPER_ONLY)) {
+ notice_lang(service, u, OPER_DEFCON_DENIED);
+ }
+ } else {
+ if ((c->has_priv == NULL) || c->has_priv(u)) {
+ mod_current_module_name = c->mod_name;
+ retVal = c->routine(u);
+ mod_current_module_name = NULL;
+ if (retVal == MOD_CONT) {
+ current = c->next;
+ while (current && retVal == MOD_CONT) {
+ mod_current_module_name = c->mod_name;
+ retVal = current->routine(u);
+ mod_current_module_name = NULL;
+ current = current->next;
+ }
+ }
+ }
+
+ else {
+ notice_lang(service, u, ACCESS_DENIED);
+ alog("Access denied for %s with service %s and command %s",
+ u->nick, service, cmd);
+ }
+ }
+ } else {
+ if ((!checkDefCon(DEFCON_SILENT_OPER_ONLY)) || is_oper(u))
+ notice_lang(service, u, UNKNOWN_COMMAND_HELP, cmd, service);
+ }
+}
+
+/*************************************************************************/
+
+/* Print a help message for the given command. */
+
+void do_help_cmd(const char *service, User * u, Command * c,
+ const char *cmd)
+{
+ Command *current;
+ int has_had_help = 0;
+ int cont = MOD_CONT;
+ const char *p1 = NULL, *p2 = NULL, *p3 = NULL, *p4 = NULL;
+
+ for (current = c; (current) && (cont == MOD_CONT);
+ current = current->next) {
+ p1 = current->help_param1;
+ p2 = current->help_param2;
+ p3 = current->help_param3;
+ p4 = current->help_param4;
+ if (current->helpmsg_all >= 0) {
+ notice_help(service, u, current->helpmsg_all, p1, p2, p3, p4);
+ has_had_help = 1;
+ } else if (current->all_help) {
+ cont = current->all_help(u);
+ has_had_help = 1;
+ }
+ if (is_services_root(u)) {
+ if (current->helpmsg_root >= 0) {
+ notice_help(service, u, current->helpmsg_root, p1, p2, p3,
+ p4);
+ has_had_help = 1;
+ } else if (current->root_help) {
+ cont = current->root_help(u);
+ has_had_help = 1;
+ }
+ } else if (is_services_admin(u)) {
+ if (current->helpmsg_admin >= 0) {
+ notice_help(service, u, current->helpmsg_admin, p1, p2, p3,
+ p4);
+ has_had_help = 1;
+ } else if (current->admin_help) {
+ cont = current->admin_help(u);
+ has_had_help = 1;
+ }
+ } else if (is_services_oper(u)) {
+ if (current->helpmsg_oper >= 0) {
+ notice_help(service, u, current->helpmsg_oper, p1, p2, p3,
+ p4);
+ has_had_help = 1;
+ } else if (current->oper_help) {
+ cont = current->oper_help(u);
+ has_had_help = 1;
+ }
+ } else {
+ if (current->helpmsg_reg >= 0) {
+ notice_help(service, u, current->helpmsg_reg, p1, p2, p3,
+ p4);
+ has_had_help = 1;
+ } else if (current->regular_help) {
+ cont = current->regular_help(u);
+ has_had_help = 1;
+ }
+ }
+ }
+ if (has_had_help == 0) {
+ notice_lang(service, u, NO_HELP_AVAILABLE, cmd);
+ }
+}
+
+void help_cmd(const char *service, User * u, Command * list,
+ const char *cmd)
+{
+ Command *c = lookup_cmd(list, cmd);
+ do_help_cmd(service, u, c, cmd);
+}
+
+void mod_help_cmd(const char *service, User * u, CommandHash * cmdTable[],
+ const char *cmd)
+{
+ Command *c = findCommand(cmdTable, cmd);
+ do_help_cmd(service, u, c, cmd);
+}
+
+/*************************************************************************/
diff --git a/commands.h b/commands.h
new file mode 100644
index 000000000..28c197fe3
--- /dev/null
+++ b/commands.h
@@ -0,0 +1,34 @@
+/* Declarations for command data.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: commands.h,v 1.6 2003/08/16 22:13:47 rob Exp $
+ *
+ */
+
+ #include "modules.h"
+
+/*************************************************************************/
+
+/* Routines for looking up commands. Command lists are arrays that must be
+ * terminated with a NULL name.
+ */
+
+extern Command *lookup_cmd(Command *list, const char *name);
+extern void run_cmd(const char *service, User *u, Command *list,
+ const char *name);
+extern void help_cmd(const char *service, User *u, Command *list,
+ const char *name);
+extern void do_run_cmd(const char *service, User * u, Command *c,const char *cmd);
+extern void do_help_cmd(const char *service, User * u, Command *c,const char *cmd);
+extern void mod_help_cmd(const char *service, User *u, CommandHash *cmdTable[],const char *cmd);
+extern void mod_run_cmd(const char *service, User *u, CommandHash *cmdTable[],const char *cmd);
+
+extern char *mod_current_module_name;
+/*************************************************************************/
diff --git a/compat.c b/compat.c
new file mode 100644
index 000000000..33b3f1480
--- /dev/null
+++ b/compat.c
@@ -0,0 +1,212 @@
+/* Compatibility routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: compat.c,v 1.5 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+#if !HAVE_SNPRINTF
+
+/* [v]snprintf: Like [v]sprintf, but don't write more than len bytes
+ * (including null terminator). Return the number of bytes
+ * written.
+ */
+
+#if BAD_SNPRINTF
+int vsnprintf(char *buf, size_t len, const char *fmt, va_list args)
+{
+ if (len <= 0)
+ return 0;
+ *buf = 0;
+#undef vsnprintf
+ vsnprintf(buf, len, fmt, args);
+#define vsnprintf my_vsnprintf
+ buf[len - 1] = 0;
+ return strlen(buf);
+}
+#endif /* BAD_SNPRINTF */
+
+int snprintf(char *buf, size_t len, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ return vsnprintf(buf, len, fmt, args);
+}
+
+#endif /* !HAVE_SNPRINTF */
+
+/*************************************************************************/
+
+#if !HAVE_STRICMP && !HAVE_STRCASECMP
+
+/* stricmp, strnicmp: Case-insensitive versions of strcmp() and
+ * strncmp().
+ */
+
+int stricmp(const char *s1, const char *s2)
+{
+ register int c;
+
+ while ((c = tolower(*s1)) == tolower(*s2)) {
+ if (c == 0)
+ return 0;
+ s1++;
+ s2++;
+ }
+ if (c < tolower(*s2))
+ return -1;
+ return 1;
+}
+
+int strnicmp(const char *s1, const char *s2, size_t len)
+{
+ register int c;
+
+ if (!len)
+ return 0;
+ while ((c = tolower(*s1)) == tolower(*s2) && len > 0) {
+ if (c == 0 || --len == 0)
+ return 0;
+ s1++;
+ s2++;
+ }
+ if (c < tolower(*s2))
+ return -1;
+ return 1;
+}
+#endif
+
+/*************************************************************************/
+
+#if !HAVE_STRDUP
+char *strdup(const char *s)
+{
+ char *new = calloc(strlen(s) + 1, 1);
+ if (new)
+ strcpy(new, s);
+ return new;
+}
+#endif
+
+/*************************************************************************/
+
+#if !HAVE_STRSPN
+size_t strspn(const char *s, const char *accept)
+{
+ size_t i = 0;
+
+ while (*s && strchr(accept, *s))
+ ++i, ++s;
+ return i;
+}
+#endif
+
+/*************************************************************************/
+
+#if !HAVE_STRERROR
+# if HAVE_SYS_ERRLIST
+extern char *sys_errlist[];
+# endif
+
+char *strerror(int errnum)
+{
+# if HAVE_SYS_ERRLIST
+ return sys_errlist[errnum];
+# else
+ static char buf[20];
+ snprintf(buf, sizeof(buf), "Error %d", errnum);
+ return buf;
+# endif
+}
+#endif
+
+/*************************************************************************/
+
+#if !HAVE_STRSIGNAL
+char *strsignal(int signum)
+{
+ static char buf[32];
+ switch (signum) {
+ case SIGHUP:
+ strscpy(buf, "Hangup", sizeof(buf));
+ break;
+ case SIGINT:
+ strscpy(buf, "Interrupt", sizeof(buf));
+ break;
+ case SIGQUIT:
+ strscpy(buf, "Quit", sizeof(buf));
+ break;
+#ifdef SIGILL
+ case SIGILL:
+ strscpy(buf, "Illegal instruction", sizeof(buf));
+ break;
+#endif
+#ifdef SIGABRT
+ case SIGABRT:
+ strscpy(buf, "Abort", sizeof(buf));
+ break;
+#endif
+#if defined(SIGIOT) && (!defined(SIGABRT) || SIGIOT != SIGABRT)
+ case SIGIOT:
+ strscpy(buf, "IOT trap", sizeof(buf));
+ break;
+#endif
+#ifdef SIGBUS
+ case SIGBUS:
+ strscpy(buf, "Bus error", sizeof(buf));
+ break;
+#endif
+ case SIGFPE:
+ strscpy(buf, "Floating point exception", sizeof(buf));
+ break;
+ case SIGKILL:
+ strscpy(buf, "Killed", sizeof(buf));
+ break;
+ case SIGUSR1:
+ strscpy(buf, "User signal 1", sizeof(buf));
+ break;
+ case SIGSEGV:
+ strscpy(buf, "Segmentation fault", sizeof(buf));
+ break;
+ case SIGUSR2:
+ strscpy(buf, "User signal 2", sizeof(buf));
+ break;
+ case SIGPIPE:
+ strscpy(buf, "Broken pipe", sizeof(buf));
+ break;
+ case SIGALRM:
+ strscpy(buf, "Alarm clock", sizeof(buf));
+ break;
+ case SIGTERM:
+ strscpy(buf, "Terminated", sizeof(buf));
+ break;
+ case SIGSTOP:
+ strscpy(buf, "Suspended (signal)", sizeof(buf));
+ break;
+ case SIGTSTP:
+ strscpy(buf, "Suspended", sizeof(buf));
+ break;
+ case SIGIO:
+ strscpy(buf, "I/O error", sizeof(buf));
+ break;
+ default:
+ snprintf(buf, sizeof(buf), "Signal %d\n", signum);
+ break;
+ }
+ return buf;
+}
+#endif
+
+/*************************************************************************/
diff --git a/config.c b/config.c
new file mode 100644
index 000000000..e2e34a33e
--- /dev/null
+++ b/config.c
@@ -0,0 +1,1283 @@
+/* Configuration file handling.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: config.c,v 1.56 2004/03/21 14:08:53 rob Exp $
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+/* Configurable variables: */
+
+char *RemoteServer;
+int RemotePort;
+char *RemotePassword;
+
+char *RemoteServer2;
+int RemotePort2;
+char *RemotePassword2;
+
+char *RemoteServer3;
+int RemotePort3;
+char *RemotePassword3;
+
+char *LocalHost;
+int LocalPort;
+
+char *ServerName;
+char *ServerDesc;
+char *ServiceUser;
+char *ServiceHost;
+static char *temp_userhost;
+
+char *HelpChannel;
+char *LogChannel;
+char *NetworkDomain;
+char **NetworkDomains;
+int DomainNumber;
+char *NetworkName;
+
+char *s_NickServ;
+char *s_ChanServ;
+char *s_MemoServ;
+char *s_BotServ;
+char *s_HelpServ;
+char *s_OperServ;
+char *s_GlobalNoticer;
+char *s_DevNull;
+char *desc_NickServ;
+char *desc_ChanServ;
+char *desc_MemoServ;
+char *desc_BotServ;
+char *desc_HelpServ;
+char *desc_OperServ;
+char *desc_GlobalNoticer;
+char *desc_DevNull;
+
+char *HostDBName; /* Name of HostServ DB File */
+char *s_HostServ; /* HostServ Name */
+char *desc_HostServ; /* HostServ Description */
+
+char *s_NickServAlias;
+char *s_ChanServAlias;
+char *s_MemoServAlias;
+char *s_BotServAlias;
+char *s_HelpServAlias;
+char *s_OperServAlias;
+char *s_GlobalNoticerAlias;
+char *s_DevNullAlias;
+char *s_HostServAlias;
+char *desc_NickServAlias;
+char *desc_ChanServAlias;
+char *desc_MemoServAlias;
+char *desc_BotServAlias;
+char *desc_HelpServAlias;
+char *desc_OperServAlias;
+char *desc_GlobalNoticerAlias;
+char *desc_DevNullAlias;
+char *desc_HostServAlias;
+
+char *PIDFilename;
+char *MOTDFilename;
+char *NickDBName;
+char *PreNickDBName;
+char *ChanDBName;
+char *BotDBName;
+char *OperDBName;
+char *AutokillDBName;
+char *NewsDBName;
+
+char *HostSetter;
+char **HostSetters;
+int HostNumber = 0; /* needs to be set to 0 */
+
+int NoBackupOkay;
+int StrictPasswords;
+int BadPassLimit;
+int BadPassTimeout;
+int UpdateTimeout;
+int ExpireTimeout;
+int ReadTimeout;
+int WarningTimeout;
+int TimeoutCheck;
+int KeepLogs;
+int KeepBackups;
+int ForceForbidReason;
+int UsePrivmsg;
+int DumpCore;
+int LogUsers;
+
+int UseMail;
+char *SendMailPath;
+char *SendFrom;
+int RestrictMail;
+int MailDelay;
+int DontQuoteAddresses;
+
+int ProxyDetect;
+int ProxyThreads;
+char *ProxyMessage[8];
+int ProxyCheckWingate;
+int ProxyCheckSocks4;
+int ProxyCheckSocks5;
+int ProxyCheckHTTP1;
+int ProxyCheckHTTP2;
+int ProxyCheckHTTP3;
+int ProxyTimeout;
+char *ProxyTestServer;
+int ProxyTestPort;
+int ProxyExpire;
+int ProxyCacheExpire;
+char *ProxyAkillReason;
+int WallProxy;
+int ProxyMax;
+
+static int NSDefNone;
+char *NSGuestNickPrefix;
+int NSAllowKillImmed;
+int NSNoGroupChange;
+int NSDefKill;
+int NSDefKillQuick;
+int NSDefSecure;
+int NSDefPrivate;
+int NSDefMsg;
+int NSDefHideEmail;
+int NSDefHideUsermask;
+int NSDefHideQuit;
+int NSDefMemoSignon;
+int NSDefMemoReceive;
+int NSDefFlags;
+int NSDefLanguage;
+int NSRegDelay;
+int NSExpire;
+int NSRExpire;
+int NSForceEmail;
+int NSMaxAliases;
+int NSAccessMax;
+char *NSEnforcerUser;
+char *NSEnforcerHost;
+static char *temp_nsuserhost;
+int NSReleaseTimeout;
+int NSListOpersOnly;
+int NSListMax;
+int NSSecureAdmins;
+int NSStrictPrivileges;
+int NSEmailReg;
+int NSModeOnID;
+int NSRestrictGetPass;
+
+int CSDefNone;
+int CSDefKeepTopic;
+int CSDefOpNotice;
+int CSDefPeace;
+int CSDefPrivate;
+int CSDefRestricted;
+int CSDefSecure;
+int CSDefSecureOps;
+int CSDefSecureFounder;
+int CSDefSignKick;
+int CSDefSignKickLevel;
+int CSDefTopicLock;
+int CSDefXOP;
+int CSDefFlags;
+int CSMaxReg;
+int CSExpire;
+int CSDefBantype;
+int CSAccessMax;
+int CSAutokickMax;
+char *CSAutokickReason;
+int CSInhabit;
+int CSListOpersOnly;
+int CSListMax;
+int CSRestrictGetPass;
+int CSOpersOnly;
+
+int MSMaxMemos;
+int MSSendDelay;
+int MSNotifyAll;
+
+int BSDefDontKickOps;
+int BSDefDontKickVoices;
+int BSDefFantasy;
+int BSDefGreet;
+int BSDefSymbiosis;
+int BSDefFlags;
+int BSKeepData;
+int BSMinUsers;
+int BSBadWordsMax;
+int BSSmartJoin;
+int BSGentleBWReason;
+
+int HideStatsO;
+int GlobalOnCycle;
+int AnonymousGlobal;
+char *GlobalOnCycleMessage;
+char *GlobalOnCycleUP;
+char *ServicesRoot;
+char **ServicesRoots;
+int RootNumber;
+int SuperAdmin;
+int LogBot;
+int LogMaxUsers;
+int DisableRaw;
+int AutokillExpiry;
+int ChankillExpiry;
+int SGLineExpiry;
+int SQLineExpiry;
+int SZLineExpiry;
+int AkillOnAdd;
+int WallOper;
+int WallBadOS;
+int WallOSGlobal;
+int WallOSMode;
+int WallOSClearmodes;
+int WallOSKick;
+int WallOSAkill;
+int WallOSSGLine;
+int WallOSSQLine;
+int WallOSSZLine;
+int WallOSNoOp;
+int WallOSJupe;
+int WallOSRaw;
+int WallAkillExpire;
+int WallSGLineExpire;
+int WallSQLineExpire;
+int WallSZLineExpire;
+int WallExceptionExpire;
+int WallDrop;
+int WallForbid;
+int WallGetpass;
+int WallSetpass;
+int CheckClones;
+int CloneMinUsers;
+int CloneMaxDelay;
+int CloneWarningDelay;
+int KillClones;
+int AddAkiller;
+
+int KillClonesAkillExpire;
+
+int LimitSessions;
+int DefSessionLimit;
+int ExceptionExpiry;
+int MaxSessionKill;
+int MaxSessionLimit;
+int SessionAutoKillExpiry;
+char *ExceptionDBName;
+char *SessionLimitExceeded;
+char *SessionLimitDetailsLoc;
+
+char *Modules;
+char *ModulesDelayed;
+char **ModulesAutoload;
+int ModulesNumber;
+int ModulesDelayedNumber;
+char **ModulesDelayedAutoload;
+
+char *MysqlHost;
+char *MysqlUser;
+char *MysqlPass;
+char *MysqlName;
+int MysqlPort;
+char *MysqlSecure;
+char *MysqlSock;
+int MysqlRetries = 0;
+int MysqlRetryGap = 0;
+
+int DefConLevel;
+int DefCon1;
+int DefCon2;
+int DefCon3;
+int DefCon4;
+int DefCon5;
+int DefCon[6];
+char *DefConTimeOut;
+int DefConSessionLimit;
+char *DefConAKILL;
+char *DefConChanModes;
+int GlobalOnDefcon;
+int GlobalOnDefconMore;
+char *DefConOffMessage;
+char *DefconMessage;
+char *DefConAkillReason;
+
+/*************************************************************************/
+
+/* Deprecated directive (dep_) and value checking (chk_) functions: */
+
+static void dep_ListOpersOnly(void)
+{
+ NSListOpersOnly = 1;
+ CSListOpersOnly = 1;
+}
+
+/*************************************************************************/
+
+#define MAXPARAMS 8
+
+/* Configuration directives */
+
+typedef struct {
+ char *name;
+ struct {
+ int type; /* PARAM_* below */
+ int flags; /* Same */
+ void *ptr; /* Pointer to where to store the value */
+ } params[MAXPARAMS];
+} Directive;
+
+#define PARAM_NONE 0
+#define PARAM_INT 1
+#define PARAM_POSINT 2 /* Positive integer only */
+#define PARAM_PORT 3 /* 1..65535 only */
+#define PARAM_STRING 4
+#define PARAM_TIME 5
+#define PARAM_STRING_ARRAY 6 /* Array of string */
+#define PARAM_SET -1 /* Not a real parameter; just set the
+ * given integer variable to 1 */
+#define PARAM_DEPRECATED -2 /* Set for deprecated directives; `ptr'
+ * is a function pointer to call */
+
+/* Flags: */
+#define PARAM_OPTIONAL 0x01
+#define PARAM_FULLONLY 0x02 /* Directive only allowed if !STREAMLINED */
+#define PARAM_RELOAD 0x04 /* Directive is reloadable */
+
+Directive directives[] = {
+ {"AkillOnAdd", {{PARAM_SET, PARAM_RELOAD, &AkillOnAdd}}},
+ {"AutokillDB", {{PARAM_STRING, PARAM_RELOAD, &AutokillDBName}}},
+ {"AutokillExpiry", {{PARAM_TIME, PARAM_RELOAD, &AutokillExpiry}}},
+ {"ChankillExpiry", {{PARAM_TIME, PARAM_RELOAD, &ChankillExpiry}}},
+ {"BadPassLimit", {{PARAM_POSINT, PARAM_RELOAD, &BadPassLimit}}},
+ {"BadPassTimeout", {{PARAM_TIME, PARAM_RELOAD, &BadPassTimeout}}},
+ {"BotServDB", {{PARAM_STRING, PARAM_RELOAD, &BotDBName}}},
+ {"BotServName", {{PARAM_STRING, 0, &s_BotServ},
+ {PARAM_STRING, 0, &desc_BotServ}}},
+ {"BotServAlias", {{PARAM_STRING, 0, &s_BotServAlias},
+ {PARAM_STRING, 0, &desc_BotServAlias}}},
+ {"BSBadWordsMax", {{PARAM_POSINT, PARAM_RELOAD, &BSBadWordsMax}}},
+ {"BSDefDontKickOps", {{PARAM_SET, PARAM_RELOAD, &BSDefDontKickOps}}},
+ {"BSDefDontKickVoices",
+ {{PARAM_SET, PARAM_RELOAD, &BSDefDontKickVoices}}},
+ {"BSDefGreet", {{PARAM_SET, PARAM_RELOAD, &BSDefGreet}}},
+ {"BSDefFantasy", {{PARAM_SET, PARAM_RELOAD, &BSDefFantasy}}},
+ {"BSDefSymbiosis", {{PARAM_SET, PARAM_RELOAD, &BSDefSymbiosis}}},
+ {"BSGentleBWReason", {{PARAM_SET, PARAM_RELOAD, &BSGentleBWReason}}},
+ {"BSKeepData", {{PARAM_TIME, PARAM_RELOAD, &BSKeepData}}},
+ {"BSMinUsers", {{PARAM_POSINT, PARAM_RELOAD, &BSMinUsers}}},
+ {"BSSmartJoin", {{PARAM_SET, PARAM_RELOAD, &BSSmartJoin}}},
+ {"HostServDB", {{PARAM_STRING, PARAM_RELOAD, &HostDBName}}},
+ {"HostServName", {{PARAM_STRING, 0, &s_HostServ},
+ {PARAM_STRING, 0, &desc_HostServ}}},
+ {"ChanServDB", {{PARAM_STRING, PARAM_RELOAD, &ChanDBName}}},
+ {"ChanServName", {{PARAM_STRING, 0, &s_ChanServ},
+ {PARAM_STRING, 0, &desc_ChanServ}}},
+ {"ChanServAlias", {{PARAM_STRING, 0, &s_ChanServAlias},
+ {PARAM_STRING, 0, &desc_ChanServAlias}}},
+ {"CheckClones", {{PARAM_SET, PARAM_FULLONLY, &CheckClones},
+ {PARAM_POSINT, 0, &CloneMinUsers},
+ {PARAM_TIME, 0, &CloneMaxDelay},
+ {PARAM_TIME, 0, &CloneWarningDelay}}},
+ {"CSAccessMax", {{PARAM_POSINT, PARAM_RELOAD, &CSAccessMax}}},
+ {"CSAutokickMax", {{PARAM_POSINT, PARAM_RELOAD, &CSAutokickMax}}},
+ {"CSAutokickReason",
+ {{PARAM_STRING, PARAM_RELOAD, &CSAutokickReason}}},
+ {"CSDefBantype", {{PARAM_POSINT, PARAM_RELOAD, &CSDefBantype}}},
+ {"CSDefNone", {{PARAM_SET, PARAM_RELOAD, &CSDefNone}}},
+ {"CSDefKeepTopic", {{PARAM_SET, PARAM_RELOAD, &CSDefKeepTopic}}},
+ {"CSDefOpNotice", {{PARAM_SET, PARAM_RELOAD, &CSDefOpNotice}}},
+ {"CSDefPeace", {{PARAM_SET, PARAM_RELOAD, &CSDefPeace}}},
+ {"CSDefPrivate", {{PARAM_SET, PARAM_RELOAD, &CSDefPrivate}}},
+ {"CSDefRestricted", {{PARAM_SET, PARAM_RELOAD, &CSDefRestricted}}},
+ {"CSDefSecure", {{PARAM_SET, PARAM_RELOAD, &CSDefSecure}}},
+ {"CSDefSecureOps", {{PARAM_SET, PARAM_RELOAD, &CSDefSecureOps}}},
+ {"CSDefSecureFounder",
+ {{PARAM_SET, PARAM_RELOAD, &CSDefSecureFounder}}},
+ {"CSDefSignKick", {{PARAM_SET, PARAM_RELOAD, &CSDefSignKick}}},
+ {"CSDefSignKickLevel",
+ {{PARAM_SET, PARAM_RELOAD, &CSDefSignKickLevel}}},
+ {"CSDefTopicLock", {{PARAM_SET, PARAM_RELOAD, &CSDefTopicLock}}},
+ {"CSDefXOP", {{PARAM_SET, PARAM_RELOAD, &CSDefXOP}}},
+ {"CSExpire", {{PARAM_TIME, PARAM_RELOAD, &CSExpire}}},
+ {"CSInhabit", {{PARAM_TIME, PARAM_RELOAD, &CSInhabit}}},
+ {"CSListMax", {{PARAM_POSINT, PARAM_RELOAD, &CSListMax}}},
+ {"CSListOpersOnly", {{PARAM_SET, PARAM_RELOAD, &CSListOpersOnly}}},
+ {"CSMaxReg", {{PARAM_POSINT, 0, &CSMaxReg}}},
+ {"CSRestrictGetPass", {{PARAM_SET, PARAM_RELOAD, &CSRestrictGetPass}}},
+ {"CSOpersOnly", {{PARAM_SET, PARAM_RELOAD, &CSOpersOnly}}},
+ {"DefSessionLimit", {{PARAM_POSINT, 0, &DefSessionLimit}}},
+ {"DevNullName", {{PARAM_STRING, 0, &s_DevNull},
+ {PARAM_STRING, 0, &desc_DevNull}}},
+ {"DevNullAlias", {{PARAM_STRING, 0, &s_DevNullAlias},
+ {PARAM_STRING, 0, &desc_DevNullAlias}}},
+ {"DisableRaw", {{PARAM_SET, PARAM_RELOAD, &DisableRaw}}},
+ {"DontQuoteAddresses",
+ {{PARAM_SET, PARAM_RELOAD, &DontQuoteAddresses}}},
+ {"DumpCore", {{PARAM_SET, 0, &DumpCore}}},
+ {"DefConLevel", {{PARAM_INT, PARAM_RELOAD, &DefConLevel}}},
+ {"DefCon1", {{PARAM_INT, PARAM_RELOAD, &DefCon1}}},
+ {"DefCon2", {{PARAM_INT, PARAM_RELOAD, &DefCon2}}},
+ {"DefCon3", {{PARAM_INT, PARAM_RELOAD, &DefCon3}}},
+ {"DefCon4", {{PARAM_INT, PARAM_RELOAD, &DefCon4}}},
+ {"DefConSessionLimit",
+ {{PARAM_INT, PARAM_RELOAD, &DefConSessionLimit}}},
+ {"DefConAkillExpire", {{PARAM_STRING, PARAM_RELOAD, &DefConAKILL}}},
+ {"DefConChanModes", {{PARAM_STRING, PARAM_RELOAD, &DefConChanModes}}},
+ {"DefConTimeOut", {{PARAM_STRING, PARAM_RELOAD, &DefConTimeOut}}},
+ {"DefConAkillReason",
+ {{PARAM_STRING, PARAM_RELOAD, &DefConAkillReason}}},
+ {"DefConOffMessage",
+ {{PARAM_STRING, PARAM_RELOAD, &DefConOffMessage}}},
+ {"ExceptionDB", {{PARAM_STRING, PARAM_RELOAD, &ExceptionDBName}}},
+ {"ExceptionExpiry", {{PARAM_TIME, PARAM_RELOAD, &ExceptionExpiry}}},
+ {"ExpireTimeout", {{PARAM_TIME, PARAM_RELOAD, &ExpireTimeout}}},
+ {"ForceForbidReason", {{PARAM_SET, PARAM_RELOAD, &ForceForbidReason}}},
+ {"GlobalName", {{PARAM_STRING, 0, &s_GlobalNoticer},
+ {PARAM_STRING, 0, &desc_GlobalNoticer}}},
+ {"GlobalAlias", {{PARAM_STRING, 0, &s_GlobalNoticerAlias},
+ {PARAM_STRING, 0, &desc_GlobalNoticerAlias}}},
+ {"HelpChannel", {{PARAM_STRING, PARAM_RELOAD, &HelpChannel}}},
+ {"HostServAlias", {{PARAM_STRING, 0, &s_HostServAlias},
+ {PARAM_STRING, 0, &desc_HostServAlias}}},
+ {"HostSetters", {{PARAM_STRING, PARAM_RELOAD, &HostSetter}}},
+ {"LogChannel", {{PARAM_STRING, PARAM_RELOAD, &LogChannel}}},
+ {"LogBot", {{PARAM_SET, PARAM_RELOAD, &LogBot}}},
+ {"HelpServName", {{PARAM_STRING, 0, &s_HelpServ},
+ {PARAM_STRING, 0, &desc_HelpServ}}},
+ {"HelpServAlias", {{PARAM_STRING, 0, &s_HelpServAlias},
+ {PARAM_STRING, 0, &desc_HelpServAlias}}},
+ {"KeepBackups", {{PARAM_POSINT, PARAM_RELOAD, &KeepBackups}}},
+ {"KeepLogs", {{PARAM_POSINT, PARAM_RELOAD, &KeepLogs}}},
+ {"KillClones", {{PARAM_SET, PARAM_FULLONLY, &KillClones}}},
+ {"AddAkiller", {{PARAM_SET, PARAM_RELOAD, &AddAkiller}}},
+ {"KillClonesAkillExpire",
+ {{PARAM_TIME, PARAM_RELOAD, &KillClonesAkillExpire}}},
+ {"LimitSessions", {{PARAM_SET, PARAM_FULLONLY, &LimitSessions}}},
+ {"ListOpersOnly",
+ {{PARAM_DEPRECATED, PARAM_RELOAD, dep_ListOpersOnly}}},
+ {"LocalAddress", {{PARAM_STRING, 0, &LocalHost},
+ {PARAM_PORT, PARAM_OPTIONAL, &LocalPort}}},
+ {"LogUsers", {{PARAM_SET, PARAM_RELOAD, &LogUsers}}},
+ {"SuperAdmin", {{PARAM_SET, PARAM_RELOAD, &SuperAdmin}}},
+ {"LogMaxUsers", {{PARAM_SET, PARAM_RELOAD, &LogMaxUsers}}},
+ {"MailDelay", {{PARAM_TIME, PARAM_RELOAD, &MailDelay}}},
+ {"MaxSessionKill", {{PARAM_POSINT, PARAM_RELOAD, &MaxSessionKill}}},
+ {"MaxSessionLimit", {{PARAM_POSINT, PARAM_RELOAD, &MaxSessionLimit}}},
+ {"MemoServName", {{PARAM_STRING, 0, &s_MemoServ},
+ {PARAM_STRING, 0, &desc_MemoServ}}},
+ {"MemoServAlias", {{PARAM_STRING, 0, &s_MemoServAlias},
+ {PARAM_STRING, 0, &desc_MemoServAlias}}},
+ {"MysqlHost", {{PARAM_STRING, PARAM_RELOAD, &MysqlHost}}},
+ {"MysqlUser", {{PARAM_STRING, PARAM_RELOAD, &MysqlUser}}},
+ {"MysqlPass", {{PARAM_STRING, PARAM_RELOAD, &MysqlPass}}},
+ {"MysqlName", {{PARAM_STRING, PARAM_RELOAD, &MysqlName}}},
+ {"MysqlPort", {{PARAM_PORT, PARAM_RELOAD, &MysqlPort}}},
+ {"MysqlSecure", {{PARAM_STRING, PARAM_RELOAD, &MysqlSecure}}},
+ {"MysqlSock", {{PARAM_STRING, PARAM_RELOAD, &MysqlSock}}},
+ {"MysqlRetries", {{PARAM_POSINT, PARAM_RELOAD, &MysqlRetries}}},
+ {"MysqlRetryGap", {{PARAM_POSINT, PARAM_RELOAD, &MysqlRetryGap}}},
+ {"ModuleAutoload", {{PARAM_STRING, PARAM_RELOAD, &Modules}}},
+ {"ModuleDelayedAutoload",
+ {{PARAM_STRING, PARAM_RELOAD, &ModulesDelayed}}},
+ {"MOTDFile", {{PARAM_STRING, PARAM_RELOAD, &MOTDFilename}}},
+ {"MSMaxMemos", {{PARAM_POSINT, PARAM_RELOAD, &MSMaxMemos}}},
+ {"MSNotifyAll", {{PARAM_SET, PARAM_RELOAD, &MSNotifyAll}}},
+ {"MSSendDelay", {{PARAM_TIME, PARAM_RELOAD, &MSSendDelay}}},
+ {"NetworkDomain", {{PARAM_STRING, PARAM_RELOAD, &NetworkDomain}}},
+ {"NetworkName", {{PARAM_STRING, PARAM_RELOAD, &NetworkName}}},
+ {"NewsDB", {{PARAM_STRING, PARAM_RELOAD, &NewsDBName}}},
+ {"NickservDB", {{PARAM_STRING, PARAM_RELOAD, &NickDBName}}},
+ {"PreNickServDB", {{PARAM_STRING, PARAM_RELOAD, &PreNickDBName}}},
+ {"NSEmailReg", {{PARAM_SET, PARAM_RELOAD, &NSEmailReg}}},
+ {"NickServName", {{PARAM_STRING, 0, &s_NickServ},
+ {PARAM_STRING, 0, &desc_NickServ}}},
+ {"NickServAlias", {{PARAM_STRING, 0, &s_NickServAlias},
+ {PARAM_STRING, 0, &desc_NickServAlias}}},
+ {"NoBackupOkay", {{PARAM_SET, PARAM_RELOAD, &NoBackupOkay}}},
+ {"NSAccessMax", {{PARAM_POSINT, PARAM_RELOAD, &NSAccessMax}}},
+ {"NSAllowKillImmed", {{PARAM_SET, 0, &NSAllowKillImmed}}},
+ {"NSDefHideEmail", {{PARAM_SET, PARAM_RELOAD, &NSDefHideEmail}}},
+ {"NSDefHideQuit", {{PARAM_SET, PARAM_RELOAD, &NSDefHideQuit}}},
+ {"NSDefHideUsermask", {{PARAM_SET, PARAM_RELOAD, &NSDefHideUsermask}}},
+ {"NSDefKill", {{PARAM_SET, PARAM_RELOAD, &NSDefKill}}},
+ {"NSDefKillQuick", {{PARAM_SET, PARAM_RELOAD, &NSDefKillQuick}}},
+ {"NSDefLanguage", {{PARAM_POSINT, PARAM_RELOAD, &NSDefLanguage}}},
+ {"NSDefMemoReceive", {{PARAM_SET, PARAM_RELOAD, &NSDefMemoReceive}}},
+ {"NSDefMemoSignon", {{PARAM_SET, PARAM_RELOAD, &NSDefMemoSignon}}},
+ {"NSDefMsg", {{PARAM_SET, PARAM_RELOAD, &NSDefMsg}}},
+ {"NSDefNone", {{PARAM_SET, PARAM_RELOAD, &NSDefNone}}},
+ {"NSDefPrivate", {{PARAM_SET, PARAM_RELOAD, &NSDefPrivate}}},
+ {"NSDefSecure", {{PARAM_SET, PARAM_RELOAD, &NSDefSecure}}},
+ {"NSEnforcerUser", {{PARAM_STRING, PARAM_RELOAD, &temp_nsuserhost}}},
+ {"NSExpire", {{PARAM_TIME, PARAM_RELOAD, &NSExpire}}},
+ {"NSRExpire", {{PARAM_TIME, PARAM_RELOAD, &NSRExpire}}},
+ {"NSModeOnID", {{PARAM_SET, PARAM_RELOAD, &NSModeOnID}}},
+ {"NSForceEmail", {{PARAM_SET, PARAM_RELOAD, &NSForceEmail}}},
+ {"NSGuestNickPrefix",
+ {{PARAM_STRING, PARAM_RELOAD, &NSGuestNickPrefix}}},
+ {"NSListMax", {{PARAM_POSINT, PARAM_RELOAD, &NSListMax}}},
+ {"NSListOpersOnly", {{PARAM_SET, PARAM_RELOAD, &NSListOpersOnly}}},
+ {"NSMaxAliases", {{PARAM_POSINT, PARAM_RELOAD, &NSMaxAliases}}},
+ {"NSNoGroupChange", {{PARAM_SET, PARAM_RELOAD, &NSNoGroupChange}}},
+ {"NSRegDelay", {{PARAM_TIME, PARAM_RELOAD, &NSRegDelay}}},
+ {"NSReleaseTimeout", {{PARAM_TIME, PARAM_RELOAD, &NSReleaseTimeout}}},
+ {"NSSecureAdmins", {{PARAM_SET, PARAM_RELOAD, &NSSecureAdmins}}},
+ {"NSStrictPrivileges",
+ {{PARAM_SET, PARAM_RELOAD, &NSStrictPrivileges}}},
+ {"NSRestrictGetPass", {{PARAM_SET, PARAM_RELOAD, &NSRestrictGetPass}}},
+ {"OperServDB", {{PARAM_STRING, PARAM_RELOAD, &OperDBName}}},
+ {"OperServName", {{PARAM_STRING, 0, &s_OperServ},
+ {PARAM_STRING, 0, &desc_OperServ}}},
+ {"OperServAlias", {{PARAM_STRING, 0, &s_OperServAlias},
+ {PARAM_STRING, 0, &desc_OperServAlias}}},
+ {"PIDFile", {{PARAM_STRING, 0, &PIDFilename}}},
+ {"ProxyAkillReason",
+ {{PARAM_STRING, PARAM_RELOAD, &ProxyAkillReason}}},
+ {"ProxyCacheExpire", {{PARAM_TIME, PARAM_RELOAD, &ProxyCacheExpire}}},
+ {"ProxyCheckWingate", {{PARAM_SET, PARAM_RELOAD, &ProxyCheckWingate}}},
+ {"ProxyCheckSocks4", {{PARAM_SET, PARAM_RELOAD, &ProxyCheckSocks4}}},
+ {"ProxyCheckSocks5", {{PARAM_SET, PARAM_RELOAD, &ProxyCheckSocks5}}},
+ {"ProxyCheckHTTP1", {{PARAM_SET, PARAM_RELOAD, &ProxyCheckHTTP1}}},
+ {"ProxyCheckHTTP2", {{PARAM_SET, PARAM_RELOAD, &ProxyCheckHTTP2}}},
+ {"ProxyCheckHTTP3", {{PARAM_SET, PARAM_RELOAD, &ProxyCheckHTTP3}}},
+ {"ProxyDetect", {{PARAM_SET, 0, &ProxyDetect}}},
+ {"ProxyExpire", {{PARAM_TIME, PARAM_RELOAD, &ProxyExpire}}},
+ {"ProxyMax", {{PARAM_POSINT, PARAM_RELOAD, &ProxyMax}}},
+ {"ProxyMessage1", {{PARAM_STRING, PARAM_RELOAD, &ProxyMessage[0]}}},
+ {"ProxyMessage2", {{PARAM_STRING, PARAM_RELOAD, &ProxyMessage[1]}}},
+ {"ProxyMessage3", {{PARAM_STRING, PARAM_RELOAD, &ProxyMessage[2]}}},
+ {"ProxyMessage4", {{PARAM_STRING, PARAM_RELOAD, &ProxyMessage[3]}}},
+ {"ProxyMessage5", {{PARAM_STRING, PARAM_RELOAD, &ProxyMessage[4]}}},
+ {"ProxyMessage6", {{PARAM_STRING, PARAM_RELOAD, &ProxyMessage[5]}}},
+ {"ProxyMessage7", {{PARAM_STRING, PARAM_RELOAD, &ProxyMessage[6]}}},
+ {"ProxyMessage8", {{PARAM_STRING, PARAM_RELOAD, &ProxyMessage[7]}}},
+ {"ProxyTestServer", {{PARAM_STRING, PARAM_RELOAD, &ProxyTestServer},
+ {PARAM_PORT, PARAM_RELOAD, &ProxyTestPort}}},
+ {"ProxyThreads", {{PARAM_POSINT, 0, &ProxyThreads}}},
+ {"ProxyTimeout", {{PARAM_TIME, PARAM_RELOAD, &ProxyTimeout}}},
+ {"ReadTimeout", {{PARAM_TIME, PARAM_RELOAD, &ReadTimeout}}},
+ {"RemoteServer", {{PARAM_STRING, 0, &RemoteServer},
+ {PARAM_PORT, 0, &RemotePort},
+ {PARAM_STRING, 0, &RemotePassword}}},
+ {"RemoteServer2", {{PARAM_STRING, 0, &RemoteServer2},
+ {PARAM_PORT, 0, &RemotePort2},
+ {PARAM_STRING, 0, &RemotePassword2}}},
+ {"RemoteServer3", {{PARAM_STRING, 0, &RemoteServer3},
+ {PARAM_PORT, 0, &RemotePort3},
+ {PARAM_STRING, 0, &RemotePassword3}}},
+ {"RestrictMail", {{PARAM_SET, PARAM_RELOAD, &RestrictMail}}},
+ {"SendMailPath", {{PARAM_STRING, PARAM_RELOAD, &SendMailPath}}},
+ {"SendFrom", {{PARAM_STRING, PARAM_RELOAD, &SendFrom}}},
+ {"ServerDesc", {{PARAM_STRING, 0, &ServerDesc}}},
+ {"ServerName", {{PARAM_STRING, 0, &ServerName}}},
+ {"ServicesRoot", {{PARAM_STRING, PARAM_RELOAD, &ServicesRoot}}},
+ {"ServiceUser", {{PARAM_STRING, 0, &temp_userhost}}},
+ {"SessionLimitDetailsLoc",
+ {{PARAM_STRING, PARAM_RELOAD, &SessionLimitDetailsLoc}}},
+ {"SessionLimitExceeded",
+ {{PARAM_STRING, PARAM_RELOAD, &SessionLimitExceeded}}},
+ {"SessionAutoKillExpiry",
+ {{PARAM_TIME, PARAM_RELOAD, &SessionAutoKillExpiry}}},
+ {"SGLineExpiry", {{PARAM_TIME, PARAM_RELOAD, &SGLineExpiry}}},
+ {"SQLineExpiry", {{PARAM_TIME, PARAM_RELOAD, &SQLineExpiry}}},
+ {"SZLineExpiry", {{PARAM_TIME, PARAM_RELOAD, &SZLineExpiry}}},
+ {"HideStatsO", {{PARAM_SET, PARAM_RELOAD, &HideStatsO}}},
+ {"GlobalOnCycle", {{PARAM_SET, PARAM_RELOAD, &GlobalOnCycle}}},
+ {"AnonymousGlobal", {{PARAM_SET, PARAM_RELOAD, &AnonymousGlobal}}},
+ {"GlobalOnCycleMessage",
+ {{PARAM_STRING, PARAM_RELOAD, &GlobalOnCycleMessage}}},
+ {"GlobalOnCycleUP", {{PARAM_STRING, PARAM_RELOAD, &GlobalOnCycleUP}}},
+ {"StrictPasswords", {{PARAM_SET, PARAM_RELOAD, &StrictPasswords}}},
+ {"TimeoutCheck", {{PARAM_TIME, PARAM_RELOAD, &TimeoutCheck}}},
+ {"UpdateTimeout", {{PARAM_TIME, PARAM_RELOAD, &UpdateTimeout}}},
+ {"UseMail", {{PARAM_SET, PARAM_RELOAD, &UseMail}}},
+ {"UsePrivmsg", {{PARAM_SET, PARAM_RELOAD, &UsePrivmsg}}},
+ {"WallAkillExpire", {{PARAM_SET, PARAM_RELOAD, &WallAkillExpire}}},
+ {"WallBadOS", {{PARAM_SET, PARAM_RELOAD, &WallBadOS}}},
+ {"WallDrop", {{PARAM_SET, PARAM_RELOAD, &WallDrop}}},
+ {"WallExceptionExpire",
+ {{PARAM_SET, PARAM_RELOAD, &WallExceptionExpire}}},
+ {"WallForbid", {{PARAM_SET, PARAM_RELOAD, &WallForbid}}},
+ {"WallGetpass", {{PARAM_SET, PARAM_RELOAD, &WallGetpass}}},
+ {"WallOper", {{PARAM_SET, PARAM_RELOAD, &WallOper}}},
+ {"WallOSAkill", {{PARAM_SET, PARAM_RELOAD, &WallOSAkill}}},
+ {"WallOSClearmodes", {{PARAM_SET, PARAM_RELOAD, &WallOSClearmodes}}},
+ {"WallOSGlobal", {{PARAM_SET, PARAM_RELOAD, &WallOSGlobal}}},
+ {"WallOSKick", {{PARAM_SET, PARAM_RELOAD, &WallOSKick}}},
+ {"WallOSJupe", {{PARAM_SET, PARAM_RELOAD, &WallOSJupe}}},
+ {"WallOSMode", {{PARAM_SET, PARAM_RELOAD, &WallOSMode}}},
+ {"WallOSNoOp", {{PARAM_SET, PARAM_RELOAD, &WallOSNoOp}}},
+ {"WallOSRaw", {{PARAM_SET, PARAM_RELOAD, &WallOSRaw}}},
+ {"WallOSSGLine", {{PARAM_SET, PARAM_RELOAD, &WallOSSGLine}}},
+ {"WallOSSQLine", {{PARAM_SET, PARAM_RELOAD, &WallOSSQLine}}},
+ {"WallOSSZLine", {{PARAM_SET, PARAM_RELOAD, &WallOSSZLine}}},
+ {"WallProxy", {{PARAM_SET, PARAM_RELOAD, &WallProxy}}},
+ {"WallSetpass", {{PARAM_SET, PARAM_RELOAD, &WallSetpass}}},
+ {"WallSGLineExpire", {{PARAM_SET, PARAM_RELOAD, &WallSGLineExpire}}},
+ {"WallSQLineExpire", {{PARAM_SET, PARAM_RELOAD, &WallSQLineExpire}}},
+ {"WallSZLineExpire", {{PARAM_SET, PARAM_RELOAD, &WallSZLineExpire}}},
+ {"WarningTimeout", {{PARAM_TIME, PARAM_RELOAD, &WarningTimeout}}},
+ {"GlobalOnDefcon", {{PARAM_SET, PARAM_RELOAD, &GlobalOnDefcon}}},
+ {"GlobalOnDefconMore",
+ {{PARAM_SET, PARAM_RELOAD, &GlobalOnDefconMore}}},
+ {"DefconMessage", {{PARAM_STRING, PARAM_RELOAD, &DefconMessage}}},
+};
+
+/*************************************************************************/
+
+/* Print an error message to the log (and the console, if open). */
+
+void error(int linenum, char *message, ...)
+{
+ char buf[4096];
+ va_list args;
+
+ va_start(args, message);
+ vsnprintf(buf, sizeof(buf), message, args);
+#ifndef NOT_MAIN
+ if (linenum)
+ alog("%s:%d: %s", SERVICES_CONF, linenum, buf);
+ else
+ alog("%s: %s", SERVICES_CONF, buf);
+ if (!nofork && isatty(2)) {
+#endif
+ if (linenum)
+ fprintf(stderr, "%s:%d: %s\n", SERVICES_CONF, linenum, buf);
+ else
+ fprintf(stderr, "%s: %s\n", SERVICES_CONF, buf);
+#ifndef NOT_MAIN
+ }
+#endif
+}
+
+/*************************************************************************/
+
+/* Parse a configuration line. Return 1 on success; otherwise, print an
+ * appropriate error message and return 0. Destroys the buffer by side
+ * effect.
+ */
+
+int parse(char *buf, int linenum, int reload)
+{
+ char *s, *t, *dir;
+ int i, n, optind, val;
+ int retval = 1;
+ int ac = 0;
+ char *av[MAXPARAMS];
+
+ dir = strtok(buf, " \t\r\n");
+ s = strtok(NULL, "");
+ if (s) {
+ while (isspace(*s))
+ s++;
+ while (*s) {
+ if (ac >= MAXPARAMS) {
+ error(linenum, "Warning: too many parameters (%d max)",
+ MAXPARAMS);
+ break;
+ }
+ t = s;
+ if (*s == '"') {
+ t++;
+ s++;
+ while (*s && *s != '"') {
+ if (*s == '\\' && s[1] != 0)
+ s++;
+ s++;
+ }
+ if (!*s)
+ error(linenum,
+ "Warning: unterminated double-quoted string");
+ else
+ *s++ = 0;
+ } else {
+ s += strcspn(s, " \t\r\n");
+ if (*s)
+ *s++ = 0;
+ }
+ av[ac++] = t;
+ while (isspace(*s))
+ s++;
+ }
+ }
+
+ if (!dir)
+ return 1;
+
+ for (n = 0; n < lenof(directives); n++) {
+ Directive *d = &directives[n];
+ if (stricmp(dir, d->name) != 0)
+ continue;
+ optind = 0;
+ for (i = 0; i < MAXPARAMS && d->params[i].type != PARAM_NONE; i++) {
+ if (reload && !(d->params[i].flags & PARAM_RELOAD))
+ continue;
+
+ if (d->params[i].type == PARAM_SET) {
+ *(int *) d->params[i].ptr = 1;
+ continue;
+ }
+#ifdef STREAMLINED
+ if (d->params[i].flags & PARAM_FULLONLY) {
+ error(linenum,
+ "Directive `%s' not available in STREAMLINED mode",
+ d->name);
+ break;
+ }
+#endif
+
+ if (d->params[i].type == PARAM_DEPRECATED) {
+ void (*func) (void);
+ error(linenum, "Deprecated directive `%s' used", d->name);
+ func = (void (*)(void)) (d->params[i].ptr);
+ func(); /* For clarity */
+ continue;
+ }
+ if (optind >= ac) {
+ if (!(d->params[i].flags & PARAM_OPTIONAL)) {
+ error(linenum, "Not enough parameters for `%s'",
+ d->name);
+ retval = 0;
+ }
+ break;
+ }
+ switch (d->params[i].type) {
+ case PARAM_INT:
+ val = strtol(av[optind++], &s, 0);
+ if (*s) {
+ error(linenum,
+ "%s: Expected an integer for parameter %d",
+ d->name, optind);
+ retval = 0;
+ break;
+ }
+ *(int *) d->params[i].ptr = val;
+ break;
+ case PARAM_POSINT:
+ val = strtol(av[optind++], &s, 0);
+ if (*s || val <= 0) {
+ error(linenum,
+ "%s: Expected a positive integer for parameter %d",
+ d->name, optind);
+ retval = 0;
+ break;
+ }
+ *(int *) d->params[i].ptr = val;
+ break;
+ case PARAM_PORT:
+ val = strtol(av[optind++], &s, 0);
+ if (*s) {
+ error(linenum,
+ "%s: Expected a port number for parameter %d",
+ d->name, optind);
+ retval = 0;
+ break;
+ }
+ if (val < 1 || val > 65535) {
+ error(linenum,
+ "Port numbers must be in the range 1..65535");
+ retval = 0;
+ break;
+ }
+ *(int *) d->params[i].ptr = val;
+ break;
+ case PARAM_STRING:
+/* if (reload && *(char **)d->params[i].ptr)
+ free(*(char **)d->params[i].ptr); */
+ *(char **) d->params[i].ptr = strdup(av[optind++]);
+ if (!d->params[i].ptr) {
+ error(linenum, "%s: Out of memory", d->name);
+ return 0;
+ }
+ break;
+ case PARAM_TIME:
+ val = dotime(av[optind++]);
+ if (val < 0) {
+ error(linenum,
+ "%s: Expected a time value for parameter %d",
+ d->name, optind);
+ retval = 0;
+ break;
+ }
+ *(int *) d->params[i].ptr = val;
+ break;
+ default:
+ error(linenum, "%s: Unknown type %d for param %d",
+ d->name, d->params[i].type, i + 1);
+ return 0; /* don't bother continuing--something's bizarre */
+ }
+ }
+ break; /* because we found a match */
+ }
+
+ if (n == lenof(directives)) {
+ error(linenum, "Unknown directive `%s'", dir);
+ return 1; /* don't cause abort */
+ }
+
+ return retval;
+}
+
+/*************************************************************************/
+
+#define CHECK(v) do { \
+ if (!v) { \
+ error(0, #v " missing"); \
+ retval = 0; \
+ } \
+} while (0)
+
+#define CHEK2(v,n) do { \
+ if (!v) { \
+ error(0, #n " missing"); \
+ retval = 0; \
+ } \
+} while (0)
+
+/* Read the entire configuration file. If an error occurs while reading
+ * the file or a required directive is not found, print and log an
+ * appropriate error message and return 0; otherwise, return 1.
+ *
+ * If reload is 1, will reload the configuration file.
+ * --lara
+ *
+ */
+
+int read_config(int reload)
+{
+ FILE *config;
+ int linenum = 0, retval = 1;
+ char buf[1024], *s;
+ int defconCount = 0;
+
+ if (reload) {
+ int i, n;
+
+ /* Reset all the reloadable settings */
+
+ for (n = 0; n < lenof(directives); n++) {
+ Directive *d = &directives[n];
+
+ for (i = 0; i < MAXPARAMS && d->params[i].type != PARAM_NONE;
+ i++) {
+ if (!(d->params[i].flags & PARAM_RELOAD))
+ continue;
+
+ if (d->params[i].type == PARAM_SET
+ || d->params[i].type == PARAM_INT
+ || d->params[i].type == PARAM_POSINT
+ || d->params[i].type == PARAM_TIME) {
+ *(int *) d->params[i].ptr = 0;
+ } else if (d->params[i].type == PARAM_STRING) {
+ if (*(char **) d->params[i].ptr)
+ free(*(char **) d->params[i].ptr);
+ (*(char **) d->params[i].ptr) = NULL;
+ }
+ }
+ }
+ }
+
+ config = fopen(SERVICES_CONF, "r");
+ if (!config) {
+#ifndef NOT_MAIN
+ log_perror("Can't open " SERVICES_CONF);
+ if (!nofork && isatty(2)) {
+#endif
+ if (!reload)
+ perror("Can't open " SERVICES_CONF);
+ else
+ alog("Can't open %s", SERVICES_CONF);
+ }
+ return 0;
+ }
+ while (fgets(buf, sizeof(buf), config)) {
+ linenum++;
+ if (*buf == '#' || *buf == '\r' || *buf == '\n')
+ continue;
+ if (!parse(buf, linenum, reload))
+ retval = 0;
+ }
+ fclose(config);
+
+ if (!reload) {
+ CHECK(RemoteServer);
+ CHECK(ServerName);
+ CHECK(ServerDesc);
+ }
+ if (!reload) {
+ if (RemoteServer3)
+ CHECK(RemoteServer2);
+ }
+ CHECK(NetworkName);
+ if (!reload) {
+ CHEK2(temp_userhost, ServiceUser);
+ CHEK2(s_NickServ, NickServName);
+ CHEK2(s_ChanServ, ChanServName);
+ CHEK2(s_MemoServ, MemoServName);
+ CHEK2(s_HelpServ, HelpServName);
+ CHEK2(s_OperServ, OperServName);
+ CHEK2(s_GlobalNoticer, GlobalName);
+ CHEK2(PIDFilename, PIDFile);
+ }
+ CHEK2(MOTDFilename, MOTDFile);
+ if (!reload) {
+ CHEK2(NickDBName, NickServDB);
+ CHEK2(ChanDBName, ChanServDB);
+ CHEK2(OperDBName, OperServDB);
+ CHEK2(NewsDBName, NewsDB);
+ CHEK2(ExceptionDBName, ExceptionDB);
+ }
+ CHECK(UpdateTimeout);
+ CHECK(ExpireTimeout);
+ CHECK(ReadTimeout);
+ CHECK(WarningTimeout);
+ CHECK(TimeoutCheck);
+ CHECK(NSAccessMax);
+ CHEK2(temp_nsuserhost, NSEnforcerUser);
+ CHECK(NSReleaseTimeout);
+ CHECK(NSListMax);
+ CHECK(CSAccessMax);
+ CHECK(CSAutokickMax);
+ CHECK(CSAutokickReason);
+ CHECK(CSInhabit);
+ CHECK(CSListMax);
+ CHECK(ServicesRoot);
+ CHECK(AutokillExpiry);
+ CHECK(ChankillExpiry);
+ CHECK(SGLineExpiry);
+ CHECK(SQLineExpiry);
+ CHECK(SZLineExpiry);
+
+ if (!reload) {
+
+ if (temp_userhost) {
+ if (!(s = strchr(temp_userhost, '@'))) {
+ error(0, "Missing `@' for ServiceUser");
+ } else {
+ *s++ = 0;
+ ServiceUser = temp_userhost;
+ ServiceHost = s;
+ }
+ }
+
+ }
+
+ if (temp_nsuserhost) {
+ if (!(s = strchr(temp_nsuserhost, '@'))) {
+ NSEnforcerUser = temp_nsuserhost;
+ NSEnforcerHost = ServiceHost;
+ } else {
+ *s++ = 0;
+ NSEnforcerUser = temp_userhost;
+ NSEnforcerHost = s;
+ }
+ }
+
+ if (!NSDefNone &&
+ !NSDefKill &&
+ !NSDefKillQuick &&
+ !NSDefSecure &&
+ !NSDefPrivate &&
+ !NSDefHideEmail &&
+ !NSDefHideUsermask &&
+ !NSDefHideQuit && !NSDefMemoSignon && !NSDefMemoReceive) {
+ NSDefSecure = 1;
+ NSDefMemoSignon = 1;
+ NSDefMemoReceive = 1;
+ }
+
+ NSDefFlags = 0;
+ if (!NSDefNone) {
+ if (NSDefKill)
+ NSDefFlags |= NI_KILLPROTECT;
+ if (NSDefKillQuick)
+ NSDefFlags |= NI_KILL_QUICK;
+ if (NSDefSecure)
+ NSDefFlags |= NI_SECURE;
+ if (NSDefPrivate)
+ NSDefFlags |= NI_PRIVATE;
+ if (NSDefMsg)
+ NSDefFlags |= NI_MSG;
+ if (NSDefHideEmail)
+ NSDefFlags |= NI_HIDE_EMAIL;
+ if (NSDefHideUsermask)
+ NSDefFlags |= NI_HIDE_MASK;
+ if (NSDefHideQuit)
+ NSDefFlags |= NI_HIDE_QUIT;
+ if (NSDefMemoSignon)
+ NSDefFlags |= NI_MEMO_SIGNON;
+ if (NSDefMemoReceive)
+ NSDefFlags |= NI_MEMO_RECEIVE;
+ }
+
+ CHECK(NSGuestNickPrefix);
+ CHECK(NSDefLanguage);
+ if (NSDefLanguage) {
+ NSDefLanguage--;
+ if (NSDefLanguage < 0 || NSDefLanguage >= NUM_LANGS) {
+ error(0, "Value of NSDefLanguage must be between 1 and %d",
+ USED_LANGS);
+ retval = 0;
+ }
+ }
+
+ if (reload) {
+ if ((NSDefLanguage = langlist[NSDefLanguage]) < 0)
+ NSDefLanguage = DEF_LANGUAGE;
+ }
+
+ if (CSDefBantype < 0 || CSDefBantype > 3) {
+ error(0, "Value of CSDefBantype must be between 0 and 3 included");
+ retval = 0;
+ }
+
+ if (!MysqlRetries || !MysqlRetryGap) {
+ MysqlRetries = 5;
+ MysqlRetryGap = 1;
+ } else if (((MysqlRetries * MysqlRetryGap) > 60)
+ || ((MysqlRetries * MysqlRetryGap) < 1)) {
+ error(0,
+ "MysqlRetries * MysqlRetryGap must be between 1 and 60, using standard values.");
+ MysqlRetries = 5;
+ MysqlRetryGap = 1;
+ }
+
+ if (!CSDefNone &&
+ !CSDefKeepTopic &&
+ !CSDefTopicLock &&
+ !CSDefPrivate &&
+ !CSDefRestricted &&
+ !CSDefSecure &&
+ !CSDefSecureOps &&
+ !CSDefSecureFounder &&
+ !CSDefSignKick && !CSDefSignKickLevel && !CSDefOpNotice) {
+ CSDefKeepTopic = 1;
+ CSDefSecure = 1;
+ CSDefSecureFounder = 1;
+ CSDefSignKick = 1;
+ }
+
+ CSDefFlags = 0;
+ if (!CSDefNone) {
+ if (CSDefKeepTopic)
+ CSDefFlags |= CI_KEEPTOPIC;
+ if (CSDefTopicLock)
+ CSDefFlags |= CI_TOPICLOCK;
+ if (CSDefPrivate)
+ CSDefFlags |= CI_PRIVATE;
+ if (CSDefRestricted)
+ CSDefFlags |= CI_RESTRICTED;
+ if (CSDefSecure)
+ CSDefFlags |= CI_SECURE;
+ if (CSDefSecureOps)
+ CSDefFlags |= CI_SECUREOPS;
+ if (CSDefSecureFounder)
+ CSDefFlags |= CI_SECUREFOUNDER;
+ if (CSDefSignKick)
+ CSDefFlags |= CI_SIGNKICK;
+ if (CSDefSignKickLevel)
+ CSDefFlags |= CI_SIGNKICK_LEVEL;
+ if (CSDefOpNotice)
+ CSDefFlags |= CI_OPNOTICE;
+ if (CSDefXOP)
+ CSDefFlags |= CI_XOP;
+ if (CSDefPeace)
+ CSDefFlags |= CI_PEACE;
+ }
+
+ BSDefFlags = 0;
+ if (BSDefDontKickOps)
+ BSDefFlags |= BS_DONTKICKOPS;
+ if (BSDefDontKickVoices)
+ BSDefFlags |= BS_DONTKICKVOICES;
+ if (BSDefGreet)
+ BSDefFlags |= BS_GREET;
+ if (BSDefFantasy)
+ BSDefFlags |= BS_FANTASY;
+ if (BSDefSymbiosis)
+ BSDefFlags |= BS_SYMBIOSIS;
+
+ /* Services Root building */
+
+ if (ServicesRoot && !reload) { /* Check to prevent segmentation fault if it's missing */
+ RootNumber = 0;
+
+ s = strtok(ServicesRoot, " ");
+ do {
+ RootNumber++;
+ ServicesRoots =
+ realloc(ServicesRoots, sizeof(char *) * RootNumber);
+ ServicesRoots[RootNumber - 1] = strdup(s);
+ } while ((s = strtok(NULL, " ")));
+ }
+
+ /* Host Setters building... :P */
+ HostNumber = 0; /* always zero it, even if we have no setters */
+ if (HostSetter) {
+ s = strtok(HostSetter, " ");
+ do {
+ if (s) {
+ HostNumber++;
+ HostSetters =
+ realloc(HostSetters, sizeof(char *) * HostNumber);
+ HostSetters[HostNumber - 1] = strdup(s);
+ }
+ } while ((s = strtok(NULL, " ")));
+ }
+
+ /* Modules Autoload building... :P */
+ ModulesNumber = 0; /* always zero it, even if we have no setters */
+ if (Modules) {
+ s = strtok(Modules, " ");
+ do {
+ if (s) {
+ ModulesNumber++;
+ ModulesAutoload =
+ realloc(ModulesAutoload,
+ sizeof(char *) * ModulesNumber);
+ ModulesAutoload[ModulesNumber - 1] = strdup(s);
+ }
+ } while ((s = strtok(NULL, " ")));
+ }
+
+ ModulesDelayedNumber = 0; /* always zero it, even if we have no setters */
+ if (ModulesDelayed) {
+ s = strtok(ModulesDelayed, " ");
+ do {
+ if (s) {
+ ModulesDelayedNumber++;
+ ModulesDelayedAutoload =
+ realloc(ModulesDelayedAutoload,
+ sizeof(char *) * ModulesDelayedNumber);
+ ModulesDelayedAutoload[ModulesDelayedNumber - 1] =
+ strdup(s);
+ }
+ } while ((s = strtok(NULL, " ")));
+ }
+
+ if (LimitSessions) {
+ CHECK(DefSessionLimit);
+ CHECK(MaxSessionLimit);
+ CHECK(ExceptionExpiry);
+
+ if (MaxSessionKill && !SessionAutoKillExpiry)
+ SessionAutoKillExpiry = 30 * 60; /* 30 minutes */
+
+ if (!reload && CheckClones) {
+ printf
+ ("Warning: You have enabled both session limiting (config "
+ "option: LimitSessions)\nand clone detection (config option: "
+ "CheckClones). These two features do not\nfunction correctly "
+ "when running together. Session limiting is preferred.\n\n");
+#ifndef NOT_MAIN
+ alog("*** Warning: Both LimitSessions and CheckClones are enabled " "- this is bad! Check your config.");
+#endif
+ }
+ }
+
+ if (s_BotServ) {
+ CHEK2(BotDBName, BotServDB);
+ CHECK(BSBadWordsMax);
+ CHECK(BSMinUsers);
+ CHECK(BSKeepData);
+ }
+
+ if (s_HostServ) {
+ CHEK2(s_HostServ, HostServName);
+ CHEK2(HostDBName, HostServDB);
+ }
+
+ if (UseMail) {
+ CHECK(SendMailPath);
+ CHECK(SendFrom);
+ }
+
+ if (ProxyDetect) {
+ CHECK(ProxyThreads);
+ CHECK(ProxyTimeout);
+ CHECK(ProxyTestServer);
+ CHECK(ProxyCacheExpire);
+ CHECK(ProxyAkillReason);
+ CHECK(ProxyMax);
+ }
+
+ if (GlobalOnCycle) {
+ CHECK(GlobalOnCycleMessage);
+ }
+
+ /**
+ * Check all DEFCON dependiencies...
+ **/
+ if (DefConLevel) {
+ CHECK(DefCon1);
+ CHECK(DefCon2);
+ CHECK(DefCon3);
+ CHECK(DefCon4);
+ DefCon5 = 0; /* ALWAYS have defcon 5 as normal operation */
+ /* Build DefCon's */
+ DefCon[0] = 0;
+ DefCon[1] = DefCon1;
+ DefCon[2] = DefCon2;
+ DefCon[3] = DefCon3;
+ DefCon[4] = DefCon4;
+ DefCon[5] = DefCon5;
+ for (defconCount = 1; defconCount <= 5; defconCount++) { /* Check any defcon needed settings */
+ if (DefCon[defconCount] & DEFCON_REDUCE_SESSION) {
+ CHECK(DefConSessionLimit);
+ }
+ if (DefCon[defconCount] & DEFCON_AKILL_NEW_CLIENTS) {
+ CHECK(DefConAKILL);
+ CHECK(DefConAkillReason);
+ }
+ if (DefCon[defconCount] & DEFCON_FORCE_CHAN_MODES) {
+ CHECK(DefConChanModes);
+ }
+ }
+ if (GlobalOnDefconMore)
+ CHECK(DefconMessage);
+ }
+
+ /**
+ * If they try to enable any email registration option,
+ * make sure they have everything else they need too...
+ *
+ * rob
+ **/
+ if (NSEmailReg) {
+ CHEK2(PreNickDBName, PreNickServDB);
+ CHECK(NSEmailReg);
+ CHECK(NSRExpire);
+ CHECK(UseMail);
+ CHECK(NSForceEmail);
+ } else {
+ PreNickDBName = NULL;
+ NSRExpire = 0;
+ }
+
+ /* Network Domain building */
+ DomainNumber = 0;
+ if (NetworkDomain) {
+ s = strtok(NetworkDomain, " ");
+ if (s) {
+ do {
+ DomainNumber++;
+ NetworkDomains =
+ realloc(NetworkDomains, sizeof(char *) * DomainNumber);
+ NetworkDomains[DomainNumber - 1] = strdup(s);
+ } while ((s = strtok(NULL, " ")));
+ }
+ }
+
+ return retval;
+}
+
+/*************************************************************************/
diff --git a/config.h b/config.h
new file mode 100644
index 000000000..b1ef2af0d
--- /dev/null
+++ b/config.h
@@ -0,0 +1,81 @@
+/* Services configuration.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: config.h,v 1.7 2003/09/04 18:55:34 rob Exp $
+ *
+ */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+/* Note that most of the options which used to be here have been moved to
+ * services.conf. */
+
+/*************************************************************************/
+
+/******* General configuration *******/
+
+/* Name of configuration file (in Services directory) */
+#define SERVICES_CONF "services.conf"
+
+/* Name of log file (in Services directory) */
+#define LOG_FILENAME "services.log"
+
+/* Maximum amount of data from/to the network to buffer (bytes). */
+#define NET_BUFSIZE 65536
+
+/******* OperServ configuration *******/
+
+/* How big a hostname list do we keep for clone detection? On large nets
+ * (over 500 simultaneous users or so), you may want to increase this if
+ * you want a good chance of catching clones. */
+#define CLONE_DETECT_SIZE 16
+
+/* Define this to enable OperServ's svs commands (superadmin only). */
+ #define USE_OSSVS
+
+/* Define this to enable OperServ's debugging commands (Services root
+ * only). These commands are undocumented; "use the source, Luke!" */
+/* #define DEBUG_COMMANDS */
+
+/******************* END OF USER-CONFIGURABLE SECTION ********************/
+
+/* Size of input buffer (note: this is different from BUFSIZ)
+ * This must be big enough to hold at least one full IRC message, or messy
+ * things will happen. */
+#define BUFSIZE 1024
+
+/* Extra warning: If you change CHANMAX, your ChanServ database will be
+ * unusable.
+ */
+
+/* Maximum length of a channel name, including the trailing null. Any
+ * channels with a length longer than (CHANMAX-1) including the leading #
+ * will not be usable with ChanServ. */
+#define CHANMAX 64
+
+/* Maximum length of a nickname, including the trailing null. This MUST be
+ * at least one greater than the maximum allowable nickname length on your
+ * network, or people will run into problems using Services! The default
+ * (32) works with all servers I know of. */
+#define NICKMAX 32
+
+/* Maximum length of a password */
+#define PASSMAX 32
+
+/* Maximum length of a username */
+#define USERMAX 10
+
+/* Maximum length of a domain */
+#define HOSTMAX 64
+
+/**************************************************************************/
+
+#endif /* CONFIG_H */
diff --git a/configure b/configure
new file mode 100755
index 000000000..38693a570
--- /dev/null
+++ b/configure
@@ -0,0 +1,1858 @@
+#!/bin/sh
+#
+# Configuration script for Services.
+#
+# Anope (c) 2003 Anope team
+# Contact us at anope@zero.org
+#
+# This program is free but copyrighted software; see the file COPYING for
+# details.
+#
+# Based on the original code of Epona by PegSoft.
+# Based on the original code of Services by Andy Church.
+
+###########################################################################
+
+# Nifty handy functions.
+
+echo2 () {
+ $ECHO2 "$*$ECHO2SUF" # these are defined later
+}
+
+log () {
+ echo >&3 "$MODE: $*"
+}
+
+run () {
+ echo >&3 "$MODE: >>> $*"
+ $* >&3 2>&3 </dev/null
+}
+
+exists () { # because some shells don't have test -e
+ if [ -f $1 -o -d $1 -o -p $1 -o -c $1 -o -b $1 ] ; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+###########################################################################
+
+# Test for the presence of a given include file or function. If the
+# variable TEST is non-empty, it contains code to be placed at the end of
+# main(), and should return 0 if everything is okay, else 1.
+#
+# For includes: Pass the include filename as an argument. The variable
+# HAVE_include_name, where "include_name" is the name of the include file
+# with letters uppercased and non-alphanumerics replaced by underscores, is
+# set to 1 if the include file is present, else 0.
+#
+# For functions: Pass the return type, function name, and prototype as
+# arguments. The variable HAVE_function, where "function" is the name
+# of the function with letters uppercased, is set to 1 if the function is
+# available, else 0.
+#
+# For both: The result code of the function will be 0 (true) if the entity
+# is present, else 1 (false).
+
+test_include () {
+ include="$1"
+ inc2="`echo $include | sed 'y+abcdefghijklmnopqrstuvwxyz/.-+ABCDEFGHIJKLMNOPQRSTUVWXYZ___+'`"
+ if [ -f "/usr/include/$include" ] ; then
+ eval "HAVE_${inc2}=1"
+ log "found $include in /usr/include"
+ return 0
+ fi
+ cat >tmp/test.c <<EOT
+#include <$include>
+int main() { return 0; }
+EOT
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
+ eval "HAVE_${inc2}=1"
+ log "found $include"
+ return 0
+ else
+ eval "HAVE_${inc2}=0"
+ log "didn't find $include"
+ return 1
+ fi
+}
+
+test_function () {
+ rettype="$1"
+ func="$2"
+ proto="$3"
+ if [ ! "$rettype" -o ! "$func" ] ; then
+ log "test_function: missing parameter(s)"
+ return 1
+ fi
+ if [ ! "$proto" ] ; then
+ proto="(...)"
+ fi
+ func2=`echo $func | tr '[a-z]' '[A-Z]'`
+ if [ ! "$TEST" ] ; then
+ TEST="return 0;"
+ fi
+ cat >tmp/test.c <<EOT
+ int main() {
+ extern int $func$proto;
+ $TEST
+ }
+EOT
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test && run tmp/test ; then
+ eval "HAVE_${func2}=1"
+ log "found $func"
+ return 0
+ else
+ eval "HAVE_${func2}=0"
+ log "didn't find $func"
+ return 1
+ fi
+}
+
+###########################################################################
+
+# If something happens that really shouldn't:
+
+whoa_there () {
+ echo ""
+ echo ""
+ echo "*** WHOA THERE! ***"
+ echo ""
+ echo "We suddenly couldn't compile using the C compiler we already tested!"
+ echo "The command line we used was:"
+ echo " $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test"
+ echo "Please try to fix this; if you can't, mail anope@zero.org"
+ echo "with information about your system, the output from this script,"
+ echo "and the "\`"configure.log' file generated by this script."
+ echo ""
+ exit 4
+}
+
+###########################################################################
+###########################################################################
+
+# Create a temporary directory for our use.
+
+if [ -d tmp ] ; then
+ rm -rf tmp
+fi
+if mkdir tmp ; then : ; else
+ echo "Failed to create temporary directory! Exiting."
+ exit 2
+fi
+if chmod u+rwx tmp ; then : ; else
+ echo "Cannot write to temporary directory! Exiting."
+ exit 2
+fi
+
+###########################################################################
+
+# Variable initialization.
+
+PROGRAM=services
+BINDEST=$HOME/services
+DATDEST=$HOME/services
+
+RUNGROUP=
+UMASK=
+IRCTYPE="no default"
+IRCTYPE_DEF=
+IRCTYPE_DEF2=
+ENCRYPTION=
+IMPORTSUPPORT=
+THREAD=
+MYSQL=
+RDB=
+HAVE_MYSQL_MYSQL_H=
+USE_MODULES=
+MODULE_PATH=
+HAS_RTLD_LOCAL=
+CC_ELIBS=
+CC_MLIBS=
+
+
+INSTALL=
+CP_ALL=
+
+CC=
+CC_FLAGS=bonkle
+CC_LFLAGS=bonkle
+CC_LIBS=bonkle
+
+OSTYPE=bonkle
+
+TYPE_INT16=
+TYPE_INT32=
+
+HAVE_STRINGS_H=
+HAVE_SYS_SELECT_H=
+HAVE_SYS_SYSPROTO_H=
+
+HAVE_GETHOSTBYNAME_R=bonkle
+
+HAVE_STRERROR=
+HAVE_SYS_ERRLIST=0
+
+HAVE_SNPRINTF=
+BAD_SNPRINTF=
+HAVE_STRICMP=
+HAVE_STRCASECMP=
+HAVE_STRDUP=
+HAVE_STRSPN=
+HAVE_STRSIGNAL=
+HAVE_GETTIMEOFDAY=
+HAVE_SETGRENT=
+HAVE_UMASK=
+HAVE_FORK=
+MISSING=bonkle
+
+###########################################################################
+
+# How can we echo something without going to the next line?
+
+ECHO2SUF=''
+if [ "`echo -n a ; echo -n b`" = "ab" ] ; then
+ ECHO2='echo -n'
+elif [ "`echo 'a\c' ; echo 'b\c'`" = "ab" ] ; then
+ ECHO2='echo' ; ECHO2SUF='\c'
+elif [ "`printf 'a' 2>&1 ; printf 'b' 2>&1`" = "ab" ] ; then
+ ECHO2='printf "%s"'
+else
+ # oh well...
+ ECHO2='echo'
+fi
+export ECHO2 ECHO2SUF
+
+###########################################################################
+
+# Command-line parsing.
+
+IGNORE_CACHE= ; USER_CC= ; USER_CC_FLAGS=bonkle ; USER_CC_LFLAGS=bonkle
+USER_CC_LIBS= ; MYSQL_LIB_DIR=bonkle ; MYSQL_INC_DIR=bonkle
+
+export IGNORE_CACHE USER_CC USER_CC_FLAGS USER_CC_LFLAGS USER_CC_LIBS MYSQL_LIB_DIR MYSQL_INC_DIR
+
+while [ $# -gt 0 ] ; do
+ if [ "$1" = "-ignore-cache" ] ; then
+ IGNORE_CACHE=bonkle
+ elif [ "$1" = "-cc" ] ; then
+ shift
+ USER_CC=$1
+ elif [ "$1" = "-cflags" ] ; then
+ shift
+ USER_CC_FLAGS=$1
+ elif [ "$1" = "-lflags" ] ; then
+ shift
+ USER_CC_LFLAGS=$1
+ elif [ "$1" = "-libs" ] ; then
+ shift
+ USER_CC_LIBS=$1
+ elif [ "$1" = "-os2" ] ; then
+ PROGRAM=services.exe
+ elif [ "$1" = "-with-mysql-libs" ] ; then
+ shift
+ MYSQL_LIB_DIR=$1
+ elif [ "$1" = "-with-mysql-includes" ] ; then
+ shift
+ MYSQL_INC_DIR=$1
+ else
+ if [ "$1" != "-help" -a "$1" != "-h" -a "$1" != "--help" ]; then
+ echo >&2 Unknown option/parameter: "$1"
+ exitval=1
+ else
+ exitval=0
+ fi
+ cat >&2 <<EOT
+Available options:
+ -ignore-cache Don't use cache file if it exists
+ -os2 Indicate that this is an OS/2 system.
+ -cc Specify C compiler to use (overrides cache and check)
+ -cflags Specify compilation flags (defaults: -O2 for gcc,
+ -O for other compilers; overrides cache/check)
+ -lflags Specify link flags for C compiler (default: none)
+ -libs Specify extra link libraries to use (default: none)
+ -with-mysql-libs Specify MySQL library directory to use (default: /usr/lib/mysql)
+ -with-mysql-includes Specify MySQL include directory to use (default: /usr/include)
+EOT
+ exit $exitval
+ fi
+ shift
+done
+
+###########################################################################
+
+echo ""
+echo "-========================= A N O P E ==========================-"
+echo "For more detailed information on the features of Anope1.5 please"
+echo "read the self-named documentation found on the 'docs' directory."
+echo ""
+
+echo "Anope is a set of IRC Service expanded upon Lara's Epona, based"
+echo "on Andy Church's IRC Services. For all your Anope needs please"
+echo "visit our portal at http://www.anope.org/"
+echo ""
+
+echo "Please read the INSTALL file for install/upgrade instructions."
+echo "Reading the FAQ and README files would be a good idea too. (all"
+echo "documentation is located on directory 'docs')."
+echo "-==============================================================-"
+echo ""
+echo "Beginning Services configuration."
+echo ""
+
+###########################################################################
+
+# First, test for the presence of a config.cache file. If found, either
+# don't use it (-ignore-cache), or let the user know how to not use it and
+# then use it.
+
+if [ -f config.cache -a -r config.cache -a ! "$IGNORE_CACHE" ] ; then
+ cat <<EOT
+Using defaults from config.cache. To ignore, either rm config.cache
+or give the command-line option "-ignore-cache".
+
+EOT
+ . config.cache
+ if [ ! "$HAVE_SNPRINTF" \
+ -o ! "$BAD_SNPRINTF" \
+ -o ! "$HAVE_STRICMP" \
+ -o ! "$HAVE_STRCASECMP" \
+ -o ! "$HAVE_STRDUP" \
+ -o ! "$HAVE_STRSPN" \
+ -o ! "$HAVE_STRSIGNAL" ] ; then
+ MISSING=bonkle
+ fi
+fi
+
+###########################################################################
+
+# Ask the user anything we need to know ahead of time.
+
+export ok INPUT
+
+####
+
+ok=0
+echo "Note: press Return for the default, or enter a new value."
+echo "In what directory do you want the binaries to be installed?"
+while [ $ok -eq 0 ] ; do
+ echo2 "[$BINDEST] "
+ if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+ if [ ! "$INPUT" ] ; then
+ INPUT=$BINDEST
+ fi
+ if [ ! -d "$INPUT" ] ; then
+ if exists "$INPUT" ; then
+ echo "$INPUT exists, but is not a directory!"
+ else
+ echo "$INPUT does not exist. Create it?"
+ echo2 "[y] "
+ read YN
+ if [ "$YN" != "n" ] ; then
+ if mkdir -p $INPUT ; then
+ ok=1
+ fi
+ fi
+ fi
+ elif exists "$INPUT/services.h" ; then
+ echo "You cannot use the Services source directory as a target directory."
+ else
+ ok=1
+ fi
+done
+BINDEST=$INPUT
+DATDEST=$INPUT
+echo ""
+
+####
+
+ok=0
+echo "Where do you want the data files to be installed?"
+while [ $ok -eq 0 ] ; do
+ echo2 "[$DATDEST] "
+ if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+ if [ ! "$INPUT" ] ; then
+ INPUT=$DATDEST
+ fi
+ if [ ! -d "$INPUT" ] ; then
+ if exists "$INPUT" ; then
+ echo "$INPUT exists, but is not a directory!"
+ else
+ echo "$INPUT does not exist. Create it?"
+ echo2 "[y] "
+ read YN
+ if [ "$YN" != "n" ] ; then
+ if mkdir -p $INPUT ; then
+ ok=1
+ fi
+ fi
+ fi
+ elif exists "$INPUT/services.h" ; then
+ echo "You cannot use the Services source directory as a target directory."
+ else
+ ok=1
+ fi
+done
+DATDEST=$INPUT
+echo ""
+
+####
+
+OLD_RUNGROUP="$RUNGROUP"
+if [ "$RUNGROUP" ] ; then
+ echo "Which group should all Services data files be owned by? (If Services"
+ echo "should not force files to be owned by a particular group, type "\"none\"
+ echo "(without the quotes) and press Return.)"
+else
+ echo "Which group should all Services data files be owned by? (If Services"
+ echo "should not force files to be owned by a particular group, just press"
+ echo "Return.)"
+fi
+echo2 "[$RUNGROUP] "
+if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+if [ "$INPUT" ] ; then
+ if [ "$INPUT" = "none" ] ; then
+ RUNGROUP=""
+ else
+ RUNGROUP="$INPUT"
+ fi
+fi
+echo ""
+
+####
+
+if [ ! "$UMASK" -o "$RUNGROUP" != "$OLD_RUNGROUP" ] ; then
+ if [ "$RUNGROUP" ] ; then
+ UMASK=007
+ else
+ UMASK=077
+ fi
+fi
+
+ok=0
+echo "What should the default umask for data files be (in octal)?"
+echo "(077 = only accessible by owner; 007 = accessible by owner and group)"
+while [ $ok -eq 0 ] ; do
+ echo2 "[$UMASK] "
+ if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+ if [ ! "$INPUT" ] ; then
+ INPUT=$UMASK
+ fi
+ if [ `echo "$INPUT" | grep -c '[^0-7]'` -gt 0 ] ; then
+ echo "$UMASK is not a valid octal number!"
+ else
+ if [ "`echo $INPUT | cut -c1`" != "0" ] ; then
+ INPUT=0$INPUT
+ fi
+ ok=1
+ fi
+done
+UMASK=$INPUT
+echo ""
+
+####
+
+ok=0
+echo "Select the closest to the type of server on your IRC network:"
+echo " 1) DreamForge 4.6.7 [dated IRCd, upgrade to a current one]"
+echo " 2) Bahamut 1.4.27 [or later]"
+echo " 3) UnrealIRCd 3.1.1 [or later]"
+echo " 4) UltimateIRCd 2.8.2 [or later]"
+echo " 5) UltimateIRCd 3.0.0 [alpha26 or later]"
+echo " 6) Hybrid IRCd 7.0 [experimental]"
+echo " 7) ViagraIRCd 1.3.x [or later]"
+echo " 8) PTlink 6.15.0 [experimental]"
+
+while [ $ok -eq 0 ] ; do
+ echo2 "[$IRCTYPE] "
+ if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+ if [ ! "$INPUT" ] ; then
+ INPUT=$IRCTYPE
+ fi
+ case $INPUT in
+ no\ default)
+ echo "You must specify your IRC server type in order for Services to function"
+ echo "correctly."
+ ;;
+ 1)
+ IRCTYPE_DEF="IRC_DREAMFORGE"
+ IRCTYPE_DEF2=
+ ok=1
+ ;;
+ 2)
+ IRCTYPE_DEF="IRC_BAHAMUT"
+ IRCTYPE_DEF2=
+ ok=1
+ ;;
+ 3) IRCTYPE_DEF="IRC_DREAMFORGE"
+ IRCTYPE_DEF2="IRC_UNREAL"
+ ok=1
+ ;;
+ 4) IRCTYPE_DEF="IRC_DREAMFORGE"
+ IRCTYPE_DEF2="IRC_ULTIMATE"
+ ok=1
+ ;;
+ 5) IRCTYPE_DEF="IRC_BAHAMUT"
+ IRCTYPE_DEF2="IRC_ULTIMATE3"
+ ok=1
+ ;;
+ 6) IRCTYPE_DEF="IRC_HYBRID"
+ IRCTYPE_DEF2=
+ ok=1
+ ;;
+ 7) IRCTYPE_DEF="IRC_BAHAMUT"
+ IRCTYPE_DEF2="IRC_VIAGRA"
+ ok=1
+ ;;
+ 8) IRCTYPE_DEF="IRC_PTLINK"
+ IRCTYPE_DEF2=
+ ok=1
+ ;;
+ *)
+ echo "Please enter a valid option number."
+ ;;
+ esac
+done
+IRCTYPE=$INPUT
+echo ""
+
+####
+
+if [ "$ENCRYPTION" = "ENCRYPT_MD5" ] ; then
+ DEF=yes
+else
+ DEF=no
+fi
+
+ok=0
+echo "Do you want to use the MD5 message-digest algorithm to encrypt passwords?"
+echo "(Selecting "\"yes\"" protects your passwords from being stolen if someone"
+echo "gains access to the Services databases, but makes it impossible to recover"
+echo "forgotten passwords. There is no way to reverse this operation, so make"
+echo "sure you really want to enable it.)"
+while [ $ok -eq 0 ] ; do
+ echo2 "[$DEF] "
+ if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+ if [ ! "$INPUT" ] ; then
+ INPUT=$DEF
+ fi
+ case $INPUT in
+ n*|N*)
+ ENCRYPTION=
+ ok=1
+ ;;
+ y*|Y*)
+ ENCRYPTION=ENCRYPT_MD5
+ ok=1
+ ;;
+ *)
+ echo "Please enter `yes' or `no'."
+ ;;
+ esac
+done
+echo ""
+
+
+
+####
+
+if [ "$THREAD" = "USE_THREADS" ] ; then
+ DEF=yes
+else
+ DEF=no
+fi
+
+ok=0
+echo "Do you want to compile Anope with threading support?"
+echo "If you want to use the proxy detector, you MUST have this. If you get"
+echo "compilation errors, you should disable this feature and try again."
+while [ $ok -eq 0 ] ; do
+ echo2 "[$DEF] "
+ if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+ if [ ! "$INPUT" ] ; then
+ INPUT=$DEF
+ fi
+ case $INPUT in
+ n*|N*)
+ THREAD=
+ ok=1
+ ;;
+ y*|Y*)
+ THREAD="USE_THREADS"
+ ok=1
+ ;;
+ *)
+ echo "Please enter yes or no."
+ ;;
+ esac
+done
+echo ""
+
+if [ "$MYSQL" = "USE_MYSQL" ] ; then
+ DEF=yes
+else
+ DEF=no
+fi
+
+ok=0
+echo "Do you want to compile Anope with MySQL support?"
+echo "At this time Anope is able to dump all databases into MySQL. That means"
+echo "you get a read-only copy of the data. If you plan to run any module that"
+echo "uses MySQL, you should enable this option as well."
+while [ $ok -eq 0 ] ; do
+ echo2 "[$DEF] "
+ if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+ if [ ! "$INPUT" ] ; then
+ INPUT=$DEF
+ fi
+ case $INPUT in
+ n*|N*)
+ RDB=
+ MYSQL=
+ ok=1
+ ;;
+ y*|Y*)
+ RDB="USE_RDB"
+ MYSQL="USE_MYSQL"
+ ok=1
+ ;;
+ *)
+ echo "Please enter yes or no."
+ ;;
+ esac
+done
+echo ""
+
+####
+
+if [ "$USE_MODULES" = "USE_MODULES" ] ; then
+ DEF=yes
+else
+ DEF=no
+fi
+
+ok=0
+echo "Do you want to compile Anope with Module support?"
+echo "This will allow you to load and unload external modules of code without"
+echo "restarting services. You can find several Anope modules on our website."
+echo "This requires libdl, if you have problems compiling disable this option."
+echo "(this option is ignored on OpenBSD for the time being)"
+while [ $ok -eq 0 ] ; do
+ echo2 "[$DEF] "
+ if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+ if [ ! "$INPUT" ] ; then
+ INPUT=$DEF
+ fi
+ case $INPUT in
+ n*|N*)
+ USE_MODULES=
+ MODULE_PATH=
+ ok=1
+ ;;
+ y*|Y*)
+ USE_MODULES="USE_MODULES"
+ ok=1
+ ;;
+ *)
+ echo "Please enter yes or no."
+ ;;
+ esac
+done
+echo ""
+
+###
+if [ "$USE_MODULES" = "USE_MODULES" ] ; then
+ if [ "$MODULE_PATH" ] ; then
+ DEF=$MODULE_PATH
+ else
+ DEF=$BINDEST/modules/
+ fi
+ ok=0
+ echo "Where do you want the modules installed? (The trailing / is important)"
+ while [ $ok -eq 0 ] ; do
+ echo2 "[$DEF] "
+ if read INPUT ; then : ; else echo "" ; exit 1 ; fi
+ if [ ! "$INPUT" ] ; then
+ INPUT=$DEF
+ fi
+ if [ ! -d "$INPUT" ] ; then
+ if exists "$INPUT" ; then
+ echo "$INPUT exists, but is not a directory!"
+ else
+ echo "$INPUT does not exist. Create it?"
+ echo2 "[y] "
+ read YN
+ if [ "$YN" != "n" ] ; then
+ if mkdir -p $INPUT ; then
+ ok=1
+ fi
+ fi
+ fi
+ elif exists "$INPUT/services.h" ; then
+ echo "You cannot use the Services source directory as a target directory."
+ else
+ ok=1
+ fi
+ if [ ! -d "$INPUT/runtime/" ] ; then
+ if mkdir -p $INPUT/runtime/ ; then
+ ok=1
+ fi
+ fi
+ done
+ MODULE_PATH=$INPUT
+ echo ""
+fi
+echo ""
+
+###
+
+echo "End of interactive configuration."
+echo ""
+
+###########################################################################
+
+# Set up log file for automated tests, so we have a clue what's going on if
+# something dies.
+
+exec 3>configure.log
+
+MODE=" "
+TEST=""
+export MODE TEST
+
+###########################################################################
+
+# Search for a compiler.
+
+MODE="find_cc "
+echo2 "Searching for a suitable compiler... "
+if [ "$USER_CC" ] ; then
+ CC="$USER_CC"
+ echo "(supplied) using $CC."
+ log user supplied \`"$USER_CC'"
+elif [ "$CC" ] ; then
+ echo "(cached) using $CC."
+ log cache supplied \`"$CC'"
+elif run gcc --version ; then
+ echo "great, found gcc!"
+ CC=gcc
+ DEF_CC_FLAGS=-O2
+ log using \`gcc\'
+else
+ echo "gcc not found."
+ echo2 " Looking for alternatives... "
+ echo >tmp/test.c "int main(){return 1;}"
+ if run cc tmp/test.c -o tmp/test ; then
+ CC=cc
+ elif run c89 tmp/test.c -o tmp/test ; then
+ CC=c89
+ else
+ echo "no C compiler found!"
+ echo " Use the -cc command line option to specify your C compiler."
+ log "automatic tests failed"
+ exit 2
+ fi
+ # See if it handles ANSI.
+ cat >tmp/test.c <<EOT
+ int main(int argc, char **argv) {
+ extern void foo(int bar);
+ }
+EOT
+ log "test for ANSI..."
+ if run $CC tmp/test.c -o tmp/test ; then
+ echo "using $CC."
+ log using \`"$CC'"
+ else
+ echo "found $CC, but it's not ANSI-compliant!"
+ echo " Use the -cc command line option to specify your C compiler."
+ log \`"$CC' not ANSI-compliant"
+ exit 2
+ fi
+ DEF_CC_FLAGS=-O
+fi
+
+
+# Test compiler options.
+
+MODE="find_ccopts "
+if [ "$USER_CC_FLAGS" != bonkle ] ; then
+ CC_FLAGS="$USER_CC_FLAGS"
+ echo "Compiler flags supplied: $CC_FLAGS"
+ log user supplied flags: \`"$CC_FLAGS'"
+elif [ "$CC_FLAGS" != bonkle ] ; then
+ echo "Compiler flags: (cached) $CC_FLAGS"
+ log cache supplied flags: \`"$CC_FLAGS'"
+else
+ CC_FLAGS=$DEF_CC_FLAGS
+ echo2 "Testing default compiler flags ($CC_FLAGS)... "
+ cat >tmp/test.c <<EOT
+ int main(int argc, char **argv) {
+ extern void foo(int bar);
+ }
+EOT
+ if run $CC $CC_FLAGS -c tmp/test.c -o tmp/test.o ; then
+ echo "looks good."
+ else
+ echo "no luck! Using no flags."
+ echo " If you know what flags you want, use the -cflags option to configure."
+ CC_FLAGS=
+ fi
+ log using flags: \`"$CC_FLAGS'"
+fi
+
+###########################################################################
+
+# Set linker flags.
+
+MODE="find_lflags "
+if [ "$USER_CC_LFLAGS" != "bonkle" ] ; then
+ CC_LFLAGS=$USER_CC_LFLAGS
+ log user supplied \`"$CC_LFLAGS'"
+elif [ "$CC_LFLAGS" != "bonkle" ] ; then
+ log cache supplied \`"$CC_LFLAGS'"
+else
+ log using no flags
+ CC_LFLAGS=""
+fi
+
+###########################################################################
+
+# See what libraries we have that we might need.
+
+MODE="find_libs "
+echo2 "Let's see what libraries are lying around... "
+if [ "$CC_LIBS" != bonkle ] ; then
+ if [ "$CC_LIBS" ] ; then
+ echo "(cached) $CC_LIBS"
+ else
+ echo "(cached) none"
+ fi
+ log cache supplied \`"$CC_LIBS'"
+else
+ CC_LIBS=
+ if run $CC $CC_FLAGS tmp/test.c -lnsl -o tmp/test ; then
+ CC_LIBS="$CC_LIBS -lnsl"
+ echo2 "-lnsl "
+ fi
+ if run $CC $CC_FLAGS tmp/test.c -lsocket -o tmp/test ; then
+ CC_LIBS="$CC_LIBS -lsocket"
+ echo2 "-lsocket "
+ fi
+ if run $CC $CC_FLAGS tmp/test.c -lresolv -o tmp/test ; then
+ CC_LIBS="$CC_LIBS -lresolv"
+ echo2 "-lresolv "
+ fi
+ if run $CC $CC_FLAGS tmp/test.c -lbsd -o tmp/test ; then
+ CC_LIBS="$CC_LIBS -lbsd"
+ echo2 "-lbsd "
+ fi
+
+ if [ "$THREAD" = "USE_THREADS" ] ; then
+ if run $CC $CC_FLAGS -D_REENTRANT tmp/test.c -pthread -o tmp/test ; then
+ CC_FLAGS="$CC_FLAGS -D_REENTRANT"
+ CC_LIBS="$CC_LIBS -pthread"
+ echo2 "-pthread "
+ elif run $CC $CC_FLAGS -D_REENTRANT tmp/test.c -lpthread -o tmp/test ; then
+ CC_FLAGS="$CC_FLAGS -D_REENTRANT"
+ CC_LIBS="$CC_LIBS -lpthread"
+ echo2 "-lpthread "
+ else
+ THREAD=""
+ echo ""
+ echo "Configure was not able to determine how to compile Anope"
+ echo "with threading support; disabled it."
+ fi
+ fi
+
+ if [ "$MYSQL" = "USE_MYSQL" ] ; then
+ if [ "$MYSQL_LIB_DIR" = bonkle ] ; then
+ # Let's try to find it...
+ MYSQL_LIB_DIR="`mysql_config --libs 2> /dev/null | awk '{print $1}' | sed s/-L//g | sed s/\'//g`"
+ if [ -f "$MYSQL_LIB_DIR/libmysqlclient.so" ] ; then
+ MYSQL_LIB_DIR="$MYSQL_LIB_DIR"
+ elif [ -f "/usr/lib/libmysqlclient.so" ] ; then
+ MYSQL_LIB_DIR="/usr/lib"
+ elif [ -f "/usr/lib/mysql/libmysqlclient.so" ] ; then
+ MYSQL_LIB_DIR="/usr/lib/mysql"
+ elif [ -f "/usr/local/lib/mysql/libmysqlclient.so" ] ; then
+ MYSQL_LIB_DIR="/usr/local/lib/mysql"
+ else
+ echo ""
+ echo "Couldn't find default MySQL lib directory."
+ echo "Specify your MySQL lib directory manually."
+ echo "Run $0 with:"
+ echo "-with-mysql-libs /path/to/libmysqlclient.so"
+ echo ""
+ echo "Exiting..."
+ exit 4
+ fi
+ else
+ if [ ! -f "${MYSQL_LIB_DIR}/libmysqlclient.so" ] ; then
+ echo ""
+ echo "Couldn't find MySQL library files. Check"
+ echo "that your MySQL lib directory is correct"
+ echo "Exiting..."
+ exit 4
+ else
+ export LD_LIBRARY_PATH="${MYSQL_LIB_DIR}:${LD_LIBRARY_PATH}"
+ MYSQL_LIBDIR_WARN="MYSQL_LIBDIR_WARN"
+ fi
+ fi
+
+ if [ "$MYSQL_INC_DIR" = bonkle ] ; then
+ # Same deal as before
+ MYSQL_INC_DIR="`mysql_config --cflags 2> /dev/null | sed s/-I//g | sed s/\'//g`"
+ if [ -d "$MYSQL_INC_DIR" ] && [ -f "$MYSQL_INC_DIR/mysql/mysql.h" ] ; then
+ MYSQL_INC_DIR="$MYSQL_INC_DIR"
+ elif [ -f "$MYSQL_INC_DIR/mysql.h" ] ; then
+ MYSQL_INC_DIR="$MYSQL_INC_DIR"
+ HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
+ elif [ -d "/usr/include/mysql" ] && [ -f "/usr/include/mysql/mysql.h" ] ; then
+ MYSQL_INC_DIR="/usr/include"
+ elif [ -f "/usr/include/mysql.h" ] ; then
+ MYSQL_INC_DIR="/usr/include"
+ HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
+ elif [ -d "/usr/local/include" ] && [ -f "/usr/local/include/mysql/mysql.h" ] ; then
+ MYSQL_INC_DIR="/usr/local/include"
+ elif [ -f "/usr/local/include/mysql.h" ] ; then
+ MYSQL_INC_DIR="/usr/local/include"
+ HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
+ else
+ echo ""
+ echo "Couldn't find default MySQL include directory."
+ echo "Specify your MySQL include directory manually."
+ echo "Run $0 with:"
+ echo "-with-mysql-includes /path/to/mysql.h"
+ echo ""
+ echo "Exiting..."
+ exit 4
+ fi
+ else
+ if [ -f "${MYSQL_INC_DIR}/mysql/mysql.h" ] ; then
+ MYSQL_INC_DIR="${MYSQL_INC_DIR}/mysql"
+ HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
+ elif [ -f "${MYSQL_INC_DIR}/mysql.h" ] ; then
+ HAVE_MYSQL_MYSQL_H="HAVE_MYSQL_MYSQL_H"
+ else
+ echo ""
+ echo "Couldn't find MySQL include files. Check that"
+ echo "your MySQL include directory is correct."
+ echo "Exiting..."
+ exit 4
+ fi
+
+ fi
+
+ if [ "$HAVE_MYSQL_MYSQL_H" = "HAVE_MYSQL_MYSQL_H" ] ; then
+ cat >tmp/test.c <<EOT
+ #include <mysql.h>
+ int main(void) { return 0; }
+EOT
+ else
+ cat >tmp/test.c <<EOT
+ #include <mysql/mysql.h>
+ int main(void) { return 0; }
+EOT
+ fi
+
+ if run $CC $CC_FLAGS -I$MYSQL_INC_DIR -L$MYSQL_LIB_DIR -lmysqlclient tmp/test.c ; then
+ CC_LIBS="$CC_LIBS -L$MYSQL_LIB_DIR -lmysqlclient -lz"
+ CC_FLAGS="$CC_FLAGS -I$MYSQL_INC_DIR"
+ echo2 "-lmysqlclient "
+ else
+ echo ""
+ echo "Unable to compile with MySQL support. Check that the include"
+ echo "and library directories are correct."
+ exit 4
+ fi
+
+ fi
+
+ echo ""
+ CC_LIBS="`echo $CC_LIBS | sed 's/^ +//'`"
+fi
+
+if [ "$USER_CC_LIBS" ] ; then
+ CC_LIBS="$CC_LIBS $USER_CC_LIBS"
+ echo "Additional user-supplied libraries: $USER_CC_LIBS"
+ log user added \`"$USER_CC_LIBS'"
+fi
+
+
+if [ "$USE_MODULES" = "USE_MODULES" ] ; then
+ cat >tmp/test.c <<EOT
+ #include <dlfcn.h>
+ int main(void) { return RTLD_LOCAL; }
+EOT
+ if run $CC $CC_FLAGS tmp/test.c ; then
+ HAS_RTLD_LOCAL="yes"
+ echo "has RTLD_LOCAL "
+ else
+ echo "no RTLD_LOCAL"
+ fi
+fi
+
+
+
+###########################################################################
+
+# OS specific behaviour
+
+echo2 "Looking for OS specific needs... "
+if [ "$OSTYPE" != bonkle ] ; then
+ if [ "$OSTYPE" = "LINUX20" ] ; then
+ echo2 "(cached) Linux 2.0 or 2.1 thread handling; "
+ fi
+ if [ "$OSTYPE" = "LINUX22" ] ; then
+ echo2 "(cached) Linux 2.2+ thread handling; "
+ fi
+ if [ "$OSTYPE" = "JAGUAR" ] ; then
+ echo2 "(cached) Jaguar (MacOS X 10.2.x); "
+ fi
+ if [ "$OSTYPE" = "MACOSX" ] ; then
+ echo2 "(cached) MacOS X (10.0.x, 10.1.x); "
+ fi
+else
+ if [ "$THREAD" = "USE_THREADS" -a `uname -s` = "Linux" ] ; then
+ VER=`uname -r`
+ case $VER in
+ 2.0*|2.1*)
+ OSTYPE="LINUX20"
+ echo2 "Linux 2.0 or 2.1 thread handling; "
+ ;;
+ *)
+ OSTYPE="LINUX22"
+ echo2 "Linux 2.2+ thread handling; "
+ ;;
+ esac
+ else
+ if [ `uname -s` = "Darwin" ] ; then
+ VER=`uname -r`
+ case $VER in
+ 6.*)
+ OSTYPE="JAGUAR"
+ echo2 "Jaguar (MacOS X 10.2.x); "
+ ;;
+ *)
+ OSTYPE="MACOSX"
+ echo2 "MacOS X (10.0.x, 10.1.x); "
+ ;;
+ esac
+ fi
+ fi
+fi
+
+echo ""
+
+###########################################################################
+
+# See what sizes various types are.
+
+MODE="check_int16 "
+echo2 "Looking for a 16-bit integer type... "
+if [ "$TYPE_INT16" ] ; then
+ echo "(cached) $TYPE_INT16"
+ log "cache supplied $TYPE_INT16"
+else
+ cat >tmp/test.c <<EOT
+ int main() {
+ int a;
+ short b;
+ printf("%d %d", sizeof(a), sizeof(b));
+ return 0;
+ }
+EOT
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
+ a="`tmp/test`"
+ log "test program output (sizeof(int) sizeof(short)): $a"
+ if [ ! "$a" ] ; then
+ echo "test program failed! Assuming short."
+ log "assuming short"
+ TYPE_INT16=short
+ else
+ size_int=`echo $a | cut -d\ -f1`
+ size_short=`echo $a | cut -d\ -f2`
+ if [ $size_int = 2 ] ; then
+ echo int
+ log "int is 16 bits"
+ TYPE_INT16=int
+ elif [ $size_short = 2 ] ; then
+ echo short
+ log "short is 16 bits"
+ TYPE_INT16=short
+ else
+ echo "none found?! Assuming short."
+ log "no 16-bit type found, assuming short"
+ TYPE_INT16=short
+ fi
+ fi
+ else
+ whoa_there
+ fi
+fi
+
+MODE="check_int32 "
+echo2 "Looking for a 32-bit integer type... "
+if [ "$TYPE_INT32" ] ; then
+ echo "(cached) $TYPE_INT32"
+ log "cache supplied $TYPE_INT32"
+else
+ cat >tmp/test.c <<EOT
+ int main() {
+ int a;
+ long b;
+ printf("%d %d", sizeof(a), sizeof(b));
+ return 0;
+ }
+EOT
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
+ a="`tmp/test`"
+ log "test program output (sizeof(int) sizeof(long)): $a"
+ if [ ! "$a" ] ; then
+ echo "test program failed! Assuming long."
+ log "assuming long"
+ TYPE_INT32=long
+ else
+ size_int=`echo $a | cut -d\ -f1`
+ size_long=`echo $a | cut -d\ -f2`
+ if [ $size_int = 4 ] ; then
+ echo int
+ log "int is 32 bits"
+ TYPE_INT32=int
+ elif [ $size_long = 4 ] ; then
+ echo long
+ log "long is 32 bits"
+ TYPE_INT32=long
+ else
+ echo "none found?! Assuming long."
+ log "no 32-bit type found, assuming long"
+ TYPE_INT32=long
+ fi
+ fi
+ else
+ whoa_there
+ fi
+fi
+
+###########################################################################
+
+# Look for include files that might or might not be here.
+echo "Checking for presence of include files (it's okay if some aren't there):"
+
+MODE="check_strings "
+echo2 " strings.h... "
+if [ "$HAVE_STRINGS_H" ] ; then
+ if [ "$HAVE_STRINGS_H" = 1 ] ; then
+ echo "(cached) present"
+ log "cache says present"
+ else
+ echo "(cached) not present"
+ log "cache says not present"
+ fi
+else
+ if test_include strings.h ; then
+ echo "present"
+ else
+ echo "not present"
+ fi
+fi
+
+MODE="check_sysselect "
+echo2 " sys/select.h... "
+if [ "$HAVE_SYS_SELECT_H" ] ; then
+ if [ "$HAVE_SYS_SELECT_H" = 1 ] ; then
+ echo "(cached) present"
+ log "cache says present"
+ else
+ echo "(cached) not present"
+ log "cache says not present"
+ fi
+else
+ if test_include sys/select.h ; then
+ echo "present"
+ else
+ echo "not present"
+ fi
+fi
+
+MODE="check_sysproto "
+echo2 " sys/sysproto.h... "
+if [ "$HAVE_SYS_SYSPROTO_H" ] ; then
+ if [ "$HAVE_SYS_SYSPROTO_H" = 1 ] ; then
+ echo "(cached) present"
+ log "cache says present"
+ else
+ echo "(cached) not present"
+ log "cache says not present"
+ fi
+else
+ if test_include sys/sysproto.h ; then
+ echo "present"
+ else
+ echo "not present"
+ fi
+fi
+
+###########################################################################
+
+# AIX workaround.
+
+MODE="check_aix_intNN "
+echo2 "Seeing if your system defines int16/int32... "
+res="`run egrep int16\|int32 /usr/include/sys/systypes.h`"
+if [ "$res" ] ; then
+ echo "found."
+ echo " (This is bad, but we can work around it.)"
+ log "int16/int32 types found, enabling workaround"
+ INTTYPE_WORKAROUND=1
+else
+ echo "not found (this is good)."
+ log "int16/int32 types not found"
+ INTTYPE_WORKAROUND=0
+fi
+
+###########################################################################
+
+# How to use gethostbyname_r() ...
+
+if [ "$THREAD" = "USE_THREADS" ] ; then
+ MODE="check_gethostbyname_r "
+ echo2 "Figuring out how to call gethostbyname_r on your system... "
+
+ if [ "$HAVE_GETHOSTBYNAME_R" != "bonkle" ] ; then
+ if [ "$HAVE_GETHOSTBYNAME_R" = "HAVE_GETHOSTBYNAME_R6" ] ; then
+ echo "(cached) with 6 parameters."
+ log "cache supplied with 6 parameters."
+ elif [ "$HAVE_GETHOSTBYNAME_R" = "HAVE_GETHOSTBYNAME_R5" ] ; then
+ echo "(cached) with 5 parameters."
+ log "cache supplied with 5 parameters."
+ elif [ "$HAVE_GETHOSTBYNAME_R" = "HAVE_GETHOSTBYNAME_R3" ] ; then
+ echo "(cached) with 3 parameters."
+ log "cache supplied with 3 parameters."
+ else
+ THREAD=
+ echo "(cached) no compatible gethostbyname_r()"
+ log "cache supplied no compatible gethostbyname_r()"
+ fi
+ else
+ cat >tmp/test.c <<EOT
+ #include "pthread.h"
+ #include "netdb.h"
+
+ int main() {
+ char *name;
+ struct hostent *he, *res;
+ char buffer[2048];
+ int buflen = 2048;
+ int h_errnop;
+
+ (void) gethostbyname_r(name, he, buffer, buflen, &res, &h_errnop);
+ }
+EOT
+
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
+ HAVE_GETHOSTBYNAME_R="HAVE_GETHOSTBYNAME_R6"
+ echo "with 6 parameters"
+ fi
+
+ if [ "$HAVE_GETHOSTBYNAME_R" = "bonkle" ] ; then
+
+ cat >tmp/test.c <<EOT
+ #include "pthread.h"
+ #include "netdb.h"
+
+ int main() {
+ char *name;
+ struct hostent *he;
+ char buffer[2048];
+ int buflen = 2048;
+ int h_errnop;
+
+ (void) gethostbyname_r(name, he, buffer, buflen, &h_errnop);
+ }
+EOT
+
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
+ HAVE_GETHOSTBYNAME_R="HAVE_GETHOSTBYNAME_R5"
+ echo "with 5 parameters"
+ fi
+
+ fi
+
+ if [ "$HAVE_GETHOSTBYNAME_R" = "bonkle" ] ; then
+
+ cat >tmp/test.c <<EOT
+ #include "pthread.h"
+ #include "netdb.h"
+
+ int main() {
+ char *name;
+ struct hostent *he;
+ struct hostent_data data;
+
+ gethostbyname_r(name, he, &data);
+ }
+EOT
+
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
+ HAVE_GETHOSTBYNAME_R="HAVE_GETHOSTBYNAME_R3"
+ echo "with 3 parameters"
+ fi
+
+ fi
+
+ if [ "$HAVE_GETHOSTBYNAME_R" = "bonkle" ] ; then
+ HAVE_GETHOSTBYNAME_R=
+ echo "no way, so we'll use mutexes"
+ fi
+ fi
+fi
+
+###########################################################################
+
+# Look for missing/broken built-in routines, and similar compatibility
+# stuff.
+
+MODE="check_strerror "
+echo2 "How to complain when something goes wrong... "
+if [ "$HAVE_STRERROR" ] ; then
+ if [ "$HAVE_STRERROR" = 1 ] ; then
+ echo "(cached) strerror()."
+ log "cache supplied strerror()"
+ elif [ "$HAVE_SYS_ERRLIST" = 1 ] ; then
+ echo "(cached) sys_errlist."
+ log "cache supplied sys_errlist"
+ else
+ HAVE_SYS_ERRLIST=0 # just in case... you never know.
+ echo "(cached) pseudo sys_errlist."
+ log "cache supplied pseudo sys_errlist"
+ fi
+else
+ cat >tmp/test.c <<EOT
+ int main() {
+ extern void strerror(void);
+ strerror();
+ }
+EOT
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
+ HAVE_STRERROR=1
+ echo "ah, strerror() is here."
+ log "using strerror()"
+ else
+ HAVE_STRERROR=0
+ echo "no strerror()."
+ cat >tmp/test.c <<EOT
+int main() {
+ extern char *sys_errlist[];
+ char *s;
+ s = sys_errlist[0];
+}
+EOT
+ log "trying sys_errlist..."
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then
+ HAVE_SYS_ERRLIST=1
+ echo " But you have sys_errlist, which will do nicely."
+ log "using sys_errlist"
+ else
+ HAVE_SYS_ERRLIST=0
+ echo " You don't have sys_errlist either, so we'll have to make do."
+ log "using pseudo sys_errlist"
+ fi
+ fi
+fi
+
+
+echo2 "Looking for other routines we want that you don't have... "
+
+MODE="check_compat "
+if [ "$MISSING" != bonkle ] ; then
+ if [ ! "$MISSING" ] ; then
+ echo "(cached) none"
+ log "cache supplied: (none)"
+ else
+ echo "(cached)$MISSING"
+ log "cache supplied:$MISSING"
+ fi
+else
+ MISSING=
+
+ MODE="check_snprintf "
+ TEST='char buf[16];
+ int res;
+ buf[0] = 0;
+ res = snprintf(buf, 8, "%d", 123456789);
+ if (strcmp(buf, "1234567") != 0) {
+ printf("test: snprintf broken (bad result in buffer: wanted 1234567, got \"%s\")\n", buf);
+ if (strlen(buf) > 7)
+ printf("test: your snprintf does not check buffer size!\n");
+ return 1;
+ } else if (res != 7) {
+ printf("test: snprintf broken (wrong return value: wanted 7, got %d)\n", res);
+ return 1;
+ } else
+ return 0;'
+ if test_function int snprintf "(char *, int, const char *, ...)" ; then
+ BAD_SNPRINTF=0
+ else
+ tmp="`tmp/test 2>&1`"
+ res="`echo $tmp | cut -d\ -f10 2>&1`"
+ if [ "$res" = "-1)" ] ; then
+ BAD_SNPRINTF=1
+ log "found, but returns -1 if string too long"
+ elif [ "$res" = "9)" ] ; then
+ BAD_SNPRINTF=2
+ log "found, but returns large value if string too long"
+ else
+ BAD_SNPRINTF=0
+ MISSING="$MISSING snprintf"
+ echo2 "snprintf "
+ fi
+ fi
+
+ MODE="check_stricmp "
+ TEST='extern int strnicmp(const char *, const char *, int); return stricmp("ABC","abc")==0 && strnicmp("ABC","abd",2)==0 ? 0 : 1;'
+ if test_function int stricmp "(const char *, const char *)" ; then
+ HAVE_STRCASECMP=0 # doesn't really matter
+ else
+ TEST='extern int strncasecmp(const char *, const char *, int); return strcasecmp("ABC","abc")==0 && strncasecmp("ABC","abd",2)==0 ? 0 : 1;'
+ if test_function int strcasecmp "(const char *, const char *)"
+ then : ; else
+ MISSING="$MISSING str[n]icmp"
+ echo2 "str[n]icmp "
+ fi
+ fi
+
+ MODE="check_strdup "
+ TEST='char *s, *t;
+ s = "ABC";
+ t = strdup(s);'"
+ return (t != (char *)0 && t[0]=='A' && t[1]=='B' && t[2]=='C' && t[3]==0) ? 0 : 1;"
+ if test_function "char *" strdup "(const char *)" ; then : ; else
+ MISSING="$MISSING strdup"
+ echo2 "strdup "
+ fi
+
+ MODE="check_strspn "
+ TEST='return (strspn("ABCBA","BA")==2 && strspn("123","123")==3) ? 0 : 1;'
+ if test_function int strspn "(const char *, const char *)" ; then : ; else
+ MISSING="$MISSING strspn"
+ echo2 "strspn "
+ fi
+
+ MODE="check_strsignal "
+ TEST="(void) strsignal(1); return 0;"
+ if test_function "char *" strsignal "(int)" ; then : ; else
+ MISSING="$MISSING strsignal"
+ echo2 "strsignal "
+ fi
+
+ MODE="check_gettimeofday"
+ TEST="char buf[256]; (void) gettimeofday((void *)buf, (void *)buf); return 0;"
+ if test_function "char *" gettimeofday "(void *, void *)" ; then : ; else
+ MISSING="$MISSING gettimeofday"
+ echo2 "gettimeofday "
+ fi
+
+ MODE="check_setgrent "
+ TEST="(void) setgrent(); return 0;"
+ if test_function int setgrent "(void)" ; then : ; else
+ MISSING="$MISSING setgrent"
+ echo2 "setgrent "
+ fi
+
+ MODE="check_umask "
+ TEST="(void) umask(1); return 0;"
+ if test_function int umask "(int)" ; then : ; else
+ MISSING="$MISSING umask"
+ echo2 "umask "
+ fi
+
+ MODE="check_fork "
+ TEST="(void) fork(); return 0;"
+ if test_function int fork "(void)" ; then : ; else
+ MISSING="$MISSING fork"
+ echo2 "fork "
+ fi
+
+ MODE="check_gethostbyname"
+ TEST='(void) gethostbyname("localhost"); return 0;'
+ if test_function "struct hostent *" gethostbyname "(const char *)" ; then : ; else
+ MISSING="$MISSING gethostbyname"
+ echo2 "gethostbyname "
+ fi
+
+ echo ""
+fi
+
+if [ $HAVE_GETHOSTBYNAME = 0 ] ; then
+ cat <<EOT
+
+*** Notice: Your system does not seem to have the gethostbyname() function.
+*** This function is used to translate hostnames into IP addresses. Since
+*** you don't have it (or we can't find it), you will need to use IP
+*** addresses instead of hostnames when setting the uplink server address
+*** in services.conf.
+
+EOT
+fi
+
+###########################################################################
+
+MODE="check_install "
+echo2 "Checking how to install files... "
+
+if [ "$INSTALL" -a "$OLD_RUNGROUP" = "$RUNGROUP" ] ; then
+ if [ "`echo $INSTALL | cut -c1`" = "." ] ; then
+ echo '(cached) using our own "install".'
+ log "cache says use our own"
+ else
+ echo '(cached) this system'\''s "install" works.'
+ log "cache says use regular "\`"install'"
+ fi
+else
+ cat >tmp/test.c <<EOT
+ int main() { return 0; }
+EOT
+ if run $CC $CC_FLAGS tmp/test.c $CC_LIBS -o tmp/test ; then : ; else
+ whoa_there
+ fi
+ if run cp -p tmp/test tmp/test3 ; then : ; else
+ echo ""
+ echo ""
+ echo "*** WHOA THERE! ***"
+ echo ""
+ echo "A simple "\`"cp -p' failed!"
+ echo "Are you out of disk space?"
+ exit 4
+ fi
+
+ if run install -m 500 tmp/test tmp/test2 && test -f tmp/test && run cmp tmp/test tmp/test2 ; then
+ echo 'looks like "install" will work.'
+ if [ "$RUNGROUP" ] ; then
+ INSTALL="install -g $RUNGROUP -m 750"
+ else
+ INSTALL="install -m 700"
+ fi
+ elif run cp -p tmp/test3 tmp/test ; run install -c -m 500 tmp/test tmp/test2 && test -f tmp/test && run cmp tmp/test tmp/test2 ; then
+ echo 'looks like "install -c" will work.'
+ if [ "$RUNGROUP" ] ; then
+ INSTALL="install -c -g $RUNGROUP -m 750"
+ else
+ INSTALL="install -c -m 700"
+ fi
+ elif run cp -p tmp/test3 tmp/test ; run ginstall -m 500 tmp/test tmp/test2 && test -f tmp/test && run cmp tmp/test tmp/test2 ; then
+ echo 'looks like "ginstall" will work.'
+ if [ "$RUNGROUP" ] ; then
+ INSTALL="ginstall -g $RUNGROUP -m 750"
+ else
+ INSTALL="ginstall -m 700"
+ fi
+ else
+ echo \"install\"" doesn't seem to work."
+ echo " But we can still use cp and friends, so we'll roll our own "\"install\".
+ if [ "$RUNGROUP" ] ; then
+ INSTALL="./install-script -g $RUNGROUP -m 750"
+ else
+ INSTALL="./install-script -m 700"
+ fi
+ fi
+ log "using: $INSTALL"
+fi
+
+###########################################################################
+
+MODE="check_copy_recur"
+echo2 "Checking how to copy directories... "
+
+if [ "$CP_ALL" ] ; then
+ echo "(cached) $CP_ALL"
+ log "cache supplied $CP_ALL"
+else
+ sysname=`/bin/uname -s 2>&1`
+ log "sysname: $sysname"
+ case $sysname in
+ Linux) CP_ALL="/bin/cp -dpr";
+ log "guessing: cp -dpr";;
+ *) CP_ALL="/bin/cp -pr";
+ log "guessing: cp -pr";;
+ esac
+ if [ ! -f tmp/test2 ] ; then
+ run cp tmp/test tmp/test2
+ fi
+ if run /bin/mkdir tmp/testA && run /bin/mkdir tmp/testB && run /bin/mv tmp/test2 tmp/testA
+ then : ; else
+ echo ""
+ echo ""
+ echo "*** WHOA THERE! ***"
+ echo ""
+ echo "A few simple mkdir's and mv's failed!"
+ echo "Are you out of disk space?"
+ exit 4
+ fi
+ if run $CP_ALL tmp/testA/* tmp/testB && run cmp tmp/testA/test2 tmp/testB/test2 ; then
+ echo "$CP_ALL"
+ log \`"$CP_ALL' works"
+ else
+ log \`"$CP_ALL' doesn't work"
+ run /bin/rm -rf tmp/testB/*
+ if run sh -c '/bin/tar -Ccf tmp/testA - . | /bin/tar -Cxf tmp/testB -' ; then
+ echo "tar (yuck)"
+ CP_ALL="./bin/cp-recursive -t"
+ log "using tar"
+ else
+ log "tar failed(!)"
+ echo ""
+ echo " Neither cp nor tar work! I give up."
+ exit 2
+ fi
+ fi
+fi
+
+###########################################################################
+
+# Create files.
+
+echo2 "Creating sysconf.h... "
+cat >sysconf.h <<EOT
+/*
+ * This file is generated automatically by "configure". Any changes made
+ * to it will be erased next time "configure" is run.
+ */
+
+#define SERVICES_BIN "$BINDEST/services"
+#define SERVICES_DIR "$DATDEST"
+
+EOT
+if [ "$RUNGROUP" ] ; then cat >>sysconf.h <<EOT
+#define RUNGROUP "$RUNGROUP"
+EOT
+fi
+cat >>sysconf.h <<EOT
+#define DEFUMASK $UMASK
+EOT
+
+cat >>sysconf.h <<EOT
+
+#define $IRCTYPE_DEF
+EOT
+if [ "$IRCTYPE_DEF2" ] ; then cat >>sysconf.h <<EOT ; fi
+#define $IRCTYPE_DEF2
+EOT
+if [ "$ENCRYPTION" ] ; then cat >>sysconf.h <<EOT ; fi
+
+#define USE_ENCRYPTION
+#define $ENCRYPTION
+EOT
+
+if [ "$IMPORTSUPPORT" ] ; then cat >>sysconf.h <<EOT ; fi
+
+#define USE_CONVERTER
+#define $IMPORTSUPPORT
+EOT
+
+if [ "$THREAD" ] ; then cat >>sysconf.h <<EOT ; fi
+
+#define $THREAD
+EOT
+
+if [ "$MYSQL" ] ; then cat >>sysconf.h <<EOT ; fi
+
+#define $MYSQL
+EOT
+
+if [ "$RDB" ] ; then cat >>sysconf.h <<EOT ; fi
+
+#define $RDB
+EOT
+
+if [ "$HAVE_MYSQL_MYSQL_H" ] ; then cat >>sysconf.h <<EOT ; fi
+#define $HAVE_MYSQL_MYSQL_H
+EOT
+
+if [ "$USE_MODULES" ] ; then cat >>sysconf.h <<EOT ; fi
+
+#define USE_MODULES 1
+#define MODULE_PATH "$MODULE_PATH"
+EOT
+if [ "$HAS_RTLD_LOCAL" ] ; then cat >>sysconf.h <<EOT ; fi
+#define HAS_RTLD_LOCAL 1
+EOT
+
+if [ "$OSTYPE" != "bonkle" ] ; then cat >>sysconf.h <<EOT ; fi
+#define $OSTYPE
+EOT
+
+cat >>sysconf.h <<EOT
+
+typedef signed $TYPE_INT16 int16;
+typedef unsigned $TYPE_INT16 uint16;
+typedef signed $TYPE_INT32 int32;
+typedef unsigned $TYPE_INT32 uint32;
+
+#define HAVE_STRINGS_H $HAVE_STRINGS_H
+#define HAVE_SYS_SELECT_H $HAVE_SYS_SELECT_H
+#define HAVE_SYS_SYSPROTO_H $HAVE_SYS_SYSPROTO_H
+
+#define HAVE_STRERROR $HAVE_STRERROR
+#define HAVE_SYS_ERRLIST $HAVE_SYS_ERRLIST
+#define HAVE_SNPRINTF $HAVE_SNPRINTF
+#define BAD_SNPRINTF $BAD_SNPRINTF
+#define HAVE_STRICMP $HAVE_STRICMP
+#define HAVE_STRCASECMP $HAVE_STRCASECMP
+#define HAVE_STRDUP $HAVE_STRDUP
+#define HAVE_STRSPN $HAVE_STRSPN
+#define HAVE_STRSIGNAL $HAVE_STRSIGNAL
+#define HAVE_GETTIMEOFDAY $HAVE_GETTIMEOFDAY
+#define HAVE_SETGRENT $HAVE_SETGRENT
+#define HAVE_UMASK $HAVE_UMASK
+#define HAVE_FORK $HAVE_FORK
+#define HAVE_GETHOSTBYNAME $HAVE_GETHOSTBYNAME
+EOT
+
+if [ "$THREAD" = "USE_THREADS" -a "$HAVE_GETHOSTBYNAME_R" != "" ] ; then
+cat >>sysconf.h <<EOT
+#define $HAVE_GETHOSTBYNAME_R
+EOT
+fi
+
+echo "done."
+
+echo2 "Creating Makefile.inc... "
+
+if [ "$USE_MODULES" = "USE_MODULES" ] ; then
+ if [ `uname -s` = "Linux" ] ; then
+ CC_ELIBS="$CC_ELIBS -ldl"
+ fi
+ CC_MLIBS="$CC_MLIBS -rdynamic"
+fi
+
+cat >Makefile.inc <<EOT
+# This file is generated automatically by "configure". Any changes made
+# to it will be erased next time "configure" is run.
+
+CC=$CC
+BASE_CFLAGS=$CC_FLAGS
+LFLAGS=$CC_LFLAGS
+LIBS=$CC_LIBS
+ELIBS=$CC_ELIBS
+MLIBS=$CC_MLIBS
+
+EOT
+if [ $HAVE_SNPRINTF = 0 -a $BAD_SNPRINTF = 0 ];then cat >>Makefile.inc <<EOT;fi
+
+VSNPRINTF_C=vsnprintf.c
+VSNPRINTF_O=vsnprintf.o
+EOT
+if [ "$RDB" = "USE_RDB" ];then cat >>Makefile.inc <<EOT;fi
+
+RDB_C=rdb.c
+RDB_O=rdb.o
+EOT
+if [ "$MYSQL" = "USE_MYSQL" ];then cat >>Makefile.inc <<EOT;fi
+
+MYSQL_C=mysql.c
+MYSQL_O=mysql.o
+EOT
+cat >>Makefile.inc <<EOT
+
+PROGRAM=$PROGRAM
+BINDEST=$BINDEST
+DATDEST=$DATDEST
+
+INSTALL=$INSTALL
+CP_ALL=$CP_ALL
+RUNGROUP=$RUNGROUP
+
+USE_MODULES=$USE_MODULES
+MODULE_PATH=$MODULE_PATH
+EOT
+echo "done."
+
+###########################################################################
+
+# Save results in cache for next time around.
+
+echo2 "Saving configuration results in config.cache... "
+
+cat <<EOT >config.cache
+PROGRAM="$PROGRAM"
+BINDEST="$BINDEST"
+DATDEST="$DATDEST"
+
+INSTALL="$INSTALL"
+CP_ALL="$CP_ALL"
+
+RUNGROUP="$RUNGROUP"
+UMASK=$UMASK
+IRCTYPE=$IRCTYPE
+IRCTYPE_DEF="$IRCTYPE_DEF"
+IRCTYPE_DEF2="$IRCTYPE_DEF2"
+ENCRYPTION="$ENCRYPTION"
+IMPORTSUPPORT="$IMPORTSUPPORT"
+THREAD="$THREAD"
+MYSQL="$MYSQL"
+USE_MODULES="$USE_MODULES"
+MODULE_PATH="$MODULE_PATH"
+HAVE_MYSQL_MYSQL_H="$HAVE_MYSQL_MYSQL_H"
+OSTYPE="$OSTYPE"
+
+CC="$CC"
+CC_FLAGS="$CC_FLAGS"
+CC_LFLAGS="$CC_LFLAGS"
+CC_LIBS="$CC_LIBS"
+
+TYPE_INT16=$TYPE_INT16
+TYPE_INT32=$TYPE_INT32
+
+HAVE_STRINGS_H=$HAVE_STRINGS_H
+HAVE_SYS_SELECT_H=$HAVE_SYS_SELECT_H
+HAVE_SYS_SYSPROTO_H=$HAVE_SYS_SYSPROTO_H
+
+HAVE_GETHOSTBYNAME_R=$HAVE_GETHOSTBYNAME_R
+
+HAVE_STRERROR=$HAVE_STRERROR
+HAVE_SYS_ERRLIST=$HAVE_SYS_ERRLIST
+
+HAVE_SNPRINTF=$HAVE_SNPRINTF
+BAD_SNPRINTF=$BAD_SNPRINTF
+HAVE_STRICMP=$HAVE_STRICMP
+HAVE_STRCASECMP=$HAVE_STRCASECMP
+HAVE_STRDUP=$HAVE_STRDUP
+HAVE_STRSPN=$HAVE_STRSPN
+HAVE_STRSIGNAL=$HAVE_STRSIGNAL
+HAVE_GETTIMEOFDAY=$HAVE_GETTIMEOFDAY
+HAVE_SETGRENT=$HAVE_SETGRENT
+HAVE_UMASK=$HAVE_UMASK
+HAVE_FORK=$HAVE_FORK
+HAVE_GETHOSTBYNAME=$HAVE_GETHOSTBYNAME
+MISSING="$MISSING"
+EOT
+
+echo "done."
+
+###########################################################################
+
+# Delete the temporary directory we created.
+
+rm -rf tmp
+
+###########################################################################
+
+# If MYSQL is enabled and the user specified a library dir
+# warn to include the directory in the LD_LIBRARY_PATH
+if [ "$MYSQL" = "USE_MYSQL" ] && [ "$MYSQL_LIBDIR_WARN" = "MYSQL_LIBDIR_WARN" ] ; then
+ echo ""
+ echo "BECAUSE YOU SPECIFIED A USER DEFINED LIBRARY DIRECTORY,"
+ echo "YOU MAY NEED TO ADD $MYSQL_LIB_DIR"
+ echo "TO YOUR LD_LIBRARY_PATH VARIABLE BEFORE RUNNING ANOPE."
+ echo "PRESS RETURN TO CONTINUE"
+ read foo
+fi
+
+cat <<EOT
+
+All done! Now run "make" (or possibly "gmake") to compile Services.
+See the INSTALL, README and FAQ files if you have any problems.
+EOT
+exit 0
diff --git a/converter.c b/converter.c
new file mode 100644
index 000000000..31c0cb880
--- /dev/null
+++ b/converter.c
@@ -0,0 +1,398 @@
+/* Database converters.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: converter.c,v 1.5 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "datafiles.h"
+
+/* Each converter will try to convert the databases to the format used
+ * by ircservices-4.3 (that is compatible with Epona).
+ */
+
+#ifdef USE_CONVERTER
+
+/*************************************************************************/
+
+#define IS43_VERSION 7
+
+#define SAFER(x) do { \
+ if ((x) < 0) { \
+ fatal("Read error on %s", rdb); \
+ return 0; \
+ } \
+} while (0)
+
+#define SAFEW(x) do { \
+ if ((x) < 0) { \
+ fatal("Write error on %s", wdb); \
+ return 0; \
+ } \
+} while (0)
+
+/*************************************************************************/
+/*****************************ircservices-4.4*****************************/
+/*************************************************************************/
+
+#ifdef IS44_CONVERTER
+
+#define IS44_VERSION 8
+#define IS44_CA_SIZE 13
+
+int convert_ircservices_44(void)
+{
+ dbFILE *f, *g; /* f for reading, g for writing */
+ int c, i, j;
+ char *rdb, *wdb;
+
+ char *tmp;
+ int16 tmp16;
+ int32 tmp32;
+
+ char nick[NICKMAX];
+ char pass[PASSMAX];
+ char chan[CHANMAX];
+
+ /* NickServ database */
+
+ if (rename("nick.db", "nick.db.old") == -1) {
+ fatal("Converter: unable to rename nick.db to nick.db.old: %s",
+ strerror(errno));
+ return 0;
+ }
+
+ if (!(f = open_db(s_NickServ, "nick.db.old", "r", IS44_VERSION))) {
+ fatal("Converter: unable to open nick.db.old in read access: %s",
+ strerror(errno));
+ return 0;
+ }
+
+ if (!(g = open_db(s_NickServ, NickDBName, "w", IS43_VERSION))) {
+ fatal("Converter: unable to open %s in write access: %s",
+ NickDBName, strerror(errno));
+ return 0;
+ }
+
+ rdb = sstrdup("nick.db.old");
+ wdb = sstrdup(NickDBName);
+
+ get_file_version(f);
+
+ for (i = 0; i < 256; i++) {
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1)
+ fatal("Invalid format in %s", wdb);
+
+ SAFEW(write_int8(1, g));
+
+ SAFER(read_buffer(nick, f));
+ SAFEW(write_buffer(nick, g));
+ SAFER(read_buffer(pass, f));
+ SAFEW(write_buffer(pass, g));
+
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+
+ if (tmp) {
+ if (tmp)
+ free(tmp);
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ } else {
+ int32 flags;
+ int16 memocount, accesscount;
+
+ SAFER(read_int32(&flags, f));
+ tmp32 = (flags & ~0x10000000);
+ SAFEW(write_int32(tmp32, g));
+
+ /* Suspend stuff that we don't convert */
+ if (flags & 0x10000000) {
+ SAFER(read_buffer(nick, f));
+ SAFER(read_string(&tmp, f));
+ if (tmp)
+ free(tmp);
+ SAFER(read_int32(&tmp32, f));
+ SAFER(read_int32(&tmp32, f));
+ }
+
+ SAFER(read_int16(&tmp16, f));
+ accesscount = tmp16;
+ SAFEW(write_int16(tmp16, g));
+
+ if (accesscount) {
+ for (j = 0; j < accesscount; j++) {
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ }
+ }
+
+ SAFER(read_int16(&memocount, f));
+ SAFEW(write_int16(memocount, g));
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+
+ if (memocount) {
+ for (j = 0; j < memocount; j++) {
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+ SAFER(read_buffer(nick, f));
+ SAFEW(write_buffer(nick, g));
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ }
+ }
+
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ }
+ } /* while (getc_db(f) != 0) */
+ SAFEW(write_int8(0, g));
+ } /* for (i) */
+
+ close_db(f);
+ close_db(g);
+
+ free(rdb);
+ free(wdb);
+
+ /* ChanServ */
+
+ rdb = sstrdup("chan.db.old");
+ wdb = sstrdup(ChanDBName);
+
+ if (rename("chan.db", rdb) == -1) {
+ fatal("Converter: unable to rename chan.db to %s: %s", rdb,
+ strerror(errno));
+ return 0;
+ }
+
+ if (!(f = open_db(s_ChanServ, rdb, "r", IS44_VERSION))) {
+ fatal("Converter: unable to open %s in read access: %s", rdb,
+ strerror(errno));
+ return 0;
+ }
+
+ if (!(g = open_db(s_ChanServ, wdb, "w", IS43_VERSION))) {
+ fatal("Converter: unable to open %s in write access: %s", wdb,
+ strerror(errno));
+ return 0;
+ }
+
+ get_file_version(f);
+
+ for (i = 0; i < 256; i++) {
+ while ((c = getc_db(f)) != 0) {
+ int16 n_levels, accesscount, akickcount, memocount;
+
+ if (c != 1)
+ fatal("Invalid format in %s", wdb);
+
+ SAFEW(write_int8(1, g));
+
+ SAFER(read_buffer(chan, f));
+ SAFEW(write_buffer(chan, g));
+
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+
+ SAFER(read_buffer(pass, f));
+ SAFEW(write_buffer(pass, g));
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ SAFER(read_buffer(nick, f));
+ SAFEW(write_buffer(nick, g));
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+
+ SAFER(read_int16(&n_levels, f));
+ SAFEW(write_int16(n_levels, g));
+
+ for (j = 0; j < n_levels; j++) {
+ SAFER(read_int16(&tmp16, f));
+ if (j < IS44_CA_SIZE)
+ SAFEW(write_int16(tmp16, g));
+ }
+
+ SAFER(read_int16(&accesscount, f));
+ SAFEW(write_int16(accesscount, g));
+
+ if (accesscount) {
+ for (j = 0; j < accesscount; j++) {
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ if (tmp16) {
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ }
+ }
+ }
+
+ SAFER(read_int16(&akickcount, f));
+ SAFEW(write_int16(akickcount, g));
+
+ if (akickcount) {
+ for (j = 0; j < akickcount; j++) {
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ if (tmp16) {
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ SAFER(read_buffer(nick, f));
+ }
+ }
+ }
+
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+
+ SAFER(read_int16(&memocount, f));
+ SAFEW(write_int16(memocount, g));
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+
+ if (memocount) {
+ for (j = 0; j < memocount; j++) {
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+ SAFER(read_int16(&tmp16, f));
+ SAFEW(write_int16(tmp16, g));
+ SAFER(read_int32(&tmp32, f));
+ SAFEW(write_int32(tmp32, g));
+ SAFER(read_buffer(nick, f));
+ SAFER(write_buffer(nick, g));
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ }
+ }
+
+ SAFER(read_string(&tmp, f));
+ SAFEW(write_string(tmp, g));
+ if (tmp)
+ free(tmp);
+ } /* while (getc_db(f) != 0) */
+ SAFEW(write_int8(0, g));
+ } /* for (i) */
+
+ close_db(f);
+ close_db(g);
+
+ free(rdb);
+ free(wdb);
+
+ return 1;
+}
+
+#endif
+
+/*************************************************************************/
+
+#endif
+
+/*************************************************************************/
diff --git a/data/example.chk b/data/example.chk
new file mode 100644
index 000000000..fe7632417
--- /dev/null
+++ b/data/example.chk
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+# Crontab script for Anope
+#
+# To know how to install the crontab, read the INSTALL file.
+
+###############################################################
+# CONFIGURATION
+###############################################################
+
+# Anope binary directory
+ANOPATH=/home/ircd/services/
+
+# Name of the pid file
+ANOPIDF=services.pid
+
+# Name of the executable
+ANOPROG=services
+
+# Parameters to pass to the executable
+ANOARGS=""
+#ANOARGS="-debug"
+
+###############################################################
+# DON'T EDIT ANYTHING BELOW #
+###############################################################
+
+PATH=/bin:/usr/bin:/usr/local/bin
+
+ANOPID=
+
+cd $ANOPATH
+
+if [ -f $ANOPIDF ]
+then
+ ANOPID=`cat $ANOPIDF`
+ if [ `ps ux| grep $ANOPROG | grep $ANOPID | grep -v -c grep` = 1 ]
+ then
+ exit
+ fi
+ rm -f $ANOPIDF
+fi
+
+./$ANOPROG $ANOARGS
diff --git a/data/example.conf b/data/example.conf
new file mode 100644
index 000000000..1b7e39f15
--- /dev/null
+++ b/data/example.conf
@@ -0,0 +1,1450 @@
+# Example configuration file for Services. After making the appropriate
+# changes to this file, place it in the Services data directory (as
+# specified in the "configure" script, default /usr/local/lib/services)
+# under the name "services.conf".
+#
+# The format of this file is fairly simple: a line beginning with a # is a
+# comment, and any other non-blank line is expected to be a directive and
+# parameters, separated by spaces or tabs. For example:
+#
+# Directive Parameter-1 Parameter-2 ...
+#
+# Directives are case-insensitive. Note that some directives do not take
+# any parameters; these are typically "on-off" directives, for which simply
+# including the directive in this file (or removing it) has an effect on
+# Services' functionality.
+#
+# If a parameter's value is a string which includes spaces, enclose the
+# string in double quotation marks, like the example below. Quotes may be
+# used around any string at all for clarity.
+#
+# "This is a parameter string with spaces in it"
+#
+# If you need to include a double quote inside a quoted string, precede it
+# by a backslash:
+#
+# "This string has \"double quotes\" in it"
+#
+# Time parameters can be specified either as an integer representing a
+# number of seconds (e.g. "3600" = 1 hour), or as an integer with a unit
+# specifier: "s" = seconds, "m" = minutes, "h" = hours, "d" = days.
+# Combinations (such as "1h30m") are not permitted. Examples (all of which
+# represent the same length of time, one day):
+#
+# "86400", "86400s", "1440m", "24h", "1d"
+#
+# CAUTION:
+# Please note that your services might _CRASH_ if you add more format-
+# strings (%s, %d, etc.) to custom messages than Anope needs. Use the
+# default messages to see how many format-strings are needed.
+#
+# In the documentation for each directive, one of the following will be
+# included to indicate whether an option is required:
+#
+# [REQUIRED]
+# Indicates a directive which must be given. Without it, Services will
+# not start.
+#
+# [RECOMMENDED]
+# Indicates a directive which may be omitted, but omitting it may cause
+# undesirable side effects.
+#
+# [OPTIONAL]
+# Indicates a directive which is optional. If not given, the feature
+# will typically be disabled. If this is not the case, more
+# information will be given in the documentation.
+#
+# [DISCOURAGED]
+# Indicates a directive which may cause undesirable side effects if
+# specified.
+#
+# [DEPRECATED]
+# Indicates a directive which will disappear in a future version of
+# Services, usually because its functionality has been either
+# superseded by that of other directives or incorporated into the main
+# program.
+
+###########################################################################
+#
+# Remote server configuration
+#
+###########################################################################
+
+# RemoteServer <hostname> <port> <password> [REQUIRED]
+# Specifies the remote server hostname and port. The hostname may
+# either be a standard Internet hostname or dotted-quad numeric
+# address; the port number must be an integer between 1 and 65535
+# inclusive. The password is a string which should be enclosed in
+# double quotes if it contains any spaces (or just for clarity).
+#
+# The remote server and port may be overridden at runtime with the
+# -remote command-line option. The password may not be set at runtime.
+#
+# If services can't connect to the RemoteServer, they will try
+# RemoteServer2 (if defined). If they can't connect to RemoteServer2,
+# they will use RemoteServer3 (if defined).
+
+RemoteServer localhost 6667 "mypass"
+#RemoteServer2 localhost 6667 "mypass"
+#RemoteServer3 localhost 6667 "mypass"
+
+# LocalAddress <hostname> [port] [OPTIONAL]
+# Specifies the local address to bind to before connecting to the
+# remote server. This may be useful on multihomed hosts. The hostname
+# and port number are specified the same way as with the RemoteServer
+# directive. If this is not specified, Services will let the operating
+# system choose the local address. If only a hostname is specified,
+# Services will bind to that address but let the operating system
+# choose the local port number.
+#
+# If you don't know what this means or don't need to use it, just leave
+# the directive commented out.
+#
+# This directive may be overridden at runtime by the -local
+# command-line option.
+
+#LocalAddress nowhere. 0
+
+###########################################################################
+#
+# Services identification and pseudoclient names
+#
+###########################################################################
+
+# ServerName <name> [REQUIRED]
+# Specifies the IRC server name which Services should use. May be
+# overridden by the -name command-line option.
+
+ServerName "services.localhost.net"
+
+# ServerDesc <text> [REQUIRED]
+# Specifies the text which should appear as the server's information in
+# /whois and similar queries. May be overridden by the -desc
+# command-line option.
+
+ServerDesc "Services for IRC Networks"
+
+# ServiceUser <usermask> [REQUIRED]
+# Specifies the user@host mask which should be used by the Services
+# pseudoclients. May be overridden by the -user and -host command-line
+# options.
+
+ServiceUser "services@localhost.net"
+
+# ...Name <nick> <string> [REQUIRED except as noted below]
+# Specify the nicknames (first parameter) and "real" names (second
+# parameter) for the Services pseudoclients. BotServ and DevNull may
+# be disabled by commenting out the appropriate lines below. Disabling
+# BotServ is recommended on large networks.
+
+NickServName "NickServ" "Nickname Server"
+ChanServName "ChanServ" "Channel Server"
+MemoServName "MemoServ" "Memo Server"
+BotServName "BotServ" "Bot Server"
+HelpServName "HelpServ" "Help Server"
+OperServName "OperServ" "Operator Server"
+GlobalName "Global" "Global Noticer"
+#DevNullName "DevNull" "/dev/null -- message sink"
+HostServName "HostServ" "vHost Server"
+
+# ...Alias <nick> <string> [OPTIONAL]
+# Specify alternate nicknames for services. When a user will /msg
+# NickServAlias sthing, it will be forwarded to NickServName, and
+# NickServName will answer. This can be used to ease the migration
+# from another network, for example if your services are called
+# NickKeeper, ChanKeeper, etc ... and the other network calls them
+# NickServ, ChanServ, etc ...
+
+#NickServAlias "NickServ2" "Nickname Server Forwarder"
+#ChanServAlias "ChanServ2" "Channel Server Forwarder"
+#MemoServAlias "MemoServ2" "Memo Server Forwarder"
+#BotServAlias "BotServ2" "Bot Server Forwarder"
+#HelpServAlias "HelpServ2" "Help Server Forwarder"
+#OperServAlias "OperServ2" "Operator Server Forwarder"
+#GlobalAlias "Global2" "Global Noticer Forwarder"
+#DevNullName "DevNull2" "/dev/null -- message sink Forwarder"
+#HostServAlias "HostServ2" "vHost Server Forwarder"
+
+###########################################################################
+#
+# Services data filenames
+#
+###########################################################################
+
+# NOTE: All filenames are relative to the Services data directory.
+
+# PIDFile <filename> [REQUIRED]
+# Specifies the name of the file containing Services' process ID.
+
+PIDFile services.pid
+
+# MOTDFile <filename> [REQUIRED]
+# Specifies the name of the Message of the Day file.
+
+MOTDFile services.motd
+
+# ...DB <filename> [REQUIRED]
+# Specifies the filenames for the various Services subsystems' databases.
+
+NickServDB nick.db
+#PreNickServDB prenick.db
+ChanServDB chan.db
+BotServDB bot.db
+OperServDB oper.db
+NewsDB news.db
+ExceptionDB exception.db
+HostServDB hosts.db
+
+# There is no more databases for AKILLs. This setting is kept to allow
+# you to import old AKILL database, and is optional. (If not given,
+# Services will look for a file named akill.db.)
+
+# AutokillDB akill.db
+
+###########################################################################
+#
+# Network information
+#
+###########################################################################
+
+# HelpChannel <channel> [OPTIONAL]
+#
+# When defined, every users that got op on this channel automatically
+# receive the +h user mode.
+
+HelpChannel "#help"
+
+# LogChannel <channel> [OPTIONAL]
+#
+# When defined, services will output log messages to this channel.
+# IMPORTANT: This can be a security risk so make certain this channel
+# is sufficiently protected from normal access.
+
+#LogChannel "#services"
+
+# LogBot [OPTIONAL]
+#
+# When defined, services will output all BotServ chatter to the defined
+# LogChan above. It shows all uses of BotServ ACT and SAY commands. Note
+# that there is no logging to the log file. Only works if LogChannel is
+# also defined.
+
+#LogBot
+
+# NetworkDomain <name> [OPTIONAL]
+#
+# If your network has a common domain name, specify it there (for
+# example, all IRCZONE servers have a name ending in ".irczone.cl",
+# so "irczone.cl" would be set there. It will be used by the OperServ
+# GLOBAL command, and if you don't have a common domain name, this
+# command may just not work.
+#
+# You can specify more than one Network Domain by separating each one by
+# a space: NetworkDomain "localnet.net localnet.com"
+
+NetworkDomain "localnet.com"
+
+# NetworkName <name> [REQUIRED]
+#
+# This is the name of the network the Services are running on.
+
+NetworkName "LocalNet"
+
+###########################################################################
+#
+# Basic functionality
+#
+###########################################################################
+
+# NoBackupOkay [DISCOURAGED]
+# Allows Services to continue file write operations (i.e. database
+# saving) even if the original file cannot be backed up. Enabling this
+# option may allow Services to continue operation under some conditions
+# when it might otherwise fail, such as a nearly-full disk.
+#
+# *** NOTE ***
+# Enabling this option can cause irrecoverable data loss under some
+# conditions, so make CERTAIN you know what you're doing when you
+# enable it!
+
+#NoBackupOkay
+
+# ListOpersOnly [DEPRECATED]
+# When enabled, limits use of the ChanServ and NickServ LIST commands
+# to IRC operators.
+#
+# This directive has been superseded by the NSListOpersOnly and
+# CSListOpersOnly directives.
+
+#ListOpersOnly
+
+# StrictPasswords [RECOMMENDED]
+# When enabled, causes Services to perform more stringent checks on
+# passwords. If this is disabled, Services will only disallow a
+# password if it is the same as the entity (nickname or channel name)
+# with which it is associated. When enabled, however, Services will
+# also check that the password is at least five characters long, and
+# in the future will probably check other things as well.
+
+StrictPasswords
+
+# BadPassLimit <count> [RECOMMENDED]
+# Sets the number of invalid password tries before Services removes a
+# user from the network. If a user enters <count> invalid passwords
+# for any Services function or combination of functions during a
+# single IRC session (subect to BadPassTimeout, below), Services will
+# issue a /KILL for the user. If not given, Services will ignore
+# failed password attempts (though they will be logged in any case).
+
+BadPassLimit 5
+
+# BadPassTimeout <time> [OPTIONAL]
+# Sets the time after which invalid passwords are forgotten about. If
+# a user does not enter any incorrect passwords in this amount of time,
+# the incorrect password count will reset to zero. If not given, the
+# timeout will be disabled, and the incorrect password count will never
+# be reset until the user disconnects.
+
+BadPassTimeout 1h
+
+# UpdateTimeout <time> [REQUIRED]
+# Sets the delay between automatic database updates. This timer is
+# reset by the OperServ UPDATE command.
+
+UpdateTimeout 5m
+
+# ExpireTimeout <time> [REQUIRED]
+# Sets the delay between checks for expired nicknames and channels.
+# The OperServ UPDATE command will also cause a check for expiration
+# and reset this timer.
+
+ExpireTimeout 30m
+
+# ReadTimeout <time> [REQUIRED]
+# Sets the timeout period for reading from the network.
+
+ReadTimeout 5s
+
+# WarningTimeout <time> [REQUIRED]
+# Sets the interval between sending warning messages for program
+# errors via WALLOPS/GLOBOPS.
+
+WarningTimeout 4h
+
+# TimeoutCheck <time> [REQUIRED]
+# Sets the (maximum) frequency at which the timeout list is checked.
+# This, combined with ReadTimeout above, determine how accurately timed
+# events, such as nick kills, occur; it also determines how much CPU
+# time Services will use doing this. Higher values will cause less
+# accurate timing but less CPU usage.
+#
+# This shouldn't be set any higher than 10 seconds, and 1 second is
+# best if your system is powerful enough (or your network small enough)
+# to handle it. 0 will cause the timeout list to be checked every time
+# through the main loop, which will probably slow down Services too
+# much to be useful on most networks.
+#
+# Note that this value is not an absolute limit on the period between
+# checks of the timeout list; the period may be as great as ReadTimeout
+# (above) during periods of inactivity.
+
+TimeoutCheck 3s
+
+# KeepLogs <days> [RECOMMENDED]
+#
+# Sets the number of days log files are kept. If you don't give it, or if
+# you set it to 0, logs will be kept undefinitely.
+#
+# NOTE: Services must run 24 hours a day for this feature to work.
+
+KeepLogs 7
+
+# KeepBackups <days> [RECOMMENDED]
+#
+# Sets the number of days backups of databases are kept. If you don't give
+# it, or if you set it to 0, Services won't backup the databases.
+#
+# NOTE: Services must run 24 hours a day for this feature to work.
+
+KeepBackups 3
+
+# ForceForbidReason [OPTIONAL]
+#
+# If set, Services will require a reason when a forbid is added, else
+# the reason is optional. This directive also applies to SUSPENDed
+# channels as well.
+
+ForceForbidReason
+
+# UsePrivmsg [OPTIONAL]
+#
+# This directive will make Services send PRIVMSGs to users instead of
+# NOTICEs by default, and allow users to set how Services should
+# communicate with them.
+#
+# This is a feature that is against the IRC RFC and should be used
+# _only_ if absolutely necessary.
+
+#UsePrivmsg
+
+# DumpCore [OPTIONAL]
+#
+# Setting this directive will make Anope dump core when a segmentation
+# fault occurs. This is generally not needed, but if Anope is crashing
+# on your network and you want to make a bug report, having a core
+# file may be of great help.
+
+#DumpCore
+
+# LogUsers [OPTIONAL]
+#
+# Defines whether Anope will log user connections, disconnections and
+# nickname changes. You may have to do so in case you ever need to
+# transmit user information to your local authorities.
+
+#LogUsers
+
+# HideStatsO [OPTIONAL]
+#
+# Setting this directive will make Services only show Stats o to
+# IRC Operators.
+
+#HideStatsO
+
+# GlobalOnCycle [OPTIONAL]
+#
+# Setting this directive will make Services send global messages on
+# starting up and shuting down/restarting.
+
+#GlobalOnCycle
+
+# GlobalOnCycleMessage <text> [REQUIRED if GlobalOnCycle is specified]
+# This is the global message sent when the Services are
+# being shutdown/restarted if using GlobalOnCycle
+GlobalOnCycleMessage "Services are restarting, they will be back shortly - please be good while we're gone"
+
+# GlobalOnCycleUP <text> [OPTIONAL]
+# If defined this message will be sent global when the services join
+# the network.
+GlobalOnCycleUP "Services are now back online - have a nice day"
+
+# AnonymousGlobal [OPTIONAL]
+# hides the oper's nick in a global message/notice
+#AnonymousGlobal
+
+###########################################################################
+#
+# Mail-related options
+#
+###########################################################################
+
+# NOTE: if UseMail is not set, all parameters after it in this section
+# are optional.
+
+# UseMail [OPTIONAL]
+#
+# This option enables the mail commands in Services. You may choose
+# to disable it if you have no sendmail-compatible mailer installed.
+
+UseMail
+
+# SendMailPath <path> [REQUIRED]
+#
+# This is how we should call SendMail to send a mail. It must be
+# called with all parameters needed to make it scan the mail input
+# to find the mail recipient; consult your SendMail documentation.
+#
+# Postfix users must use the compatible sendmail utility provided
+# with it; this one needs no parameters on the command line.
+
+SendMailPath "/usr/sbin/sendmail -t"
+
+# SendFrom <e-mail> [REQUIRED]
+#
+# This is the e-mail from which all the e-mails are to be sent. It should
+# really exist.
+
+SendFrom services@localhost.net
+
+# RestrictMail [OPTIONAL]
+#
+# When enabled, SENDPASS will be restricted to IRC operators.
+#
+# WARNING: if you choose to not enable this option, you should limit
+# the number of processes the services user can have at a time (you can
+# create a special user for this; remember to never launch Services as root).
+
+RestrictMail
+
+# MailDelay <time> [RECOMMENDED]
+#
+# This controls the minimum amount of time an user must wait before sending
+# another mail after it has sent one. It also controls the minimum time
+# an user must wait before it can receive another mail.
+#
+# This feature prevents users from being mail bombed using Services and
+# should definitely be used.
+
+MailDelay 5m
+
+# DontQuoteAddresses [OPTIONAL]
+#
+# When enabled, services will not attempt to "" the TO: fields in mails
+#
+# So far we only know of ESMTP/QMail which need this set.
+#
+
+#DontQuoteAddresses
+
+###########################################################################
+#
+# Proxy detection
+#
+###########################################################################
+
+# Note: if ProxyDetect is not set, all parameters after it in this section
+# are optional.
+
+# ProxyDetect [OPTIONAL]
+#
+# Enables insecure proxy detection. Services will automatically
+# scan each incoming user and akill those that use insecure proxy.
+#
+# Anope currently supports detection of Wingate (port 23), SOCKS4/5
+# (port 1080), and HTTP proxy (ports 3128 and 8080). It uses the
+# protocol of each proxy type to connect to an IRC server, it does
+# not only check if the port is open (so your users may still have
+# an open telnet server on their port 23 for example).
+#
+# WARNING: You should get the authorization of the administrator of
+# the computer which runs the proxy detector before enabling it; not
+# all administrators will accept it. Also note that in certain
+# countries, port scanning is prohibited.
+#
+# This feature requires threading support to be compiled into Anope.
+
+#ProxyDetect
+
+# ProxyThreads <number> [REQUIRED]
+#
+# Sets the number of threads Services will launch when starting. Each
+# thread will have the responsability to scan queued hostname for
+# proxies.
+#
+# This value must be set depending of the number of users you have
+# on your network. The more threads are used, the more simultaneous
+# checks can be done. Remember however, that threads are
+# resource-consuming.
+#
+# WARNING: On Linux, each thread takes a background process, and there
+# is an additional process used for thread management; this is a problem
+# if you are limited in the number of background process you can use
+# (on a paid shell for example).
+
+ProxyThreads 5
+
+# ProxyMessage... <message> [RECOMMENDED]
+#
+# Sets the notices that will be sent out to users before Services
+# scan them for proxy. You may not use all of them, but just as much as
+# necessary.
+
+ProxyMessage1 "I will now detect if you're using an insecure proxy."
+ProxyMessage2 "If you see a connection on port 23, 1080, 3128 or 8080 from"
+ProxyMessage3 "my.box.net, please disregard it, as it is the detector in action."
+ProxyMessage4 "See http://proxy.myirc.net/ for information about our proxy policy."
+#ProxyMessage5 "Enter"
+#ProxyMessage6 "whatever"
+#ProxyMessage7 "you want"
+#ProxyMessage8 "here."
+
+# ProxyCheck... [OPTIONAL]
+#
+# Determines what types of proxy AnopAnope wille try to find (respectively
+# Wingate on port 23, SOCKS4 on port 1080, SOCKS5 on port 1080, HTTP
+# proxy on port 3128, HTTP proxy on port 8080 and HTTP proxy on port
+# 80).
+
+ProxyCheckWingate
+ProxyCheckSocks4
+ProxyCheckSocks5
+ProxyCheckHTTP1
+ProxyCheckHTTP2
+ProxyCheckHTTP3
+
+# ProxyTimeout <time> [REQUIRED]
+
+# Sets the maximum length of time we allow a connect/read operation to
+# take. If you set this value too high, your threads may hang on a single
+# check for a very long time. The best is to try different values
+# and see which one is the more efficient for your network.
+
+ProxyTimeout 15s
+
+# ProxyTestServer <ip> <port> [REQUIRED]
+#
+# Sets the *IP* and port of the IRC server to use as a target when
+# testing users for proxy.
+
+ProxyTestServer "1.2.3.4" 6667
+
+# ProxyExpire <time> [RECOMMENDED]
+#
+# Sets the length of time before a proxy host cache entry expires, if
+# not used.
+
+ProxyExpire 30d
+
+# ProxyCacheExpire <time> [REQUIRED]
+#
+# Sets the length of time before a normal host cache entry expires, if
+# not used. This cannot be set to 0d.
+#
+# Every non-proxy hosts will be stored in cache (to avoid too many scans
+# to the same host), so you should set this enough low to not fill your
+# memory, especially on large networks.
+
+ProxyCacheExpire 1d
+
+# ProxyAkillReason <reason>
+#
+# Sets the reason that will be used to AKILL an user from the network
+# if a proxy is detected.
+
+ProxyAkillReason "You're using an insecure proxy. See http://proxy.myirc.net/config.html for information about how to config your proxy in a safe manner."
+
+# WallProxy [OPTIONAL]
+#
+# Sends a WALLOPS/GLOBOPS when an user using an insecure proxy is being
+# AKILLed.
+
+WallProxy
+
+# ProxyMax <number> [REQUIRED]
+#
+# Sets the maximum proxy cache entries that can be displayed in a single
+# call to OperServ CACHE.
+
+ProxyMax 50
+
+###########################################################################
+#
+# NickServ configuration
+#
+###########################################################################
+
+# NSForceEmail [RECOMMENDED]
+# This option forces the users to give an e-mail when they register
+# a nickname. If you have nicks in the database that have no e-mail
+# set, they will be asked to set an e-mail when they identify their
+# nickname until they set one. Also, this option prevents user from
+# unsetting the password.
+#
+# This option is useful to resolve "lost password" problems.
+
+NSForceEmail
+
+# NSEmailReg [OPTIONAL]
+# This option splits the nick registration into 2 steps, the first
+# after registering a email with a passcode is sent to the supplied
+# email address, this passcode needs to be entered with a confirm
+# command before the nick registration will be completed.
+#
+# You must have mail / forcemail set for this to work correctly.
+# It is also recommended that MailDelay be set to a sensible value
+# to prevent mail flooding
+
+# NSEmailReg
+
+# NSDef... [OPTIONAL]
+# Sets the default options for newly registered nicks. Note that
+# changing these options will have no effect on nicks which are already
+# registered.
+#
+# If both NSDefKill and NSDefKillQuick are given, the latter takes
+# precedence. KILL IMMED cannot be specified as a default.
+#
+# Note: Both NSDefKill and NSDefKillQuick must be specified for Quick to take effect.
+#
+# NOTE: If you do not enable any of these options, a default of
+# Secure, MemoSignon, and MemoReceive will be used, for backward
+# compatibility. If you really want no options enabled by default, use
+# NSDefNone.
+
+#NSDefNone
+
+#NSDefKill
+#NSDefKillQuick
+NSDefSecure
+NSDefPrivate
+NSDefHideEmail
+NSDefHideUsermask
+#NSDefHideQuit
+#NSDefMsg
+NSDefMemoSignon
+NSDefMemoReceive
+
+# NSDefLanguage <language-number> [REQUIRED]
+# Sets the default language non- and newly-registered will receive
+# services' messages in. The numbers are the same as those
+# used for the /nickserv SET LANGUAGE command, so look the at the help
+# of this command for the list of currently supported languages.
+#
+# If you ever wanted to know how to translate services in your
+# language, read the chapter about it in the README.
+
+NSDefLanguage 1
+
+# NSRegDelay <time> [RECOMMENDED]
+# Sets the minimum length of time between consecutive uses of the
+# REGISTER command. If not given, this restriction is disabled (note
+# that this allows "registration flooding").
+
+NSRegDelay 30s
+
+# NSExpire <time> [RECOMMENDED]
+# Sets the length of time before a nick registration expires.
+
+NSExpire 21d
+
+# NSRExpire <time> [OPTIONAL]
+# Sets the length of time a user gets to enter the confirmation code
+# which has been e-mailed to them before the nick will be relased
+# for general use again
+
+# NSRExpire 1d
+
+# NSMaxAliases <number> [RECOMMENDED]
+# Sets the maximum number of nicks allowed in a group. If you
+# set it to 0, or don't set it at all, no limits will be applied.
+
+NSMaxAliases 16
+
+# NSAccessMax <count> [REQUIRED]
+# Sets the maximum number of entries allowed on a nickname access list.
+
+NSAccessMax 32
+
+# NSEnforcerUser <user>[@<host>] [REQUIRED]
+# Sets the username (and possibly hostname) used for the fake user
+# created when NickServ collides a user. Should be in user@host
+# format. If the host is not given, the one from ServicesUser is
+# used.
+
+NSEnforcerUser enforcer@localhost.net
+#NSEnforcerUser enforcer
+
+# NSReleaseTimeout <time> [REQUIRED]
+# Sets the delay before a NickServ-collided nick is released.
+
+NSReleaseTimeout 1m
+
+# NSAllowKillImmed [OPTIONAL]
+# When enabled, allows the use of the IMMED option with the NickServ
+# SET KILL command.
+
+#NSAllowKillImmed
+
+# NSNoGroupChange [OPTIONAL]
+# When enabled, the NickServ GROUP command won't allow any group change.
+# This is recommended for better performances and to protect against
+# nick stealing, however users will have less flexibility.
+
+#NSNoGroupChange
+
+# NSListOpersOnly [OPTIONAL]
+# When enabled, limits use of the NickServ LIST command to IRC
+# operators.
+
+#NSListOpersOnly
+
+# NSListMax <count> [REQUIRED]
+# Specifies the maximum number of nicks to be returned for a NickServ
+# LIST command.
+
+NSListMax 50
+
+# NSGuestNickPrefix <value> [REQUIRED]
+# When a user's nick is forcibly changed to enforce a "nick kill", their
+# new nick will start with this value. The rest will be made up of 6 or 7
+# digits.
+
+NSGuestNickPrefix "Guest"
+
+# NSSecureAdmins [RECOMMENDED]
+# When enabled, prevents the use of the DROP, FORBID, GETPASS, and
+# SET PASSWORD commands by Services admins on other Services admins or
+# the Services root(s).
+
+NSSecureAdmins
+
+# NSStrictPrivileges [RECOMMENDED]
+#
+# When enabled, any user wanting to use the privileges of Services Root, Services
+# Admin or Services Operator must have been logged as an IRC Operator with the
+# /oper command.
+
+NSStrictPrivileges
+
+# NSModeOnID [OPTIONAL]
+#
+# When enabled, services will set the channel modes a user has access to upon
+# identifying, assuming they are not already set.
+#
+
+# NSModeOnID
+
+# NSRestrictGetPass [OPTIONAL]
+#
+# When enabled, services will only allow Services Root to use the getpass
+# command on a nick.
+
+NSRestrictGetPass
+
+###########################################################################
+#
+# ChanServ configuration
+#
+###########################################################################
+
+# CSDef... [OPTIONAL]
+# Sets the default options for newly registered channels. Note that
+# changing these options will have no effect on channels which are
+# already registered.
+#
+# NOTE: If you do not enable any of these options, a default of
+# KeepTopic, Secure, SecureFounder and SignKick will be used, for
+# backward compatibility. If you really want no options enabled by
+# default, use CSDefNone.
+
+#CSDefNone
+
+CSDefKeepTopic
+#CSDefOpNotice
+CSDefPeace
+#CSDefPrivate
+#CSDefRestricted
+CSDefSecure
+#CSDefSecureOps
+CSDefSecureFounder
+CSDefSignKick
+#CSDefSignKickLevel
+#CSDefTopicLock
+CSDefXOP
+
+
+# CSMaxReg <count> [RECOMMENDED]
+# Limits the number of channels which may be registered to a single
+# nickname.
+
+CSMaxReg 20
+
+# CSExpire <time> [RECOMMENDED]
+# Sets the number of days before a channel expires.
+
+CSExpire 14d
+
+# CSDefBantype <bantype> [REQUIRED]
+#
+# Sets the default ban type for newly registered channels (and when
+# importing old databases).
+#
+# bantype can be:
+#
+# 0: ban in the form *!user@host
+# 1: ban in the form *!*user@host
+# 2: ban in the form *!*@host
+# 3: ban in the form *!*user@*.domain
+
+CSDefBantype 2
+
+# CSAccessMax <count> [REQUIRED]
+# Sets the maximum number of entries on a channel's access list.
+# Channel access lists may contain only registered nicknames;
+# therefore, checking each entry on the list requires only a single
+# scaler comparison instead of a wildcard match, and this limit may be
+# safely set much higher than (for exmple) the nickname access list
+# size limit without impacting performance significantly.
+
+CSAccessMax 1024
+
+# CSAutokickMax <count> [REQUIRED]
+# Sets the maximum number of entries on a channel's autokick list.
+
+CSAutokickMax 32
+
+# CSAutokickReason <text> [REQUIRED]
+# Sets the default reason for an autokick if none is given.
+
+CSAutokickReason "User has been banned from the channel"
+
+# CSInhabit <time> [REQUIRED]
+# Sets the length of time ChanServ stays in a channel after kicking a
+# user from a channel s/he is not permitted to be in. This only occurs
+# when the user is the only one in the channel.
+
+CSInhabit 15s
+
+# CSListOpersOnly [OPTIONAL]
+# When enabled, limits use of the ChanServ LIST command to IRC
+# operators.
+
+#CSListOpersOnly
+
+# CSListMax <count> [REQUIRED]
+# Specifies the maximum number of channels to be returned for a
+# ChanServ LIST command.
+
+CSListMax 50
+
+# CSRestrictGetPass [OPTIONAL]
+#
+# When enabled, services will only allow Services Root to use the getpass
+# command on a channel.
+
+# CSRestrictGetPass
+
+# CSOpersOnly [OPTIONAL]
+# If this is defined, only IRC Operators will be permitted to use ChanServ.
+
+#CSOpersOnly
+
+###########################################################################
+#
+# MemoServ configuration
+#
+###########################################################################
+
+# MSMaxMemos <count> [RECOMMENDED]
+# Sets the maximum number of memos a user is allowed to keep by
+# default. Normal users may set the limit anywhere between zero and
+# this value; Services admins can change it to any value or disable it.
+# If not given, the limit is disabled by default, and normal users can
+# set any limit they want.
+
+MSMaxMemos 20
+
+# MSSendDelay <time> [RECOMMENDED]
+# Sets the delay between consecutive uses of the MemoServ SEND command.
+# This can help prevent spam as well as denial-of-service attacks from
+# sending large numbers of memos and filling up disk space (and
+# memory). A 3-second wait means a maximum average of 150 bytes of
+# memo per second per user under the current IRC protocol.
+
+MSSendDelay 3s
+
+# MSNotifyAll [OPTIONAL]
+# Should we notify all appropriate users of a new memo? This applies
+# in cases where a memo is sent to a nick which is in the group of
+# another nick. Note that, unlike before, it is currently often more
+# efficient to enable this.
+
+MSNotifyAll
+
+###########################################################################
+#
+# BotServ configuration
+#
+###########################################################################
+
+# BSDef... [OPTIONAL]
+# Sets the default options for newly registered channels. Note that
+# changing these options will have no effect on channels which are
+# already registered.
+
+#BSDefDontKickOps
+#BSDefDontKickVoices
+BSDefGreet
+BSDefFantasy
+BSDefSymbiosis
+
+# BSMinUsers <count> [REQUIRED]
+# 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
+# cannot be 0, otherwise topic retention and mode lock and such
+# other things won't work.
+
+BSMinUsers 1
+
+# BSBadWordsMax <count> [REQUIRED]
+# Maximum number of entries a single bad words list can have.
+# Setting it too high can reduce performances slightely.
+
+BSBadWordsMax 32
+
+# BSKeepData <time> [REQUIRED]
+# Amount of time data for a user that is used by BotServ is
+# valid. If the data exceeds this time, it is reset or deleted
+# depending the case. Do not set it too high otherwise your resources
+# will be slightly affected.
+
+BSKeepData 10m
+
+# BSSmartJoin [OPTIONAL]
+# The bot is currently not affected by any modes or bans when he
+# tries to join a channel. But some people may want to make it
+# act like a real bot, that is, for example, remove all bans
+# that affect the bot before joining the channel, remove a
+# ban that affects the bot set by an user when it is on the
+# channel, and so on. Since it consumes a bit more CPU time,
+# you should not comment it out on larger networks.
+
+# BSSmartJoin
+
+# BSGentleBWReason [OPTIONAL]
+# This option will make the bot use a kick reason that does not retake
+# the word when it is kicking the bot. This is especially useful if
+# you have young people on your network.
+
+BSGentleBWReason
+
+###########################################################################
+#
+# HostServ configuration
+#
+###########################################################################
+
+# HostSetters <nicks> [DISCOURAGED]
+# Specifies the nicks of NON-OPERS allowed to Set/Remove vHosts using
+# HostServ. Can be re-loaded with /msg operserv reload
+# You can specify more than one nick by separating each one by a space.
+#
+# Make sure you insert the correct nick(s) here..
+
+#HostSetters "rob dengel certus"
+
+###########################################################################
+#
+# OperServ configuration
+#
+###########################################################################
+
+# ServicesRoot <nicks> [REQUIRED]
+# Specifies the Services "super-users". The super-users, or "roots" as in
+# Unix terminology, are the only users who can add or delete Services
+# admins.
+#
+# You can specify more than one nick by separating each one by a space.
+#
+# This is commented out by default; make sure you insert the correct
+# nick before uncommenting it.
+
+#ServicesRoot "dengel anope"
+
+# SuperAdmin [OPTIONAL]
+# When enabled, Services admins will be able to use SuperAdmin [ON|OFF]
+# which will temporarily grant them extra privileges, such as being a
+# founder of _all_ channels, ability to adjust another users modes etc..
+
+#SuperAdmin
+
+# LogMaxUsers [OPTIONAL]
+# Causes Services to write a message to the log every time a new user
+# maximum is set.
+
+LogMaxUsers
+
+# ...Expiry <time> [REQUIRED]
+# Sets the default expiry time for, respectively, AKILLs, SGLINEs,
+# SQLINEs and SZLINEs.
+
+AutoKillExpiry 30d
+ChanKillExpiry 30d
+SGLineExpiry 30d
+SQLineExpiry 30d
+SZLineExpiry 30d
+
+# AkillOnAdd [OPTIONAL]
+#
+# When enabled, this option makes the services send an AKILL command
+# immediately after it has been added with AKILL ADD. This eliminates
+# the need of killing the users after the akill has been added.
+
+# AkillOnAdd
+
+# KillClonesAkillExpire <time> [REQUIRED]
+# Sets the expiry time for autokills added for hosts that have been
+# killed using the KILLCLONES command.
+
+KillClonesAkillExpire 30m
+
+# DisableRaw [RECOMMENDED]
+#
+# Disables the highly destructive OperServ RAW command.
+
+DisableRaw
+
+# WallOper [OPTIONAL]
+# Causes Services to send a WALLOPS/GLOBOPS when a user becomes an IRC
+# operator. Note that this can cause WALLOPS floods when Services
+# first connects to the network.
+
+#WallOper
+
+# WallBadOS [OPTIONAL]
+# Causes Services to send a WALLOPS/GLOBOPS if a non-IRC-operator tries
+# to use OperServ.
+
+#WallBadOS
+
+# WallOS... [OPTIONAL]
+# Cause Services to send a WALLOPS/GLOBOPS on use of each of the
+# OperServ commands listed.
+
+WallOSGlobal
+WallOSMode
+WallOSClearmodes
+WallOSKick
+WallOSAkill
+WallOSSGLine
+WallOSSQLine
+WallOSSZLine
+WallOSNoOp
+WallOSJupe
+WallOSRaw
+
+# Wall...Expire [OPTIONAL]
+# Causes Services to send a WALLOPS/GLOBOPS whenever respectively
+# an AKILL, an SGLINE, an SQLINE, an SZLINE and a session limit
+# exception expires.
+
+#WallAkillExpire
+#WallSGLineExpire
+#WallSQLineExpire
+#WallSZLineExpire
+#WallExceptionExpire
+
+# WallGetpass [OPTIONAL]
+# Causes Services to send a WALLOPS/GLOBOPS on use of the NickServ or
+# ChanServ GETPASS command.
+
+WallGetpass
+
+# WallSetpass [OPTIONAL]
+# Causes Services to send a WALLOPS/GLOBOPS whenever a Services admin
+# sets a password for a nickname or channel (s)he does not normally have
+# privileges to set.
+
+WallSetpass
+
+# WallForbid [OPTIONAL]
+# Causes Services to send a WALLOPS/GLOBOPS on use of the NickServ or
+# ChanServ FORBID command.
+
+WallForbid
+
+# WallDrop [OPTIONAL]
+# Causes Services to send a WALLOPS/GLOBOPS whenever a Services admin
+# drops a nickname or channel (s)he does not normally have
+# privileges to drop.
+
+WallDrop
+
+# LimitSessions [OPTIONAL]
+# Enables session limiting. Session limiting prevents users from
+# connecting more than a certain number of times from the same host at the
+# same time - thus preventing most types of cloning. Once a host reaches
+# it's session limit, all clients attempting to connect from that host
+# will be killed. Exceptions to the default session limit, which are based
+# on host names, can be defined via the exception list. It should be noted
+# that session limiting, along with a large exception list, can degrade
+# services' performance. See the source and comments in sessions.c and the
+# online help for more information about session limiting.
+#
+# Session limiting is meant to replace the CheckClones and KillClones
+# code. It is therefore highly recommened that they are disabled when
+# session limiting has been enabled.
+#
+# NOTE: This option is not available when STREAMLINED is defined in
+# the Makefile.
+
+LimitSessions
+
+# DefSessionLimit <limit> [REQUIRED]
+# Default session limit per host. Once a host reaches it's session limit,
+# all clients attempting to connect from that host will be killed. A value
+# of zero means an unlimited session limit.
+
+DefSessionLimit 3
+
+# MaxSessionLimit <limit> [REQUIRED]
+# The maximum session limit that may be set for a host in an exception.
+
+MaxSessionLimit 100
+
+# ExceptionExpiry <time> [REQUIRED]
+# Sets the default expiry time for exceptions.
+
+ExceptionExpiry 1d
+
+# SessionLimitExceeded <message> [OPTIONAL]
+# The message that will be NOTICE'd to a user just before they are removed
+# from the network because their's host session-limit has been exceeded.
+# It may be used to give a slightly more descriptive reason for the
+# impending kill as apposed to simply "Session limit exceeded". If this is
+# commented out, nothing will be sent.
+
+SessionLimitExceeded "The session limit for your host %s has been exceeded."
+
+# SessionLimitDetailsLoc <message> [OPTIONAL]
+# Same as above, but should be used to provide a website address where
+# users can find out more about session limits and how to go about
+# applying for an exception. If this is commented out, nothing will be
+# sent.
+#
+# This option has been intentionally commented out in an effort to remind
+# you to change the URL it contains. It is recommended that you supply an
+# address/url where people can get help regarding session limits.
+
+#SessionLimitDetailsLoc "Please visit http://your.website.url/ for more information about session limits."
+
+# MaxSessionKill <number> [OPTIONAL]
+#
+# If given and different from 0, this option tells the Services to add an
+# AKILL when there is number subsequent kills for the same hostname, preventing
+# the network from KILL flood.
+
+MaxSessionKill 15
+
+# SessionAutoKillExpiry <time> [OPTIONAL]
+#
+# Sets the expiry time for autokills added for hosts that need to be
+# AKILLed as controlled by the MaxSessionKill option.
+#
+# If not given, the default value is 30 minutes.
+
+SessionAutoKillExpiry 30m
+
+# CheckClones <minusers> <maxdelay> <warningdelay> [DEPRECATED]
+# Causes Services to try and detect "clones" connecting to the network.
+# A WALLOPS (or GOPER, if supported on the IRC server) will be sent if
+# Services thinks it has found clones.
+#
+# This feature has been superceded by Session Limiting.
+#
+# <minusers> sets the minimum number of users which must successively
+# connect to the network before Services will send a clone warning.
+#
+# <maxdelay> sets the maximum time that can elapse between successive
+# users before Services decides they are not clones.
+#
+# <warningdelay> sets the minimum time between clone warnings for
+# clones from the same host.
+#
+# NOTE: This option is not available when STREAMLINED is defined in
+# the Makefile.
+
+# CheckClones 5 10s 30s
+
+# KillClones [DISCOURAGED] [DEPRECATED]
+# Causes Services to kill users which trigger the clone warnings. (If
+# CheckClones is disabled, this will have no effect.)
+#
+# This feature has been superceded by Session Limiting.
+#
+# BEWARE! The clone checking code is easily fooled; it can be
+# triggered falsely under many conditions, for example:
+#
+# - Multiple users connecting from a shell machine.
+#
+# - A single user repeatedly connecting and disconnecting.
+#
+# Be very sure you know what you're doing before you even think about
+# enabling this option, and remember that Services comes with no
+# warranty.
+#
+# If that wasn't enough discouragement:
+#
+# ***** DO NOT ENABLE THIS OPTION! *****
+#
+# NOTE: This option is not available when STREAMLINED is defined in
+# the Makefile.
+
+#KillClones
+
+# AddAkiller [OPTIONAL]
+# Adds the nickname of the Operator issuing an AKILL to the kill reason.
+#
+AddAkiller
+
+###########################################################################
+#
+# DefCon configuration
+#
+###########################################################################
+
+# DefConLevel <level> [OPTIONAL]
+# Default defcon level (1-5) to use when starting services up, level 5
+# instructs services to run as normal.
+
+#DefConLevel 5
+
+# DefCon1-4 <numeric> [REQUIRED if Defcon is activated]
+# These numercics determine which of the following operations take place
+# at each level, the correct numeric can be found by adding together the
+# number for each restriction you wish to place at a level.
+# No new channel registrations 1
+# No New Nick Registrations 2
+# No MLOCK changes 4
+# Force Chan Mode 8
+# Use Reduced Session Limit 16
+# KILL any new clients trying to connect 32
+# Services will ignore everyone but opers 64
+# Services will silently ignore everyone but opers 128
+# AKILL all new clients trying to connect 256
+# No new memos sent to block memoserv attacks 512
+
+#DefCon4 23
+# No channel reg + No Nick Reg + No MLOCK changes + Use Reduced Session Limit
+# 1 + 2 + 4 + 16
+
+#DefCon3 31
+# As DefCon4 + Services will Force Chan Mode's on channels
+# 23 + 8
+
+#DefCon2 159
+# As DefCon3 + Services will silently ignore everyone but opers
+# 32 + 128
+
+#DefCon1 415
+# As DefCon2 + AKILL all new clients trying to connect
+# 159 + 256
+
+
+# DefConSessionLimit <limit> [REQUIRED if DefCon is activated]
+# New session limit to use when a defcon level is using "reduced"
+# session limiting.
+# NOTE: When using DefCon this value needs to be defined
+#DefConSessionLimit 2
+
+# DefConAkillExpire <time> [REQUIRED if DefCon is activated]
+# Length of time to add the AKILL for when DEFCON is preventing
+# all new clients from connecting to the network
+#
+# NOTE: As with all expire times, the expirey check will only be
+# carried out once every "ExpireTimeout" so if this setting is
+# 30m the the akill could last for 30m regardless of this setting.
+#
+# NOTE: When using DefCon this value needs to be defined
+#DefConAkillExpire 5m
+
+# DefConChanModes <modes> [REQUIRED if DefCon is activated]
+# The channel modes to set on all channel's when the DefCon channel
+# mode system is in use.
+#
+# NOTE: Choose these modes carefully, because when defcon switches to
+# a level which does NOT have the mode setting selected, services will
+# set the reverse on all channel's, e.g. if this setting is +RN
+# when defcon is used all channel's will be set to +RN, when
+# defcon is removed, channels will all be set to -RN. You don't
+# want to set this to +k for example because when defcon is removed all
+# channels will -k.
+# NOTE: mlock'ed modes will not be lost
+#DefConChanModes "+R"
+
+# DefConTimeOut <time> [OPTIONAL]
+# This value can be used to automaticaly return the network to
+# defcon 5 after the specified time period - just in case any opers
+# forget to remove a defcon setting.
+#DefConTimeOut 15m
+
+# GlobalOnDefcon [OPTIONAL]
+#
+# Setting this directive will make Services send a global message on
+# Defcon Level changes.
+#GlobalOnDefcon
+
+# GlobalOnDefconMore [OPTIONAL]
+#
+# Setting this directive will make Services send a global message on
+# Defcon Level changes. Uncommenting this will allow you to send along
+# with the new level, the DefconMessage.
+#GlobalOnDefconMore
+
+#DefconMessage "Put your message to send your users here. Dont forget to uncomment GlobalOnDefconMore"
+
+# DefConOffMessage [OPTIONAL]
+#
+# If this is defined, it will be used in place of GlobalOnDefcon and
+# GlobalOnDefconMore when defcon is returned to level 5
+#DefConOffMessage "Services are now back to normal, sorry for any inconvenience"
+
+# DefConAkillReason <text> [REQUIRED if DefCon is activated]
+#
+# When using DEFCON this setting will be used when any clients are killed
+# or akilled from the network by defcon
+#
+#DefConAkillReason "This network is currently not accepting connections, please try again later"
+
+###########################################################################
+#
+# MySQL configuration
+#
+###########################################################################
+#
+# Mysql [OPTIONAL]
+#
+# Your MySQL configuration for use with Anope.
+# To disable MySQL functionality, just comment out this block.
+# To make use of MySQL use these directives and change their
+# setting to the appropiate values.
+#
+# MysqlHost defines the Mysql server hostname.
+# MysqlUser defines the Mysql user to log in with.
+# MysqlPass defines the Mysql pass required for the specified user to log in.
+# MysqlName defines the Mysql database name Anope uses
+# MysqlSock defines the Mysql UNIX socket
+# MysqlPort defines the Mysql TCP port
+#
+#MysqlHost "localhost"
+#MysqlUser "Anonymous"
+#MysqlPass ""
+#MysqlName "anope"
+#MysqlSock "/tmp/mysql.sock"
+#MysqlPort 3306
+
+# MysqlSecure "<des>|<md5>|<sha>|<key>" [OPTIONAL]
+#
+# Method for storing passwords on MySQL. Available methods are:
+# Empty or not set will save your passwords as clear text.
+# des : Encrypt using a simple DES algorithm.
+# md5 : Produces the md5 hash for the password.
+# sha : Calculates the checksum using a Secure Hash Algorithm.
+# key : Encodes using "key" as password.
+# Please read docs/MYSQL file for more info and details.
+#
+#MysqlSecure ""
+
+
+# MysqlRetries <value> [OPTIONAL]
+# MysqlRetryGap <value> [OPTIONAL]
+#
+# These values let you define how often and with how much interruption Anope
+# shall retry to open a connection when losing the contact to the mysql db.
+# The product of these values must be between 1 and 60.
+#
+#MysqlRetries 10
+#MysqlRetryGap 1
+
+###########################################################################
+#
+# Module configuration
+#
+###########################################################################
+#
+# ModuleAutoload [OPTIONAL]
+#
+# When compiled with module support, this contains a space seperated list
+# of modules to automaticaly load as soon as possible, e.g. IRCD support modules.
+#
+#ModuleAutoload "hs_moo ircd_defizzer"
+
+# ModuleDelayedAutoload [OPTIONAL]
+#
+# When compiled with module support, this contains a space seperated list
+# of modules to automaticaly load when services are ready for new clients.
+# e.g. new pesudo clients such as CatServ :-) *meow*
+#
+#ModuleDelayedAutoload "ircd_catserv"
+
+#EOF
diff --git a/data/tables.sql b/data/tables.sql
new file mode 100644
index 000000000..533a4c6e8
--- /dev/null
+++ b/data/tables.sql
@@ -0,0 +1,470 @@
+
+-- If you need to create your db, uncomment the following lines.
+-- create database anope;
+-- use anope;
+
+--
+-- Table structure for table `anope_info`
+--
+
+DROP TABLE IF EXISTS anope_info;
+CREATE TABLE anope_info (
+ version int(11) default NULL,
+ date datetime default NULL
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_bs_core`
+--
+
+DROP TABLE IF EXISTS anope_bs_core;
+CREATE TABLE anope_bs_core (
+ bs_id int(11) NOT NULL auto_increment,
+ nick varchar(255) NOT NULL default '',
+ user text NOT NULL,
+ host text NOT NULL,
+ rname text NOT NULL,
+ flags int(11) NOT NULL default '0',
+ created int(11) NOT NULL default '0',
+ chancount int(11) NOT NULL default '0',
+ PRIMARY KEY (bs_id),
+ UNIQUE KEY nick (nick),
+ KEY nick_index (nick(10))
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_cs_access`
+--
+
+DROP TABLE IF EXISTS anope_cs_access;
+CREATE TABLE anope_cs_access (
+ ca_id int(11) NOT NULL auto_increment,
+ in_use int(11) NOT NULL default '0',
+ level int(11) NOT NULL default '0',
+ display varchar(255) NOT NULL default '',
+ channel varchar(255) NOT NULL default '',
+ last_seen int(11) NOT NULL default '0',
+ PRIMARY KEY (ca_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_cs_akicks`
+--
+
+DROP TABLE IF EXISTS anope_cs_akicks;
+CREATE TABLE anope_cs_akicks (
+ ck_id int(11) NOT NULL auto_increment,
+ channel varchar(255) NOT NULL default '',
+ flags int(11) NOT NULL default '0',
+ dmask text NOT NULL,
+ reason text NOT NULL,
+ creator text NOT NULL,
+ addtime int(11) NOT NULL default '0',
+ PRIMARY KEY (ck_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_cs_badwords`
+--
+
+DROP TABLE IF EXISTS anope_cs_badwords;
+CREATE TABLE anope_cs_badwords (
+ cw_id int(11) NOT NULL auto_increment,
+ channel varchar(255) NOT NULL default '',
+ word text NOT NULL,
+ type int(11) NOT NULL default '0',
+ PRIMARY KEY (cw_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_cs_info`
+--
+
+DROP TABLE IF EXISTS anope_cs_info;
+CREATE TABLE anope_cs_info (
+ ci_id int(11) NOT NULL auto_increment,
+ name varchar(255) NOT NULL default '',
+ founder text NOT NULL,
+ successor text NOT NULL,
+ founderpass tinyblob NOT NULL,
+ descr text NOT NULL,
+ url text NOT NULL,
+ email text NOT NULL,
+ time_registered int(10) unsigned NOT NULL default '0',
+ last_used int(10) unsigned NOT NULL default '0',
+ last_topic text NOT NULL,
+ last_topic_setter text NOT NULL,
+ last_topic_time int(10) unsigned NOT NULL default '0',
+ flags int(10) unsigned NOT NULL default '0',
+ forbidby text NOT NULL,
+ forbidreason text NOT NULL,
+ bantype smallint(6) NOT NULL default '0',
+ accesscount smallint(6) NOT NULL default '0',
+ akickcount smallint(6) NOT NULL default '0',
+ mlock_on int(10) unsigned NOT NULL default '0',
+ mlock_off int(10) unsigned NOT NULL default '0',
+ mlock_limit int(10) unsigned NOT NULL default '0',
+ mlock_key text NOT NULL,
+ mlock_flood text NOT NULL,
+ mlock_redirect text NOT NULL,
+ entry_message text NOT NULL,
+ memomax smallint(5) unsigned NOT NULL default '0',
+ botnick varchar(255) NOT NULL default '',
+ botflags int(10) unsigned NOT NULL default '0',
+ ttb smallint(6) NOT NULL default '0',
+ bwcount smallint(6) NOT NULL default '0',
+ capsmin smallint(6) NOT NULL default '0',
+ capspercent smallint(6) NOT NULL default '0',
+ floodlines smallint(6) NOT NULL default '0',
+ floodsecs smallint(6) NOT NULL default '0',
+ repeattimes smallint(6) NOT NULL default '0',
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (ci_id),
+ UNIQUE KEY name (name),
+ KEY name_index (name(10))
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_cs_levels`
+--
+
+DROP TABLE IF EXISTS anope_cs_levels;
+CREATE TABLE anope_cs_levels (
+ cl_id int(11) NOT NULL auto_increment,
+ channel varchar(255) NOT NULL default '',
+ position int(11) NOT NULL default '0',
+ level int(11) NOT NULL default '0',
+ PRIMARY KEY (cl_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_hs_core`
+--
+
+DROP TABLE IF EXISTS anope_hs_core;
+CREATE TABLE anope_hs_core (
+ bs_id int(11) NOT NULL auto_increment,
+ nick varchar(255) NOT NULL default '',
+ vident text NOT NULL,
+ vhost text NOT NULL,
+ creator text NOT NULL,
+ time int(11) NOT NULL default '0',
+ PRIMARY KEY (bs_id),
+ UNIQUE KEY nick (nick),
+ KEY nick_index (nick(10))
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_ms_info`
+--
+
+DROP TABLE IF EXISTS anope_ms_info;
+CREATE TABLE anope_ms_info (
+ nm_id int(11) NOT NULL auto_increment,
+ receiver text NOT NULL,
+ number int(11) NOT NULL default '0',
+ flags int(11) NOT NULL default '0',
+ time int(11) NOT NULL default '0',
+ sender text NOT NULL,
+ text blob NOT NULL,
+ serv enum('NICK','CHAN') NOT NULL default 'NICK',
+ PRIMARY KEY (nm_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_ns_access`
+--
+
+DROP TABLE IF EXISTS anope_ns_access;
+CREATE TABLE anope_ns_access (
+ na_id int(11) NOT NULL auto_increment,
+ display varchar(255) NOT NULL default '',
+ access text NOT NULL,
+ PRIMARY KEY (na_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_ns_alias`
+--
+
+DROP TABLE IF EXISTS anope_ns_alias;
+CREATE TABLE anope_ns_alias (
+ na_id int(11) NOT NULL auto_increment,
+ display varchar(255) NOT NULL default '',
+ nick varchar(255) NOT NULL default '',
+ time_registered int(10) unsigned NOT NULL default '0',
+ last_seen int(10) unsigned NOT NULL default '0',
+ status smallint(6) NOT NULL default '0',
+ last_usermask text NOT NULL,
+ last_realname text NOT NULL,
+ last_quit text NOT NULL,
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (na_id),
+ UNIQUE KEY nick (nick),
+ KEY nick_index (nick(10))
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_ns_core`
+--
+
+DROP TABLE IF EXISTS anope_ns_core;
+CREATE TABLE anope_ns_core (
+ nc_id int(11) NOT NULL auto_increment,
+ display varchar(255) NOT NULL default '',
+ pass tinyblob NOT NULL,
+ email text NOT NULL,
+ icq int(10) unsigned NOT NULL default '0',
+ url text NOT NULL,
+ flags int(11) NOT NULL default '0',
+ language smallint(5) unsigned NOT NULL default '0',
+ accesscount smallint(6) NOT NULL default '0',
+ memocount smallint(5) unsigned NOT NULL default '0',
+ memomax smallint(5) unsigned NOT NULL default '0',
+ channelcount smallint(5) unsigned NOT NULL default '0',
+ channelmax smallint(5) unsigned NOT NULL default '0',
+ greet text NOT NULL,
+ active tinyint(1) NOT NULL default '1',
+ PRIMARY KEY (nc_id),
+ UNIQUE KEY display (display),
+ KEY display_index (display(10))
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_ns_request`
+--
+
+DROP TABLE IF EXISTS anope_ns_request;
+CREATE TABLE anope_ns_request (
+ nr_id int(11) NOT NULL auto_increment,
+ nick varchar(255) NOT NULL default '',
+ passcode text NOT NULL,
+ password tinyblob NOT NULL,
+ email text NOT NULL,
+ requested int(11) NOT NULL default '0',
+ active int(1) NOT NULL default '1',
+ PRIMARY KEY (nr_id),
+ UNIQUE KEY nick (nick),
+ KEY nick_index (nick(10))
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_os_akills`
+--
+
+DROP TABLE IF EXISTS anope_os_akills;
+CREATE TABLE anope_os_akills (
+ ok_id int(11) NOT NULL auto_increment,
+ user text NOT NULL,
+ host text NOT NULL,
+ xby text NOT NULL,
+ reason text NOT NULL,
+ seton int(11) NOT NULL default '0',
+ expire int(11) NOT NULL default '0',
+ PRIMARY KEY (ok_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_os_core`
+--
+
+DROP TABLE IF EXISTS anope_os_core;
+CREATE TABLE anope_os_core (
+ oc_id int(11) NOT NULL auto_increment,
+ maxusercnt int(11) NOT NULL default '0',
+ maxusertime int(11) NOT NULL default '0',
+ akills_count int(11) NOT NULL default '0',
+ sglines_count int(11) NOT NULL default '0',
+ sqlines_count int(11) NOT NULL default '0',
+ szlines_count int(11) NOT NULL default '0',
+ PRIMARY KEY (oc_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_os_exceptions`
+--
+
+DROP TABLE IF EXISTS anope_os_exceptions;
+CREATE TABLE anope_os_exceptions (
+ oe_id int(11) NOT NULL auto_increment,
+ mask text NOT NULL,
+ lim int(11) NOT NULL default '0',
+ who text NOT NULL,
+ reason text NOT NULL,
+ time int(11) NOT NULL default '0',
+ expires int(11) NOT NULL default '0',
+ PRIMARY KEY (oe_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_os_hcache`
+--
+
+DROP TABLE IF EXISTS anope_os_hcache;
+CREATE TABLE anope_os_hcache (
+ oh_id int(11) NOT NULL auto_increment,
+ mask text NOT NULL,
+ status int(11) NOT NULL default '0',
+ used int(11) NOT NULL default '0',
+ PRIMARY KEY (oh_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_os_news`
+--
+
+DROP TABLE IF EXISTS anope_os_news;
+CREATE TABLE anope_os_news (
+ on_id int(11) NOT NULL auto_increment,
+ type int(11) NOT NULL default '0',
+ num int(11) NOT NULL default '0',
+ ntext text NOT NULL,
+ who text NOT NULL,
+ time int(11) NOT NULL default '0',
+ PRIMARY KEY (on_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_os_sglines`
+--
+
+DROP TABLE IF EXISTS anope_os_sglines;
+CREATE TABLE anope_os_sglines (
+ og_id int(11) NOT NULL auto_increment,
+ mask text NOT NULL,
+ xby text NOT NULL,
+ reason text NOT NULL,
+ seton int(11) NOT NULL default '0',
+ expire int(11) NOT NULL default '0',
+ PRIMARY KEY (og_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_os_sqlines`
+--
+
+DROP TABLE IF EXISTS anope_os_sqlines;
+CREATE TABLE anope_os_sqlines (
+ og_id int(11) NOT NULL auto_increment,
+ mask text NOT NULL,
+ xby text NOT NULL,
+ reason text NOT NULL,
+ seton int(11) NOT NULL default '0',
+ expire int(11) NOT NULL default '0',
+ PRIMARY KEY (og_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_os_status`
+--
+
+DROP TABLE IF EXISTS anope_os_status;
+CREATE TABLE anope_os_status (
+ os_id int(11) NOT NULL auto_increment,
+ host text NOT NULL,
+ status int(11) NOT NULL default '0',
+ used int(11) NOT NULL default '0',
+ PRIMARY KEY (os_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `anope_os_szlines`
+--
+
+DROP TABLE IF EXISTS anope_os_szlines;
+CREATE TABLE anope_os_szlines (
+ og_id int(11) NOT NULL auto_increment,
+ mask text NOT NULL,
+ xby text NOT NULL,
+ reason text NOT NULL,
+ seton int(11) NOT NULL default '0',
+ expire int(11) NOT NULL default '0',
+ PRIMARY KEY (og_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `bugs`
+--
+
+DROP TABLE IF EXISTS bugs;
+CREATE TABLE bugs (
+ b_id int(9) NOT NULL auto_increment,
+ b_moduleid int(9) NOT NULL default '0',
+ b_title varchar(40) NOT NULL default '',
+ b_desc text NOT NULL,
+ b_reporter varchar(15) NOT NULL default '',
+ PRIMARY KEY (b_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `modules`
+--
+
+DROP TABLE IF EXISTS modules;
+CREATE TABLE modules (
+ m_id int(9) NOT NULL auto_increment,
+ m_name varchar(30) NOT NULL default '',
+ m_category enum('OperServ','NickServ','MemoServ','ChanServ','BotServ','HostServ','HelpServ','Misc') NOT NULL default 'Misc',
+ m_description longtext NOT NULL,
+ m_activated enum('0','1') NOT NULL default '0',
+ m_owner varchar(15) NOT NULL default '',
+ m_path varchar(40) NOT NULL default '',
+ m_updated date NOT NULL default '0000-00-00',
+ m_official enum('0','1') NOT NULL default '0',
+ m_version varchar(5) NOT NULL default '',
+ PRIMARY KEY (m_id)
+) TYPE=MyISAM PACK_KEYS=0;
+
+--
+-- Table structure for table `requests`
+--
+
+DROP TABLE IF EXISTS requests;
+CREATE TABLE requests (
+ r_id int(3) NOT NULL auto_increment,
+ r_title varchar(30) NOT NULL default '',
+ r_category enum('OperServ','NickServ','MemoServ','ChanServ','BotServ','HostServ','HelpServ','Misc') NOT NULL default 'Misc',
+ r_description longtext NOT NULL,
+ r_owner varchar(15) NOT NULL default 'Anonymous',
+ r_assigned varchar(15) NOT NULL default '',
+ PRIMARY KEY (r_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `uploaded`
+--
+
+DROP TABLE IF EXISTS uploaded;
+CREATE TABLE uploaded (
+ mu_id int(9) NOT NULL auto_increment,
+ mu_name varchar(30) NOT NULL default '',
+ mu_category enum('OperServ','NickServ','MemoServ','ChanServ','BotServ','HostServ','HelpServ','Misc') NOT NULL default 'Misc',
+ mu_description longtext NOT NULL,
+ mu_activated enum('0','1') NOT NULL default '0',
+ mu_owner varchar(15) NOT NULL default '',
+ mu_path varchar(40) NOT NULL default '',
+ mu_updated date NOT NULL default '0000-00-00',
+ mu_official enum('0','1') NOT NULL default '0',
+ mu_version varchar(5) NOT NULL default '',
+ PRIMARY KEY (mu_id)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `users`
+--
+
+DROP TABLE IF EXISTS users;
+CREATE TABLE users (
+ u_id int(9) NOT NULL auto_increment,
+ u_username varchar(15) NOT NULL default '',
+ u_password varchar(32) NOT NULL default '',
+ u_email varchar(40) NOT NULL default '',
+ u_location varchar(40) NOT NULL default '',
+ u_status enum('normal','coder','admin','root') NOT NULL default 'normal',
+ u_confirmed enum('0','1') NOT NULL default '1',
+ u_registered date NOT NULL default '0000-00-00',
+ u_lastvisit date NOT NULL default '0000-00-00',
+ u_hideemail enum('0','1') NOT NULL default '0',
+ PRIMARY KEY (u_id)
+) TYPE=MyISAM PACK_KEYS=0;
+
diff --git a/datafiles.c b/datafiles.c
new file mode 100644
index 000000000..6d4d4e4c2
--- /dev/null
+++ b/datafiles.c
@@ -0,0 +1,507 @@
+/* Database file handling routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: datafiles.c,v 1.8 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "datafiles.h"
+#include <fcntl.h>
+
+static int curday = 0;
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Return the version number on the file. Return 0 if there is no version
+ * number or the number doesn't make sense (i.e. less than 1 or greater
+ * than FILE_VERSION).
+ */
+
+int get_file_version(dbFILE * f)
+{
+ FILE *fp = f->fp;
+ int version =
+ fgetc(fp) << 24 | fgetc(fp) << 16 | fgetc(fp) << 8 | fgetc(fp);
+ if (ferror(fp)) {
+#ifndef NOT_MAIN
+ log_perror("Error reading version number on %s", f->filename);
+#endif
+ return 0;
+ } else if (feof(fp)) {
+#ifndef NOT_MAIN
+ alog("Error reading version number on %s: End of file detected",
+ f->filename);
+#endif
+ return 0;
+ } else if (version < 1) {
+#ifndef NOT_MAIN
+ alog("Invalid version number (%d) on %s", version, f->filename);
+#endif
+ return 0;
+ }
+ return version;
+}
+
+/*************************************************************************/
+
+/* Write the current version number to the file. Return 0 on error, 1 on
+ * success.
+ */
+
+int write_file_version(dbFILE * f, uint32 version)
+{
+ FILE *fp = f->fp;
+ if (fputc(version >> 24 & 0xFF, fp) < 0 ||
+ fputc(version >> 16 & 0xFF, fp) < 0 ||
+ fputc(version >> 8 & 0xFF, fp) < 0 ||
+ fputc(version & 0xFF, fp) < 0) {
+#ifndef NOT_MAIN
+ log_perror("Error writing version number on %s", f->filename);
+#endif
+ return 0;
+ }
+ return 1;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+static dbFILE *open_db_read(const char *service, const char *filename)
+{
+ dbFILE *f;
+ FILE *fp;
+
+ f = scalloc(sizeof(*f), 1);
+ if (!f) {
+#ifndef NOT_MAIN
+ log_perror("Can't read %s database %s", service, filename);
+#endif
+ return NULL;
+ }
+ strscpy(f->filename, filename, sizeof(f->filename));
+ f->mode = 'r';
+ fp = fopen(f->filename, "rb");
+ if (!fp) {
+ int errno_save = errno;
+#ifndef NOT_MAIN
+ if (errno != ENOENT)
+ log_perror("Can't read %s database %s", service, f->filename);
+#endif
+ free(f);
+ errno = errno_save;
+ return NULL;
+ }
+ f->fp = fp;
+ f->backupfp = NULL;
+ return f;
+}
+
+/*************************************************************************/
+
+static dbFILE *open_db_write(const char *service, const char *filename,
+ uint32 version)
+{
+ dbFILE *f;
+ int fd;
+
+ f = scalloc(sizeof(*f), 1);
+ if (!f) {
+#ifndef NOT_MAIN
+ log_perror("Can't read %s database %s", service, filename);
+#endif
+ return NULL;
+ }
+ strscpy(f->filename, filename, sizeof(f->filename));
+ filename = f->filename;
+ f->mode = 'w';
+
+ *f->backupname = 0;
+ snprintf(f->backupname, sizeof(f->backupname), "%s.save", filename);
+ if (!*f->backupname || strcmp(f->backupname, filename) == 0) {
+ int errno_save = errno;
+#ifndef NOT_MAIN
+ alog("Opening %s database %s for write: Filename too long",
+ service, filename);
+#endif
+ free(f);
+ errno = errno_save;
+ return NULL;
+ }
+ unlink(f->backupname);
+ f->backupfp = fopen(filename, "rb");
+ if (rename(filename, f->backupname) < 0 && errno != ENOENT) {
+ int errno_save = errno;
+#ifndef NOT_MAIN
+ static int walloped = 0;
+ if (!walloped) {
+ walloped++;
+ wallops(NULL, "Can't back up %s database %s", service,
+ filename);
+ }
+ errno = errno_save;
+ log_perror("Can't back up %s database %s", service, filename);
+ if (!NoBackupOkay) {
+#endif
+ if (f->backupfp)
+ fclose(f->backupfp);
+ free(f);
+ errno = errno_save;
+ return NULL;
+#ifndef NOT_MAIN
+ }
+#endif
+ *f->backupname = 0;
+ }
+ unlink(filename);
+ /* Use open() to avoid people sneaking a new file in under us */
+ fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);
+ f->fp = fdopen(fd, "wb"); /* will fail and return NULL if fd < 0 */
+ if (!f->fp || !write_file_version(f, version)) {
+ int errno_save = errno;
+#ifndef NOT_MAIN
+ static int walloped = 0;
+ if (!walloped) {
+ walloped++;
+ wallops(NULL, "Can't write to %s database %s", service,
+ filename);
+ }
+ errno = errno_save;
+ log_perror("Can't write to %s database %s", service, filename);
+#endif
+ if (f->fp) {
+ fclose(f->fp);
+ unlink(filename);
+ }
+ if (*f->backupname && rename(f->backupname, filename) < 0)
+#ifndef NOT_MAIN
+ log_perror("Cannot restore backup copy of %s", filename);
+#else
+ ;
+#endif
+ errno = errno_save;
+ return NULL;
+ }
+ return f;
+}
+
+/*************************************************************************/
+
+/* Open a database file for reading (*mode == 'r') or writing (*mode == 'w').
+ * Return the stream pointer, or NULL on error. When opening for write, it
+ * is an error for rename() to return an error (when backing up the original
+ * file) other than ENOENT, if NO_BACKUP_OKAY is not defined; it is an error
+ * if the version number cannot be written to the file; and it is a fatal
+ * error if opening the file for write fails and the backup was successfully
+ * made but cannot be restored.
+ */
+
+dbFILE *open_db(const char *service, const char *filename,
+ const char *mode, uint32 version)
+{
+ if (*mode == 'r') {
+ return open_db_read(service, filename);
+ } else if (*mode == 'w') {
+ return open_db_write(service, filename, version);
+ } else {
+ errno = EINVAL;
+ return NULL;
+ }
+}
+
+/*************************************************************************/
+
+/* Restore the database file to its condition before open_db(). This is
+ * identical to close_db() for files open for reading; however, for files
+ * open for writing, we first attempt to restore any backup file before
+ * closing files.
+ */
+
+void restore_db(dbFILE * f)
+{
+ int errno_save = errno;
+
+ if (f->mode == 'w') {
+ int ok = 0; /* Did we manage to restore the old file? */
+ errno = errno_save = 0;
+ if (*f->backupname && strcmp(f->backupname, f->filename) != 0) {
+ if (rename(f->backupname, f->filename) == 0)
+ ok = 1;
+ }
+ if (!ok && f->backupfp) {
+ char buf[1024];
+ int i;
+ ok = 1;
+ if (fseek(f->fp, 0, SEEK_SET) < 0)
+ ok = 0;
+ while (ok && (i = fread(buf, 1, sizeof(buf), f->backupfp)) > 0) {
+ if (fwrite(buf, 1, i, f->fp) != i)
+ ok = 0;
+ }
+ if (ok) {
+ fflush(f->fp);
+ ftruncate(fileno(f->fp), ftell(f->fp));
+ }
+ }
+#ifndef NOT_MAIN
+ if (!ok && errno > 0)
+ log_perror("Unable to restore backup of %s", f->filename);
+#endif
+ errno_save = errno;
+ if (f->backupfp)
+ fclose(f->backupfp);
+ if (*f->backupname)
+ unlink(f->backupname);
+ }
+ fclose(f->fp);
+ if (!errno_save)
+ errno_save = errno;
+ free(f);
+ errno = errno_save;
+}
+
+/*************************************************************************/
+
+/* Close a database file. If the file was opened for write, remove the
+ * backup we (may have) created earlier.
+ */
+
+void close_db(dbFILE * f)
+{
+ if (f->mode == 'w' && *f->backupname
+ && strcmp(f->backupname, f->filename) != 0) {
+ if (f->backupfp)
+ fclose(f->backupfp);
+ unlink(f->backupname);
+ }
+ fclose(f->fp);
+ free(f);
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Read and write 2- and 4-byte quantities, pointers, and strings. All
+ * multibyte values are stored in big-endian order (most significant byte
+ * first). A pointer is stored as a byte, either 0 if NULL or 1 if not,
+ * and read pointers are returned as either (void *)0 or (void *)1. A
+ * string is stored with a 2-byte unsigned length (including the trailing
+ * \0) first; a length of 0 indicates that the string pointer is NULL.
+ * Written strings are truncated silently at 65534 bytes, and are always
+ * null-terminated.
+ *
+ * All routines return -1 on error, 0 otherwise.
+ */
+
+
+int read_int16(uint16 * ret, dbFILE * f)
+{
+ int c1, c2;
+
+ c1 = fgetc(f->fp);
+ c2 = fgetc(f->fp);
+ if (c1 == EOF || c2 == EOF)
+ return -1;
+ *ret = c1 << 8 | c2;
+ return 0;
+}
+
+int write_int16(uint16 val, dbFILE * f)
+{
+ if (fputc((val >> 8) & 0xFF, f->fp) == EOF
+ || fputc(val & 0xFF, f->fp) == EOF)
+ return -1;
+ return 0;
+}
+
+
+int read_int32(uint32 * ret, dbFILE * f)
+{
+ int c1, c2, c3, c4;
+
+ c1 = fgetc(f->fp);
+ c2 = fgetc(f->fp);
+ c3 = fgetc(f->fp);
+ c4 = fgetc(f->fp);
+ if (c1 == EOF || c2 == EOF || c3 == EOF || c4 == EOF)
+ return -1;
+ *ret = c1 << 24 | c2 << 16 | c3 << 8 | c4;
+ return 0;
+}
+
+int write_int32(uint32 val, dbFILE * f)
+{
+ if (fputc((val >> 24) & 0xFF, f->fp) == EOF)
+ return -1;
+ if (fputc((val >> 16) & 0xFF, f->fp) == EOF)
+ return -1;
+ if (fputc((val >> 8) & 0xFF, f->fp) == EOF)
+ return -1;
+ if (fputc((val) & 0xFF, f->fp) == EOF)
+ return -1;
+ return 0;
+}
+
+
+int read_ptr(void **ret, dbFILE * f)
+{
+ int c;
+
+ c = fgetc(f->fp);
+ if (c == EOF)
+ return -1;
+ *ret = (c ? (void *) 1 : (void *) 0);
+ return 0;
+}
+
+int write_ptr(const void *ptr, dbFILE * f)
+{
+ if (fputc(ptr ? 1 : 0, f->fp) == EOF)
+ return -1;
+ return 0;
+}
+
+
+int read_string(char **ret, dbFILE * f)
+{
+ char *s;
+ uint16 len;
+
+ if (read_int16(&len, f) < 0)
+ return -1;
+ if (len == 0) {
+ *ret = NULL;
+ return 0;
+ }
+ s = scalloc(len, 1);
+ if (len != fread(s, 1, len, f->fp)) {
+ free(s);
+ return -1;
+ }
+ *ret = s;
+ return 0;
+}
+
+int write_string(const char *s, dbFILE * f)
+{
+ uint32 len;
+
+ if (!s)
+ return write_int16(0, f);
+ len = strlen(s);
+ if (len > 65534)
+ len = 65534;
+ if (write_int16((uint16) (len + 1), f) < 0)
+ return -1;
+ if (len > 0 && fwrite(s, 1, len, f->fp) != len)
+ return -1;
+ if (fputc(0, f->fp) == EOF)
+ return -1;
+ return 0;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Renames a database */
+
+static void rename_database(char *name, char *ext)
+{
+
+ char destpath[PATH_MAX];
+
+ snprintf(destpath, sizeof(destpath), "backups/%s.%s", name, ext);
+ if (rename(name, destpath) != 0) {
+ alog("Backup of %s failed.", name);
+ wallops(s_OperServ, "WARNING! Backup of %s failed.", name);
+ }
+}
+
+/*************************************************************************/
+
+/* Removes old databases */
+
+static void remove_backups(void)
+{
+
+ char ext[9];
+ char path[PATH_MAX];
+
+ time_t t;
+ struct tm tm;
+
+ time(&t);
+ t -= (60 * 60 * 24 * KeepBackups);
+ tm = *localtime(&t);
+ strftime(ext, sizeof(ext), "%Y%m%d", &tm);
+
+ snprintf(path, sizeof(path), "backups/%s.%s", NickDBName, ext);
+ unlink(path);
+ snprintf(path, sizeof(path), "backups/%s.%s", BotDBName, ext);
+ unlink(path);
+ snprintf(path, sizeof(path), "backups/%s.%s", ChanDBName, ext);
+ unlink(path);
+ snprintf(path, sizeof(path), "backups/%s.%s", OperDBName, ext);
+ unlink(path);
+ snprintf(path, sizeof(path), "backups/%s.%s", NewsDBName, ext);
+ unlink(path);
+ snprintf(path, sizeof(path), "backups/%s.%s", ExceptionDBName, ext);
+ unlink(path);
+ snprintf(path, sizeof(path), "backups/%s.%s", HostDBName, ext);
+ unlink(path);
+}
+
+/*************************************************************************/
+
+/* Handles database backups. */
+
+void backup_databases(void)
+{
+
+ time_t t;
+ struct tm tm;
+
+ if (!KeepBackups)
+ return;
+
+ time(&t);
+ tm = *localtime(&t);
+
+ if (!curday) {
+ curday = tm.tm_yday;
+ return;
+ }
+
+ if (curday != tm.tm_yday) {
+
+ char ext[9];
+
+ alog("Backing up databases");
+
+ remove_backups();
+
+ curday = tm.tm_yday;
+ strftime(ext, sizeof(ext), "%Y%m%d", &tm);
+
+ if (!skeleton) {
+ rename_database(NickDBName, ext);
+ if (s_BotServ)
+ rename_database(BotDBName, ext);
+ rename_database(ChanDBName, ext);
+ if (s_HostServ)
+ rename_database(HostDBName, ext);
+ }
+
+ rename_database(OperDBName, ext);
+ rename_database(NewsDBName, ext);
+ rename_database(ExceptionDBName, ext);
+ }
+}
diff --git a/datafiles.h b/datafiles.h
new file mode 100644
index 000000000..3bb09916a
--- /dev/null
+++ b/datafiles.h
@@ -0,0 +1,67 @@
+/* Database file descriptor structure and file handling routine prototypes.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: datafiles.h,v 1.4 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+#ifndef DATAFILES_H
+#define DATAFILES_H
+
+/*************************************************************************/
+
+typedef struct dbFILE_ dbFILE;
+struct dbFILE_ {
+ int mode; /* 'r' for reading, 'w' for writing */
+ FILE *fp; /* The normal file descriptor */
+ FILE *backupfp; /* Open file pointer to a backup copy of
+ * the database file (if non-NULL) */
+ char filename[PATH_MAX]; /* Name of the database file */
+ char backupname[PATH_MAX]; /* Name of the backup file */
+};
+
+/*************************************************************************/
+
+/* Prototypes and macros: */
+
+E void check_file_version(dbFILE *f);
+E int get_file_version(dbFILE *f);
+E int write_file_version(dbFILE *f, uint32 version);
+
+E dbFILE *open_db(const char *service, const char *filename, const char *mode, uint32 version);
+E void restore_db(dbFILE *f); /* Restore to state before open_db() */
+E void close_db(dbFILE *f);
+E void backup_databases(void);
+
+#define read_db(f,buf,len) (fread((buf),1,(len),(f)->fp))
+#define write_db(f,buf,len) (fwrite((buf),1,(len),(f)->fp))
+#define getc_db(f) (fgetc((f)->fp))
+
+E int read_int16(uint16 *ret, dbFILE *f);
+E int write_int16(uint16 val, dbFILE *f);
+E int read_int32(uint32 *ret, dbFILE *f);
+E int write_int32(uint32 val, dbFILE *f);
+E int read_ptr(void **ret, dbFILE *f);
+E int write_ptr(const void *ptr, dbFILE *f);
+E int read_string(char **ret, dbFILE *f);
+E int write_string(const char *s, dbFILE *f);
+
+#define read_int8(ret,f) ((*(ret)=fgetc((f)->fp))==EOF ? -1 : 0)
+#define write_int8(val,f) (fputc((val),(f)->fp)==EOF ? -1 : 0)
+#define read_buffer(buf,f) (read_db((f),(buf),sizeof(buf)) == sizeof(buf))
+#define write_buffer(buf,f) (write_db((f),(buf),sizeof(buf)) == sizeof(buf))
+#define read_buflen(buf,len,f) (read_db((f),(buf),(len)) == (len))
+#define write_buflen(buf,len,f) (write_db((f),(buf),(len)) == (len))
+#define read_variable(var,f) (read_db((f),&(var),sizeof(var)) == sizeof(var))
+#define write_variable(var,f) (write_db((f),&(var),sizeof(var)) == sizeof(var))
+
+/*************************************************************************/
+
+#endif /* DATAFILES_H */
diff --git a/defs.h b/defs.h
new file mode 100644
index 000000000..eeadde73d
--- /dev/null
+++ b/defs.h
@@ -0,0 +1,40 @@
+/* Set default values for any constants that should be in include files but
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ * $Id: defs.h,v 1.4 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+/*************************************************************************/
+
+#ifndef NAME_MAX
+# define NAME_MAX 255
+#endif
+
+#ifndef BUFSIZ
+# define BUFSIZ 256
+#else
+# if BUFSIZ < 256
+# define BUFSIZ 256
+# endif
+#endif
+
+/* Length of an array: */
+#define lenof(a) (sizeof(a) / sizeof(*(a)))
+
+/* Telling compilers about printf()-like functions: */
+#ifdef __GNUC__
+# define FORMAT(type,fmt,start) __attribute__((format(type,fmt,start)))
+#else
+# define FORMAT(type,fmt,start)
+#endif
+
+/*************************************************************************/
diff --git a/docs/BUGS b/docs/BUGS
new file mode 100644
index 000000000..cbf2d5bad
--- /dev/null
+++ b/docs/BUGS
@@ -0,0 +1,17 @@
+Reported Bugs from Mantis: http://www.anope.org/bug
+===================================================
+
+.- Strange Segfault on expiring nicknames. Almost arbitrary, very hard
+ to reproduce.
+
+.- Clone detection can give false warnings if a user connects and then
+ signs off several times in rapid succession. Clone detection also
+ goes off wrongly if a server links and has a number of clients from
+ the same hostname.
+
+.- If there is absolutely no activity on your network, Services may delay
+ timed events (nick kills, database saving, etc.) until the next message
+ comes in from Services' uplink server.
+
+.- Modules will not work on OpenBSD machines, due to limitations on libdl.
+
diff --git a/docs/COPYING b/docs/COPYING
new file mode 100644
index 000000000..a43ea2126
--- /dev/null
+++ b/docs/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/docs/DEFCON b/docs/DEFCON
new file mode 100644
index 000000000..1b7b169de
--- /dev/null
+++ b/docs/DEFCON
@@ -0,0 +1,111 @@
+Anope DefCon
+------------
+
+Introduction:
+
+ Anope 1.6 onwards supports a unique protection mechanism based on the
+ military "Defense Readiness Condition" (DefCon) system. It is based on
+ 5 levels of defense readiness defined as:
+
+ DEFCON5 Normal peacetime readiness
+ DEFCON4 Increased intelligence and security readiness
+ DEFCON3 Increase in force readiness
+ DEFCON2 Further increase in force readiness
+ DEFCON1 Maximum force readiness.
+
+ These are configurable levels that mandates what actions Anope should
+ take in case of emergency and change in readiness status.
+
+ It is used to prevent abuse to both Services, and the ircd on which they
+ are running. Also to protect the users, primarily in the event of Clones
+ and/or FloodBOT attacks.
+
+Installation:
+
+ The DefCon system is part of Anope's core,
+
+ The DefCon system has to be configured on your services.conf file to
+ be enabled. All directives are optional unless they depend on what
+ options you enable for each level. Look for the "DefCon configuration"
+ section on your services.conf file for more information.
+
+ Make sure you restart Anope after changing the DefCon configuration
+ directives.
+
+Configuration:
+
+ Pre-defined DefCon actions:
+
+ No new channel registrations 1
+ No New Nick Registrations 2
+ No MLOCK changes 4
+ Force Chan Mode 8
+ Use Reduced Session Limit 16
+ KILL any new clients trying to connect 32
+ Services will ignore everyone but opers 64
+ Services will silently ignore everyone but opers 128
+ AKILL all new clients trying to connect 256
+ No new memos sent to block memoserv attacks 512
+
+ These are the values used to determine each defcon setting, are set via:
+
+ DefCon1 XX
+ DefCon2 XX
+ DefCon3 XX
+ DefCon4 XX
+
+ To set the desired value, you simply add the value of the numbers together
+ and place that as your DefCon# setting. For instance:
+
+ Say you wish to set:
+
+ No Channel Registrations, No Nickname Registrations and Services Ignoring
+ everyone except for Operators. You would do this by:
+
+ 1 + 2 + 128 (Each value listed above is added together)
+ Giving: 131
+
+ You would then place this as which ever Defcon setting you want:
+
+ DefCon1 131
+
+ The recommended default values are safe to use on any network.
+
+Usage:
+
+ Anope starts up in DEFCON5 (normal readiness). To change the Defcon level
+ in action use:
+
+ /msg OperServ DEFCON 1|2|3|4|5
+
+Example:
+
+ Place the network on DEFCON4:
+
+ /msg OperServ DEFCON 4
+
+ *** Global -- from OperServ: dengel Changed the DEFCON level to 4
+
+ -OperServ- Services are now at DEFCON 4
+ -OperServ- * No new channel registrations
+ -OperServ- * No new nick registrations
+ -OperServ- * No MLOCK changes
+ -OperServ- * Use the reduced session limit of 5
+
+ -Global- The Defcon Level is now at Level: 4
+
+ Restore normal readiness:
+
+ /msg OperServ DEFCON 5
+
+ *** Global -- from OperServ: dengel Changed the DEFCON level to 5
+
+ -OperServ- Services are now at DEFCON 5
+
+ -Global- Services are now back to normal, sorry for any inconvenience
+
+Support:
+
+ You might get DefCon support by posting on our online forum, or maybe on
+ our #anope channel at /server irc.anope.org.
+
diff --git a/docs/FAQ b/docs/FAQ
new file mode 100644
index 000000000..014d3a34d
--- /dev/null
+++ b/docs/FAQ
@@ -0,0 +1,423 @@
+ Frequently Asked Questions (FAQ) concerning Anope
+ =================================================
+
+Index:
+
+ 1. What is Anope?
+
+ 2. Where can I find Anope?
+
+ 3. Does Anope run under Windows?
+
+ 4. Can I send you questions without reading the FAQ, INSTALL or
+ README files?
+
+ 5. When I run "make", I get an error message like "missing separator",
+ "Unassociated shell command", "Unexpected end of line seen", etc.
+
+ 6. I get an error like "Makefile.inc not found".
+
+ 7. I typed "./services" at the command line, but nothing happened!
+
+ 8. I need support for the XYZ protocol.
+
+ 9. Whenever I start Anope, I get a message on my IRC server saying
+ "connection refused" or something similar, and Anope gives an error
+ message from the server saying "Closing Link: ...".
+
+10. My IRC server is giving me messages like "Connection to
+ services.whatever.net[127.0.0.1] activated" and then "Access denied --
+ no N line". Why?
+
+11. When I say "/connect services.*", it doesn't work!
+
+12. Anope complains in the logfile about being unable to load the
+ default language.
+
+13. Anope always dies after about five minutes, saying "FATAL ERROR!
+ Can't back up nick.db".
+
+14. Anope starts up okay, but if I try to register a nickname, it comes
+ back with "Sorry, registration failed."
+
+15. Anope crashed with a segmentation fault.
+
+16. Anope's channel mode setting doesn't work. I can't set modes with
+ OperServ, and every time ChanServ tries to set a mode, my server
+ reverses the change.
+
+17. Using the OperServ JUPE command results in server messages like
+ "Server juped.server introduced by non-hub server services.my.net".
+
+18. I can't use the ADMIN command to add Services admins--it tells me
+ "Permission denied."
+
+19. When I add an AKILL, the users matching it don't get killed.
+
+20. Anope reports (via /stats u or /msg OperServ STATS) a different
+ number of users online than I get from doing /lusers.
+
+21. Anope ignored the SET SUCCESSOR setting and deleted a channel when
+ the founder expired.
+
+22. Trying to use OperServ gives me "Access denied", but my nick is in the
+ ServicesRoot directive and is registered, and I've identified for my
+ nick.
+
+23. Anope spricht kein Deutsch!, etc. (Anope doesn't speak my
+ language!)
+
+24. I selected a language other than English, but sometimes Anope sends
+ responses in English instead.
+
+25. I've found a bug that's not mentioned here or in the
+ BUGS files. What should I do?
+
+26. Your Services program doesn't do XYZ like DALnet Services. What's
+ wrong?
+
+27. I've got a great new idea for Anope. Do you want it?
+
+28. Examples of features I have been asked about and why we won't add (or
+ haven't yet added) them--so don't ask us about them.
+
+29. How do I add bots to BotServ?
+
+30. When I used the OperServ RAW command, Anope and/or my network
+ crashed, or did weird things! Please fix this bug!
+
+31. I would like to have the list of the differents RAW on operserv
+
+32. I can't get /OS UMODES and /OS SVSNICK do not work!
+
+33. What is a Super-Admin? How does it work? Why might it not work?
+
+---------------------------------------------------------------------------
+
+1. What is Anope?
+
+ Anope is a set of services for IRC networks. See the README
+ file for more information. And in case you were wondering,
+ Anope is Epona spelt backwards :)
+
+
+2. Where can I find Anope?
+
+ The latest version can always be found at the official Anope
+ distribution site:
+
+ http://www.anope.org/
+
+ New version announcements can also be found at http://anope.zero.org/
+ in the Announcement section.
+
+
+3. Does Anope run under Windows?
+
+ Well... not officialy. Bu there is a cygwin based patch that makes
+ Anope work on Windows. Note, however, that some features might not
+ work, and you should take that into consideration when answering
+ the questions of ./configure (i.e. MySQL, Modules).
+
+ You can obtain a pre-build copy of Anope for Windoes from
+ http://www.wircds.net/ although we have "blessed" that port,
+ we do not provide support for it. If you can't get it work,
+ go to wIRCds.net forum.
+
+ If you feel capable of taking ownership of an official windows
+ port, and to keep it current, please let the current Development
+ team know.
+
+
+4. Can I send you questions without reading the FAQ, INSTALL or README
+ files?
+
+ No. If you don't read those files, your messages will most probably
+ be ignored. We don't mean to be rude, but if we took the time
+ to write down some documentation, we'd expect you to take some
+ time to read it.
+
+
+5. When I run "make", I get an error message like "missing separator",
+ "Unassociated shell command", "Unexpected end of line seen", etc.
+
+ Your make program isn't compatible with the Makefile for Anope.
+ The Makefile was designed to work with GNU make, and as such may
+ not work on other systems' "make" programs. If you get an error
+ from "make", obtain GNU make from ftp://prep.ai.mit.edu/pub/gnu/
+ (or wherever you prefer) and use it instead of your system's
+ default "make". Note that GNU make may already be installed on
+ your system; try using the command "gmake" instead of "make".
+
+ The make programs bundled with SunOS/Solaris and FreeBSD have been
+ reported not to work; you will need to use GNU make on these
+ systems.
+
+6. I get an error like "Makefile.inc not found".
+
+ You forgot to run the configure script first. See the INSTALL file
+ for compilation instructions.
+
+
+7. I typed "./services" at the command line, but nothing happened!
+
+ Anope puts itself in the background when it starts, so you get
+ your shell prompt right back. Meanwhile, Anope will continue
+ setting up, then connect to the IRC server specified in
+ services.conf (or on the command line). If it doesn't connect, you
+ probably specified the wrong server type when running the configure
+ script. (Also make sure that you are actually running one of the
+ supported servers. There are a gazillion different variations on
+ the basic IRC protocol out there, and I have neither the time nor
+ the desire to add support for them.)
+
+ The recommended server, under which Epona (the original code base
+ used by Anope) was developed, is Bahamut. DreamForge 4.6.7 will also
+ work fine, but it's a bit obsolete nowadays. Derivatives of Bahamut
+ and DreamForge may also work, if they don't change the server<->server
+ protocol too much; contact their authors for more information.
+ Most people, though, are running Anope with UnrealIRCd, UltimateIRCd
+ or Bahamut.
+
+ As always, you can check the log file (services.log by default) for
+ error messages.
+
+
+8. I need support for the XYZ protocol.
+
+ Hang in there! We are working on making Anope protocol independent.
+ It should show up sometime soon... more details to follow.
+
+
+9. Whenever I start Anope, I get a message on my IRC server saying
+ "connection refused" or something similar, and Anope gives an error
+ message from the server saying "Closing Link: ...".
+
+ See seection 3 of the INSTALL file.
+
+
+10. My IRC server is giving me messages like "Connection to
+ services.whatever.net[127.0.0.1] activated" and then "Access denied --
+ no N line". Why?
+
+ This is typically caused by including a port number in the C:line
+ for services, which tells your server to try to autoconnect to it
+ (depending on the class (Y:line) settings). This is not what you
+ want, because Anope will connect to the server itself, but does
+ not listen for servers to connect to it. The solution is to remove
+ the port number from the C:line.
+
+
+11. When I say "/connect services.*", it doesn't work!
+
+ Of course not. RTFM (Read The Fine Manual), and see the previous
+ answer.
+
+
+12. Anope complains in the logfile about being unable to load the
+ default language.
+
+ You forgot to run "make install".
+
+13. Anope always dies after about five minutes, saying "FATAL ERROR!
+ Can't back up nick.db".
+
+ Make sure that the user Anope runs as has write access to the
+ data directory, and that the data directory actually exists (the
+ latter shouldn't be a problem if you ran the configure script).
+ This means Anope needs write and execute permission on the data
+ directory itself and execute permission on every parent directory
+ of the data directory.
+
+
+14. Anope starts up okay, but if I try to register a nickname, it comes
+ back with "Sorry, registration failed."
+
+ Make sure you've selected the correct IRC server type in the
+ configure script; see question 9 for details.
+
+
+15. Anope crashed with a segmentation fault.
+
+ See if you can reproduce this by doing a certain sequence of
+ things. If so, please report it to us (see part 6 of README file). If
+ not, you're probably out of luck; if you like, you can report it to
+ us anyway, but chances are it won't get fixed if we don't have
+ instructions on reproducing it. If you do have such a problem, you
+ may find the crontab utility useful for dealing with it.
+
+ Also, see the DumpCore directive in the configuration file. It allows
+ Anope to dump its core whenever it's segfaulting, usually calling it
+ core and placing it into Anope's main directory.
+ Open up gdb by issuing the following command at your shell:
+ gdb services core
+ (of course replacing 'core' with the name of the core if different)
+ and type 'bt' at the gdb prompt. After that, send us the output you
+ got and keep the core file in a safe place, in case we need it to
+ dig deeper into the problem.
+
+16. Anope's channel mode setting doesn't work. I can't set modes with
+ OperServ, and every time ChanServ tries to set a mode, my server
+ reverses the change.
+
+ Make sure EVERY servers on your network has a U: line for Services in
+ ircd.conf, for example:
+
+ U:services.whatever.net:*:*
+
+
+17. Using the OperServ JUPE command results in server messages like
+ "Server juped.server introduced by non-hub server services.my.net".
+
+ Services' uplink must have an H: line for Services in the
+ ircd.conf file, which looks something like:
+
+ H:*::services.whatever.net
+
+
+18. I can't use the ADMIN command to add Services admins--it tells me
+ "Permission denied."
+
+ Did you define yourself as the Services root? You need to insert
+ your nickname in the ServicesRoot directive in services.conf.
+
+
+19. When I add an AKILL, the users matching it don't get killed.
+
+ Use the AkillOnAdd configuration directive.
+
+
+20. Anope reports (via /stats u or /msg OperServ STATS) a different
+ number of users online than I get from doing /lusers.
+
+ Anope doesn't count its own pseudo-clients (NickServ, ChanServ,
+ etc.) in its user count.
+
+
+21. Anope ignored the SET SUCCESSOR setting and deleted a channel when
+ the founder expired.
+
+ Normally, this is because the successor had too many channels
+ registered; in this case, you will see an entry in the log file
+ like the following:
+
+ [date] Successor (SuccessorNick) of channel #somechannel owns too
+ many channels, deleting channel #somechannel
+
+ If you don't get a message like this or you can verify that the
+ successor wasn't running into the channel limit, please report it
+ using the bug-reporting procedure below (see section 6 of the
+ README file).
+
+
+22. Trying to use OperServ gives me "Access denied", but my nick is in the
+ ServicesRoot directive and is registered, and I've identified for my
+ nick.
+
+ You need to be opered (i.e. user mode +o) to access OperServ.
+
+
+23. Anope spricht kein Deutsch!, etc. (Anope doesn't speak my
+ language!)
+
+ See section 5 of the README file.
+
+
+24. I selected a language other than English, but sometimes Anope sends
+ responses in English instead.
+
+ Some language files are not complete--in other words, they don't
+ have a translation of every message Anope uses, but only some of
+ them. In this case, the missing messages will be displayed in
+ English. You can either wait for the primary translator to provide
+ us with a translation, or do the translation yourself and send us
+ the messages translated into your language.
+
+
+25. I've found a bug that's not mentioned here or in the README or
+ BUGS files. What should I do?
+
+ See section 6 of the README file.
+
+
+26. Your Services program doesn't do XYZ like DALnet (or other) Services.
+ What's wrong?
+
+ Nothing is wrong, except your expectations. Anope is a
+ completely different program from that used on DALnet; they are
+ similar in concept only.
+
+
+27. I've got a great new idea for Services. Do you want it?
+
+ We are always interested in hearing new ideas. HOWEVER, do not
+ expect your proposal to be in the next Anope release for sure.
+ As a rule, we usually don't add anything that can be equivalently
+ done by other means, or that we consider totally useless; see below
+ for examples of things we don't plan to add.
+
+ Our general intent is for Anope to provide as much functionality
+ as possible--while staying as lean as possible. So features which
+ are arguably beneficial will tend to be added, while features of
+ limited or no benefit or which can be equally provided by something
+ else already in use will tend to be passed over.
+
+ If you'd like to give us your idea, you can go to our website at
+ http://www.anope.org/ and add it as a Feature Request on our Bug
+ Tracking System. Or, if unsure, you can discuss it on our online
+ Forum, in the Ideas and Suggestions section.
+
+28. Examples of features we have been asked about and why we won't add (or
+ haven't yet added) them--so don't ask us about them:
+
+ - An option to make ChanServ stay in some/all registered channels:
+ we see absolutely no necessity for this feature, since BotServ
+ already does this anyway.
+
+ - A "current time" field in NickServ and ChanServ INFO displays:
+ Most people have clocks of some sort either on their computer
+ screens or on their walls (or both), and all IRC servers, as well
+ as Services, have a command to return the server's current time.
+ Thus a current-time field in INFO displays would simply take up
+ extra space for no reason.
+
+
+29. How do I add bots to BotServ?
+
+ Read /msg BotServ HELP and /msg BotServ HELP BOT.
+
+30. When I used the OperServ RAW command, Anope and/or my network
+ crashed, or did weird things! Please fix this bug!
+
+ "That's not a bug, it's a feature."
+
+ Have you ever typed /msg OperServ HELP RAW? It's clearly stated
+ there that this command is dangerous and that its use may result
+ in very bad things.
+
+ And that's why this command has been disabled by default. If you
+ enabled and used it, YOU'RE ON YOUR OWN. All help requests will
+ be ignored, even if the problem happens not immediately.
+
+
+31. I would like to have the list of the differents RAW on operserv
+
+ If you have to ask, you should not be messing with RAW :)
+
+
+32. I can't get /OS UMODES and /OS SVSNICK do not work!
+
+ Make sure you the USE_OSSVS is defined on config.h. Since these
+ are very controversial commands, they are turned off by default.
+ Then, make clean ; make ; make install
+
+
+33. What is a Super-Admin? How does it work? Why might it not work?
+
+ Super-Admin's have extra privileges, including being founder on
+ all channels. It must be activated on a per user basis and is
+ only available to Services Admins and Services Roots.
+ It is set using OperServ and is not persistent.
+ It only works if SuperAdmin is uncommented in the services
+ configuration file. This is commented by default.
+ Read /msg OperServ HELP SET SUPERADMIN for further help.
diff --git a/docs/INSTALL b/docs/INSTALL
new file mode 100644
index 000000000..c3a165538
--- /dev/null
+++ b/docs/INSTALL
@@ -0,0 +1,177 @@
+ANOPE INSTALLATION INSTRUCTIONS
+===============================
+
+Table of contents
+-----------------
+ 1. Installing Anope
+ 2. Upgrading Anope
+ 3. Setting up the IRCd
+ 4. Starting Anope
+ 5. Setting up a crontab
+
+You should also read the README and FAQ files!
+
+1. Installing Anope
+-------------------
+
+IMPORTANT NOTE: it is not recommended to use (and therefore install)
+Anope as root. Use an unprivileged user instead -- the one you're
+using for the ircd or a dedicated one will be good enough.
+
+The very first thing you need to do is to get the Anope package
+(if not already done). You can find it at the following place:
+
+ http://www.anope.org/
+
+Next, unpack the package in your home directory, and go into the
+created directory.
+
+Now type ./configure to start the configuration script. It will
+ask you a few questions, and figure out how to compile Anope on
+your system. If you are unsure about the answer to a question,
+use the default value.
+
+NOTE: although you may specify different binary and data paths,
+ it is RECOMMENDED that you use the same value for both.
+
+You can now type make to compile Anope. If there are errors in the
+Makefile, *try to use gmake* instead. If it still doesn't work, you
+(or the system administrator if it's a shell) must install GNU
+make. You may find it at ftp://prep.ai.mit.edu/pub/gnu/.
+
+Now type make install (or gmake install; see above). This will
+install all the needed files in the paths you specified with the
+configure script, and setup file permissions. You should ensure
+that the data directory is not accessible by other users, as malicious
+users may cause troubles on your network if passwords are not
+encrypted, or read the memos of any user.
+
+If you see errors during this process, please mail us with the
+*complete* error output, and don't forget to mention your OS,
+compiler and C library versions.
+
+Now go into the data directory (by default, ~/services). Copy the
+example.conf file to services.conf, and open the latter with your
+favourite text editor. It contains all the configuration
+directives Anope will use at startup. Read the instructions contained
+in the file carefully. Using the default values is NOT a good idea,
+and will most likely not work!
+
+If you need help, you should subscribe to the Anope mailing list and
+mail there to get help from other users. See the README file for more
+information.
+
+
+2. Upgrading Anope
+------------------
+
+If you got a .diff file and want to patch the old Anope sources with it, do
+the following:
+ * Copy the .diff file into the root Anope sources directory.
+ * Type patch -p1 <file.diff
+
+To upgrade Anope, just follow the installation instructions described in
+section 1. There are however a few specific guidelines:
+
+ * IMPORTANT: Back up your old databases!
+ * If you are upgrading to a new major release, ALWAYS restart a
+ fresh configuration file from example.conf.
+
+
+3. Setting up the IRCd
+----------------------
+
+Services acts as an IRC server with pseudo-clients on it. To link
+them to your network, you'll need to add some lines in the ircd.conf
+of their hub server (as stated in the RemoteServer configuration
+directive).
+
+For samples below we'll take Services.LocalHost.Net as the name of
+the Services (as stated in the ServerName configuration directive).
+
+First, the C/N lines, that allow Services to link. They also need a
+Y:line to work correctly.
+
+Y:27:180:0:0:4000000
+C:127.0.0.1:mypass:Services.LocalHost.Net::30
+N:127.0.0.1:mypass:Services.LocalHost.Net::30
+
+mypass is the same password you mentionned in the RemoteServer
+configuration directive. 127.0.0.1 is the IP from which Services
+connect from (linking in localhost is the most efficient way
+to run Services).
+
+Then, you have to set-up an U:line, that will allow Services to
+change channel modes, topics, and much more without being opped
+in the channel.
+
+U:Services.LocalHost.Net:*:*
+
+NOTE: if you have more than one server in your network, this line
+MUST be added on ALL servers, or things won't work.
+
+Finally, you'll need to add an H:line, to make the OperServ JUPE
+command work correctly.
+
+H:*::Services.LocalHost.Net
+
+Don't forget to /rehash to apply changes.
+
+A new trend in ircd configuration is popping all over the place,
+good examples are the latest Hybrid and Unreal, which use a more
+"readable" for of configuration. For those, use something like:
+
+link Services.LocalHost.Net
+{
+ username *;
+ hostname localhost;
+ bind-ip *;
+ port 6667;
+ hub *;
+ password-connect "mypass";
+ password-receive "mypass";
+ class servers;
+};
+
+
+4. Starting Anope
+-----------------
+
+Go into the directory where binaries were installed (by default,
+~/services). Type ./services to launch Anope.
+
+If there are syntax errors in the configuration file they will be
+displayed on the screen. Correct them until there are no errors
+anymore. A successful startup won't generate any message.
+
+Give to Services at least one minute to link to your network, as
+certain IRCds on some OSes may be really slow for the link process.
+If nothing happens then, it is probably a configuration problem.
+Try to launch Anope with ./services -debug -nofork to see any errors
+that it encounters, and try to correct them.
+
+If you need help to solve errors, feel free to subscribe to the
+Anope mailing list and ask there. See the README file for details.
+
+
+5. Setting up a crontab
+-----------------------
+
+A crontab entry will allow you to check periodically whether Anope
+is still running, and restart it if not. You'll need to have
+Anope binaries and data installed in the same directory for this to
+work without modification.
+
+First rename the example.chk script that is in Anope path (by default,
+~/services) to services.chk and edit it. You'll need to modify the
+CONFIGURATION part of the file. Then ensure that the file is marked as
+executable by typing chmod +x services.chk, and try to launch the script
+to see if it works (Anope must not be running when you do this ;).
+
+When this is done, you'll have to add the crontab entry. Type crontab -e.
+This will open the default text editor with the crontab file. Enter the
+following (with correct path):
+*/5 * * * * /home/ircd/services/services.chk >/dev/null 2>&1
+The */5 at the beginning means "check every 5 minutes". You may replace
+the 5 with other another number if you want (but less than 60).
+Save and exit, and it's installed.
diff --git a/docs/MODULES b/docs/MODULES
new file mode 100644
index 000000000..84467cc92
--- /dev/null
+++ b/docs/MODULES
@@ -0,0 +1,110 @@
+Anope Modules
+-------------
+
+Introduction:
+
+ Anope 1.6 onwards supports external modules. External modules are pieces
+ of code that can be attached to a running Anope process dynamically. These
+ modules can serve several purposes, and perform all kind of operations to
+ enhance your network.
+
+Installation:
+
+ 1. You need to configure Anope to be compiled with module support. To
+ do so you must run ./configure and answer "Yes" when asked for
+ Module Support, and selecting a folder where your modules will live
+ in (the default path is safe for most people).
+
+ Notes:
+
+ * Modules are not supported on the following platforms: OpenBSD, Windows.
+ * You might need to run "make distclean" prior to running ./configure
+
+ 2. Compile Anope as usual. The gmake process will now compile module
+ support into Anope, and compile the default sample modules, and/or
+ any other module located on the "modules" folder.
+
+ 3. Install Anope as usual. The install process will place the compiled
+ modules in their runtime location, making them available for loading.
+
+ 4. Start or restart services to make use of the new Anope executable.
+
+Usage:
+
+ All module manipulation commands are done through OperServ. These are:
+
+ MODLOAD Load a module
+ MODUNLOAD Un-Load a module
+ MODLIST List loaded modules
+ MODINFO Info about a loaded module
+
+ These commands available to Service Roots only.
+
+ You can also load (and pre-load) Modules automatically by loading them
+ on startup. To do so, edit your services.conf file and change the values
+ of "ModuleAutoload" and "ModuleDelayedAutoload" to include the modules
+ you want to load every time Anope starts.
+
+Example:
+
+ /msg OperServ modload hs_moo
+ *** Global -- from OperServ: dengel loaded module hs_moo
+ -OperServ- Module hs_moo loaded
+
+ /msg OperServ modinfo hs_moo
+ -OperServ- Module: hs_moo Version: 1.1 Author: Anope loaded: Mar 21 10:54:37 2004 CLT
+ -OperServ- Providing command: /msg HostServ moo
+
+ /msg HostServ moo
+ -HostServ- MOO! - This command was loaded via a module!
+
+ /msg OperServ modunload hs_moo
+ *** Global -- from OperServ: dengel unloaded module hs_moo
+ -OperServ- Module hs_moo unloaded
+
+ /msg HostServ moo
+ -HostServ- Unknown command moo. "/msg HostServ HELP" for help.
+
+ * Note that the name of the module file is "hs_moo.c", yet we load
+ and reference the module as "hs_moo" only. By naming convention
+ modules have an abreviated service name they attach to (hs_ for
+ HostServ, cs_ for ChanServ, etc) followed by a descriptive keyword.
+
+More Modules:
+
+ Anope ships with two sample modules that only ilustrates some of the
+ implemented module capabilities. They don't really do much or anything
+ useful.
+
+ You can download more useful modules from http://www.anope.org/ or from
+ our interim modules development website http://modules.anope.org/. Just
+ grab the module file (usualy with a .c extension). Place the module
+ file on your compile "modules" folder. The same folder that contain both
+ hs_moo.c and catserv.c module files.
+
+ The new modules need to be compiled and installed before you can make
+ use of them:
+
+ 1. Change directories to your compile "modules" folder.
+ 2. Run ./configure
+ 3. Run make
+ 4. Run make install
+
+ You can now use /msg OperServ MODLOAD to load the new modules.
+
+Support:
+
+ The Anope team is not responsible or liable for any unofficial module
+ (i.e. anything other than what was released with the Anope package).
+
+ Use modules at your own risk, and make sure you get them from a
+ reputable source. You might get module support by contacting the module
+ author, posting on our online forum, or maybe on our #anope channel
+ at /server irc.anope.org.
+
+Developers:
+
+ Please take a look at:
+
+ * http://geniusdex.dezeserver.nl/anope
+
diff --git a/docs/MYSQL b/docs/MYSQL
new file mode 100644
index 000000000..088b5c07a
--- /dev/null
+++ b/docs/MYSQL
@@ -0,0 +1,97 @@
+Anope MySQL Support
+-------------------
+
+Introduction:
+
+ Anope 1.6 onwards supports MySQL databases. On Anope 1.6.0 only PHASE 1
+ has been implemented. Since the next phases require major changes in the
+ core, we decided to save it for 2.0. However, having your db's easily
+ accessible on your website is still a great feature.
+
+ PHASE 1:Anope will be able to save all it's databases to MySQL. It will
+ happen in conjuction with the current FFF databases. This first step is
+ nothing more than a MySQL dump of the databases (i.e. read-only), since
+ Anope will not (for now) read from Mysql. (COMPLETED)
+
+ PHASE 2:The next step is load the databases from mysql, being able to
+ replace the FFF completely as an archive method (since all changes to
+ the mysql db would be lost on the next Services save). All, while keeping
+ FFF intact. This is still not the final goal, but it's a milestone.
+
+ PHASE 3:The next step, and most convoluted of all (since we'll need to
+ modify pretty much all the source) is to load/save (SELECT/INSERT) data
+ in realtime. That way the mysql db could be modified externaly (web?).
+ Again, the FFF will be kept intact.
+
+Requirements:
+
+ 1. MySQL server version 3.23.32 or greater
+ 2. MySQL libs and development files (usualy called mysql-dev).
+ 3. A MySQL user account
+ 4. A MySQL database
+
+Installation:
+
+ 1. You need to configure Anope to be compiled with MySQL support. To
+ do so you must run ./configure and answer "Yes" when asked for
+ MySQL Support.
+
+ Notes:
+
+ * MySQL is not supported on the following platforms: Windows.
+ * You might need to run "make distclean" prior to running ./configure
+
+ 2. Compile Anope as usual. The gmake process will now compile MySQL
+ support into Anope.
+
+ 3. Install Anope as usual.
+
+Configuration:
+
+ 1. Run bin/mydbgen to help on the schema creation and adjustments.
+
+ 2. Edit services.conf and add your mysql data to the MySQL configuration
+ block.
+
+ 3. Start or restart services to make use of the new Anope executable.
+
+Security:
+
+ To add a layer of security you have the option of encrypting or encoding
+ all passwords for nicks and chans. Use the "MysqlSecure" directive on your
+ services.conf file to enable it. The availabe storage methods are:
+
+ #MysqlSecure "" or MysqlSecure ""
+
+ Disables security. All passwords will be saved on the MySQL database
+ as clear text, with no encryption or encoding. FASTEST
+
+ MysqlSecure "des"
+
+ Encrypts all passwords using a unix DES encription. This is a one way
+ encryption algorithm. You can only validate it agains another DES
+ encrypted string, using the same "salt" (the first two characters of
+ the encrypted string). FAST
+
+ MysqlSecure "md5"
+
+ Calculates an MD5 128-bit checksum for the password. The value is
+ returned as a 32-digit hex number that may be used as a hash key.
+ SLOW
+
+ MysqlSecure "sha"
+
+ Calculates an SHA 160-bit checksum for the password. The value is
+ returned as a 40-digit hex number. SLOWEST
+
+ MysqlSecure "mykey"
+
+ Encodes the passwords using "mykey" as the encryption password. It
+ produces a binary string and can be decoded using the MySQL builtit
+ function DECODE(crypt_str,mykey). VARIABLE
+
+ Caveat: Keep in mind that this if you use any method other than clear
+ text, services will need to encrypt/encode every single password on
+ every database save. On large networks, it may impact responsiveness
+ during the saves.
+
diff --git a/docs/NEWS b/docs/NEWS
new file mode 100644
index 000000000..f6aabec87
--- /dev/null
+++ b/docs/NEWS
@@ -0,0 +1,92 @@
+Highlighted News in Anope 1.6
+=============================
+ * Fixed various exploits and vulverabilities.
+ * Fixed various language typos and inconsistencies.
+ * Improved ignore system.
+ * Improved ./configure script.
+ * Removed all compile warning fixed.
+ * Converted HelpServ into a proper service.
+ * Added external module support.
+ * Added Defense Condition (DEFCON) System.
+ * Added MySQL support for mirroring databases.
+ * Added multi-server configuration.
+ * Added multi-domain /OS GLOBAL support.
+ * Added combined +oq +oa +ha +va on net-joins.
+ * Added support for ircd changes and upgrades.
+ * Added HostSetters configuration directive.
+ * Added /OS STAFF command.
+ * Added /OS SVSNICK command.
+ * Added /OS CHANKILL command.
+ * Added /MS STAFF command.
+ * Added /NS UPDATE command.
+ * Added /MS SENDALL command.
+ * Added /NS GETMAIL command.
+ * Added /HS DELALL command.
+ * Added /HS LIST command with pattern matching.
+ * New support scripts and tools.
+ * New ircd support, complete list: DreamForge 4.6.7, Bahamut 1.4.27,
+ UnrealIRCd 3.1.1, UltimateIRCd 2.8.2,
+ UltimateIRCd 3.0.0, Hybrid IRCd 7.0
+ ViagraIRCd 1.3.x, PTlink 6.15.0
+ * New Language files, complete list: cat.l, de.l, en_us.l, es.l, fr.l,
+ gr.l, it.l, nl.l, pt.l, ru.l, tr.l
+
+Highlighted News in Anope 1.4
+=============================
+
+After the change from Epona to Anope
+------------------------------------
+ * New Italian Language file
+ * Added support for UltimateIRCd 3.0 and later
+ * Services realtime logging to a channel
+ * SuperAdmin directive for access to "super" commands.
+ * Ban system is now exception aware.
+ * HostServ for hostname masquarading.
+ * Smarter XOP System.
+ * Email verification/handshake upon registration.
+ * Services can now /ignore users.
+ * Smarter memo notification for channels.
+ * Channel can be SUSPENDed instead of FORBIDen.
+
+Before the change from Epona to Anope
+-------------------------------------
+ * HostServ for networks that support them.
+ * UnrealIRCd support has been rewritten, it is now fully
+ working (hopefully) and officially supported again.
+ * Added support for UltimateIRCd 2.8.2 and later.
+ * A multi-threaded proxy detector that can scan Wingates,
+ SOCKS 4/5 and HTTP proxies on ports 3128 and 8080. Don't use
+ it if you have not been authorized to use it by your system
+ administrator!
+ * The ChanServ AOP/SOP/VOP commands, and, on networks that
+ support halfops, the HOP command, have been added. They
+ allow a more user-friendly control of channel privileges.
+ * Use of services IDs that allow an user to be automatically
+ identified after a split (if he was identified before the split)
+ in a secure way. This also saves lots of bandwidth.
+ * Services' default language can now be set in services.conf.
+ * The OperServ RANDOMNEWS command provides an easy way to show
+ network news in a random manner without flooding your users
+ with them (one news per connection).
+ * The BotServ SET PRIVATE option allows services admins to
+ make the bot usable by IRC operators only.
+ * The OperServ SQLINE command allows you to forbid nick masks
+ and even channel masks with the latest Bahamut.
+ * The ChanServ AKICK STICK command allows akicks to be permanently
+ kept on channel.
+ * The ChanServ SET TOPIC command has been renamed to TOPIC, and
+ a new BAN command has been added. They both have their own
+ associated levels.
+ * A SET PEACE command has been added to ChanServ. It prevents
+ users to use pejorative services commands (DEOP, KICK, ...)
+ on users with greater or equal levels.
+
+Networks using Bahamut must upgrade to Bahamut 1.4.27 or later,
+while networks using UnrealIRCd must upgrade to Unreal 3.1.1.
+
+For the full changes, see the Changes file.
+
+For announcements and discussions about Anope, subscribe to the mailing
+list by sending an e-mail to epona-request@epona.org with "subscribe"
+in the body (quotes excluded). You can then post to the mailing list
+by sending an e-mail to epona@epona.org.
diff --git a/docs/README b/docs/README
new file mode 100644
index 000000000..36950b3a0
--- /dev/null
+++ b/docs/README
@@ -0,0 +1,307 @@
+Anope -- a set of IRC services for IRC networks
+===============================================
+
+Anope is 2003-2004 Anope Team <info@anope.org>
+Based on Epona 2000-2002 PegSoft <epona@pegsoft.net>.
+Based on Services 1996-1999 Andrew Church <achurch@dragonfire.net>.
+
+This program is free but copyrighted software; see the file COPYING for
+details.
+
+Information about Anope may be found at http://www.anope.org/
+Information about Epona may be found at http://www.epona.org/
+Information about Services may be found at http://www.ircservices.za.net/
+
+TABLE OF CONTENTS
+-----------------
+ 1. Credits
+ 2. Presentation
+ 3. Installation
+ 4. Command line options
+ 5. Messages translation
+ 6. Contact and mailing list
+
+1. CREDITS
+----------
+
+Anope is based on Lara's Epona version 1.4.14.
+Epona is based on Andy Church's IRC Services version 4.3.3.
+
+The original credits:
+ Mauritz Antunes -- Portuguese translation
+ Jose R. Holzmann, Raul S. Villarreal -- Spanish translation
+ Andrew Kempe <theshadow@shadowfire.org> -- news system
+ <d.duca@eurcom.net> -- Italian translation
+ <mikado@holyfire.com> -- Turkish translation
+ Andrew Kempe <theshadow@shadowfire.org> -- session limiting
+Epona credits:
+ lara <lara@pegsoft.net> -- Main coding
+ CafeiN <oytuny@yahoo.com> -- Turkish translation
+ Sylvain Cresto aka tost <scresto@netsante.fr> -- FreeBSD 5 patch
+ Marcelo Conde Foscarini aka Bras <ircadmin@brmarket.net> -- Portuguese translation
+ Alvaro Toledo aka POLLITO <atoledo@keldon.org> -- Spanish translation
+ chemical <chemical@musicplay.de> -- German translation
+ shine <dh@shinewelt.de> -- German translation
+ Guven Guzelbey aka MeShGuL <guzelbey@cs.utk.edu> -- Turkish translation
+ Jordi Pujol <jordi.pujol@aujac.org> -- Catalan translation
+ Eva Dachs <evadachs@terra.es> -- Catalan translation
+ Toni Perez <toni.perez@aujac.org> -- Catalan translation
+ Sergios Karalis <sergios_k@hotmail.com> -- Greek translation
+ Thomas J. Stensas aka ShadowMaster <shadowmaster@shadow-realm.org> -- Ultimate 3.x support
+Anope credits:
+ Adam Kramer <ribosome@anope.org>
+ Alvaro Toledo <atoledo@keldon.org>
+ Björn Stiddien <keeper@anope.org>
+ Daniel Engel <dane@zero.org>
+ David <dv@diboo.net>
+ David Narayan <jester@phrixus.net>
+ David Robson <rob@anope.org>
+ Daniele Nicolucci <jollino@sogno.net>
+ Florian Schulze <certus@anope.org>
+ JH <jh@irc-chat.net>
+ Joris Vink <joris@anope.org>
+ Lucas Nussbaum <lucas@lucas-nussbaum.net>
+ Thomas Juberg Stensås <ShadowMaster@Shadow-Realm.org>
+ Trystan .S Lee <trystan@anope.org>
+ openglx <openglx@brasnerd.com.br>
+Anope Translations:
+ GeniousDex (nl.l)
+ Oleg Nikolaev aka Isot <isot@complife.ru> (ru.l)
+ Stuff <the.stuff@gmx.de> (de.l)
+ DrStein (es.l)
+
+
+2. PRESENTATION
+---------------
+
+Anope is a set of Services for IRC networks that allows users to
+manage their nicks and channels in a secure and efficient way, and
+administrators to manage their network with powerful tools.
+
+Currently available services are:
+
+ * NickServ, a powerful nickname manager that users can use to
+ protect themselves against nick stealing. Each user has its
+ own nickname group, that allows him to register as many nicks as
+ he needs while still being able to take profit of his privileges
+ and to modify his nick configuration. NickServ also has an optional
+ password retrieval feature.
+
+ * ChanServ, a powerful channel manager that helps users to administer
+ their channels in a totally customizable way. ChanServ has an internal
+ list of privilegied users and banned users that controls accesses
+ on a per-channel basis. It eliminates all takeover problems,
+ because of its powerful op/unban/invite and even mass deop and mass
+ kick functions.
+
+ * MemoServ, an helpful companion that allows sending short messages
+ to offline users, that they can then read when they come online
+ later.
+
+ * BotServ, an original service that allows users to get a permanent,
+ friendly bot on their channels in an easy way. Each bot can be
+ configured to monitor the channels against floods, repetitions,
+ caps writing, swear, and take appropriate actions. It also can
+ handle user-friendly commands (!op,!deop,!voice,!devoice,!kick,...),
+ say a short greet message when an user joins a channel, and even
+ "take over" ChanServ actions such as auto-opping users, saying the
+ entry notice, and so on. This service can be disabled if you
+ want to save some bandwidth.
+
+ * OperServ, the IRCops' and IRC admins' black box, that allows them
+ to manage the list of network bans (also known as AKILL (DALnet) or
+ GLINE (Undernet)), to configure messages displayed to users when
+ they log on, to set modes and to kick users from any channel,
+ to send notices quickly to the entire network, and much more!
+
+ * HostServ, a neat service that allows users to show custom
+ vHosts (virtual hosts) instead of their real IP address; this only
+ works on deamons supporting ip cloaking, such as UnrealIRCd and
+ UltimateIRCd.
+
+ * HelpServ, a skeleton service used to serve help files.
+
+Anope currently works with:
+ - DreamForge 4.6.7
+ - Bahamut 1.4.27 or later
+ - UnrealIRCd 3.1.1 or later (including 3.2)
+ - UltimateIRCd 2.8.2 or later (including 3.0.0)
+ - ViagraIRCd 1.3 or later
+ - Hybrid 7 or later
+ - PTlink 6.15 or later
+
+Anope could also work with some of the deamons derivated by the ones
+listed above.
+
+
+3. INSTALLATION
+---------------
+
+See the INSTALL file.
+
+
+4. COMMAND LINE OPTIONS
+-----------------------
+
+ Normally, Anope can be run simply by invoking the "services"
+executable. Anope will then use the defaults specified in the
+services.conf file, and connect to the specified uplink server.
+Alternatively, any of the following command-line options can be specified
+to change the default values:
+
+ -remote server[:port] Connect to the specified server
+ -local host -or- Connect from the specified address (e.g.
+ [host]:[port] for multihomed servers)
+ -name servername Our server name (e.g. services.some.net)
+ -desc string Description of us (e.g. SomeNet Services)
+ -user username Username for Services' nicks (e.g. services)
+ -host hostname Hostname for Services' nicks (e.g. esper.net)
+ -dir directory Directory containing Services' data files
+ (e.g. /usr/local/lib/services)
+ -log filename Services log filename (e.g. services.log)
+ -update secs How often to update databases (in seconds)
+ -expire secs How often to check for nick/channel
+ expiration (in seconds)
+
+ Additionally, the following command-line options can be used to modify
+the behavior of Anope:
+
+ -debug Enable debugging mode--more info sent to log
+ (give option more times for more info)
+ -readonly Enable read-only mode--no changes to
+ databases allowed, .db files and log
+ not written
+ -skeleton Enable skeleton mode--like read-only mode,
+ but only OperServ is available
+ -nofork Do not fork after startup; log messages will
+ be written to terminal (as well as to
+ the log file if not in read-only mode)
+ -forceload Try to load as much of the databases as
+ possible, even if errors are encountered
+ -noexpire Expiration routines won't be run at all
+ -logchan Startup with logchan enabled
+
+ Upon starting, Anope will parse its command-line parameters, open
+its logfile, then (assuming the -nofork option is not given) detach itself
+and run in the background. If Anope encounters a problem reading the
+database files or cannot connect to its uplink server, it will terminate
+immediately; otherwise, it will run until the connection is terminated (or
+a QUIT, SHUTDOWN, or RESTART command is sent--see OperServ's help). In the
+case of an error, an appropriate error message will be written to the log
+file.
+
+ If Anope is run with the "-readonly" command-line option, it can
+serve as a "backup" to the full version of services. A "full" version of
+services (run without -readonly) will automatically reintroduce its
+pseudo-clients (NickServ, ChanServ, etc.), while a "backup" services will
+not, thus allowing full services to be brought up at any time without
+disrupting the network (and without having to take backup services down
+beforehand).
+
+ If Anope is run with the "-skeleton" command-line option, it will
+not try to load the nickname or channel databases, and will respond with
+"service is inactive" messages to any commands sent to NickServ, ChanServ,
+MemoServ or BotServ. This can be useful as an emergency stopgap measure
+when the main copy of Anope cannot be started.
+
+ The "-debug" option is useful if you find or suspect a problem in
+Anope. Giving it once on the command line will cause all traffic to and
+from services as well as some other debugging information to be recorded in
+the log file; if you send a bug report, PLEASE include an excerpt from the
+log file WITH DEBUGGING ACTIVE--I cannot emphasize enough how important
+this is to tracking down problems. (You can also enable debugging while
+Services is running using OperServ's SET DEBUG command.) If you repeat the
+-debug option more than once, the debugging level will be increased, which
+provides more detailed information but may also slow Anope down
+considerably and make the log file grow dramatically faster (in particular,
+at debug level 4 a message is written to the log for every character
+received from the server). In general, a debug level of 1 is sufficient
+for the coding team to be able to trace a problem, because all network
+traffic is included and we can usually reproduce the problem.
+
+ The "-forceload" option is provided to attempt recovery of data from
+corrupted or truncated databases. Normally, if Anope encounters an
+error writing to a database file, it will attempt to restore the original
+version of the file and report an error to the logfile and through WALLOPS.
+However, if this should fail (which normally should not happen), or if
+Anope is terminated abruptly e.g. by kill -9 or a power failure, then
+one or more of the databases may be corrupt. Normally, this will cause
+Anope to abort the next time you try to run it; however, if you give
+the -forceload option to Anope, it will instead read as much as it can,
+then skip to the next database. For obvious reasons, it's recommended to
+keep backup copies of your databases in case something does happen (since
+Anope will stop at the first error even with -forceload, meaning you
+lose any data after that).
+
+
+5. MESSAGES TRANSLATIONS
+------------------------
+
+Anope has a powerful option in NickServ allowing users to choose what
+language it must use when sending messages to users. Messages
+are stored in language files (located in the lang directory).
+
+Anope is currently provided with eleven languages: Catalan, Dutch, English,
+French, German, Greek, Italian, Portuguese, Russian, Spanish and
+Turkish. If you want to translate Anope messages into another language,
+follow the following instructions:
+
+ * Copy the lang/en_us.l file to a meaningful name (for example, if
+ you would like to translate messages in Spanish, you would
+ rename it to es.l).
+ * Edit the file with your favourite text editor. Carefully read
+ the instructions given at the top of the file, and start
+ translating the whole file. The file is big so make sure you have
+ some coffee available. ;) Try to avoid the use of English words
+ as much as possible. If the new language contains only a few 'special'
+ characters, try and use latin representations of it, if possible.
+ Remember that most clients are only capable of handling the
+ ISO-8859-1 charset. Of course, if you are translating Anope to a
+ language with a totally different charset, such as Russian, feel free
+ to use the one that suites it best (and the one that is in use by
+ most speakers of that language ;).
+ * When this is done, you have two solutions: either patch Services
+ source code so they take in account the new language file (basically,
+ you'll have to modify lang/Makefile, language.c and maybe services.h),
+ or send us the translated file so we can make the patch and
+ include your language in the next Anope release.
+ * Note that there is a language tool on bin/langtool.pl that can aid
+ the verification process on newly created language files. Try to use
+ it before you submit a language file.
+
+When new major releases come out, you'll not have to retranslate the whole
+file; the Changes.lang file will help you to know which messages were
+added, modified or deleted.
+
+If you did a language file translation, and want to let others use it,
+please send it to dev@anope.org (don't forget to mention clearly your
+(nick)name, your e-mail and the language name). You'll of course get full
+credit for it, and will even get future final major releases before anyone
+else to complete the translation!... ;)
+
+
+6. CONTACT
+---------------------------
+
+* For announcements and discussions about Anope, please visit our Portal
+and Forums at http://www.anope.org/ make sure you register yourself and
+your netowrk to get full benefits.
+
+* If you read the documentation carefully, and didn't find the answer
+to your question, feel free to post on the website forums or join our
+irc channel (irc.anope.org #anope). Once you join our Support channel,
+just type "? report" for instructions on how to report a Bug. Be as
+precise as possible when asking a question, because we have no extraordinary
+powers and can't guess things if they aren't provided. The more precise you
+are, the sooner you'll be likely to get an answer.
+
+* If you think you found a bug, add it to the bug tracking system on our
+website (http://www.anope.org) and - again - be as precise as possible. Also
+say whether the bug happens always or under what circumstances, and anything
+that could be useful to track your bug down. If you wrote a patch, send it
+over. :)
+
+* We do *not* support Windows versions of Anope. You must seek support from
+the website you downloaded the Windows port from. Anope Services was never
+meant to run on Windows... it might in the future, but for the time being
+you are on your own. And for Mac fans... Anope runs like a champ on OSX.
diff --git a/encrypt.c b/encrypt.c
new file mode 100644
index 000000000..eaa8cc74c
--- /dev/null
+++ b/encrypt.c
@@ -0,0 +1,434 @@
+/* Include file for high-level encryption routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: encrypt.c,v 1.5 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "encrypt.h"
+
+#ifdef USE_ENCRYPTION
+
+/*************************************************************************/
+
+/******** Code specific to the type of encryption. ********/
+
+#ifdef /********/ ENCRYPT_MD5 /********/
+
+/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+rights reserved.
+
+License to copy and use this software is granted provided that it
+is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+Algorithm" in all material mentioning or referencing this software
+or this function.
+
+License is also granted to make and use derivative works provided
+that such works are identified as "derived from the RSA Data
+Security, Inc. MD5 Message-Digest Algorithm" in all material
+mentioning or referencing the derived work.
+
+RSA Data Security, Inc. makes no representations concerning either
+the merchantability of this software or the suitability of this
+software for any particular purpose. It is provided "as is"
+without express or implied warranty of any kind.
+
+These notices must be retained in any copies of any part of this
+documentation and/or software.
+ */
+
+#include <string.h>
+
+typedef unsigned int UINT4;
+
+/* MD5 context. */
+typedef struct {
+ UINT4 state[4]; /* state (ABCD) */
+ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
+ unsigned char buffer[64]; /* input buffer */
+} MD5_CTX;
+
+/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
+ */
+
+typedef void *POINTER;
+
+/* Constants for MD5Transform routine.
+ */
+#define S11 7
+#define S12 12
+#define S13 17
+#define S14 22
+#define S21 5
+#define S22 9
+#define S23 14
+#define S24 20
+#define S31 4
+#define S32 11
+#define S33 16
+#define S34 23
+#define S41 6
+#define S42 10
+#define S43 15
+#define S44 21
+
+static void MD5Transform(UINT4[4], unsigned char[64]);
+static void Encode(unsigned char *, UINT4 *, unsigned int);
+static void Decode(UINT4 *, unsigned char *, unsigned int);
+
+static unsigned char PADDING[64] = {
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/* F, G, H and I are basic MD5 functions.
+ */
+#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
+#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | (~z)))
+
+/* ROTATE_LEFT rotates x left n bits.
+ */
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
+
+/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
+Rotation is separate from addition to prevent recomputation.
+ */
+#define FF(a, b, c, d, x, s, ac) { \
+ (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define GG(a, b, c, d, x, s, ac) { \
+ (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define HH(a, b, c, d, x, s, ac) { \
+ (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+#define II(a, b, c, d, x, s, ac) { \
+ (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
+ (a) = ROTATE_LEFT ((a), (s)); \
+ (a) += (b); \
+ }
+
+/* MD5 initialization. Begins an MD5 operation, writing a new context.
+ */
+static void MD5Init(context)
+MD5_CTX *context; /* context */
+{
+ context->count[0] = context->count[1] = 0;
+ /* Load magic initialization constants.
+ */
+ context->state[0] = 0x67452301;
+ context->state[1] = 0xefcdab89;
+ context->state[2] = 0x98badcfe;
+ context->state[3] = 0x10325476;
+}
+
+/* MD5 block update operation. Continues an MD5 message-digest
+ operation, processing another message block, and updating the
+ context.
+ */
+static void MD5Update(context, input, inputLen)
+MD5_CTX *context; /* context */
+unsigned char *input; /* input block */
+unsigned int inputLen; /* length of input block */
+{
+ unsigned int i, index, partLen;
+
+ /* Compute number of bytes mod 64 */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
+
+ /* Update number of bits */
+ if ((context->count[0] += ((UINT4) inputLen << 3))
+ < ((UINT4) inputLen << 3))
+ context->count[1]++;
+ context->count[1] += ((UINT4) inputLen >> 29);
+
+ partLen = 64 - index;
+
+ /* Transform as many times as possible.
+ */
+ if (inputLen >= partLen) {
+ memcpy
+ ((POINTER) & context->buffer[index], (POINTER) input, partLen);
+ MD5Transform(context->state, context->buffer);
+
+ for (i = partLen; i + 63 < inputLen; i += 64)
+ MD5Transform(context->state, &input[i]);
+
+ index = 0;
+ } else
+ i = 0;
+
+ /* Buffer remaining input */
+ memcpy
+ ((POINTER) & context->buffer[index], (POINTER) & input[i],
+ inputLen - i);
+}
+
+/* MD5 finalization. Ends an MD5 message-digest operation, writing the
+ the message digest and zeroizing the context.
+ */
+static void MD5Final(digest, context)
+unsigned char digest[16]; /* message digest */
+MD5_CTX *context; /* context */
+{
+ unsigned char bits[8];
+ unsigned int index, padLen;
+
+ /* Save number of bits */
+ Encode(bits, context->count, 8);
+
+ /* Pad out to 56 mod 64.
+ */
+ index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
+ padLen = (index < 56) ? (56 - index) : (120 - index);
+ MD5Update(context, PADDING, padLen);
+
+ /* Append length (before padding) */
+ MD5Update(context, bits, 8);
+ /* Store state in digest */
+ Encode(digest, context->state, 16);
+
+ /* Zeroize sensitive information.
+ */
+ memset((POINTER) context, 0, sizeof(*context));
+}
+
+/* MD5 basic transformation. Transforms state based on block.
+ */
+static void MD5Transform(state, block)
+UINT4 state[4];
+unsigned char block[64];
+{
+ UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+
+ Decode(x, block, 64);
+
+ /* Round 1 */
+ FF(a, b, c, d, x[0], S11, 0xd76aa478); /* 1 */
+ FF(d, a, b, c, x[1], S12, 0xe8c7b756); /* 2 */
+ FF(c, d, a, b, x[2], S13, 0x242070db); /* 3 */
+ FF(b, c, d, a, x[3], S14, 0xc1bdceee); /* 4 */
+ FF(a, b, c, d, x[4], S11, 0xf57c0faf); /* 5 */
+ FF(d, a, b, c, x[5], S12, 0x4787c62a); /* 6 */
+ FF(c, d, a, b, x[6], S13, 0xa8304613); /* 7 */
+ FF(b, c, d, a, x[7], S14, 0xfd469501); /* 8 */
+ FF(a, b, c, d, x[8], S11, 0x698098d8); /* 9 */
+ FF(d, a, b, c, x[9], S12, 0x8b44f7af); /* 10 */
+ FF(c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
+ FF(b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
+ FF(a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
+ FF(d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
+ FF(c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
+ FF(b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
+
+ /* Round 2 */
+ GG(a, b, c, d, x[1], S21, 0xf61e2562); /* 17 */
+ GG(d, a, b, c, x[6], S22, 0xc040b340); /* 18 */
+ GG(c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
+ GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); /* 20 */
+ GG(a, b, c, d, x[5], S21, 0xd62f105d); /* 21 */
+ GG(d, a, b, c, x[10], S22, 0x2441453); /* 22 */
+ GG(c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
+ GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); /* 24 */
+ GG(a, b, c, d, x[9], S21, 0x21e1cde6); /* 25 */
+ GG(d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
+ GG(c, d, a, b, x[3], S23, 0xf4d50d87); /* 27 */
+ GG(b, c, d, a, x[8], S24, 0x455a14ed); /* 28 */
+ GG(a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
+ GG(d, a, b, c, x[2], S22, 0xfcefa3f8); /* 30 */
+ GG(c, d, a, b, x[7], S23, 0x676f02d9); /* 31 */
+ GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
+
+ /* Round 3 */
+ HH(a, b, c, d, x[5], S31, 0xfffa3942); /* 33 */
+ HH(d, a, b, c, x[8], S32, 0x8771f681); /* 34 */
+ HH(c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
+ HH(b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
+ HH(a, b, c, d, x[1], S31, 0xa4beea44); /* 37 */
+ HH(d, a, b, c, x[4], S32, 0x4bdecfa9); /* 38 */
+ HH(c, d, a, b, x[7], S33, 0xf6bb4b60); /* 39 */
+ HH(b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
+ HH(a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
+ HH(d, a, b, c, x[0], S32, 0xeaa127fa); /* 42 */
+ HH(c, d, a, b, x[3], S33, 0xd4ef3085); /* 43 */
+ HH(b, c, d, a, x[6], S34, 0x4881d05); /* 44 */
+ HH(a, b, c, d, x[9], S31, 0xd9d4d039); /* 45 */
+ HH(d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
+ HH(c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
+ HH(b, c, d, a, x[2], S34, 0xc4ac5665); /* 48 */
+
+ /* Round 4 */
+ II(a, b, c, d, x[0], S41, 0xf4292244); /* 49 */
+ II(d, a, b, c, x[7], S42, 0x432aff97); /* 50 */
+ II(c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
+ II(b, c, d, a, x[5], S44, 0xfc93a039); /* 52 */
+ II(a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
+ II(d, a, b, c, x[3], S42, 0x8f0ccc92); /* 54 */
+ II(c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
+ II(b, c, d, a, x[1], S44, 0x85845dd1); /* 56 */
+ II(a, b, c, d, x[8], S41, 0x6fa87e4f); /* 57 */
+ II(d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
+ II(c, d, a, b, x[6], S43, 0xa3014314); /* 59 */
+ II(b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
+ II(a, b, c, d, x[4], S41, 0xf7537e82); /* 61 */
+ II(d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
+ II(c, d, a, b, x[2], S43, 0x2ad7d2bb); /* 63 */
+ II(b, c, d, a, x[9], S44, 0xeb86d391); /* 64 */
+
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+
+ /* Zeroize sensitive information.
+ */
+ memset((POINTER) x, 0, sizeof(x));
+}
+
+/* Encodes input (UINT4) into output (unsigned char). Assumes len is
+ a multiple of 4.
+ */
+static void Encode(output, input, len)
+unsigned char *output;
+UINT4 *input;
+unsigned int len;
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4) {
+ output[j] = (unsigned char) (input[i] & 0xff);
+ output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff);
+ output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff);
+ output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff);
+ }
+}
+
+/* Decodes input (unsigned char) into output (UINT4). Assumes len is
+ a multiple of 4.
+ */
+static void Decode(output, input, len)
+UINT4 *output;
+unsigned char *input;
+unsigned int len;
+{
+ unsigned int i, j;
+
+ for (i = 0, j = 0; j < len; i++, j += 4)
+ output[i] = ((UINT4) input[j]) | (((UINT4) input[j + 1]) << 8) |
+ (((UINT4) input[j + 2]) << 16) | (((UINT4) input[j + 3]) <<
+ 24);
+}
+
+#endif /******** ENCRYPT_MD5 ********/
+
+/*************************************************************************/
+
+/******** Our own high-level routines. ********/
+
+
+#define XTOI(c) ((c)>9 ? (c)-'A'+10 : (c)-'0')
+
+/* Encrypt `src' of length `len' and store the result in `dest'. If the
+ * resulting string would be longer than `size', return -1 and leave `dest'
+ * unchanged; else return 0.
+ */
+int encrypt(const char *src, int len, char *dest, int size)
+{
+
+#ifdef ENCRYPT_MD5
+
+ MD5_CTX context;
+ char digest[33];
+ int i;
+
+ if (size < 16)
+ return -1;
+
+ memset(&context, 0, sizeof(context));
+ memset(&digest, 0, sizeof(digest));
+
+ MD5Init(&context);
+ MD5Update(&context, src, len);
+ MD5Final(digest, &context);
+ for (i = 0; i < 32; i += 2)
+ dest[i / 2] = XTOI(digest[i]) << 4 | XTOI(digest[i + 1]);
+ return 0;
+
+#endif
+
+ return -1; /* unknown encryption algorithm */
+
+}
+
+
+/* Shortcut for encrypting a null-terminated string in place. */
+int encrypt_in_place(char *buf, int size)
+{
+ return encrypt(buf, strlen(buf), buf, size);
+}
+
+
+/* Compare a plaintext string against an encrypted password. Return 1 if
+ * they match, 0 if not, and -1 if something went wrong. */
+
+int check_password(const char *plaintext, const char *password)
+{
+ char buf[BUFSIZE];
+
+ if (encrypt(plaintext, strlen(plaintext), buf, sizeof(buf)) < 0)
+ return -1;
+#ifdef ENCRYPT_MD5
+ if (memcmp(buf, password, 16) == 0)
+#else
+ if (0)
+#endif
+ return 1;
+ else
+ return 0;
+}
+
+/*************************************************************************/
+
+#else /* !USE_ENCRYPTION */
+
+int encrypt(const char *src, int len, char *dest, int size)
+{
+ if (size < len)
+ return -1;
+ memcpy(dest, src, len);
+ return 0;
+}
+
+int encrypt_in_place(char *buf, int size)
+{
+ return 0;
+}
+
+int check_password(const char *plaintext, const char *password)
+{
+ if (strcmp(plaintext, password) == 0)
+ return 1;
+ else
+ return 0;
+}
+
+#endif /* USE_ENCRYPTION */
+
+/*************************************************************************/
diff --git a/encrypt.h b/encrypt.h
new file mode 100644
index 000000000..7f449cf0c
--- /dev/null
+++ b/encrypt.h
@@ -0,0 +1,17 @@
+/* Include file for high-level encryption routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: encrypt.h,v 1.4 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+extern int encrypt(const char *src, int len, char *dest, int size);
+extern int encrypt_in_place(char *buf, int size);
+extern int check_password(const char *plaintext, const char *password);
diff --git a/extern.h b/extern.h
new file mode 100644
index 000000000..6be0c1b16
--- /dev/null
+++ b/extern.h
@@ -0,0 +1,838 @@
+/* Prototypes and external variable declarations.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: extern.h,v 1.65 2004/03/13 13:55:59 dane Exp $
+ *
+ */
+
+#ifndef EXTERN_H
+#define EXTERN_H
+
+#include "slist.h"
+
+#define E extern
+
+
+/**** modules.c ****/
+E void moduleCallBackRun(void);
+
+/**** actions.c ****/
+
+E void change_user_mode(User *u, char *modes, char *arg);
+E void kill_user(const char *source, const char *user, const char *reason);
+E void bad_password(User *u);
+
+/**** botserv.c ****/
+
+E BotInfo *botlists[256];
+
+E void get_botserv_stats(long *nrec, long *memuse);
+
+E void bs_init(void);
+E void botserv(User *u, char *buf);
+E void botmsgs(User *u, BotInfo *bi, char *buf);
+E void botchanmsgs(User *u, ChannelInfo *ci, char *buf);
+E void load_bs_dbase(void);
+E void save_bs_dbase(void);
+E void save_bs_rdb_dbase(void);
+
+E BotInfo *findbot(char *nick);
+E void bot_join(ChannelInfo *ci);
+E void bot_rejoin_all(BotInfo *bi);
+
+/**** channels.c ****/
+
+E Channel *chanlist[1024];
+E CBMode cbmodes[128];
+E CBModeInfo cbmodeinfos[];
+
+E void get_channel_stats(long *nrec, long *memuse);
+E Channel *findchan(const char *chan);
+E Channel *firstchan(void);
+E Channel *nextchan(void);
+
+E void chan_deluser(User *user, Channel *c);
+
+E int is_on_chan(Channel *c, User *u);
+E User *nc_on_chan(Channel *c, NickCore *nc);
+
+E char *chan_get_modes(Channel *chan, int complete, int plus);
+E void chan_set_modes(const char *source, Channel *chan, int ac, char **av, int check);
+
+E int chan_get_user_status(Channel *chan, User *user);
+E int chan_has_user_status(Channel *chan, User *user, int16 status);
+E void chan_remove_user_status(Channel *chan, User *user, int16 status);
+E void chan_set_user_status(Channel *chan, User *user, int16 status);
+
+E int get_access_level(ChannelInfo *ci, NickAlias *na);
+E char *get_xop_level(int level);
+
+E void do_cmode(const char *source, int ac, char **av);
+E void do_join(const char *source, int ac, char **av);
+E void do_kick(const char *source, int ac, char **av);
+E void do_part(const char *source, int ac, char **av);
+E void do_sjoin(const char *source, int ac, char **av);
+E void do_topic(const char *source, int ac, char **av);
+E void do_mass_mode(char *modes);
+#define whosends(ci) ((!(ci) || !((ci)->botflags & BS_SYMBIOSIS) || !(ci)->bi || !(ci)->c || (ci)->c->usercount < BSMinUsers) ? s_ChanServ : (ci)->bi->nick)
+
+/**** chanserv.c ****/
+
+E ChannelInfo *chanlists[256];
+E CSModeUtil csmodeutils[];
+
+E void listchans(int count_only, const char *chan);
+E void get_chanserv_stats(long *nrec, long *memuse);
+
+E void cs_init(void);
+E void chanserv(User *u, char *buf);
+E void load_cs_dbase(void);
+E void save_cs_dbase(void);
+E void save_cs_rdb_dbase(void);
+E void expire_chans(void);
+E void cs_remove_nick(const NickCore *nc);
+E void cs_remove_bot(const BotInfo *bi);
+
+E void check_modes(Channel *c);
+#ifdef IRC_ULTIMATE3
+E int check_valid_admin(User *user, Channel *chan, int servermode);
+#endif
+E int check_valid_op(User *user, Channel *chan, int servermode);
+E int check_should_op(User *user, const char *chan);
+E int check_should_voice(User *user, const char *chan);
+#ifdef HAS_HALFOP
+E int check_should_halfop(User *user, const char *chan);
+#endif
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+E int check_should_owner(User *user, const char *chan);
+E int check_should_protect(User *user, const char *chan);
+#endif
+#ifdef IRC_ULTIMATE3
+E int check_should_protect(User *user, const char *chan);
+#endif
+E int check_kick(User *user, char *chan);
+E void record_topic(const char *chan);
+E void restore_topic(const char *chan);
+E int check_topiclock(Channel *c, time_t topic_time);
+
+E ChannelInfo *cs_findchan(const char *chan);
+E int check_access(User *user, ChannelInfo *ci, int what);
+E int is_founder(User *user, ChannelInfo *ci);
+E int get_access(User *user, ChannelInfo *ci);
+E ChanAccess *get_access_entry(NickCore *nc, ChannelInfo *ci);
+E void update_cs_lastseen(User *user, ChannelInfo *ci);
+E int get_idealban(ChannelInfo *ci, User *u, char *ret, int retlen);
+E AutoKick *is_stuck(ChannelInfo *ci, char *mask);
+E void stick_mask(ChannelInfo *ci, AutoKick *akick);
+E void stick_all(ChannelInfo *ci);
+
+#ifdef HAS_FMODE
+E char *cs_get_flood(ChannelInfo *ci);
+E void cs_set_flood(ChannelInfo *ci, char *value);
+#endif
+E char *cs_get_key(ChannelInfo *ci);
+E void cs_set_key(ChannelInfo *ci, char *value);
+E char *cs_get_limit(ChannelInfo *ci);
+E void cs_set_limit(ChannelInfo *ci, char *value);
+#ifdef HAS_LMODE
+E char *cs_get_redirect(ChannelInfo *ci);
+E void cs_set_redirect(ChannelInfo *ci, char *value);
+#endif
+
+/**** compat.c ****/
+
+#if !HAVE_SNPRINTF
+# if BAD_SNPRINTF
+# define snprintf my_snprintf
+# endif
+# define vsnprintf my_vsnprintf
+E int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
+E int snprintf(char *buf, size_t size, const char *fmt, ...);
+#endif
+#if !HAVE_STRICMP && !HAVE_STRCASECMP
+E int stricmp(const char *s1, const char *s2);
+E int strnicmp(const char *s1, const char *s2, size_t len);
+#endif
+#if !HAVE_STRDUP
+E char *strdup(const char *s);
+#endif
+#if !HAVE_STRSPN
+E size_t strspn(const char *s, const char *accept);
+#endif
+#if !HAVE_STRERROR
+E char *strerror(int errnum);
+#endif
+#if !HAVE_STRSIGNAL
+char *strsignal(int signum);
+#endif
+
+
+/**** config.c ****/
+
+E char *RemoteServer;
+E int RemotePort;
+E char *RemotePassword;
+E char *RemoteServer2;
+E int RemotePort2;
+E char *RemotePassword2;
+E char *RemoteServer3;
+E int RemotePort3;
+E char *RemotePassword3;
+E char *LocalHost;
+E int LocalPort;
+
+E char *ServerName;
+E char *ServerDesc;
+E char *ServiceUser;
+E char *ServiceHost;
+
+E char *HelpChannel;
+E char *LogChannel;
+E char **NetworkDomains;
+E int DomainNumber;
+E char *NetworkName;
+
+E char *s_NickServ;
+E char *s_ChanServ;
+E char *s_MemoServ;
+E char *s_BotServ;
+E char *s_HelpServ;
+E char *s_OperServ;
+E char *s_GlobalNoticer;
+E char *s_IrcIIHelp;
+E char *s_DevNull;
+E char *desc_NickServ;
+E char *desc_ChanServ;
+E char *desc_MemoServ;
+E char *desc_BotServ;
+E char *desc_HelpServ;
+E char *desc_OperServ;
+E char *desc_GlobalNoticer;
+E char *desc_IrcIIHelp;
+E char *desc_DevNull;
+
+E char *HostDBName;
+E char *desc_HostServ;
+E char *s_HostServ;
+E void load_hs_dbase(void);
+E void save_hs_dbase(void);
+E void save_hs_rdb_dbase(void);
+E int do_on_id(User *u);
+E void delHostCore(char *nick);
+E void hostserv(User *u, char *buf);
+
+E char *s_NickServAlias;
+E char *s_ChanServAlias;
+E char *s_MemoServAlias;
+E char *s_BotServAlias;
+E char *s_HelpServAlias;
+E char *s_OperServAlias;
+E char *s_GlobalNoticerAlias;
+E char *s_DevNullAlias;
+E char *s_HostServAlias;
+E char *desc_NickServAlias;
+E char *desc_ChanServAlias;
+E char *desc_MemoServAlias;
+E char *desc_BotServAlias;
+E char *desc_HelpServAlias;
+E char *desc_OperServAlias;
+E char *desc_GlobalNoticerAlias;
+E char *desc_DevNullAlias;
+E char *desc_HostServAlias;
+
+E char *PIDFilename;
+E char *MOTDFilename;
+E char *NickDBName;
+E char *PreNickDBName;
+E char *ChanDBName;
+E char *BotDBName;
+E char *OperDBName;
+E char *AutokillDBName;
+E char *NewsDBName;
+
+E int NoBackupOkay;
+E int StrictPasswords;
+E int BadPassLimit;
+E int BadPassTimeout;
+E int UpdateTimeout;
+E int ExpireTimeout;
+E int ReadTimeout;
+E int WarningTimeout;
+E int TimeoutCheck;
+E int KeepLogs;
+E int KeepBackups;
+E int ForceForbidReason;
+E int UsePrivmsg;
+E int DumpCore;
+E int LogUsers;
+
+E char **HostSetters;
+E int HostNumber;
+
+E int UseMail;
+E char *SendMailPath;
+E char *SendFrom;
+E int RestrictMail;
+E int MailDelay;
+E int DontQuoteAddresses;
+
+E int ProxyDetect;
+E int ProxyThreads;
+E char *ProxyMessage[8];
+E int ProxyCheckWingate;
+E int ProxyCheckSocks4;
+E int ProxyCheckSocks5;
+E int ProxyCheckHTTP1;
+E int ProxyCheckHTTP2;
+E int ProxyCheckHTTP3;
+E int ProxyTimeout;
+E char *ProxyTestServer;
+E int ProxyTestPort;
+E int ProxyExpire;
+E int ProxyCacheExpire;
+E char *ProxyAkillReason;
+E int WallProxy;
+E int ProxyMax;
+
+E int NSDefFlags;
+E int NSDefLanguage;
+E int NSRegDelay;
+E int NSExpire;
+E int NSRExpire;
+E int NSForceEmail;
+E int NSMaxAliases;
+E int NSAccessMax;
+E char *NSEnforcerUser;
+E char *NSEnforcerHost;
+E int NSReleaseTimeout;
+E int NSAllowKillImmed;
+E int NSNoGroupChange;
+E int NSListOpersOnly;
+E int NSListMax;
+E char *NSGuestNickPrefix;
+E int NSSecureAdmins;
+E int NSStrictPrivileges;
+E int NSEmailReg;
+E int NSModeOnID;
+E int NSRestrictGetPass;
+
+E int CSDefFlags;
+E int CSMaxReg;
+E int CSExpire;
+E int CSDefBantype;
+E int CSAccessMax;
+E int CSAutokickMax;
+E char *CSAutokickReason;
+E int CSInhabit;
+E int CSListOpersOnly;
+E int CSListMax;
+E int CSRestrictGetPass;
+E int CSOpersOnly;
+
+E int MSMaxMemos;
+E int MSSendDelay;
+E int MSNotifyAll;
+
+E int BSDefFlags;
+E int BSKeepData;
+E int BSMinUsers;
+E int BSBadWordsMax;
+E int BSSmartJoin;
+E int BSGentleBWReason;
+
+E int HideStatsO;
+E int GlobalOnCycle;
+E int AnonymousGlobal;
+E char *GlobalOnCycleMessage;
+E char *GlobalOnCycleUP;
+E char **ServicesRoots;
+E int RootNumber;
+E int LogMaxUsers;
+E int SuperAdmin;
+E int LogBot;
+E int AutokillExpiry;
+E int ChankillExpiry;
+E int SGLineExpiry;
+E int SQLineExpiry;
+E int SZLineExpiry;
+E int AkillOnAdd;
+E int DisableRaw;
+E int WallOper;
+E int WallBadOS;
+E int WallOSGlobal;
+E int WallOSMode;
+E int WallOSClearmodes;
+E int WallOSKick;
+E int WallOSAkill;
+E int WallOSSGLine;
+E int WallOSSQLine;
+E int WallOSSZLine;
+E int WallOSNoOp;
+E int WallOSJupe;
+E int WallOSRaw;
+E int WallAkillExpire;
+E int WallSGLineExpire;
+E int WallSQLineExpire;
+E int WallSZLineExpire;
+E int WallExceptionExpire;
+E int WallDrop;
+E int WallForbid;
+E int WallGetpass;
+E int WallSetpass;
+E int CheckClones;
+E int CloneMinUsers;
+E int CloneMaxDelay;
+E int CloneWarningDelay;
+E int KillClones;
+E int AddAkiller;
+
+E char **ModulesAutoload;
+E int ModulesNumber;
+E char **ModulesDelayedAutoload;
+E int ModulesDelayedNumber;
+
+
+E int KillClonesAkillExpire;
+
+E int LimitSessions;
+E int DefSessionLimit;
+E int ExceptionExpiry;
+E int MaxSessionKill;
+E int MaxSessionLimit;
+E int SessionAutoKillExpiry;
+E char *ExceptionDBName;
+E char *SessionLimitDetailsLoc;
+E char *SessionLimitExceeded;
+
+#ifdef USE_RDB
+E int rdb_init();
+E int rdb_open();
+E int rdb_close();
+E int rdb_tag_table(char *table);
+E int rdb_tag_table(char *table);
+E int rdb_clear_table(char *table);
+E int rdb_scrub_table(char *table, char *clause);
+E int rdb_direct_query(char *query);
+E int rdb_ns_set_display(char *newnick, char *oldnick);
+E int rdb_cs_set_founder(char *channel, char *founder);
+E int rdb_cs_deluser(char *nick);
+E int rdb_cs_delchan(ChannelInfo * ci);
+E void rdb_save_ns_core(NickCore * nc);
+E void rdb_save_ns_alias(NickAlias * na);
+E void rdb_save_ns_req(NickRequest * nr);
+E void rdb_save_cs_info(ChannelInfo * ci);
+E void rdb_save_bs_core(BotInfo * bi);
+E void rdb_save_bs_rdb_core(BotInfo * bi);
+E void rdb_save_hs_core(HostCore * hc);
+E void rdb_save_os_db(unsigned int maxucnt, unsigned int maxutime,
+ SList * ak, SList * sgl, SList * sql, SList * szl,
+ HostCache * hc);
+E void rdb_save_news(NewsItem * ni);
+E void rdb_save_exceptions(Exception * e);
+#endif
+
+#ifdef USE_MYSQL
+E char *MysqlHost;
+E char *MysqlUser;
+E char *MysqlPass;
+E char *MysqlName;
+E int MysqlPort;
+E char *MysqlSock;
+E char *MysqlSecure;
+E int MysqlRetries;
+E int MysqlRetryGap;
+#endif
+
+E int read_config(int reload);
+
+E int DefConLevel;
+E int DefCon[6];
+E int checkDefCon(int level);
+E void resetDefCon(int level);
+E int DefConSessionLimit;
+E char *DefConTimeOut;
+E char *DefConAKILL;
+E char *DefConChanModes;
+E int GlobalOnDefcon;
+E int GlobalOnDefconMore;
+E char *DefconMessage;
+E char *DefConAkillReason;
+E char *DefConOffMessage;
+
+/**** converter.c ****/
+
+E int convert_ircservices_44(void);
+
+/**** init.c ****/
+
+E void introduce_user(const char *user);
+E int init(int ac, char **av);
+E int servernum;
+
+/**** language.c ****/
+
+E char **langtexts[NUM_LANGS];
+E char *langnames[NUM_LANGS];
+E int langlist[NUM_LANGS];
+
+E void lang_init(void);
+#define getstring(na,index) \
+ (langtexts[((na)&&((NickAlias*)na)->nc&&!(((NickAlias*)na)->status & NS_VERBOTEN)?((NickAlias*)na)->nc->language:NSDefLanguage)][(index)])
+#define getstring2(nc,index) \
+ (langtexts[((nc)?((NickCore*)nc)->language:NSDefLanguage)][(index)])
+E int strftime_lang(char *buf, int size, User *u, int format, struct tm *tm);
+E void syntax_error(const char *service, User *u, const char *command, int msgnum);
+
+
+/**** list.c ****/
+
+E void do_listnicks(int ac, char **av);
+E void do_listchans(int ac, char **av);
+
+
+/**** log.c ****/
+
+E int open_log(void);
+E void close_log(void);
+E void alog(const char *fmt, ...) FORMAT(printf,1,2);
+E void log_perror(const char *fmt, ...) FORMAT(printf,1,2);
+E void fatal(const char *fmt, ...) FORMAT(printf,1,2);
+E void fatal_perror(const char *fmt, ...) FORMAT(printf,1,2);
+
+/**** mail.c ****/
+
+E MailInfo *MailBegin(User *u, NickCore *nc, char *subject, char *service);
+E MailInfo *MailRegBegin(User *u, NickRequest *nr, char *subject, char *service);
+E void MailEnd(MailInfo *mail);
+E void MailReset(User *u, NickCore *nc);
+E int MailValidate(const char *email);
+
+/**** main.c ****/
+
+E const char version_number[];
+E const char version_build[];
+E const char version_protocol[];
+E const char version_flags[];
+
+E char *services_dir;
+E char *log_filename;
+E int debug;
+E int readonly;
+E int logchan;
+E int skeleton;
+E int nofork;
+E int forceload;
+E int noexpire;
+
+#ifdef USE_RDB
+E int do_mysql;
+#endif
+
+E int is44;
+
+E int quitting;
+E int delayed_quit;
+E char *quitmsg;
+E char inbuf[BUFSIZE];
+E int servsock;
+E int save_data;
+E int got_alarm;
+E time_t start_time;
+
+E void save_databases(void);
+
+/**** memory.c ****/
+
+E void *smalloc(long size);
+E void *scalloc(long elsize, long els);
+E void *srealloc(void *oldptr, long newsize);
+E char *sstrdup(const char *s);
+
+
+/**** memoserv.c ****/
+
+E void ms_init(void);
+E void memoserv(User *u, char *buf);
+E void check_memos(User *u);
+
+
+/**** misc.c ****/
+
+E char *strscpy(char *d, const char *s, size_t len);
+E char *stristr(char *s1, char *s2);
+E char *strnrepl(char *s, int32 size, const char *old, const char *new);
+
+E char *merge_args(int argc, char **argv);
+
+E int match_wild(const char *pattern, const char *str);
+E int match_wild_nocase(const char *pattern, const char *str);
+
+E int dotime(const char *s);
+E char *duration(NickAlias *na, char *buf, int bufsize, time_t seconds);
+E char *expire_left(NickAlias *na, char *buf, int len, time_t expires);
+
+typedef int (*range_callback_t)(User *u, int num, va_list args);
+E int process_numlist(const char *numstr, int *count_ret,
+ range_callback_t callback, User *u, ...);
+
+E int isValidHost(const char *host, int type);
+E int isvalidchar(char c);
+
+E char *myStrGetToken(const char *str, const char dilim, int token_number);
+E char *myStrGetOnlyToken(const char *str, const char dilim,
+ int token_number);
+E char *myStrSubString(const char *src, int start, int end);
+E char *myStrGetTokenRemainder(const char *str, const char dilim,
+ int token_number);
+E void doCleanBuffer(char *str);
+
+/**** news.c ****/
+
+E void get_news_stats(long *nrec, long *memuse);
+E void load_news(void);
+E void save_news(void);
+E void save_rdb_news(void);
+E void display_news(User *u, int16 type);
+E int do_logonnews(User *u);
+E int do_opernews(User *u);
+E int do_randomnews(User *u);
+
+
+/**** nickserv.c ****/
+
+E NickAlias *nalists[1024];
+E NickCore *nclists[1024];
+E NickRequest *nrlists[1024];
+
+E void listnicks(int count_only, const char *nick);
+E void get_aliases_stats(long *nrec, long *memuse);
+E void get_core_stats(long *nrec, long *memuse);
+
+E void ns_init(void);
+E void nickserv(User *u, char *buf);
+E void load_ns_dbase(void);
+E void load_ns_req_db(void);
+E void save_ns_dbase(void);
+E void save_ns_req_dbase(void);
+E void save_ns_rdb_dbase(void);
+E void save_ns_req_rdb_dbase(void);
+E int validate_user(User *u);
+E void cancel_user(User *u);
+E int nick_identified(User *u);
+E int nick_recognized(User *u);
+E void expire_nicks(void);
+E void expire_requests(void);
+E int ns_do_register(User * u);
+
+E int delnick(NickAlias *na);
+E NickAlias *findnick(const char *nick);
+E NickCore *findcore(const char *nick);
+E void clean_ns_timeouts(NickAlias *na);
+
+/**** helpserv.c ****/
+E void helpserv(User *u, char *buf);
+E void helpserv_init(void);
+
+/**** hostserv.c ****/
+E void hostserv_init(void);
+
+/**** operserv.c ****/
+
+E SList servadmins;
+E SList servopers;
+
+E void operserv(User *u, char *buf);
+E void os_init(void);
+E void load_os_dbase(void);
+E void save_os_dbase(void);
+E void save_os_rdb_dbase(void);
+
+E void os_remove_nick(NickCore *nc);
+E int is_services_root(User *u);
+E int is_services_admin(User *u);
+E int is_services_oper(User *u);
+E int nick_is_services_admin(NickCore *nc);
+E int nick_is_services_oper(NickCore *nc);
+
+E int add_akill(User *u, char *mask, const char *by, const time_t expires, const char *reason);
+E int check_akill(const char *nick, const char *username, const char *host, const char *vhost, const char *ip);
+E void expire_akills(void);
+E void oper_global(char *nick, char *fmt, ...);
+#ifdef IRC_BAHAMUT
+E int add_sgline(User *u, char *mask, const char *by, const time_t expires, const char *reason);
+E int check_sgline(const char *nick, const char *realname);
+E void expire_sglines(void);
+#endif
+
+E int add_sqline(User *u, char *mask, const char *by, const time_t expires, const char *reason);
+E int check_sqline(const char *nick, int nick_change);
+#ifdef IRC_BAHAMUT
+E int check_chan_sqline(const char *chan);
+#endif
+E void expire_sqlines(void);
+
+#ifdef IRC_BAHAMUT
+E int add_szline(User *u, char *mask, const char *by, const time_t expires, const char *reason);
+E void expire_szlines(void);
+#endif
+
+E void check_clones(User *user);
+
+E void delete_ignore(const char *nick);
+
+/**** process.c ****/
+
+E int allow_ignore;
+E IgnoreData *ignore[];
+
+E void add_ignore(const char *nick, time_t delta);
+E IgnoreData *get_ignore(const char *nick);
+
+E int split_buf(char *buf, char ***argv, int colon_special);
+E void process(void);
+
+/**** protocol.c ****/
+
+E void s_akill(char *user, char *host, char *who, time_t when, time_t expires, char *reason);
+E void s_rakill(char *user, char *host);
+E void s_sgline(char *mask, char *reason);
+E void s_sqline(char *mask, char *reason);
+E void s_svsnoop(char *server, int set);
+E void s_szline(char *mask, char *reason);
+E void s_unsgline(char *mask);
+E void s_unsqline(char *mask);
+E void s_unszline(char *mask);
+
+/**** proxy.c ****/
+
+E HostCache *hcache[1024];
+
+E void get_proxy_stats(long *nrec, long *memuse);
+E void ntoa(struct in_addr addr, char *ipaddr, int len);
+E int proxy_check(char *nick, char *host, uint32 ip);
+E void proxy_expire();
+E int proxy_init(void);
+
+E int do_cache(User *u);
+
+/**** send.c ****/
+
+E void send_cmd(const char *source, const char *fmt, ...)
+ FORMAT(printf,2,3);
+E void vsend_cmd(const char *source, const char *fmt, va_list args)
+ FORMAT(printf,2,0);
+
+E void wallops(const char *source, const char *fmt, ...)
+ FORMAT(printf,2,3);
+
+E void notice(const char *source, const char *dest, const char *fmt, ...)
+ FORMAT(printf,3,4);
+E void notice_user(const char *source, User *u, const char *fmt, ...)
+ FORMAT(printf,3,4);
+
+E void notice_list(const char *source, const char *dest, const char **text);
+E void notice_lang(const char *source, User *dest, int message, ...);
+E void notice_help(const char *source, User *dest, int message, ...);
+
+E void privmsg(const char *source, const char *dest, const char *fmt, ...)
+ FORMAT(printf,3,4);
+
+/**** sessions.c ****/
+
+E void get_session_stats(long *nrec, long *memuse);
+E void get_exception_stats(long *nrec, long *memuse);
+
+E int do_session(User *u);
+E int add_session(const char *nick, const char *host);
+E void del_session(const char *host);
+
+E void load_exceptions(void);
+E void save_exceptions(void);
+E void save_rdb_exceptions(void);
+E int do_exception(User *u);
+E void expire_exceptions(void);
+
+/**** sockutil.c ****/
+
+E int32 total_read, total_written;
+E int32 read_buffer_len(void);
+E int32 write_buffer_len(void);
+
+E int sgetc(int s);
+E char *sgets(char *buf, int len, int s);
+E char *sgets2(char *buf, int len, int s);
+E int sread(int s, char *buf, int len);
+E int sputs(char *str, int s);
+E int sockprintf(int s, char *fmt,...);
+E int conn(const char *host, int port, const char *lhost, int lport);
+E void disconn(int s);
+
+/**** users.c ****/
+
+E User *userlist[1024];
+
+E int32 usercnt, opcnt, maxusercnt;
+E time_t maxusertime;
+
+E void set_umode(User *user, int ac, char **av);
+
+E void get_user_stats(long *nusers, long *memuse);
+E User *finduser(const char *nick);
+E User *firstuser(void);
+E User *nextuser(void);
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA) || defined(IRC_PTLINK)
+E void change_user_host(User *user, const char *host);
+E void change_user_username(User *user, const char *username);
+E void change_user_realname(User *user, const char *realname);
+#endif
+
+E User *do_nick(const char *source, char *nick, char *username, char *host, char *server, char *realname, time_t ts, uint32 svid, ...);
+E void do_umode(const char *source, int ac, char **av);
+E void do_quit(const char *source, int ac, char **av);
+E void do_kill(const char *source, int ac, char **av);
+
+E int is_oper(User *user);
+E int is_protected(User *user);
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA) || defined(IRC_HYBRID)
+E int is_excepted(ChannelInfo *ci, User *user);
+E int is_excepted_mask(ChannelInfo *ci, char *mask);
+#endif
+
+E int match_usermask(const char *mask, User *user);
+E void split_usermask(const char *mask, char **nick, char **user, char **host);
+E char *create_mask(User *u);
+
+#ifdef USE_MYSQL
+/**** mysql.c ****/
+E MYSQL *mysql;
+E MYSQL_RES *mysql_res;
+E MYSQL_FIELD *mysql_fields;
+E MYSQL_ROW mysql_row;
+
+E int db_mysql_init();
+E int db_mysql_open();
+E int db_mysql_close();
+E int db_mysql_query(char *sql);
+E char *db_mysql_quote(char *sql);
+E void db_mysql_save_ns_core(NickCore * nc);
+E void db_mysql_save_ns_alias(NickAlias * na);
+E void db_mysql_save_ns_req(NickRequest * nr);
+E void db_mysql_save_cs_info(ChannelInfo * ci);
+E void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime, SList *ak, SList *sgl, SList *sql, SList *szl, HostCache *hc);
+E void db_mysql_save_news(NewsItem * ni);
+E void db_mysql_save_exceptions(Exception * e);
+E void db_mysql_save_hs_core(HostCore * hc);
+E void db_mysql_save_bs_core(BotInfo * bi);
+#endif
+
+
+#endif /* EXTERN_H */
diff --git a/helpserv.c b/helpserv.c
new file mode 100644
index 000000000..d3f49ca5c
--- /dev/null
+++ b/helpserv.c
@@ -0,0 +1,83 @@
+/* HelpServ functions
+ *
+ * (C) 2003 Anope Team / GeniusDex
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: helpserv.c,v 1.2 2004/01/18 04:33:25 dane Exp $
+ *
+ */
+
+/*************************************************************************/
+#include "services.h"
+#include "pseudo.h"
+
+#define HELP_VERSION 1
+
+void helpserv_init(void);
+static int do_help(User * u);
+void moduleAddHelpServCmds(void);
+
+/*************************************************************************/
+void moduleAddHelpServCmds(void)
+{
+ Command *c;
+ c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1);
+ addCoreCommand(HELPSERV, c);
+}
+
+/*************************************************************************/
+
+/*************************************************************************/
+/* HelpServ initialization. */
+void helpserv_init(void)
+{
+ moduleAddHelpServCmds();
+}
+
+/*************************************************************************/
+/* Main HelpServ routine. */
+void helpserv(User * u, char *buf)
+{
+ char *cmd, *s;
+
+ cmd = strtok(buf, " ");
+
+ if (!cmd) {
+ return;
+ } else if (stricmp(cmd, "\1PING") == 0) {
+ if (!(s = strtok(NULL, "")))
+ s = "\1";
+ notice(s_HelpServ, u->nick, "\1PING %s", s);
+ } else {
+ mod_run_cmd(s_HelpServ, u, HELPSERV, cmd);
+ }
+}
+
+/*************************************************************************/
+/* Display the HelpServ help. */
+/* This core function has been embed in the source for a long time, but */
+/* it moved into it's own file so we now all can enjoy the joy of */
+/* modules for HelpServ. */
+
+static int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_HelpServ, u, HELP_HELP, s_NickServ, s_ChanServ,
+ s_MemoServ);
+ if (s_BotServ)
+ notice_help(s_HelpServ, u, HELP_HELP_BOT, s_BotServ);
+ if (s_HostServ)
+ notice_help(s_HelpServ, u, HELP_HELP_HOST, s_HostServ);
+ moduleDisplayHelp(7, u);
+ } else {
+ mod_help_cmd(s_HelpServ, u, HELPSERV, cmd);
+ }
+ return MOD_CONT;
+}
diff --git a/hostserv.c b/hostserv.c
new file mode 100644
index 000000000..71a29cbc9
--- /dev/null
+++ b/hostserv.c
@@ -0,0 +1,1108 @@
+/* HostServ functions
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: hostserv.c,v 1.53 2004/02/15 22:40:46 dane Exp $
+ *
+ */
+
+/*************************************************************************/
+#include "services.h"
+#include "pseudo.h"
+
+#define HOST_VERSION 3
+#define HASH(nick) ((tolower((nick)[0])&31)<<5 | (tolower((nick)[1])&31))
+
+void load_hs_dbase_v1(dbFILE * f);
+void load_hs_dbase_v2(dbFILE * f);
+void load_hs_dbase_v3(dbFILE * f);
+
+static int guestnum; /* Current guest number */
+HostCore *head = NULL; /* head of the HostCore list */
+HostCore *createHostCorelist(HostCore * next, char *nick, char *vIdent,
+ char *vHost, char *creator, int32 tmp_time);
+HostCore *findHostCore(HostCore * head, char *nick, boolean * found);
+HostCore *insertHostCore(HostCore * head, HostCore * prev, char *nick,
+ char *vIdent, char *vHost, char *creator,
+ int32 tmp_time);
+HostCore *deleteHostCore(HostCore * head, HostCore * prev);
+void delHostCore(char *nick);
+
+static void send_on(char *nick, char *vIdent, char *vhost);
+static void send_off(User * u);
+
+char *getvIdent(char *nick);
+char *getvHost(char *nick);
+
+int is_host_setter(User * u);
+int is_host_remover(User * u);
+
+static int do_help(User * u);
+static int do_set(User * u);
+static int do_on(User * u);
+int do_on_id(User * u);
+static void set_lastmask(User * u);
+static int do_off(User * u);
+static int do_del(User * u);
+static int do_group(User * u);
+static int listOut(User * u);
+int do_hs_sync(NickCore * nc, char *vIdent, char *hostmask, char *creator,
+ time_t time);
+int do_setall(User * u);
+int do_delall(User * u);
+void moduleAddHostServCmds(void);
+/*************************************************************************/
+void moduleAddHostServCmds(void)
+{
+ Command *c;
+ c = createCommand("HELP", do_help, NULL, -1, -1, -1, -1, -1);
+ addCoreCommand(HOSTSERV, c);
+ c = createCommand("SET", do_set, is_host_setter, HOST_HELP_SET, -1, -1,
+ -1, -1);
+ addCoreCommand(HOSTSERV, c);
+ c = createCommand("GROUP", do_group, NULL, HOST_HELP_GROUP, -1, -1, -1,
+ -1);
+ addCoreCommand(HOSTSERV, c);
+ c = createCommand("SETALL", do_setall, is_host_setter,
+ HOST_HELP_SETALL, -1, -1, -1, -1);
+ addCoreCommand(HOSTSERV, c);
+ c = createCommand("DELALL", do_delall, is_host_remover,
+ HOST_HELP_DELALL, -1, -1, -1, -1);
+ addCoreCommand(HOSTSERV, c);
+ c = createCommand("ON", do_on, NULL, HOST_HELP_ON, -1, -1, -1, -1);
+ addCoreCommand(HOSTSERV, c);
+ c = createCommand("OFF", do_off, NULL, HOST_HELP_OFF, -1, -1, -1, -1);
+ addCoreCommand(HOSTSERV, c);
+ c = createCommand("DEL", do_del, is_host_remover, HOST_HELP_DEL, -1,
+ -1, -1, -1);
+ addCoreCommand(HOSTSERV, c);
+ c = createCommand("LIST", listOut, is_services_oper, HOST_HELP_LIST,
+ -1, -1, -1, -1);
+ addCoreCommand(HOSTSERV, c);
+}
+
+/*************************************************************************/
+
+/*************************************************************************/
+/* HostServ initialization. */
+void hostserv_init(void)
+{
+ moduleAddHostServCmds();
+ guestnum = time(NULL);
+ while (guestnum > 9999999)
+ guestnum -= 10000000;
+}
+
+/*************************************************************************/
+/* Main HostServ routine. */
+void hostserv(User * u, char *buf)
+{
+ char *cmd, *s;
+
+ cmd = strtok(buf, " ");
+
+ if (!cmd) {
+ return;
+ } else if (stricmp(cmd, "\1PING") == 0) {
+ if (!(s = strtok(NULL, "")))
+ s = "\1";
+ notice(s_HostServ, u->nick, "\1PING %s", s);
+ } else if (skeleton) {
+ notice_lang(s_HostServ, u, SERVICE_OFFLINE, s_HostServ);
+ } else {
+#ifdef HAS_VHOST
+ mod_run_cmd(s_HostServ, u, HOSTSERV, cmd);
+#else
+ notice_lang(s_HostServ, u, SERVICE_OFFLINE, s_HostServ);
+#endif
+ }
+}
+
+/*************************************************************************/
+/* Start of Linked List routines */
+/*************************************************************************/
+HostCore *createHostCorelist(HostCore * next, char *nick, char *vIdent,
+ char *vHost, char *creator, int32 tmp_time)
+{
+
+ next = malloc(sizeof(HostCore));
+ if (next == NULL) {
+ wallops(s_HostServ,
+ "Unable to allocate memory to create the vHost LL, problems i sense..");
+ } else {
+ next->nick = malloc(sizeof(char) * strlen(nick) + 1);
+ next->vHost = malloc(sizeof(char) * strlen(vHost) + 1);
+ next->creator = malloc(sizeof(char) * strlen(creator) + 1);
+ if (vIdent)
+ next->vIdent = malloc(sizeof(char) * strlen(vIdent) + 1);
+ if ((next->nick == NULL) || (next->vHost == NULL)
+ || (next->creator == NULL)) {
+ wallops(s_HostServ,
+ "Unable to allocate memory to create the vHost LL, problems i sense..");
+ return NULL;
+ }
+ strcpy(next->nick, nick);
+ strcpy(next->vHost, vHost);
+ strcpy(next->creator, creator);
+ if (vIdent) {
+ if ((next->vIdent == NULL)) {
+ wallops(s_HostServ,
+ "Unable to allocate memory to create the vHost LL, problems i sense..");
+ return NULL;
+ }
+ strcpy(next->vIdent, vIdent);
+ } else {
+ next->vIdent = NULL;
+ }
+ next->time = tmp_time;
+ next->next = NULL;
+ return next;
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+/**
+ * Returns either NULL for the head, or the location of the *PREVIOUS*
+ * record, this is where we need to insert etc..
+ *
+ * -rob
+ **/
+HostCore *findHostCore(HostCore * head, char *nick, boolean * found)
+{
+
+ HostCore *previous, *current;
+
+ *found = false;
+ current = head;
+ previous = current;
+
+ while (current != NULL) {
+ if (stricmp(nick, current->nick) == 0) {
+ *found = true;
+ break;
+ } else if (stricmp(nick, current->nick) < 0) {
+ /* we know were not gonna find it now.... */
+ break;
+ } else {
+ previous = current;
+ current = current->next;
+ }
+ }
+ if (current == head) {
+ return NULL;
+ } else {
+ return previous;
+ }
+}
+
+/*************************************************************************/
+HostCore *insertHostCore(HostCore * head, HostCore * prev, char *nick,
+ char *vIdent, char *vHost, char *creator,
+ int32 tmp_time)
+{
+
+ HostCore *newCore, *tmp;
+
+ newCore = malloc(sizeof(HostCore));
+ if (newCore == NULL) {
+ wallops(s_HostServ,
+ "Unable to allocate memory to insert into the vHost LL, problems i sense..");
+ return NULL;
+ } else {
+ newCore->nick = malloc(sizeof(char) * strlen(nick) + 1);
+ newCore->vHost = malloc(sizeof(char) * strlen(vHost) + 1);
+ newCore->creator = malloc(sizeof(char) * strlen(creator) + 1);
+ if (vIdent)
+ newCore->vIdent = malloc(sizeof(char) * strlen(vIdent) + 1);
+ if ((newCore->nick == NULL) || (newCore->vHost == NULL)
+ || (newCore->creator == NULL)) {
+ wallops(s_HostServ,
+ "Unable to allocate memory to create the vHost LL, problems i sense..");
+ return NULL;
+ }
+ strcpy(newCore->nick, nick);
+ strcpy(newCore->vHost, vHost);
+ strcpy(newCore->creator, creator);
+ if (vIdent) {
+ if ((newCore->vIdent == NULL)) {
+ wallops(s_HostServ,
+ "Unable to allocate memory to create the vHost LL, problems i sense..");
+ return NULL;
+ }
+ strcpy(newCore->vIdent, vIdent);
+ } else {
+ newCore->vIdent = NULL;
+ }
+ newCore->time = tmp_time;
+ if (prev == NULL) {
+ tmp = head;
+ head = newCore;
+ newCore->next = tmp;
+ } else {
+ tmp = prev->next;
+ prev->next = newCore;
+ newCore->next = tmp;
+ }
+ }
+ return head;
+}
+
+/*************************************************************************/
+HostCore *deleteHostCore(HostCore * head, HostCore * prev)
+{
+
+ HostCore *tmp;
+
+ if (prev == NULL) {
+ tmp = head;
+ head = head->next;
+ } else {
+ tmp = prev->next;
+ prev->next = tmp->next;
+ }
+ free(tmp->vHost);
+ free(tmp->nick);
+ free(tmp->creator);
+ if (tmp->vIdent) {
+ free(tmp->vIdent);
+ }
+ free(tmp);
+ return head;
+}
+
+/*************************************************************************/
+void addHostCore(char *nick, char *vIdent, char *vhost, char *creator,
+ int32 tmp_time)
+{
+ HostCore *tmp;
+ boolean found = false;
+
+ if (head == NULL) {
+ head =
+ createHostCorelist(head, nick, vIdent, vhost, creator,
+ tmp_time);
+ } else {
+ tmp = findHostCore(head, nick, &found);
+ if (!found) {
+ head =
+ insertHostCore(head, tmp, nick, vIdent, vhost, creator,
+ tmp_time);
+ } else {
+ head = deleteHostCore(head, tmp); /* delete the old entry */
+ addHostCore(nick, vIdent, vhost, creator, tmp_time); /* recursive call to add new entry */
+ }
+ }
+}
+
+/*************************************************************************/
+char *getvHost(char *nick)
+{
+ HostCore *tmp;
+ boolean found = false;
+ tmp = findHostCore(head, nick, &found);
+ if (found) {
+ if (tmp == NULL)
+ return head->vHost;
+ else
+ return tmp->next->vHost;
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+char *getvIdent(char *nick)
+{
+ HostCore *tmp;
+ boolean found = false;
+ tmp = findHostCore(head, nick, &found);
+ if (found) {
+ if (tmp == NULL)
+ return head->vIdent;
+ else
+ return tmp->next->vIdent;
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+int listOut(User * u)
+{
+ char *key = strtok(NULL, "");
+ struct tm *tm;
+ char buf[BUFSIZE];
+ int counter = 1;
+ int from = 0, to = 0;
+ char *tmp = NULL;
+ char *s = NULL;
+ int display_counter = 0;
+
+ HostCore *current;
+
+ current = head;
+ if (current == NULL)
+ notice_lang(s_HostServ, u, HOST_EMPTY);
+ else {
+ /**
+ * Do a check for a range here, then in the next loop
+ * we'll only display what has been requested..
+ **/
+ if (key) {
+ if (key[0] == '#') {
+ tmp = myStrGetOnlyToken((key + 1), '-', 0); /* Read FROM out */
+ if (!tmp) {
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ return MOD_CONT;
+ }
+ }
+ from = atoi(tmp);
+ tmp = myStrGetTokenRemainder(key, '-', 1); /* Read TO out */
+ if (!tmp) {
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ return MOD_CONT;
+ }
+ }
+ to = atoi(tmp);
+ key = NULL;
+ }
+ }
+
+ while (current != NULL) {
+ if (key) {
+ if (((match_wild_nocase(key, current->nick))
+ || (match_wild_nocase(key, current->vHost)))
+ && (display_counter < NSListMax)) {
+ display_counter++;
+ tm = localtime(&current->time);
+ strftime(buf, sizeof(buf),
+ getstring(NULL,
+ STRFTIME_DATE_TIME_FORMAT), tm);
+ if (current->vIdent) {
+ notice_lang(s_HostServ, u, HOST_IDENT_ENTRY,
+ counter, current->nick,
+ current->vIdent, current->vHost,
+ current->creator, buf);
+ } else {
+ notice_lang(s_HostServ, u, HOST_ENTRY, counter,
+ current->nick, current->vHost,
+ current->creator, buf);
+ }
+ }
+ } else {
+ /**
+ * List the host if its in the display range, and not more
+ * than NSListMax records have been displayed...
+ **/
+ if ((((counter >= from) && (counter <= to))
+ || ((from == 0) && (to == 0)))
+ && (display_counter < NSListMax)) {
+ display_counter++;
+ tm = localtime(&current->time);
+ strftime(buf, sizeof(buf),
+ getstring(NULL, STRFTIME_DATE_TIME_FORMAT),
+ tm);
+ if (current->vIdent) {
+ notice_lang(s_HostServ, u, HOST_IDENT_ENTRY,
+ counter, current->nick,
+ current->vIdent, current->vHost,
+ current->creator, buf);
+ } else {
+ notice_lang(s_HostServ, u, HOST_ENTRY, counter,
+ current->nick, current->vHost,
+ current->creator, buf);
+ }
+ }
+ }
+ counter++;
+ current = current->next;
+ }
+ if (key) {
+ notice_lang(s_HostServ, u, HOST_LIST_KEY_FOOTER, key,
+ display_counter);
+ } else {
+ if (from != 0) {
+ notice_lang(s_HostServ, u, HOST_LIST_RANGE_FOOTER, from,
+ to);
+ } else {
+ notice_lang(s_HostServ, u, HOST_LIST_FOOTER,
+ display_counter);
+ }
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+void delHostCore(char *nick)
+{
+#ifdef USE_RDB
+ static char clause[128];
+#endif
+ HostCore *tmp;
+ boolean found = false;
+ tmp = findHostCore(head, nick, &found);
+ if (found) {
+ head = deleteHostCore(head, tmp);
+
+#ifdef USE_RDB
+ /* Reflect this change in the database right away. */
+ if (rdb_open()) {
+
+ snprintf(clause, sizeof(clause), "nick='%s'", nick);
+ rdb_scrub_table("anope_hs_core", clause);
+ rdb_close();
+ }
+#endif
+
+ }
+
+}
+
+/*************************************************************************/
+/* End of Linked List routines */
+/*************************************************************************/
+/*************************************************************************/
+/* Start of Load/Save routines */
+/*************************************************************************/
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ if (!forceload) \
+ fatal("Read error on %s", HostDBName); \
+ failed = 1; \
+ break; \
+ } \
+} while (0)
+
+void load_hs_dbase(void)
+{
+ dbFILE *f;
+ int ver;
+
+ if (!(f = open_db(s_HostServ, HostDBName, "r", HOST_VERSION))) {
+ return;
+ }
+ ver = get_file_version(f);
+
+ if (ver == 1) {
+ load_hs_dbase_v1(f);
+ } else if (ver == 2) {
+ load_hs_dbase_v2(f);
+ } else if (ver == 3) {
+ load_hs_dbase_v3(f);
+ }
+ close_db(f);
+}
+
+void load_hs_dbase_v1(dbFILE * f)
+{
+ int c;
+ int failed = 0;
+ int32 tmp;
+
+ char *nick;
+ char *vHost;
+
+ tmp = time(NULL);
+
+ alog("Attempting to load V1 HS Database");
+ while (!failed && (c = getc_db(f)) == 1) {
+
+ if (c == 1) {
+ SAFE(read_string(&nick, f));
+ SAFE(read_string(&vHost, f));
+ addHostCore(nick, NULL, vHost, "Unknown", tmp); /* could get a speed increase by not searching the list */
+ free(nick); /* as we know the db is in alphabetical order... */
+ free(vHost);
+ } else {
+ fatal("Invalid format in %s %d", HostDBName, c);
+ }
+ }
+}
+
+void load_hs_dbase_v2(dbFILE * f)
+{
+ int c;
+ int failed = 0;
+
+ char *nick;
+ char *vHost;
+ char *creator;
+ int32 time;
+
+ alog("Attempting to load V2 HS Database");
+ while (!failed && (c = getc_db(f)) == 1) {
+
+ if (c == 1) {
+ SAFE(read_string(&nick, f));
+ SAFE(read_string(&vHost, f));
+ SAFE(read_string(&creator, f));
+ SAFE(read_int32(&time, f));
+ addHostCore(nick, NULL, vHost, creator, time); /* could get a speed increase by not searching the list */
+ free(nick); /* as we know the db is in alphabetical order... */
+ free(vHost);
+ free(creator);
+ } else {
+ fatal("Invalid format in %s %d", HostDBName, c);
+ }
+ }
+}
+
+void load_hs_dbase_v3(dbFILE * f)
+{
+ int c;
+ int failed = 0;
+
+ char *nick;
+ char *vHost;
+ char *creator;
+ char *vIdent;
+ int32 time;
+
+ alog("Attempting to load V3 HS Database");
+ while (!failed && (c = getc_db(f)) == 1) {
+ if (c == 1) {
+ SAFE(read_string(&nick, f));
+ SAFE(read_string(&vIdent, f));
+ SAFE(read_string(&vHost, f));
+ SAFE(read_string(&creator, f));
+ SAFE(read_int32(&time, f));
+ addHostCore(nick, vIdent, vHost, creator, time); /* could get a speed increase by not searching the list */
+ free(nick); /* as we know the db is in alphabetical order... */
+ free(vHost);
+ free(creator);
+ free(vIdent);
+ } else {
+ fatal("Invalid format in %s %d", HostDBName, c);
+ }
+ }
+}
+
+#undef SAFE
+/*************************************************************************/
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ restore_db(f); \
+ log_perror("Write error on %s", HostDBName); \
+ if (time(NULL) - lastwarn > WarningTimeout) { \
+ wallops(NULL, "Write error on %s: %s", HostDBName, \
+ strerror(errno)); \
+ lastwarn = time(NULL); \
+ } \
+ return; \
+ } \
+} while (0)
+
+void save_hs_dbase(void)
+{
+ dbFILE *f;
+ static time_t lastwarn = 0;
+ HostCore *current;
+
+ if (!(f = open_db(s_HostServ, HostDBName, "w", HOST_VERSION)))
+ return;
+
+ current = head;
+ while (current != NULL) {
+ SAFE(write_int8(1, f));
+ SAFE(write_string(current->nick, f));
+ SAFE(write_string(current->vIdent, f));
+ SAFE(write_string(current->vHost, f));
+ SAFE(write_string(current->creator, f));
+ SAFE(write_int32(current->time, f));
+ current = current->next;
+ }
+ SAFE(write_int8(0, f));
+ close_db(f);
+
+}
+
+#undef SAFE
+
+void save_hs_rdb_dbase(void)
+{
+#ifdef USE_RDB
+ HostCore *current;
+
+ if (!rdb_open())
+ return;
+
+ rdb_clear_table("anope_hs_core");
+
+ current = head;
+ while (current != NULL) {
+ rdb_save_hs_core(current);
+ current = current->next;
+ }
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+/* End of Load/Save Functions */
+/*************************************************************************/
+/*************************************************************************/
+/* Start of Generic Functions */
+/*************************************************************************/
+int do_setall(User * u)
+{
+
+ char *nick = strtok(NULL, " ");
+ char *rawhostmask = strtok(NULL, " ");
+ char *hostmask = smalloc(HOSTMAX);
+
+ NickAlias *na;
+ int32 tmp_time;
+ char *s;
+
+ char *vIdent = NULL;
+
+ if (!nick || !rawhostmask) {
+ notice_lang(s_HostServ, u, HOST_SETALL_SYNTAX, s_HostServ);
+ return MOD_CONT;
+ }
+
+ vIdent = myStrGetOnlyToken(rawhostmask, '@', 0); /* Get the first substring, @ as delimiter */
+ if (vIdent) {
+ rawhostmask = myStrGetTokenRemainder(rawhostmask, '@', 1); /* get the remaining string */
+ if (!rawhostmask) {
+ notice_lang(s_HostServ, u, HOST_SETALL_SYNTAX, s_HostServ);
+ return MOD_CONT;
+ }
+ if (strlen(vIdent) > USERMAX - 1) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX);
+ return MOD_CONT;
+ } else {
+ for (s = vIdent; *s; s++) {
+ if (!isvalidchar(*s)) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR);
+ return MOD_CONT;
+ }
+ }
+ }
+#ifndef HAS_VIDENT
+ notice_lang(s_HostServ, u, HOST_NO_VIDENT);
+ return MOD_CONT;
+#endif
+ }
+
+ if (strlen(rawhostmask) < HOSTMAX - 1)
+ snprintf(hostmask, HOSTMAX - 1, "%s", rawhostmask);
+ else {
+ notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX);
+ return MOD_CONT;
+ }
+
+ if (!isValidHost(hostmask, 3)) {
+ notice_lang(s_HostServ, u, HOST_SET_ERROR);
+ return MOD_CONT;
+ }
+
+ tmp_time = time(NULL);
+
+ if ((na = findnick(nick))) {
+ alog("vHost for all nicks in group \002%s\002 set to \002%s\002 by oper \002%s\002", nick, hostmask, u->nick);
+ do_hs_sync(na->nc, vIdent, hostmask, u->nick, tmp_time);
+ if (vIdent) {
+ notice_lang(s_HostServ, u, HOST_IDENT_SETALL, nick, vIdent,
+ hostmask);
+ } else {
+ notice_lang(s_HostServ, u, HOST_SETALL, nick, hostmask);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOREG, nick);
+ }
+
+ free(hostmask);
+ return MOD_CONT;
+}
+
+int do_delall(User * u)
+{
+ int i;
+ char *nick = strtok(NULL, " ");
+ NickAlias *na;
+ NickCore *nc;
+ if (!nick) {
+ notice_lang(s_HostServ, u, HOST_DELALL_SYNTAX, s_HostServ);
+ return MOD_CONT;
+ }
+ if ((na = findnick(nick))) {
+ nc = na->nc;
+ for (i = 0; i < nc->aliases.count; i++) {
+ na = nc->aliases.list[i];
+ delHostCore(na->nick);
+ }
+ alog("vHosts for all nicks in group \002%s\002 deleted by oper \002%s\002", nc->display, u->nick);
+ notice_lang(s_HostServ, u, HOST_DELALL, nc->display);
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOREG, nick);
+ }
+ return MOD_CONT;
+}
+
+int do_hs_sync(NickCore * nc, char *vIdent, char *hostmask, char *creator,
+ time_t time)
+{
+ int i;
+ NickAlias *na;
+
+ for (i = 0; i < nc->aliases.count; i++) {
+ na = nc->aliases.list[i];
+ addHostCore(na->nick, vIdent, hostmask, creator, time);
+ }
+ return MOD_CONT;
+}
+
+static int do_group(User * u)
+{
+ NickAlias *na;
+ HostCore *tmp;
+ char *vHost = NULL;
+ char *vIdent = NULL;
+ char *creator = NULL;
+ time_t time;
+ boolean found = false;
+
+ if ((na = findnick(u->nick))) {
+ if (na->status & NS_IDENTIFIED) {
+ tmp = findHostCore(head, u->nick, &found);
+ if (found) {
+ if (tmp == NULL) {
+ tmp = head; /* incase first in list */
+ } else if (tmp->next) { /* we dont want the previous entry were not inserting! */
+ tmp = tmp->next; /* jump to the next */
+ }
+
+ vHost = sstrdup(tmp->vHost);
+ if (tmp->vIdent)
+ vIdent = sstrdup(tmp->vIdent);
+ creator = sstrdup(tmp->creator);
+ time = tmp->time;
+
+ do_hs_sync(na->nc, vIdent, vHost, creator, time);
+ if (tmp->vIdent) {
+ notice_lang(s_HostServ, u, HOST_IDENT_GROUP,
+ na->nc->display, vIdent, vHost);
+ } else {
+ notice_lang(s_HostServ, u, HOST_GROUP, na->nc->display,
+ vHost);
+ }
+ free(vHost);
+ if (vIdent)
+ free(vIdent);
+ free(creator);
+
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOT_ASSIGNED);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_ID);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOT_REGED);
+ }
+ return MOD_CONT;
+}
+
+static int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_HostServ, u, HOST_HELP, s_HostServ);
+ if ((is_services_oper(u)) || (is_host_setter(u)))
+ notice_help(s_HostServ, u, HOST_OPER_HELP);
+ if (is_services_admin(u))
+ notice_help(s_HostServ, u, HOST_ADMIN_HELP);
+ moduleDisplayHelp(6, u);
+ } else {
+ mod_help_cmd(s_HostServ, u, HOSTSERV, cmd);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+int do_set(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *rawhostmask = strtok(NULL, " ");
+ char *hostmask = smalloc(HOSTMAX);
+
+ NickAlias *na;
+ int32 tmp_time;
+ char *s;
+
+ char *vIdent = NULL;
+
+ if (!nick || !rawhostmask) {
+ notice_lang(s_HostServ, u, HOST_SET_SYNTAX, s_HostServ);
+ return MOD_CONT;
+ }
+
+ vIdent = myStrGetOnlyToken(rawhostmask, '@', 0); /* Get the first substring, @ as delimiter */
+ if (vIdent) {
+ rawhostmask = myStrGetTokenRemainder(rawhostmask, '@', 1); /* get the remaining string */
+ if (!rawhostmask) {
+ notice_lang(s_HostServ, u, HOST_SET_SYNTAX, s_HostServ);
+ return MOD_CONT;
+ }
+ if (strlen(vIdent) > USERMAX - 1) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENTTOOLONG, USERMAX);
+ return MOD_CONT;
+ } else {
+ for (s = vIdent; *s; s++) {
+ if (!isvalidchar(*s)) {
+ notice_lang(s_HostServ, u, HOST_SET_IDENT_ERROR);
+ return MOD_CONT;
+ }
+ }
+ }
+#ifndef HAS_VIDENT
+ notice_lang(s_HostServ, u, HOST_NO_VIDENT);
+ return MOD_CONT;
+#endif
+ }
+ if (strlen(rawhostmask) < HOSTMAX - 1)
+ snprintf(hostmask, HOSTMAX - 1, "%s", rawhostmask);
+ else {
+ notice_lang(s_HostServ, u, HOST_SET_TOOLONG, HOSTMAX);
+ return MOD_CONT;
+ }
+
+ if (!isValidHost(hostmask, 3)) {
+ notice_lang(s_HostServ, u, HOST_SET_ERROR);
+ return MOD_CONT;
+ }
+
+
+ tmp_time = time(NULL);
+
+ if ((na = findnick(nick))) {
+ alog("vHost for user \002%s\002 set to \002%s\002 by oper \002%s\002", nick, hostmask, u->nick);
+ addHostCore(nick, vIdent, hostmask, u->nick, tmp_time);
+ if (vIdent) {
+ notice_lang(s_HostServ, u, HOST_IDENT_SET, nick, vIdent,
+ hostmask);
+ } else {
+ notice_lang(s_HostServ, u, HOST_SET, nick, hostmask);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOREG, nick);
+ }
+ free(hostmask);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+int do_on(User * u)
+{
+ NickAlias *na;
+ char *vHost;
+ char *vIdent = NULL;
+ if ((na = findnick(u->nick))) {
+ if (na->status & NS_IDENTIFIED) {
+ vHost = getvHost(u->nick);
+ vIdent = getvIdent(u->nick);
+ if (vHost == NULL) {
+ notice_lang(s_HostServ, u, HOST_NOT_ASSIGNED);
+ } else {
+ if (vIdent) {
+ notice_lang(s_HostServ, u, HOST_IDENT_ACTIVATED,
+ vIdent, vHost);
+ } else {
+ notice_lang(s_HostServ, u, HOST_ACTIVATED, vHost);
+ }
+ send_on(u->nick, vIdent, vHost);
+#ifdef HAS_VHOST
+ u->vhost = sstrdup(vHost);
+#endif
+#ifdef HAS_VIDENT
+ if (vIdent)
+ u->vident = sstrdup(vIdent);
+#endif
+ set_lastmask(u);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_ID);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOT_REGED);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+int do_on_id(User * u)
+{ /* we've assumed that the user exists etc.. */
+ char *vHost; /* as were only gonna call this from nsid routine */
+ char *vIdent;
+ vHost = getvHost(u->nick);
+ vIdent = getvIdent(u->nick);
+ if (vHost != NULL) {
+ if (vIdent) {
+ notice_lang(s_HostServ, u, HOST_IDENT_ACTIVATED, vIdent,
+ vHost);
+ } else {
+ notice_lang(s_HostServ, u, HOST_ACTIVATED, vHost);
+ }
+ send_on(u->nick, vIdent, vHost);
+#ifdef HAS_VHOST
+ u->vhost = sstrdup(vHost);
+#endif
+#ifdef HAS_VIDENT
+ if (vIdent)
+ u->vident = sstrdup(vIdent);
+#endif
+ set_lastmask(u);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+int do_del(User * u)
+{
+ NickAlias *na;
+ char *nick = strtok(NULL, " ");
+ if (nick) {
+ if ((na = findnick(nick))) {
+ alog("vHost for user \002%s\002 deleted by oper \002%s\002",
+ nick, u->nick);
+ delHostCore(nick);
+ notice_lang(s_HostServ, u, HOST_DEL, nick);
+ } else {
+ notice_lang(s_HostServ, u, HOST_NOREG, nick);
+ }
+ } else {
+ notice_lang(s_HostServ, u, HOST_DEL_SYNTAX, s_HostServ);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+int do_off(User * u)
+{
+ /* put any generic code here... :) */
+ send_off(u);
+ return MOD_CONT;
+}
+
+int is_host_setter(User * u)
+{
+ int i, j;
+ NickAlias *na;
+
+ if (is_services_oper(u)) {
+ return 1;
+ }
+ if (!nick_identified(u)) {
+ return 0;
+ }
+
+ /* Look through all user's aliases (0000412) */
+ for (i = 0; i < u->na->nc->aliases.count; i++) {
+ na = u->na->nc->aliases.list[i];
+ for (j = 0; j < HostNumber; j++) {
+ if (stricmp(HostSetters[j], na->nick) == 0) {
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int is_host_remover(User * u)
+{
+ return is_host_setter(u); /* only here incase we want to split them up later */
+}
+
+/*
+ * Sets the last_usermak properly. Using virtual ident and/or host
+ */
+void set_lastmask(User * u)
+{
+ if (u->na->last_usermask)
+ free(u->na->last_usermask);
+
+ u->na->last_usermask =
+ smalloc(strlen(GetIdent(u)) + strlen(GetHost(u)) + 2);
+ sprintf(u->na->last_usermask, "%s@%s", GetIdent(u), GetHost(u));
+
+}
+
+/*************************************************************************/
+/* End of Generic Functions */
+/*************************************************************************/
+/*************************************************************************/
+/* Start of Server Functions */
+/*************************************************************************/
+void send_on(char *nick, char *vIdent, char *vhost)
+{
+#ifdef IRC_UNREAL
+ if (vIdent) {
+ send_cmd(ServerName, "CHGIDENT %s %s", nick, vIdent);
+ }
+ send_cmd(ServerName, "CHGHOST %s %s", nick, vhost);
+#endif
+#ifdef IRC_VIAGRA
+ if (vIdent) {
+ send_cmd(NULL, "CHGIDENT %s %s", nick, vIdent);
+ }
+ send_cmd(NULL, "SVSMODE %s +x", nick);
+ send_cmd(NULL, "SVSCHGHOST %s %s", nick, vhost);
+#endif
+#ifdef IRC_ULTIMATE
+ if (vIdent) {
+ send_cmd(ServerName, "CHGIDENT %s %s", nick, vIdent);
+ }
+ send_cmd(s_HostServ, "SVSMODE %s +x", nick);
+ send_cmd(ServerName, "CHGHOST %s %s", nick, vhost);
+#endif
+#ifdef IRC_ULTIMATE3
+ send_cmd(s_HostServ, "SVSMODE %s +x", nick);
+ send_cmd(ServerName, "SETHOST %s %s", nick, vhost);
+#endif
+
+
+}
+
+/*************************************************************************/
+void send_off(User * u)
+{
+#ifdef IRC_UNREAL
+ send_cmd(s_HostServ, "SVSMODE %s -xt", u->nick);
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick);
+ /*
+ * tell them to type /mode nick +x to get their original
+ * host cloaking back
+ */
+#endif
+#ifdef IRC_VIAGRA
+ send_cmd(NULL, "SVSMODE %s -x", u->nick);
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick);
+#endif
+#ifdef IRC_ULTIMATE
+ /* UltimateIRCd 2.x does not allow users to control +x */
+#endif
+#ifdef IRC_ULTIMATE3
+ send_cmd(s_HostServ, "SVSMODE %s -x", u->nick);
+ notice_lang(s_HostServ, u, HOST_OFF_UNREAL, u->nick);
+#endif
+
+}
+
+/*************************************************************************/
+/* End of Server Functions */
+/*************************************************************************/
diff --git a/init.c b/init.c
new file mode 100644
index 000000000..58110ac8a
--- /dev/null
+++ b/init.c
@@ -0,0 +1,807 @@
+/* Initalization and related routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: init.c,v 1.40 2004/03/13 13:55:59 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+int servernum = 0;
+
+extern void moduleAddMsgs(void);
+/*************************************************************************/
+
+/* Send a NICK command for the given pseudo-client. If `user' is NULL,
+ * send NICK commands for all the pseudo-clients.
+ *
+ * Now also sends MODE and SQLINE */
+#if defined(IRC_HYBRID)
+# define NICK(nick,name,modes) \
+ do { \
+ kill_user(NULL, (nick), "Nick used by Services"); \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", (nick), time(NULL), (modes), \
+ ServiceUser, ServiceHost, ServerName, (name)); \
+ } while (0)
+#elif defined(IRC_ULTIMATE3)
+# define NICK(nick,name,modes) \
+ do { \
+ send_cmd(NULL, "CLIENT %s 1 %ld %s + %s %s * %s 0 0 :%s", (nick), time(NULL), (modes), \
+ ServiceUser, ServiceHost, ServerName, (name)); \
+ send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_BAHAMUT)
+# define NICK(nick,name,modes) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", (nick), time(NULL), (modes), \
+ ServiceUser, ServiceHost, ServerName, (name)); \
+ send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_UNREAL)
+# define NICK(nick,name,modes) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 %s * :%s", (nick), time(NULL), \
+ ServiceUser, ServiceHost, ServerName, (modes), (name)); \
+ send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_DREAMFORGE)
+# define NICK(nick,name,modes) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 :%s", (nick), time(NULL), \
+ ServiceUser, ServiceHost, ServerName, (name)); \
+ if (strcmp(modes, "+")) send_cmd((nick), "MODE %s %s", (nick), (modes)); \
+ send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_PTLINK)
+# define NICK(nick,name,modes) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %lu %s %s %s %s %s :%s", (nick), time(NULL), \
+ (modes), ServiceUser, ServiceHost, ServiceHost, ServerName, (name)); \
+ } while (0)
+#endif
+
+void introduce_user(const char *user)
+{
+ /* Watch out for infinite loops... */
+#define LTSIZE 20
+ static int lasttimes[LTSIZE];
+ if (lasttimes[0] >= time(NULL) - 3)
+ fatal("introduce_user() loop detected");
+ memmove(lasttimes, lasttimes + 1, sizeof(lasttimes) - sizeof(int));
+ lasttimes[LTSIZE - 1] = time(NULL);
+#undef LTSIZE
+
+ if (!user || stricmp(user, s_NickServ) == 0)
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ NICK(s_NickServ, desc_NickServ, "+S");
+#elif defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_NickServ, desc_NickServ, "+oS");
+#else
+ NICK(s_NickServ, desc_NickServ, "+o");
+#endif
+ if (!user || stricmp(user, s_ChanServ) == 0)
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ NICK(s_ChanServ, desc_ChanServ, "+S");
+#elif defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_ChanServ, desc_ChanServ, "+oS");
+#else
+ NICK(s_ChanServ, desc_ChanServ, "+o");
+#endif
+
+#ifdef HAS_VHOST
+ if (s_HostServ && (!user || stricmp(user, s_HostServ) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_HostServ, desc_HostServ, "+oS");
+#else
+ NICK(s_HostServ, desc_HostServ, "+o");
+#endif
+#endif
+
+ if (!user || stricmp(user, s_MemoServ) == 0)
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ NICK(s_MemoServ, desc_MemoServ, "+S");
+#elif defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_MemoServ, desc_MemoServ, "+oS");
+#else
+ NICK(s_MemoServ, desc_MemoServ, "+o");
+#endif
+ if (s_BotServ && (!user || stricmp(user, s_BotServ) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ NICK(s_BotServ, desc_BotServ, "+S");
+#elif defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_BotServ, desc_BotServ, "+oS");
+#else
+ NICK(s_BotServ, desc_BotServ, "+o");
+#endif
+ if (!user || stricmp(user, s_HelpServ) == 0)
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ NICK(s_HelpServ, desc_HelpServ, "+Sh");
+#elif defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_HelpServ, desc_HelpServ, "+oS");
+#else
+ NICK(s_HelpServ, desc_HelpServ, "+h");
+#endif
+ if (!user || stricmp(user, s_OperServ) == 0)
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ NICK(s_OperServ, desc_OperServ, "+iS");
+#elif defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_OperServ, desc_OperServ, "+ioS");
+#else
+ NICK(s_OperServ, desc_OperServ, "+io");
+#endif
+ if (s_DevNull && (!user || stricmp(user, s_DevNull) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3)
+ NICK(s_DevNull, desc_DevNull, "+iS");
+#else
+ NICK(s_DevNull, desc_DevNull, "+i");
+#endif
+ if (!user || stricmp(user, s_GlobalNoticer) == 0)
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ NICK(s_GlobalNoticer, desc_GlobalNoticer, "+iS");
+#elif defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_GlobalNoticer, desc_GlobalNoticer, "+ioS");
+#else
+ NICK(s_GlobalNoticer, desc_GlobalNoticer, "+io");
+#endif
+
+/* We make aliases go online */
+ if (s_NickServAlias && (!user || stricmp(user, s_NickServAlias) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_NickServAlias, desc_NickServAlias, "+oS");
+#else
+ NICK(s_NickServAlias, desc_NickServAlias, "+o");
+#endif
+ if (s_ChanServAlias && (!user || stricmp(user, s_ChanServAlias) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_ChanServAlias, desc_ChanServAlias, "+oS");
+#else
+ NICK(s_ChanServAlias, desc_ChanServAlias, "+o");
+#endif
+ if (s_MemoServAlias && (!user || stricmp(user, s_MemoServAlias) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_MemoServAlias, desc_MemoServAlias, "+oS");
+#else
+ NICK(s_MemoServAlias, desc_MemoServAlias, "+o");
+#endif
+ if (s_BotServAlias && (!user || stricmp(user, s_BotServAlias) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_BotServAlias, desc_BotServAlias, "+oS");
+#else
+ NICK(s_BotServAlias, desc_BotServAlias, "+o");
+#endif
+ if (s_HelpServAlias && (!user || stricmp(user, s_HelpServAlias) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_HelpServAlias, desc_HelpServAlias, "+oS");
+#else
+ NICK(s_HelpServAlias, desc_HelpServAlias, "+h");
+#endif
+ if (s_OperServAlias && (!user || stricmp(user, s_OperServAlias) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_OperServAlias, desc_OperServAlias, "+ioS");
+#else
+ NICK(s_OperServAlias, desc_OperServAlias, "+io");
+#endif
+ if (s_DevNullAlias && (!user || stricmp(user, s_DevNullAlias) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_DevNullAlias, desc_DevNullAlias, "+iS");
+#else
+ NICK(s_DevNullAlias, desc_DevNullAlias, "+i");
+#endif
+ if (s_HostServAlias && (!user || stricmp(user, s_HostServAlias) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NICK(s_HostServAlias, desc_HostServAlias, "+ioS");
+#else
+ NICK(s_HostServAlias, desc_HostServAlias, "+io");
+#endif
+ if (s_GlobalNoticerAlias
+ && (!user || stricmp(user, s_GlobalNoticerAlias) == 0))
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL)
+ NICK(s_GlobalNoticerAlias, desc_GlobalNoticerAlias, "+ioS");
+#else
+ NICK(s_GlobalNoticerAlias, desc_GlobalNoticerAlias, "+io");
+#endif
+
+ /* We make the bots go online */
+ if (s_BotServ) {
+ BotInfo *bi;
+ int i;
+
+ for (i = 0; i < 256; i++)
+ for (bi = botlists[i]; bi; bi = bi->next)
+ if (!user || !stricmp(user, bi->nick))
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+qS",
+ 1);
+#elif defined(IRC_ULTIMATE)
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+pS",
+ 1);
+#elif defined(IRC_ULTIMATE3)
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+S",
+ 1);
+#else
+ NEWNICK(bi->nick, bi->user, bi->host, bi->real, "+",
+ 1);
+#endif
+ }
+}
+
+#undef NICK
+
+/*************************************************************************/
+
+/* Set GID if necessary. Return 0 if successful (or if RUNGROUP not
+ * defined), else print an error message to logfile and return -1.
+ */
+
+static int set_group(void)
+{
+#if defined(RUNGROUP) && defined(HAVE_SETGRENT)
+ struct group *gr;
+
+ setgrent();
+ while ((gr = getgrent()) != NULL) {
+ if (strcmp(gr->gr_name, RUNGROUP) == 0)
+ break;
+ }
+ endgrent();
+ if (gr) {
+ setgid(gr->gr_gid);
+ return 0;
+ } else {
+ alog("Unknown group `%s'\n", RUNGROUP);
+ return -1;
+ }
+#else
+ return 0;
+#endif
+}
+
+/*************************************************************************/
+
+/* Parse command-line options for the "-dir" option only. Return 0 if all
+ * went well or -1 for a syntax error.
+ */
+
+/* XXX this could fail if we have "-some-option-taking-an-argument -dir" */
+
+static int parse_dir_options(int ac, char **av)
+{
+ int i;
+ char *s;
+
+ for (i = 1; i < ac; i++) {
+ s = av[i];
+ if (*s == '-') {
+ s++;
+ if (strcmp(s, "dir") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr, "-dir requires a parameter\n");
+ return -1;
+ }
+ services_dir = av[i];
+ } else if (strcmp(s, "log") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr, "-log requires a parameter\n");
+ return -1;
+ }
+ log_filename = av[i];
+ }
+ }
+ }
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Parse command-line options. Return 0 if all went well, -1 for an error
+ * with an option, or 1 for -help.
+ */
+
+static int parse_options(int ac, char **av)
+{
+ int i;
+ char *s, *t;
+
+ for (i = 1; i < ac; i++) {
+ s = av[i];
+ if (*s == '-') {
+ s++;
+ if (strcmp(s, "remote") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr, "-remote requires hostname[:port]\n");
+ return -1;
+ }
+ s = av[i];
+ t = strchr(s, ':');
+ if (t) {
+ *t++ = 0;
+ if (atoi(t) > 0)
+ RemotePort = atoi(t);
+ else {
+ fprintf(stderr,
+ "-remote: port number must be a positive integer. Using default.");
+ return -1;
+ }
+ }
+ RemoteServer = s;
+ } else if (strcmp(s, "local") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr,
+ "-local requires hostname or [hostname]:[port]\n");
+ return -1;
+ }
+ s = av[i];
+ t = strchr(s, ':');
+ if (t) {
+ *t++ = 0;
+ if (atoi(t) >= 0)
+ LocalPort = atoi(t);
+ else {
+ fprintf(stderr,
+ "-local: port number must be a positive integer or 0. Using default.");
+ return -1;
+ }
+ }
+ LocalHost = s;
+ } else if (strcmp(s, "name") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr, "-name requires a parameter\n");
+ return -1;
+ }
+ ServerName = av[i];
+ } else if (strcmp(s, "desc") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr, "-desc requires a parameter\n");
+ return -1;
+ }
+ ServerDesc = av[i];
+ } else if (strcmp(s, "user") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr, "-user requires a parameter\n");
+ return -1;
+ }
+ ServiceUser = av[i];
+ } else if (strcmp(s, "host") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr, "-host requires a parameter\n");
+ return -1;
+ }
+ ServiceHost = av[i];
+ } else if (strcmp(s, "dir") == 0) {
+ /* Handled by parse_dir_options() */
+ i++; /* Skip parameter */
+ } else if (strcmp(s, "log") == 0) {
+ /* Handled by parse_dir_options(), too */
+ i++; /* Skip parameter */
+ } else if (strcmp(s, "update") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr, "-update requires a parameter\n");
+ return -1;
+ }
+ s = av[i];
+ if (atoi(s) <= 0) {
+ fprintf(stderr,
+ "-update: number of seconds must be positive");
+ return -1;
+ } else
+ UpdateTimeout = atol(s);
+ } else if (strcmp(s, "expire") == 0) {
+ if (++i >= ac) {
+ fprintf(stderr, "-expire requires a parameter\n");
+ return -1;
+ }
+ s = av[i];
+ if (atoi(s) <= 0) {
+ fprintf(stderr,
+ "-expire: number of seconds must be positive");
+ return -1;
+ } else
+ ExpireTimeout = atol(s);
+ } else if (strcmp(s, "debug") == 0) {
+ debug++;
+ } else if (strcmp(s, "readonly") == 0) {
+ readonly = 1;
+ skeleton = 0;
+ } else if (strcmp(s, "skeleton") == 0) {
+ readonly = 0;
+ skeleton = 1;
+ } else if (strcmp(s, "nofork") == 0) {
+ nofork = 1;
+ } else if (strcmp(s, "logchan") == 0) {
+ logchan = 1;
+#ifdef IRC_HYBRID
+ fprintf(stderr,
+ "LogChan will only work if your logchannel is not set to +n\n");
+#endif
+ } else if (strcmp(s, "forceload") == 0) {
+ forceload = 1;
+ } else if (!strcmp(s, "noexpire")) {
+ noexpire = 1;
+#ifdef IS44_CONVERTER
+ } else if (!strcmp(s, "is44")) {
+ is44 = 1;
+#endif
+ } else {
+ fprintf(stderr, "Unknown option -%s\n", s);
+ return -1;
+ }
+ } else {
+ fprintf(stderr, "Non-option arguments not allowed\n");
+ return -1;
+ }
+ }
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Remove our PID file. Done at exit. */
+
+static void remove_pidfile(void)
+{
+ remove(PIDFilename);
+}
+
+/*************************************************************************/
+
+/* Create our PID file and write the PID to it. */
+
+static void write_pidfile(void)
+{
+ FILE *pidfile;
+
+ pidfile = fopen(PIDFilename, "w");
+ if (pidfile) {
+ fprintf(pidfile, "%d\n", (int) getpid());
+ fclose(pidfile);
+ atexit(remove_pidfile);
+ } else {
+ log_perror("Warning: cannot write to PID file %s", PIDFilename);
+ }
+}
+
+/*************************************************************************/
+
+/* Overall initialization routine. Returns 0 on success, -1 on failure. */
+
+int init(int ac, char **av)
+{
+ int i;
+ int openlog_failed = 0, openlog_errno = 0;
+ int started_from_term = isatty(0) && isatty(1) && isatty(2);
+
+ /* Imported from main.c */
+ extern void sighandler(int signum);
+
+
+ /* Set file creation mask and group ID. */
+#if defined(DEFUMASK) && HAVE_UMASK
+ umask(DEFUMASK);
+#endif
+ if (set_group() < 0)
+ return -1;
+
+ /* Parse command line for -dir option. */
+ parse_dir_options(ac, av);
+
+ /* Chdir to Services data directory. */
+ if (chdir(services_dir) < 0) {
+ fprintf(stderr, "chdir(%s): %s\n", services_dir, strerror(errno));
+ return -1;
+ }
+
+ /* Open logfile, and complain if we didn't. */
+ if (open_log() < 0) {
+ openlog_errno = errno;
+ if (started_from_term) {
+ fprintf(stderr, "Warning: unable to open log file %s: %s\n",
+ log_filename, strerror(errno));
+ } else {
+ openlog_failed = 1;
+ }
+ }
+
+ /* Read configuration file; exit if there are problems. */
+ if (!read_config(0))
+ return -1;
+
+ /* Add Core MSG handles */
+ moduleAddMsgs();
+
+ /* Parse all remaining command-line options. */
+ parse_options(ac, av);
+
+ /* Detach ourselves if requested. */
+ if (!nofork) {
+ if ((i = fork()) < 0) {
+ perror("fork()");
+ return -1;
+ } else if (i != 0) {
+ exit(0);
+ }
+ if (started_from_term) {
+ close(0);
+ close(1);
+ close(2);
+ }
+ if (setpgid(0, 0) < 0) {
+ perror("setpgid()");
+ return -1;
+ }
+ }
+
+ /* Write our PID to the PID file. */
+ write_pidfile();
+
+ /* Announce ourselves to the logfile. */
+ if (debug || readonly || skeleton) {
+ alog("Anope %s (compiled for %s) starting up (options:%s%s%s)",
+ version_number, version_protocol,
+ debug ? " debug" : "", readonly ? " readonly" : "",
+ skeleton ? " skeleton" : "");
+ } else {
+ alog("Anope %s (compiled for %s) starting up",
+ version_number, version_protocol);
+ }
+ start_time = time(NULL);
+
+ /* If in read-only mode, close the logfile again. */
+ if (readonly)
+ close_log();
+
+ /* Set signal handlers. Catch certain signals to let us do things or
+ * panic as necessary, and ignore all others.
+ */
+
+#if defined(NSIG) && !defined(LINUX20) && !defined(LINUX22)
+ for (i = 1; i <= NSIG - 1; i++) {
+#else
+ for (i = 1; i <= 31; i++) {
+#endif
+#if defined(USE_THREADS) && defined(LINUX20)
+ if (i != SIGUSR1 && i != SIGUSR2)
+#endif
+ signal(i, SIG_IGN);
+ }
+
+#ifndef USE_THREADS
+ signal(SIGINT, sighandler);
+#else
+ signal(SIGINT, SIG_DFL);
+#endif
+ signal(SIGTERM, sighandler);
+ signal(SIGQUIT, sighandler);
+ if (!DumpCore) {
+ signal(SIGSEGV, sighandler);
+ signal(SIGBUS, sighandler);
+ signal(SIGILL, sighandler);
+ signal(SIGTRAP, sighandler);
+ } else {
+ signal(SIGSEGV, SIG_DFL);
+ signal(SIGBUS, SIG_DFL);
+ signal(SIGILL, SIG_DFL);
+ signal(SIGTRAP, SIG_DFL);
+ }
+ signal(SIGQUIT, sighandler);
+ signal(SIGHUP, sighandler);
+
+#ifdef SIGIOT
+ signal(SIGIOT, sighandler);
+#endif
+ signal(SIGFPE, sighandler);
+
+#if !defined(USE_THREADS) || !defined(LINUX20)
+ signal(SIGUSR1, sighandler); /* This is our "out-of-memory" panic switch */
+#endif
+
+ /* Initialize multi-language support */
+ lang_init();
+ if (debug)
+ alog("debug: Loaded languages");
+
+ /* Initialize subservices */
+ ns_init();
+ cs_init();
+ ms_init();
+ bs_init();
+ os_init();
+ hostserv_init();
+ helpserv_init();
+
+#ifdef USE_RDB
+ db_mysql_init();
+#endif
+
+ /* Initialize proxy detection */
+#ifdef USE_THREADS
+ if (ProxyDetect && !proxy_init()) {
+ perror("proxy_init()");
+ return -1;
+ }
+#endif
+
+ /* load any custom modules */
+ modules_init();
+
+#ifdef USE_CONVERTER
+ /* Convert the databases NOW! */
+# ifdef IS44_CONVERTER
+ if (is44) {
+ convert_ircservices_44();
+ alog("debug: Databases converted");
+ }
+# endif
+#endif
+
+ /* Load up databases */
+ if (!skeleton) {
+ load_ns_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (1/9)", s_NickServ);
+ if (s_HostServ) {
+ load_hs_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (2/9)", s_HostServ);
+ }
+ if (s_BotServ) {
+ load_bs_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (3/9)", s_BotServ);
+ } else if (debug)
+ alog("debug: BotServ database (4/9) not loaded because BotServ is disabled");
+ load_cs_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (5/9)", s_ChanServ);
+ }
+ load_os_dbase();
+ if (debug)
+ alog("debug: Loaded %s database (6/9)", s_OperServ);
+ load_news();
+ if (debug)
+ alog("debug: Loaded news database (7/9)");
+ load_exceptions();
+ if (debug)
+ alog("debug: Loaded exception database (8/9)");
+ if (PreNickDBName) {
+ load_ns_req_db();
+ if (debug)
+ alog("debug: Loaded PreNick database (9/9)");
+ }
+
+ alog("Databases loaded");
+
+ /* Save the databases back to file/mysql to reflect any changes */
+ save_databases();
+
+ /* Connect to the remote server */
+ servsock = conn(RemoteServer, RemotePort, LocalHost, LocalPort);
+ if (servsock < 0 && RemoteServer2) {
+ servsock = conn(RemoteServer2, RemotePort2, LocalHost, LocalPort);
+ if (servsock < 0 && RemoteServer3) {
+ servsock =
+ conn(RemoteServer3, RemotePort3, LocalHost, LocalPort);
+ if (servsock < 0) {
+ fatal_perror("Can't connect to server");
+ } else {
+ servernum = 3;
+ alog("Connected to Server %d (%s:%d)", servernum,
+ RemoteServer3, RemotePort3);
+ }
+ } else {
+ if (servsock < 0) {
+ fatal_perror("Can't connect to server");
+ }
+ servernum = 2;
+ alog("Connected to Server %d (%s:%d)", servernum,
+ RemoteServer2, RemotePort2);
+ }
+ } else {
+ if (servsock < 0) {
+ fatal_perror("Can't connect to server");
+ }
+ servernum = 1;
+ alog("Connected to Server %d (%s:%d)", servernum, RemoteServer,
+ RemotePort);
+ }
+
+#ifdef IRC_UNREAL
+ send_cmd(NULL, "PROTOCTL NICKv2 VHP");
+#endif
+#if defined(IRC_ULTIMATE3)
+ if (servernum == 1)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword);
+ else if (servernum == 2)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword2);
+ else if (servernum == 3)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword3);
+ send_cmd(NULL, "CAPAB NICKIP SSJ5 TS5 CLIENT");
+
+#elif defined(IRC_BAHAMUT)
+ if (servernum == 1)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword);
+ else if (servernum == 2)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword2);
+ else if (servernum == 3)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword3);
+ send_cmd(NULL, "CAPAB NICKIP SSJOIN TS3");
+#elif defined(IRC_HYBRID)
+ if (servernum == 1)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword);
+ else if (servernum == 2)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword2);
+ else if (servernum == 3)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword3);
+ send_cmd(NULL, "CAPAB TS5 EX IE HOPS HUB AOPS");
+#elif defined(IRC_PTLINK)
+ if (servernum == 1)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword);
+ else if (servernum == 2)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword2);
+ else if (servernum == 3)
+ send_cmd(NULL, "PASS %s :TS", RemotePassword3);
+#else
+ if (servernum == 1)
+ send_cmd(NULL, "PASS :%s", RemotePassword);
+ if (servernum == 2)
+ send_cmd(NULL, "PASS :%s", RemotePassword2);
+ if (servernum == 3)
+ send_cmd(NULL, "PASS :%s", RemotePassword3);
+#endif
+#ifdef IRC_PTLINK
+ send_cmd(NULL, "SERVER %s 1 Anope.Services%s :%s",
+ ServerName, version_number, ServerDesc);
+#else
+ send_cmd(NULL, "SERVER %s 1 :%s", ServerName, ServerDesc);
+#endif
+#ifdef IRC_BAHAMUT
+ send_cmd(NULL, "SVINFO 3 1 0 :%ld", time(NULL));
+#endif
+#ifdef IRC_HYBRID
+ send_cmd(NULL, "SVSINFO 5 5 0 :%ld", time(NULL));
+#endif
+#ifdef IRC_PTLINK
+ send_cmd(NULL, "SVINFO 3 6 %lu", time(NULL));
+ send_cmd(NULL, "SVSINFO %lu %d", time(NULL), maxusercnt);
+#endif
+ sgets2(inbuf, sizeof(inbuf), servsock);
+ if (strnicmp(inbuf, "ERROR", 5) == 0) {
+ /* Close server socket first to stop wallops, since the other
+ * server doesn't want to listen to us anyway */
+ disconn(servsock);
+ servsock = -1;
+ fatal("Remote server returned: %s", inbuf);
+ }
+
+ /* Announce a logfile error if there was one */
+ if (openlog_failed) {
+ wallops(NULL, "Warning: couldn't open logfile: %s",
+ strerror(openlog_errno));
+ }
+
+ /* Bring in our pseudo-clients */
+ introduce_user(NULL);
+
+ /**
+ * Load our delayed modeles - modules that are planing on making clients need to wait till now
+ * where as modules wanting to modify our ircd connection messages need to load eariler :|
+ **/
+ modules_delayed_init();
+
+ /* Write the StartGlobal */
+ if (GlobalOnCycle) {
+ if (GlobalOnCycleUP)
+ oper_global(NULL, GlobalOnCycleUP);
+ }
+
+ /* Success! */
+ return 0;
+}
+
+/*************************************************************************/
diff --git a/install-script b/install-script
new file mode 100644
index 000000000..aeb6d3352
--- /dev/null
+++ b/install-script
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+SRC= ; DEST= ; MODE= ; USER= ; GROUP= ; export SRC DEST MODE USER GROUP
+while [ $# -gt 0 ] ; do
+ case $1 in
+ -m) MODE=$2; shift; shift;;
+ -u) USER=$2; shift; shift;;
+ -g) GROUP=$2; shift; shift;;
+ -c) shift;;
+ *) SRC="$DEST"; DEST="$1"; shift;;
+ esac
+done
+if [ ! "$DEST" ] ; then
+ echo >&2 "Usage: $0 [-c] [-m mode] [-u user] [-g group] source dest"
+ exit 1
+fi
+if [ -d "$DEST" ] ; then
+ DEST="$DEST/$SRC"
+fi
+/bin/cp -p "$SRC" "$DEST"
+if [ "$MODE" ] ; then
+ /bin/chmod $MODE "$DEST"
+fi
+if [ "$USER" ] ; then
+ /bin/chown "$USER" "$DEST"
+fi
+if [ "$GROUP" ] ; then
+ /bin/chgrp "$GROUP" "$DEST"
+fi
diff --git a/lang/Makefile b/lang/Makefile
new file mode 100644
index 000000000..90310df31
--- /dev/null
+++ b/lang/Makefile
@@ -0,0 +1,79 @@
+# Makefile for language module
+
+include ../Makefile.inc
+
+
+LANGOBJS = cat de en_us es fr gr nl pt tr it ru
+LANGSRCS = cat de en_us.l es fr.l gr.l nl.l pt.l tr.l it.l ru.l
+
+LANGCOMP = ./langcomp
+#LANGCOMP = ./langcomp -w
+
+
+all: $(LANGOBJS)
+
+
+install: all
+ mkdir -p $(DATDEST)/languages
+ifdef RUNGROUP
+ chgrp $(RUNGROUP) $(DATDEST)/languages
+ chmod 770 $(DATDEST)/languages
+else
+ chmod 700 $(DATDEST)/languages
+endif
+ cp $(LANGOBJS) $(DATDEST)/languages
+ifdef RUNGROUP
+ chgrp $(RUNGROUP) $(DATDEST)/languages/*
+ chmod 660 $(DATDEST)/languages/*
+else
+ chmod 600 $(DATDEST)/languages/*
+endif
+
+
+clean:
+ rm -f $(LANGOBJS) langcomp
+
+spotless: clean
+ rm -f language.h
+
+
+cat: cat.l langcomp index
+ ./langcomp $@.l
+de: de.l langcomp index
+ ./langcomp $@.l
+en_us: en_us.l langcomp index
+ ./langcomp $@.l
+es: es.l langcomp index
+ ./langcomp $@.l
+fr: fr.l langcomp index
+ ./langcomp $@.l
+gr: gr.l langcomp index
+ ./langcomp $@.l
+nl: nl.l langcomp index
+ ./langcomp $@.l
+pt: pt.l langcomp index
+ ./langcomp $@.l
+tr: tr.l langcomp index
+ ./langcomp $@.l
+it: it.l langcomp index
+ ./langcomp $@.l
+ru: ru.l langcomp index
+ ./langcomp $@.l
+
+langcomp: langcomp.c
+ $(CC) $(CFLAGS) langcomp.c -o $@
+
+
+language.h: index Makefile
+ @perl -e <index >$@ '\
+ print STDERR "Generating language.h... "; \
+ $$i=0; \
+ while (<>) { \
+ chop; \
+ printf "#define %-32s %d\n", $$_, $$i++; \
+ } \
+ print "\n#define NUM_STRINGS $$i\n"; \
+ print STDERR "$$i strings\n";'
+
+index: en_us.l
+ grep '^[A-Z]' en_us.l >index
diff --git a/lang/cat.l b/lang/cat.l
new file mode 100644
index 000000000..035959ab1
--- /dev/null
+++ b/lang/cat.l
@@ -0,0 +1,6172 @@
+# Catalan Language File.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# When translating this file to another language, keep in mind that the
+# order of per ameters for sprintf() is fixed in the source code, so your
+# messages need to take the same per ameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the per ameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() per ameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+# Translated by AUJAC (Associació d'Usuaris de Java de Catalunya. http://www.aujac.org)
+LANG_NAME
+ Catala (Catalan)
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %d %b %H:%M:%S %Y %Z
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %d %b %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %d %b %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Diu
+ Dll
+ Dmt
+ Dmc
+ Dj
+ Dv
+ Dsb
+# %A
+STRFTIME_DAYS_LONG
+ Diumenge
+ Dilluns
+ Dimarts
+ Dimecres
+ Dijous
+ Divendres
+ Dissabte
+# %b
+STRFTIME_MONTHS_SHORT
+ Gen
+ Feb
+ Mar
+ Abr
+ Mai
+ Jun
+ Jul
+ Ago
+ Sep
+ Oct
+ Nov
+ Des
+# %B
+STRFTIME_MONTHS_LONG
+ Gener
+ Febrer
+ Març
+ Abril
+ Maig
+ Juny
+ Juliol
+ Agost
+ Setembre
+ Octubre
+ Novembre
+ Desembre
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Error Intern - Impossible processar petició.
+UNKNOWN_COMMAND
+ Comanda no coneguda %s.
+UNKNOWN_COMMAND_HELP
+ Comanda no coneguda %s. "/msg %s HELP" per ajuda.
+SYNTAX_ERROR
+ Sintàxis: %s
+MORE_INFO
+ /msg %s HELP %s per més informació.
+NO_HELP_AVAILABLE
+ No existeix ajuda per %s.
+OBSOLETE_COMMAND
+ Aquesta comanda esta obsoleta; utilitzi %s en substitució.
+
+BAD_USERHOST_MASK
+ La mascara ha de ser de la forma usuari@host.
+BAD_EXPIRY_TIME
+ Temps d'expiració invàlid.
+USERHOST_MASK_TOO_WIDE
+ %s La cobertura es mes amplia; Per favor utilitzi una mascara mes especifica.
+
+SERVICE_OFFLINE
+ %s esta momentaneament offline.
+READ_ONLY_MODE
+ Noticia: Els serveis estan en mode read-only; Els canvis no seran guardats!
+PASSWORD_INCORRECT
+ Clau incorrecta.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ accés denegat.
+PERMISSION_DENIED
+ Permis denegat.
+RAW_DISABLED
+ The RAW option has been disabled. If you must use it, enable the DisableRaw directive in Services configuration.
+
+MORE_OBSCURE_PASSWORD
+ Per favor intenti novamente amb una clau mes oculta. Les claus han de ser de com a mínim 5 caràcters, no han de ser fàcils d'encertar (ex. Nom real o Nick), i no poden contenir el caràcter d'espai o tabulació.
+PASSWORD_TRUNCATED
+ Noticia: La clau ha estat retallada a %d caracters.
+
+NICK_NOT_REGISTERED
+ El teu nick no esta registrat.
+NICK_NOT_REGISTERED_HELP
+ El teu nick no esta registrat. Escriu /msg %s HELP per mes informació al registrat el teu nickname.
+NICK_X_NOT_REGISTERED
+ El nick %s no esta registrat.
+NICK_X_IN_USE
+ Nick %s is currently in use.
+NICK_X_NOT_IN_USE
+ El nick %s no esta en us.
+NICK_X_NOT_ON_CHAN
+ El nick %s no esta en el canal %s actualment.
+NICK_X_FORBIDDEN
+ El nick %s no pot ser registrat o utilitzat.
+NICK_X_FORBIDDEN_OPER
+ El nick %s ha estat prohibit per %s:
+ %s
+NICK_X_ILLEGAL
+ Nick %s is an illegal nickname and cannot be used.
+NICK_X_TRUNCATED
+ Nick %s was truncated to %d characters.
+CHAN_X_NOT_REGISTERED
+ El Canal %s no esta registrat.
+CHAN_X_NOT_IN_USE
+ El Canal %s No existeix.
+CHAN_X_FORBIDDEN
+ El Canal %s no pot ser registrat o usat.
+CHAN_X_FORBIDDEN_OPER
+ El Canal %s ha estat prohibit per %s:
+ %s
+CHAN_X_SUSPENDED
+ Suspended: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Autentificació per clau requerida per aquesta comanda.
+ Intenta un altre cop després de escriure /msg %s IDENTIFY clau.
+CHAN_IDENTIFY_REQUIRED
+ Autentificació per clau requerida per aquesta comanda.
+ Intenta de nou després d'escriure /msg %s IDENTIFY %s clau.
+
+MAIL_DISABLED
+ Els serveis han estat configurats per no enviar email
+MAIL_INVALID
+ E-mail per %s es invalid.
+MAIL_X_INVALID
+ %s no es un e-mail valid.
+MAIL_LATER
+ Imposible enviar email ara; per favor intenta en uns instants.
+MAIL_DELAYED
+ Per favor espera %d segons i intenta un altre cop.
+
+NO_REASON
+ Sense raó
+UNKNOWN
+ <desconegut>
+
+# Duration system
+DURATION_DAY
+ 1 dia
+DURATION_DAYS
+ %d dies
+DURATION_HOUR
+ 1 hora
+DURATION_HOURS
+ %d hores
+DURATION_MINUTE
+ 1 minut
+DURATION_MINUTES
+ %d minuts
+DURATION_SECOND
+ 1 segon
+DURATION_SECONDS
+ %d segons
+
+# Human readable expiration
+NO_EXPIRE
+ no expira
+EXPIRES_SOON
+ expira amb el pròxim update de la base de dades
+EXPIRES_M
+ expira en %d minuts
+EXPIRES_1M
+ expira en %d minuts
+EXPIRES_HM
+ expira en %d hores, %d minuts
+EXPIRES_H1M
+ expira en %d hores, %d minut
+EXPIRES_1HM
+ expira en %d hora, %d minuts
+EXPIRES_1H1M
+ expira en %d hora, %d minut
+EXPIRES_D
+ expira en %d dies
+EXPIRES_1D
+ expira en %d dia
+
+# Generic Footer message
+END_OF_ANY_LIST
+ End of %s list.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Aquest nick pertany a un altra persona. Per favor escull un altre nick.
+ (Si aquest es el teu nick, escriu /msg %s IDENTIFY clau.)
+NICK_IS_SECURE
+ Aquest nick esta registrat i protegit. Si es el teu
+ nick, escriu /msg %s IDENTIFY clau. Si no,
+ per favor escull un nick diferent.
+NICK_MAY_NOT_BE_USED
+ Aquest nickname no pot ser utilitzat. Per favor escull un altre.
+FORCENICKCHANGE_IN_1_MINUTE
+ Si no canvies el teu nick en un minut, el canviare jo.
+FORCENICKCHANGE_IN_20_SECONDS
+ Si no canvies el teu nick en 20 segons, el canviare jo.
+FORCENICKCHANGE_NOW
+ Aquest nick ha estat registrat; No pots utilitzar-lo.
+FORCENICKCHANGE_CHANGING
+ El teu nickname s'esta canviant a %s
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER clau [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER clau email
+NICK_REGISTRATION_DISABLED
+ Ho sento, el registre de nicknames esta temporalment deshabilitat.
+NICK_REGISTRATION_FAILED
+ Ho sento, error en el registre.
+NICK_REG_PLEASE_WAIT
+ Per favor espera %d segons abans d'utilitzar la comanda REGISTER novament.
+NICK_CANNOT_BE_REGISTERED
+ El nickname %s no pot ser registrat.
+NICK_ALREADY_REGISTERED
+ El nickname %s ja esta registrat!
+
+NICK_REGISTERED
+ El nickname %s ja esta registrat sota el teu compte: %s
+NICK_PASSWORD_IS
+ La teva clau es %s - Recordala per un us futur.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP grup clau
+NICK_GROUP_DISABLED
+ Ho sento, La agrupació de nicks esta temporalment inabilitada.
+NICK_GROUP_FAILED
+ Ho sento, La agrupació de nicks ha fallat.
+NICK_GROUP_PLEASE_WAIT
+ Per favor espera %d segons abans d'utilitzar la comanda GROUP novament.
+NICK_GROUP_CHANGE_DISABLED
+ El teu nick ja esta registrat; escriu /msg %s DROP primer.
+NICK_GROUP_SAME
+ Ja ets membre del grup de %s.
+NICK_GROUP_TOO_MANY
+ N'hi ha molts nicks en el grup de %s; lllistals i treu-ne alguns.
+ Escriu /msg %s HELP GLIST i /msg %s HELP DROP
+ per més informació.
+NICK_GROUP_JOINED
+ Ara ets membre en el grup de %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY clau
+NICK_IDENTIFY_FAILED
+ Ho sento, la identificació ha fallat.
+NICK_IDENTIFY_SUCCEEDED
+ Clau aceptada - Has estat reconegut.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Ara has de proveir un e-mail pel teu nick.
+ Aquest e-mail et permetra recuperar la teva clau en
+ cas de que la olvidis.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Escriu /msg %S SET EMAIL e-mail per provar el teu e-mail.
+ Respectems la teva privacitat; Aquest e-mail no sera entregat
+ a cap persona.
+
+# LOGOUT responses
+NICK_ALREADY_IDENTIFIED
+ You are already identified.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status updated (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ El teu nick ha estat desconnectat.
+NICK_LOGOUT_X_SUCCEEDED
+ Nick %s ha estat desconnectat.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ Can't logout %s because he's a services administrator.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Ho sento, desenregistrament de nickname esta temporalment inhabilitat.
+NICK_DROPPED
+ El teu nickname ha estat expulsat.
+NICK_X_DROPPED
+ Nickname %s ha estat expulsat.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET opcio per ametres
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] opcio per ametres
+NICK_SET_DISABLED
+ Ho sento, el seteig de Opciós per nicknames esta temporalment inhabilitat.
+NICK_SET_UNKNOWN_OPTION
+ Opcio SET desconeguda %s.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ Opció SET desconoguda %s, o nickname no esta registrat.
+NICK_SET_OPTION_DISABLED
+ Opció %s no pot ser establerta en aquesta xarxa.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ El nou display HA DE SER ser un nickname del teu grup de nicknames!
+NICK_SET_DISPLAY_CHANGED
+ El nou display es ara %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Ho sento, el canvi de clau no pot ser completat.
+NICK_SET_PASSWORD_CHANGED
+ Clau canviada.
+NICK_SET_PASSWORD_CHANGED_TO
+ Clau canviada a %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE numero
+NICK_SET_LANGUAGE_UNKNOWN
+ Numero de llenguatge %d desconegut. Escriu /msg %s HELP SET LANGUAGE per una lllista de llenguatges.
+NICK_SET_LANGUAGE_CHANGED
+ Llenguatge canviat a Català.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL canviada a %s.
+NICK_SET_URL_UNSET
+ URL no establerta.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ Adreça E-mail canviada a %s.
+NICK_SET_EMAIL_UNSET
+ Adreça E-mail no establerta.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ No pots establir la teva adreça e-mail en aquesta xarxa.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ Numero ICQ establert a %s.
+NICK_SET_ICQ_UNSET
+ Numero ICQ no establert.
+NICK_SET_ICQ_INVALID
+ %s no es un numero vàlid.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Missatge de benvinguda canviat a %s.
+NICK_SET_GREET_UNSET
+ Missatge de benvinguda no establert.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ Protecció activada.
+NICK_SET_KILL_QUICK
+ La protecció esta activada, amb demora reduida.
+NICK_SET_KILL_IMMED
+ La protecció esta activada, sense demora.
+NICK_SET_KILL_IMMED_DISABLED
+ L'opció IMMED no esta disponible en aquesta xarxa.
+NICK_SET_KILL_OFF
+ La protecció esta desactivada.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ L'opció de seguretat esta activada.
+NICK_SET_SECURE_OFF
+ L'opció de seguretat esta desactivada.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ L'opció de privacitat esta activada.
+NICK_SET_PRIVATE_OFF
+ L'opció de privacitat esta desactivada.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ La teva adreça e-mail no sera mostrada a %s INFO displays.
+NICK_SET_HIDE_EMAIL_OFF
+ La teva adreça e-mail sera mostrada a %s INFO displays.
+NICK_SET_HIDE_MASK_ON
+ La teva ultima mascara usuari@host no sera mostrada a %s INFO displays.
+NICK_SET_HIDE_MASK_OFF
+ La teva ultima mascara usuari@host sera mostrada a %s INFO displays.
+NICK_SET_HIDE_QUIT_ON
+ El teu últim missatge quit no sera mostrat a %s INFO displays.
+NICK_SET_HIDE_QUIT_OFF
+ El teu últim missatge quit sera mostrat a %s INFO displays.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Els serveis et respondran ara amb missatge.
+NICK_SET_MSG_OFF
+ Els serveis et respondran ara amb noticies.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nickname] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ El Nick %s No caducara.
+NICK_SET_NOEXPIRE_OFF
+ El Nick %s caducara.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mascara]
+NICK_ACCESS_ALREADY_PRESENT
+ La mascara %s ja esta present a la teva lllista d'accés.
+NICK_ACCESS_REACHED_LIMIT
+ Ho sento, sols pots tenir %d instàncies a la teva lllista d'accés per nickname.
+NICK_ACCESS_ADDED
+ %s afegit a la teva lllista d'accés.
+NICK_ACCESS_NOT_FOUND
+ %s no trobat a la teva lllista d'accés.
+NICK_ACCESS_DELETED
+ %s esborrat de la teva lllista d'accés.
+NICK_ACCESS_LIST
+ Lllista d'accés:
+NICK_ACCESS_LIST_X
+ Lllista d'accés per %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s es %s
+NICK_INFO_SERVICES_OPER
+ %s es un operador de serveis.
+NICK_INFO_SERVICES_ADMIN
+ %s es un administrador de serveis.
+NICK_INFO_ADDRESS
+ Ultima adreça vista: %s
+NICK_INFO_ADDRESS_ONLINE
+ Esta en linea desde: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s Esta actualment online.
+NICK_INFO_TIME_REGGED
+ Temps registrat: %s
+NICK_INFO_LAST_SEEN
+ Ultima vegada vist: %s
+NICK_INFO_LAST_QUIT
+ Ùltim missatge quit: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ Adreça E-mail: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Missatge de benvinguda: %s
+NICK_INFO_OPTIONS
+ Opciós: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Protecció
+NICK_INFO_OPT_SECURE
+ Segur
+NICK_INFO_OPT_PRIVATE
+ Privat
+NICK_INFO_OPT_MSG
+ Mode de missatge
+NICK_INFO_OPT_NONE
+ Cap
+NICK_INFO_NO_EXPIRE
+ Aquest nickname no caducara.
+NICK_INFO_FOR_MORE
+ Per més informació, escriu /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST patro
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST patro [FORBIDDEN] [NOEXPIRE]
+NICK_LIST_HEADER
+ Lllista de resultats concordant %s:
+NICK_LIST_RESULTS
+ Fi de la lllista - %d/%d resultat(s) mostrat(s).
+
+# GLIST responses
+NICK_ALIST_SYNTAX
+ ALIST nickname
+NICK_ALIST_HEADER
+ Channels that you have access on:
+ Num Channel Level Description
+NICK_ALIST_HEADER_X
+ Channels that %s has access on:
+ Num Channel Level Description
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ Fi de la lllista - %d/%d resultat(s) mostrat(s).
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Lllista de nicknames en el teu grup:
+NICK_GLIST_HEADER_X
+ Lllista de nicknames en el grup de %s:
+NICK_GLIST_FOOTER
+ %d nicknames en el grup.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nickname [clau]
+NICK_NO_RECOVER_SELF
+ No pots recuperar-te a tu mateix!
+NICK_RECOVERED
+ L'usuari demanant el teu nick ha estat expulsat.
+ /msg %s RELEASE %s per recuperar-lo abans del minut de time-out.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nickname [clau]
+NICK_RELEASE_NOT_HELD
+ El nick %s no esta sent utilitzat.
+NICK_RELEASED
+ El teu nick ha estat alliberat pels serveis.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nickname [clau]
+NICK_NO_GHOST_SELF
+ No pots fer GHOST a tu mateix!
+NICK_GHOST_KILLED
+ El ghost amb el teu nick ha estat expulsat.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nickname
+NICK_GETPASS_UNAVAILABLE
+ La comanda GETPASS no esta disponible per l'us d'encriptació.
+NICK_GETPASS_PASSWORD_IS
+ La clau per %s es %s.
+
+# SENDPASS responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host No WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails Match %s to %s.
+NICK_GETEMAIL_NOT_USED
+ No Emails listed for %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nickname
+NICK_SENDPASS_UNAVAILABLE
+ La comanda SENDPASS no esta disponible per l'us d'encriptació.
+NICK_SENDPASS_SUBJECT
+ Clau pel Nickname (%s)
+NICK_SENDPASS_HEAD
+ Hola,
+NICK_SENDPASS_LINE_1
+ El teu has demanat rebre la clau pel nickname %s via e-mail.
+NICK_SENDPASS_LINE_2
+ La clau es %s. Per raons de seguretat hauries de canviar-la quant rebis aquest mail.
+NICK_SENDPASS_LINE_3
+ Si no saps per que aquest mail t'ha estat enviat, per favor ignora'l.
+NICK_SENDPASS_LINE_4
+ Per favor NO RESPONGUIS a aquest EMAIL!
+NICK_SENDPASS_LINE_5
+ Administradors de %s.
+NICK_SENDPASS_OK
+ La clau de %s ha estat enviada.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nickname [rao]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nickname rao
+NICK_FORBID_SUCCEEDED
+ El nick %s esta prohibit.
+NICK_FORBID_FAILED
+ La prohibició de %s no es possible!
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+NICK_REQUESTED
+ This nick has already been requested, please check your e-mail address for the pass code
+NICK_REG_RESENT
+ Your passcode has been re-sent to %s.
+NICK_REG_UNABLE
+ Nick NOT registered, please try again later.
+NICK_IS_PREREG
+ This nick is awaiting an e-mail verification code before completing registration.
+NICK_ENTER_REG_CODE
+ A passcode has been sent to %s, please type /msg %s confirm <passcode> to complete registration
+NICK_CONFIRM_NOT_FOUND
+ Registration step 1 may have expired, please use "/msg %s register <password> <email>" first.
+NICK_CONFIRM_INVALID
+ Invalid passcode has been entered, please check the e-mail again, and retry
+NICK_REG_MAIL_SUBJECT
+ Nickname Registration (%s)
+NICK_REG_MAIL_HEAD
+ Hi,
+NICK_REG_MAIL_LINE_1
+ You have requested to register the following nickname %s.
+NICK_REG_MAIL_LINE_2
+ Please type " /msg %s confirm %s " to complete registration.
+NICK_REG_MAIL_LINE_3
+ If you don't know why this mail is sent to you, please ignore it silently.
+NICK_REG_MAIL_LINE_4
+ PLEASE DON'T ANSWER TO THIS MAIL!
+NICK_REG_MAIL_LINE_5
+ %s administrators.
+NICK_GETPASS_PASSCODE_IS
+ Passcode for %s is %s.
+NICK_FORCE_REG
+ Nickname %s confirmed
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Status automàtic d'operador de canal
+CHAN_LEVEL_AUTOVOICE
+ Mode automàtico +v
+CHAN_LEVEL_AUTOHALFOP
+ Mode automàtic +h
+CHAN_LEVEL_AUTOPROTECT
+ Mode automàtic +a
+CHAN_LEVEL_AUTODEOP
+ Status d'operador de canal inhabilitat
+CHAN_LEVEL_NOJOIN
+ No es possible entra a un canal si esta RESTRINGIT
+CHAN_LEVEL_INVITE
+ Abilitat a utilitzar la comanda INVITE
+CHAN_LEVEL_AKICK
+ Abilitat a utilitzar la comanda AKICK
+CHAN_LEVEL_SET
+ Abilitat a utilitzar la comanda SET (no FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ Abilitat a utilitzar la comanda CLEAR
+CHAN_LEVEL_UNBAN
+ Abilitat a utilitzar la comanda UNBAN
+CHAN_LEVEL_OPDEOP
+ Abilitat a utilitzar la comanda OP/DEOP
+CHAN_LEVEL_ACCESS_LIST
+ Abilitat a veure la lllista de accés
+CHAN_LEVEL_ACCESS_CHANGE
+ Abilitat a modificar la lllista de accés
+CHAN_LEVEL_MEMO
+ Abilitat a llistar/llegir memos del canal
+CHAN_LEVEL_ASSIGN
+ Abilitat a assignar/deassignar un bot
+CHAN_LEVEL_BADWORDS
+ Abilitat a utilitzar la comanda BADWORDS
+CHAN_LEVEL_NOKICK
+ Mai expulsat pels kicks del bot
+CHAN_LEVEL_FANTASIA
+ Abilitat a utilizar comandes de fantasia
+CHAN_LEVEL_SAY
+ Abilitat a utilitzar la comanda SAY i ACT
+CHAN_LEVEL_GREET
+ Missatge de benvinguda mostrat
+CHAN_LEVEL_VOICEME
+ Autorizat a voice/devoice a tu mateix
+CHAN_LEVEL_VOICE
+ Abilitat a utilitzar La comanda VOICE/DEVOICE
+CHAN_LEVEL_GETKEY
+ Abilitat a utilitzar La comanda GETKEY
+CHAN_LEVEL_OPDEOPME
+ Autorizat a op/deop a tu mateix
+CHAN_LEVEL_HALFOPME
+ Autorizat a halfop/dehalfop a tu mateix
+CHAN_LEVEL_HALFOP
+ Abilitat a utilitzar la comanda HALFOP/DEHALFOP
+CHAN_LEVEL_PROTECTME
+ Autorizat a protect/deprotect a tu mateix
+CHAN_LEVEL_PROTECT
+ Abilitat a utilitzar la comanda PROTECT/DEPROTECT
+CHAN_LEVEL_KICKME
+ Autoritzat a expulsar-te a tu mateix
+CHAN_LEVEL_KICK
+ Abilitat a utilitzar la comanda KICK
+CHAN_LEVEL_SIGNKICK
+ Sense firma de kick quant SIGNKICK LEVEL es utilitzat
+CHAN_LEVEL_BANME
+ Autoritzat a banegar-te
+CHAN_LEVEL_BAN
+ Autoritzat a utilitzar la comanda BAN
+CHAN_LEVEL_TOPIC
+ Autoritzat a utilitzar la comanda TOPIC
+CHAN_LEVEL_INFO
+ Autoritzar a utilitzar La comanda INFO amb
+ l'opció ALL
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Aquest canal ha estat registrat amb %s.
+CHAN_NOT_ALLOWED_OP
+ No estas autoritzat al status d'operador del canal a %s.
+CHAN_MAY_NOT_BE_USED
+ Aquest canal esta prohibit.
+CHAN_NOT_ALLOWED_TO_JOIN
+ No estas autoritzat a estar en aquest canal.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER canal clau descripció
+CHAN_REGISTER_DISABLED
+ Ho sento, el registre de canals esta temporalment inhabilitat.
+CHAN_REGISTER_NOT_LOCAL
+ Canals locals no poden ser enregistrats.
+CHAN_MUST_REGISTER_NICK
+ Has de registrar el teu nickname primer. Escriu /msg %s HELP per més informació de com registrar nicknames.
+CHAN_MUST_IDENTIFY_NICK
+ Per favor primer identifica't amb %s, utilitzant la comanda:
+ /msg %s IDENTIFY clau
+CHAN_MAY_NOT_BE_REGISTERED
+ El canal %s no pot ser enregistrat.
+CHAN_ALREADY_REGISTERED
+ El canal %s ja esta enregistrat!
+CHAN_MUST_BE_CHANOP
+ Has de ser un operador de canal per registrar el canal.
+CHAN_REACHED_CHANNEL_LIMIT
+ Ho sento, has arribat al teu límit de %d canals.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Ho sento, has sobrepassat el teu límit de %d canals.
+CHAN_REGISTRATION_FAILED
+ Ho sento, la registració ha fallat.
+CHAN_REGISTERED
+ El canal %s esta registrat sota el teu nickname: %s
+CHAN_PASSWORD_IS
+ La teva clau pel canal es %s - Recorda-la per un us futur.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY canal clau
+CHAN_IDENTIFY_FAILED
+ Ho sento, la identificació ha fallat.
+CHAN_IDENTIFY_SUCCEEDED
+ Clau aceptada - ara tens nivell de fundador a %s.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT canal nickname
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT canal [nickname]
+CHAN_LOGOUT_SUCCEEDED
+ L'usuari %s ha estat desconnectat del canal %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Tots els usuaris identificats han estat desconnectats del canal %s.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP canal
+CHAN_DROP_DISABLED
+ Ho sento, el desenregistrament de canals esta temporalment desabilitat.
+CHAN_DROPPED
+ El canal %s ha estat eliminat.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET canal opció per ametres
+CHAN_SET_DISABLED
+ Ho sento, l'establiment d'Opciós de canal esta temporalment deshAbilitat.
+CHAN_SET_UNKNOWN_OPTION
+ Opció SET %s desconoceguda.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s te masses canals registrats.
+CHAN_FOUNDER_CHANGED
+ El Fundador de %s cambiat a %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Sucessor de %s cambiat a %s.
+CHAN_SUCCESSOR_UNSET
+ Sucessor de %s desabilitat.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s no pot ser el sucessor en el canal %s ja que n'es el fundador.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Ho sento, l'establiment de la clau no ha estat possible.
+CHAN_PASSWORD_CHANGED
+ Clau per a %s canviada.
+CHAN_PASSWORD_CHANGED_TO
+ La clau per a %s canviada a %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ La descripció de %s canviada a%s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ URL per a %s canviada a %s.
+CHAN_URL_UNSET
+ URL per a %s no establerta.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ Adreça e-mail per a %s canviada a %s.
+CHAN_EMAIL_UNSET
+ Adreça e-mail per a %s no establerta.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Missatge d'entrada per a %s canviat.
+CHAN_ENTRY_MSG_UNSET
+ Missatge d'entrada per a %s no establert.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s no es un tipus de ban valid.
+CHAN_SET_BANTYPE_CHANGED
+ Tipus de ban pel canal %s es ara #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Caràcter de Mode %c desconegut i ignorat.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Mode %c ignorat per que no pots ¿¿¿lockerjar-lo???.
+CHAN_SET_MLOCK_L_REQUIRED
+ Has d'utilitzar Mode de lock +l també pel Mode
+ de lock +L.
+CHAN_SET_MLOCK_K_REQUIRED
+ Has d'utilitzar Mode de lock +i tambe pel Mode
+ de lock +K.
+CHAN_MLOCK_CHANGED
+ Mode de lock en el canal %s canviat a %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET canal KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Retenció de topic activat.
+CHAN_SET_KEEPTOPIC_OFF
+ Retenció de topic desactivada.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET canal TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Lock de topic activat.
+CHAN_SET_TOPICLOCK_OFF
+ Lock de topic desactivat.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET canal PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Opció de pau Activada.
+CHAN_SET_PEACE_OFF
+ Opció de pau desactivada.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET canal PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Opció de privacitat activada.
+CHAN_SET_PRIVATE_OFF
+ Opció de privacitat desactivada.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET canal SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Seguretat d'ops activada.
+CHAN_SET_SECUREOPS_OFF
+ Seguretat d'ops desactivada.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET canal SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Seguretat de fundador activada.
+CHAN_SET_SECUREFOUNDER_OFF
+ Seguretat de fundador desactivada.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET canal RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ accés restringiy activat.
+CHAN_SET_RESTRICTED_OFF
+ accés restringit desactivat.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET canal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Opció de seguretat activada.
+CHAN_SET_SECURE_OFF
+ Opció de seguretat desactivada.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET canal SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Opció de kick signat activada.
+CHAN_SET_SIGNKICK_LEVEL
+ Opció de kick signat activada, però depen del nivell de
+ l'usuari que utilitzi la comanda.
+CHAN_SET_SIGNKICK_OFF
+ Opció de kick firmat desactivada.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET canal OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Opció Op-notice activada.
+CHAN_SET_OPNOTICE_OFF
+ Opció Op-notice desactivada.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET canal XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ El sistema de llistes xOP ara Engegat.
+CHAN_SET_XOP_OFF
+ El sistema de llistes xOP ara Aturat.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET canal NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ El canal %s no caducara.
+CHAN_SET_NOEXPIRE_OFF
+ El canal %s caducara.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Ho sento, sols pots tenir %d instàncies de AOP/SOP/VOP
+ en un canal.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ No pots utilitzar aquesta comanda. Utilitza la comanda ACCESS.
+ Escriu /msg %s HELP ACCESS per més informació.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP canal {ADD|DEL|LIST|CLEAR} [nick | instància]
+CHAN_AOP_DISABLED
+ Ho sento, la modificació de la llista AOP de canals esta
+ temporalment deshabilitada.
+CHAN_AOP_NICKS_ONLY
+ La llista de AOP de canals nomès pot contenir nicks
+ registrats.
+CHAN_AOP_ADDED
+ %s afegit a la llista AOP de %s.
+CHAN_AOP_MOVED
+ %s moved to %s AOP list.
+CHAN_AOP_NO_SUCH_ENTRY
+ No existeix la instància (#%d) a la llista AOP de %s.
+CHAN_AOP_NOT_FOUND
+ %s no trobat a la llista AOP de %s.
+CHAN_AOP_NO_MATCH
+ No existeixen instàncies coincidents a la llista AOP de %s.
+CHAN_AOP_DELETED
+ %s esborrat de la llista AOP de %s.
+CHAN_AOP_DELETED_ONE
+ 1 instància esborrada de la llista AOP de %s.
+CHAN_AOP_DELETED_SEVERAL
+ %d instàncies esborrades de la llista AOP de %s.
+CHAN_AOP_LIST_EMPTY
+ La llista AOP de %s esta buida.
+CHAN_AOP_LIST_HEADER
+ Llista AOP per a %s:
+ Num Nick
+CHAN_AOP_CLEAR
+ La llista AOP de canals ha estat netegada.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP canal {ADD|DEL|LIST|CLEAR} [nick | llista]
+CHAN_HOP_DISABLED
+ Ho sento, la modificació de llistes HOP de canals esta
+ temporalment deshabilitada.
+CHAN_HOP_NICKS_ONLY
+ Llistes HOP de canals sols pot tenir nicks registrats.
+CHAN_HOP_ADDED
+ %s afegit a la llista HOP de %s.
+CHAN_HOP_MOVED
+ %s moved to %s HOP list.
+CHAN_HOP_NO_SUCH_ENTRY
+ No existeix la instància (#%d) a la llista HOP de %s.
+CHAN_HOP_NOT_FOUND
+ %s no trobat a la llista HOP de %s.
+CHAN_HOP_NO_MATCH
+ No existeixen instàncies coincidents a la llista HOP de %s.
+CHAN_HOP_DELETED
+ %s esborrat de la llista HOP de %s.
+CHAN_HOP_DELETED_ONE
+ 1 instància esborrada de la llista HOP de %s.
+CHAN_HOP_DELETED_SEVERAL
+ %d instàncies esborrades de la llista HOP de %s.
+CHAN_HOP_LIST_EMPTY
+ La llista HOP de %s esta buida.
+CHAN_HOP_LIST_HEADER
+ Llista HOP per a %s:
+ Num Nick
+CHAN_HOP_CLEAR
+ La llista HOP de canals ha estat netegada.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP canal {ADD|DEL|LIST|CLEAR} [nick | llista]
+CHAN_SOP_DISABLED
+ Ho sento, la modificació de la llista SOP de canals esta
+ temporalment deshabilitada.
+CHAN_SOP_NICKS_ONLY
+ Llistes SOP de canals sols pot tenir nicks registrats.
+CHAN_SOP_ADDED
+ %s afegit a la llista SOP de %s.
+CHAN_SOP_MOVED
+ %s moved to %s SOP list.
+CHAN_SOP_NO_SUCH_ENTRY
+ No existeix la instància (#%d) a la llista SOP de %s.
+CHAN_SOP_NOT_FOUND
+ %s no trobat a la llista SOP de %s.
+CHAN_SOP_NO_MATCH
+ No existeixen instàncies coincidents a la llista SOP de %s.
+CHAN_SOP_DELETED
+ %s esborrat de la llista SOP de %s.
+CHAN_SOP_DELETED_ONE
+ 1 instància esborrada de la llista SOP de %s.
+CHAN_SOP_DELETED_SEVERAL
+ %d instàncies esborrades de la llista SOP de %s.
+CHAN_SOP_LIST_EMPTY
+ La llista SOP de %s esta buida.
+CHAN_SOP_LIST_HEADER
+ Llista SOP per a %s:
+ Num Nick
+CHAN_SOP_CLEAR
+ La llista HOP de canals ha estat netegada.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP canal {ADD|DEL|LIST|CLEAR} [nick | llista]
+CHAN_VOP_DISABLED
+ Ho sento, la modificació de la llista VOP de canals esta
+ temporalment deshabilitada.
+CHAN_VOP_NICKS_ONLY
+ Llistes VOP de canals sols pot tenir nicks registrats.
+CHAN_VOP_ADDED
+ %s afegit a la llista VOP de %s.
+CHAN_VOP_MOVED
+ %s moved to %s VOP list.
+CHAN_VOP_NO_SUCH_ENTRY
+ No existeix la instància (#%d) a la llista VOP de %s.
+CHAN_VOP_NOT_FOUND
+ %s no trobat a la llista VOP de %s.
+CHAN_VOP_NO_MATCH
+ No existeixen instàncies coincidents a la llista VOP de %s.
+CHAN_VOP_DELETED
+ %s esborrat de la llista VOP de %s.
+CHAN_VOP_DELETED_ONE
+ 1 instància esborrada de la llista VOP de %s.
+CHAN_VOP_DELETED_SEVERAL
+ %d instàncies esborrades de la llista VOP de %s.
+CHAN_VOP_LIST_EMPTY
+ La llista VOP de %s esta buida.
+CHAN_VOP_LIST_HEADER
+ Llista VOP per a %s:
+ Num Nick
+CHAN_VOP_CLEAR
+ La llista HOP de canals ha estat netegada.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS canal {ADD|DEL|LIST|CLEAR} [nick [nivell] | llista]
+CHAN_ACCESS_XOP
+ No pots utilitzar aquest comanda.
+ Utilitza les comandes AOP, SOP i VOP.
+ Escriu /msg %s HELP comanda per a més informació.
+CHAN_ACCESS_DISABLED
+ Ho sento, la modificació d'accés a canals esta temporalment inabilitada.
+CHAN_ACCESS_LEVEL_NONZERO
+ El nivell de accés no pot ser zero.
+CHAN_ACCESS_LEVEL_RANGE
+ El nivell d'accés ha de ser entre %d i %d inclosos.
+CHAN_ACCESS_NICKS_ONLY
+ Las llistes de accés a canals sols pot contenir nicks registrats.
+CHAN_ACCESS_REACHED_LIMIT
+ Ho sento, sols pots tenir %d instàncies d'accés en un determinat canal.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Nivell d'accés per a %s en %s no cambiada de %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Nivell d'accés per a %s en %s cambiada a %d.
+CHAN_ACCESS_ADDED
+ %s afegit a la llista d'accés de %s amb nivel %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ No existeix (#%d) a la llista d'accés de %s.
+CHAN_ACCESS_NOT_FOUND
+ %s no trobat a la llista d'accés de %s.
+CHAN_ACCESS_NO_MATCH
+ No hi ha instàncies que concordin a la llista d'accés de %s .
+CHAN_ACCESS_DELETED
+ %s esborrat de la llista d'accés de %s.
+CHAN_ACCESS_DELETED_ONE
+ 1 instància esborrada de la llista d'accés de %s.
+CHAN_ACCESS_DELETED_SEVERAL
+ %d instàncies esborrades de la llista d'accés de %s.
+CHAN_ACCESS_LIST_EMPTY
+ La llista d'accés de %s esta buida.
+CHAN_ACCESS_LIST_HEADER
+ Llista d'accés per a %s:
+ Num Niv Nick
+CHAN_ACCESS_LIST_FOOTER
+ fi de llista d'accés.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ La llista d'accés pel canal ha estat netegada.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK canal {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-o-mascara] [rao]
+CHAN_AKICK_DISABLED
+ Ho sento, la modificació de kicks automàtics a canals esta temporalment inabilitada.
+CHAN_AKICK_ALREADY_EXISTS
+ %s ja esta present a la llista de kick automàtic en el canal %s.
+CHAN_AKICK_REACHED_LIMIT
+ Ho sento, sols pots tenir %d mascaras per a kicks automàtics a un canal.
+CHAN_AKICK_ADDED
+ %s afegit a la llista de kicks automàtics en el canal %s.
+CHAN_AKICK_NO_SUCH_ENTRY
+ La instància (#%d) no existeix a la llista de kicks automàtics en el canal %s.
+CHAN_AKICK_NOT_FOUND
+ %s no trobat a la llista de kicks automàtics en el canal %s.
+CHAN_AKICK_NO_MATCH
+ No existeixen instàncies que concordin a la llista de kicks automàtics en el canal %s.
+CHAN_AKICK_STUCK
+ %s esta ara sempre actiu en el canal %s.
+CHAN_AKICK_UNSTUCK
+ %s ja no esta sempre actiu en el canal %s.
+CHAN_AKICK_DELETED
+ %s esborrat de la llista de kicks automàtics del canal %s.
+CHAN_AKICK_DELETED_ONE
+ 1 instància esborrada de la llista de kicks automàtics del canal %s.
+CHAN_AKICK_DELETED_SEVERAL
+ %d instàncies esborrades de la llista de kicks automàtics del canal %s.
+CHAN_AKICK_LIST_EMPTY
+ La llista de kicks automàtics del canal %s esta buida.
+CHAN_AKICK_LIST_HEADER
+ Llista de kicks automàtics pel canal %s:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (per %s en %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (enganxat) (per %s en %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE en %s completa; %d usuaris afectats.
+CHAN_AKICK_CLEAR
+ La llista de kicks automàtics ha estat netegada.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS canal {SET | DIS[ABLE] | LIST | RESET} [item [nivell]]
+CHAN_LEVELS_XOP
+ Aquesta comanda es inservible en aquest mode.
+CHAN_LEVELS_RANGE
+ El nivell ha d'estar entre %d i %d inclosos.
+CHAN_LEVELS_CHANGED
+ Nivell per a %s en el canal %s cambiat a %d.
+CHAN_LEVELS_UNKNOWN
+ Opció %s no coneguda. Escriu /msg %s HELP LEVELS DESC per a una llista de opcións valides.
+CHAN_LEVELS_DISABLED
+ %s inhabilitat(s) en el canal %s.
+CHAN_LEVELS_LIST_HEADER
+ Opcions del nivell d'accés pel canal %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (inhabilitat)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (nomès el fundador)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ Nivells d'accés per a %s canviats als valors originals.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO canal [ALL]
+CHAN_INFO_HEADER
+ Informació pel canal %s:
+CHAN_INFO_FOUNDER
+ Fundador: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Fundador: %s
+CHAN_INFO_SUCCESSOR
+ Successor: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Successor: %s
+CHAN_INFO_DESCRIPTION
+ Descripció: %s
+CHAN_INFO_ENTRYMSG
+ Missatge d'entrada: %s
+CHAN_INFO_TIME_REGGED
+ Registrat: %s
+CHAN_INFO_LAST_USED
+ Últim cop utilitzat: %s
+CHAN_INFO_LAST_TOPIC
+ Últim tòpic: %s
+CHAN_INFO_TOPIC_SET_BY
+ Tòpic establert per: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ Adreça e-mail: %s
+CHAN_INFO_BANTYPE
+ Tipus de ban: %d
+CHAN_INFO_OPTIONS
+ Opcions: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Retenció de tòpic
+CHAN_INFO_OPT_OPNOTICE
+ Notícia de OP
+CHAN_INFO_OPT_PEACE
+ Pau
+CHAN_INFO_OPT_PRIVATE
+ Privat
+CHAN_INFO_OPT_RESTRICTED
+ accés restringit
+CHAN_INFO_OPT_SECURE
+ Segur
+CHAN_INFO_OPT_SECUREOPS
+ Ops Segurs
+CHAN_INFO_OPT_SECUREFOUNDER
+ Fundador Segur
+CHAN_INFO_OPT_SIGNKICK
+ Kicks Signats
+CHAN_INFO_OPT_TOPICLOCK
+ Lock de tòpic
+CHAN_INFO_OPT_XOP
+ Sistema de llistes xOP
+CHAN_INFO_OPT_NONE
+ Cap
+CHAN_INFO_MODE_LOCK
+ Mode de lock: %s
+CHAN_INFO_NO_EXPIRE
+ Aquest canal no caducara.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST patró
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST patró [FORBIDDEN] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Llista de instàncies concordant a %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Fi de la llista - %d/%d concordància(es) mostrada(es).
+
+# CLIST responses
+CHAN_INVITE_SYNTAX
+ INVITE canal
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN canal
+CHAN_UNBANNED
+ Has estat desbanegat de %s.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC canal [tòpic]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR canal Modes-a-netegar
+CHAN_CLEARED_BANS
+ Tots els bans del canal %s han estat esborrats.
+CHAN_CLEARED_EXCEPTS
+ Tots els excepts del canal %s han estat esborrats.
+CHAN_CLEARED_MODES
+ Tots els modes en el canal %s han estat reestablerts.
+CHAN_CLEARED_OPS
+ Mode +o ha estat reestablert del canal %s.
+CHAN_CLEARED_VOICES
+ Mode +v ha estat eliminat del canal %s.
+CHAN_CLEARED_USERS
+ Tots els usuaris han estat kickegats del canal %s.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS canal
+CHAN_GETPASS_UNAVAILABLE
+ Comanda GETPASS no permessa per que encriptació esta en ús.
+CHAN_GETPASS_PASSWORD_IS
+ La clau pel canal %s es %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS canal
+CHAN_SENDPASS_UNAVAILABLE
+ Comanda SENDPASS no permessa per que encriptació esta en ús.
+CHAN_SENDPASS_SUBJECT
+ Clau del canal (%s)
+CHAN_SENDPASS_HEAD
+ Hola,
+CHAN_SENDPASS_LINE_1
+ Has sol.licitat rebre la clau del canal %s per e-mail.
+CHAN_SENDPASS_LINE_2
+ La clau es %s. Per raons de seguretat hauries de cambiar-la quant rebis aquest mail.
+CHAN_SENDPASS_LINE_3
+ Si no saps per que has rebut aquest mail, per favor ignora'l.
+CHAN_SENDPASS_LINE_4
+ Per favor NO RESPONGUIS a aquest email!
+CHAN_SENDPASS_LINE_5
+ Administradors de %s.
+CHAN_SENDPASS_OK
+ La clau de %s ha estat enviada.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID canal [raó]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID canal raó
+CHAN_FORBID_SUCCEEDED
+ Canal %s ara prohibit.
+CHAN_FORBID_FAILED
+ Impossible prohibir el canal %s!
+
+# Misc responses
+CHAN_FORBID_REASON
+ This channel has been forbidden.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND channel [reason]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND channel reason
+CHAN_SUSPEND_SUCCEEDED
+ Channel %s is now suspended.
+CHAN_SUSPEND_FAILED
+ Couldn't suspended channel %s!
+CHAN_SUSPEND_REASON
+ This channel has been suspended.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND channel
+CHAN_UNSUSPEND_ERROR
+ No # found in front of channel name.
+CHAN_UNSUSPEND_SUCCEEDED
+ Channel %s is now released.
+CHAN_UNSUSPEND_FAILED
+ Couldn't release channel %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s matches an except on %s and cannot be banned until the except have been removed.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Tens 1 memo nou.
+MEMO_HAVE_NEW_MEMOS
+ Tens %d memos nous.
+MEMO_TYPE_READ_LAST
+ Escriu /msg %s READ LAST per llegir el teu últim memo.
+MEMO_TYPE_READ_NUM
+ Escriu /msg %s READ %d per a llegir-lo.
+MEMO_TYPE_LIST_NEW
+ Escriu /msg %s LIST NEW per a llistar els teus memos.
+MEMO_AT_LIMIT
+ Advertència: Has assolit el màxim numero de memos (%d). No podras rebre mes memos fins que esborris alguns dels existents.
+MEMO_OVER_LIMIT
+ Advertència: Has sobrepassat el màximo numero de memos (%d). Et resultara impossible rebre més memos fins que esborris alguns dels existents.
+MEMO_X_MANY_NOTICE
+ There are %d memos on channel %s.
+MEMO_X_ONE_NOTICE
+ There is %d memo on channel %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ There is a new memo on channel %s.
+ Type /msg %s READ %s %d to read it.
+MEMO_NEW_MEMO_ARRIVED
+ Tens un nou memo de %s.
+ Escriu /msg %s READ %d per a llegir-lo.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ No tens memos.
+MEMO_X_HAS_NO_MEMOS
+ %s no te memos.
+MEMO_DOES_NOT_EXIST
+ El memo %d no existeix!
+MEMO_LIST_NOT_FOUND
+ No existeixen memos que concordin.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | canal} text
+MEMO_SEND_DISABLED
+ Ho sento, l'enviament de memos esta temporalment inhabilitat.
+MEMO_SEND_PLEASE_WAIT
+ Per favor espera %d segons abans d'utilizar la comanda SEND un altre cop.
+MEMO_X_GETS_NO_MEMOS
+ %s no pot rebre memos.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s actualment te molts memos i no pot rebre'n mes.
+MEMO_SENT
+ Memo enviat a %s.
+
+# CANCEL responses
+MEMO_MASS_SENT
+ A massmemo has been sent to all registered users.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | canal}
+MEMO_CANCEL_DISABLED
+ Ho sento, la cancel.lació de memos esta temporalment inabilitada.
+MEMO_CANCEL_NONE
+ Cap memo pot ser cancelat.
+MEMO_CANCELLED
+ Ultim memo enviat a %s va ser cancel.lat.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [canal] [llista | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ No tens memos nous.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s no te memos nous.
+MEMO_LIST_MEMOS
+ Memos per a %s. per a llegir-los escriu: /msg %s READ numero
+MEMO_LIST_NEW_MEMOS
+ Nous memos per a %s. per a llegir-los escriu: /msg %s READ numero
+MEMO_LIST_CHAN_MEMOS
+ Memos per a %s. per a llegir-los escriu: /msg %s READ %s numero
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nous memos per a %s. Per a llegir-los escriu: /msg %s READ %s numero
+MEMO_LIST_HEADER
+ Num De Data/Hora
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [canal] {llista | LAST | NEW}
+MEMO_HEADER
+ Memo %d de %s (%s). per a esborrar-lo escriu: /msg %s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d de %s (%s). per a esborrar-lo escriu: /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [canal] {numero | llista | ALL}
+MEMO_DELETED_NONE
+ Cap memo fou esborrat.
+MEMO_DELETED_ONE
+ Memo %d ha estat esborrat.
+MEMO_DELETED_SEVERAL
+ Els memos %s han estat esborrats.
+MEMO_DELETED_ALL
+ Tots els teus memos han estat esborrats.
+
+# SET responses
+MEMO_CHAN_DELETED_ALL
+ All memos for channel %s have been deleted.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET Opció parametres
+MEMO_SET_DISABLED
+ Ho sento, l'establiment d'opcions per a memos esta temporalment inhabilitat.
+MEMO_SET_UNKNOWN_OPTION
+ Opció SET %s desconeguda.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s ara et notificara dels teus memos quant et conectis i quant et siguin enviats.
+MEMO_SET_NOTIFY_LOGON
+ %s ara et notificara dels teus memos quant et conectis o treguis el teu /AWAY.
+MEMO_SET_NOTIFY_NEW
+ %s ara te notificara dels teus memos quant se t'enviin.
+MEMO_SET_NOTIFY_OFF
+ %s no t'enviara cap notificació dels teus memos.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [canal] límit
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [usuari | canal] {límit | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ No estas autoritzat a canviar el teu límit de memos.
+MEMO_SET_LIMIT_FORBIDDEN
+ El límit de memos per a %s no pot ser canviat.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ No pots establir el teu límit de memos a mes de %d.
+MEMO_SET_LIMIT_TOO_HIGH
+ No pots establir el límite de memos per %s mes de %d.
+MEMO_SET_LIMIT_OVERFLOW
+ Límit de memos molt alt; limitant-lo a %d.
+MEMO_SET_YOUR_LIMIT
+ El teu límite de memos ha estat establert a %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ No et sera possible rebre més memos.
+MEMO_UNSET_YOUR_LIMIT
+ El teu límit de memos ha estat deshabilitat.
+MEMO_SET_LIMIT
+ Límite de memos per a %s establert a %d.
+MEMO_SET_LIMIT_ZERO
+ Límit de memos per a %s establert a 0.
+MEMO_UNSET_LIMIT
+ Límit de memos per a %s deshabilitat.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [canal]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | canal]
+MEMO_INFO_NO_MEMOS
+ No tens memos.
+MEMO_INFO_MEMO
+ Tens 1 memo.
+MEMO_INFO_MEMO_UNREAD
+ Tens 1 memo i encara no ha estat llegit.
+MEMO_INFO_MEMOS
+ Tens %d memos.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Tens %d memos, dels quals 1 encara no ha estat llegit.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Tens %d memos, dels quals %d encara no han estat llegits.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Tens %d memos, cap d'ells llegit.
+MEMO_INFO_LIMIT
+ El teu límit de memos es %d.
+MEMO_INFO_HARD_LIMIT
+ El teu límit de memos es %d i no pot ser canviat.
+MEMO_INFO_LIMIT_ZERO
+ El teu límit de memos es 0; no rebràs nous memos.
+MEMO_INFO_HARD_LIMIT_ZERO
+ El teu límit de memos es 0; no rebràs nous memos. No pots cambiar aquest límit.
+MEMO_INFO_NO_LIMIT
+ No tens límit en el numero de memos que pots mantenir.
+MEMO_INFO_NOTIFY_OFF
+ No seràs notificat per memos nous.
+MEMO_INFO_NOTIFY_ON
+ Seràs notificat per nous memos quant et conectis i quant se t'enviin.
+MEMO_INFO_NOTIFY_RECEIVE
+ Seràs notificat quan els memos nous se t'enviin.
+MEMO_INFO_NOTIFY_SIGNON
+ Seràs notificat per memos nous quant et conectis.
+MEMO_INFO_X_NO_MEMOS
+ %s no te memos.
+MEMO_INFO_X_MEMO
+ %s te 1 memo.
+MEMO_INFO_X_MEMO_UNREAD
+ %s actualment te 1 memo i encara no ha estat llegit.
+MEMO_INFO_X_MEMOS
+ %s actualment te %d memos.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s actualment te %d memos, dels quals 1 encara no ha estat llegit.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s actualment te %d memos, dels quals %d encara no han estat llegits.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s actualment te %d memos, dels quals cap ha estat llegit.
+MEMO_INFO_X_LIMIT
+ El límit de memos per a %s es %d.
+MEMO_INFO_X_HARD_LIMIT
+ El límit de memos per a %s es %d, i no pot ser canviat.
+MEMO_INFO_X_NO_LIMIT
+ %s no te límit per a memos.
+MEMO_INFO_X_NOTIFY_OFF
+ %s no es notificat per memos nous.
+MEMO_INFO_X_NOTIFY_ON
+ %s es notificat per memos nous quant es connecta i quant li són enviats.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s es notificat quant nous memos li són enviats.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s es notificat de nous memos quant es connecta.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ El bot %s no existeix.
+BOT_NOT_ASSIGNED
+ Has d'assignar un bot al canal abans de poder utilitzar aquesta comanda.
+ Escriu /msg %S HELP ASSIGN per a més informació.
+BOT_NOT_ON_CHANNEL
+ El bot no esta al canal %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ No utilitzis la paraula %s en aquest canal!
+BOT_REASON_BADWORD_GENTLE
+ Cuida el teu llenguatge!
+BOT_REASON_BOLD
+ No utilitzis negreta en aquest canal!
+BOT_REASON_CAPS
+ Desactiva les majuscules!
+BOT_REASON_COLOR
+ No utilitzis colors en aquest canal!
+BOT_REASON_FLOOD
+ Para de floodejar!
+BOT_REASON_REPEAT
+ No repeteixis com l'allioli!
+BOT_REASON_REVERSE
+ No utilitzis reversos en aquest canal!
+BOT_REASON_UNDERLINE
+ No utilitzis subratllats en aquest canal!
+
+# !seen replies
+BOT_SEEN_BOT
+ M'has trobat %s!
+BOT_SEEN_YOU
+ Cercant-te a tu mateix, eh %s?
+BOT_SEEN_ON_CHANNEL
+ %s esta en el canal en aquests instants!
+BOT_SEEN_ON_CHANNEL_AS
+ %s esta en el canal en aquests instantes (com %s) !
+BOT_SEEN_ON
+ %s va ser vist aqui fa %s.
+BOT_SEEN_NEVER
+ Mai he vist a %s en aquest canal.
+BOT_SEEN_UNKNOWN
+ Mai he visto a %s.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick usuari host nom-real
+ BOT CHANGE nick-antic nick-nou [usuari [host [nom-real]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ El bot %s ja existeix.
+BOT_BOT_CREATION_FAILED
+ Ho sento, la creació de bot ha fallat
+BOT_BOT_READONLY
+ Ho sento, la modificació de bots esta temporalment inabilitada.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) afegit a la llista de bots.
+BOT_BOT_ANY_CHANGES
+ La informació antiga es igual a la nova.
+BOT_BOT_CHANGED
+ El bot %s ha estat canviat a %s!%s@%s (%s)
+BOT_BOT_DELETED
+ El bot %s ha estat esborrat.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Llista de bots:
+BOT_BOTLIST_PRIVATE_HEADER
+ Bots reservats a operadors de IRC:
+BOT_BOTLIST_FOOTER
+ %d bots disponibles.
+BOT_BOTLIST_EMPTY
+ No hi ha bots disponibles en aquest moment.
+ Demana-li a un administrador de serveis que en fagi un!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN canal nick
+BOT_ASSIGN_READONLY
+ Ho sento, el assignament de bots esta temporalment inhabilitat.
+BOT_ASSIGN_ALREADY
+ Bot %s is already assigned to channel %s.
+BOT_ASSIGN_ASSIGNED
+ El bot %s ha estat assignat al canal %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN canal
+BOT_UNASSIGN_UNASSIGNED
+ Ja no hi ha un bot assignat a %s.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {canal | nick}
+BOT_INFO_NOT_FOUND
+ %s no és un bot valid o un canal registrat.
+BOT_INFO_BOT_HEADER
+ Informació pel bot %s:
+BOT_INFO_BOT_MASK
+ Mascara : %s@%s
+BOT_INFO_BOT_REALNAME
+ Nom real : %s
+BOT_INFO_BOT_CREATED
+ Creat : %s
+BOT_INFO_BOT_USAGE
+ Utilitzat a : %d canal(s)
+BOT_INFO_BOT_OPTIONS
+ Opcions : %s
+BOT_INFO_OPT_PRIVATE
+ Privat
+BOT_INFO_CHAN_HEADER
+ Informació pel canal %s:
+BOT_INFO_CHAN_BOT
+ Nick del bot : %s
+BOT_INFO_CHAN_BOT_NONE
+ Nick del bot : Encara no assignat.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Kicker per paraules malsonants : %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Kicker per paraules malsonants : %s (%d kick(s) per a ban)
+BOT_INFO_CHAN_KICK_BOLDS
+ Kicker per negretes : %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Kicker per negretes : %s (%d kick(s) per a ban)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Caps kicker : %s (mínim %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Kicker per majuscules : %s (%d kick(s) per a ban; mínim %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Kicker per majuscules : %s
+BOT_INFO_CHAN_KICK_COLORS
+ Kicker per colors : %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Kicker per colors : %s (%d kick(s) per a ban)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Kicker per flood : %s (%d linees en %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Kicker per flood : %s (%d kick(s) per a ban; %d linees en %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Kicker per flood : %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Kicker per repetició : %s (%d vegades)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Kicker per repetició : %s (%d kick(s) per a ban; %d vegades)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Kicker per repetició : %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Kicker per inversos : %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Kicker per inversos : %s (%d kick(s) per a ban)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Kicker per subrallats : %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Kicker per subratllats : %s (%d kick(s) per a ban)
+BOT_INFO_ACTIVE
+ Activada
+BOT_INFO_INACTIVE
+ Desactivada
+BOT_INFO_CHAN_OPTIONS
+ Opcions : %s
+BOT_INFO_OPT_DONTKICKOPS
+ Protecció de Ops
+BOT_INFO_OPT_DONTKICKVOICES
+ Protecció de Voices
+BOT_INFO_OPT_FANTASY
+ Fantasia
+BOT_INFO_OPT_GREET
+ Salutació
+BOT_INFO_OPT_NOBOT
+ Sense bot
+BOT_INFO_OPT_SYMBIOSIS
+ Simbiosis
+BOT_INFO_OPT_NONE
+ Cap
+
+# SET responses
+BOT_SET_SYNTAX
+ SET canal Opció establiments
+BOT_SET_DISABLED
+ Ho sento, l'establiment d'opcions per a bot esta temporalment inhabilitat
+BOT_SET_UNKNOWN
+ Opció %s desconeguda.
+ Escriu /msg %S HELP SET per a més informació.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET canal DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Bot no kickejara ops en el canal %s.
+BOT_SET_DONTKICKOPS_OFF
+ Bot kickejara ops en el canal %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET canal DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Bot no kickejara voices en el canal %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Bot kickejara voices en el canal %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET canal FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Mode fantasia ara activada en el canal %s.
+BOT_SET_FANTASY_OFF
+ Mode fantasia ara desactivat en el canal %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET canal GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Mode salutació ara activat en el canal %s.
+BOT_SET_GREET_OFF
+ Mode salutació ara desactivat en el canal %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET canal NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ Mode no bot ara activat en el canal %s.
+BOT_SET_NOBOT_OFF
+ Mode no bot ara desactivat en el canal %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET canal PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Mode privado del bot %s esta ara activat.
+BOT_SET_PRIVATE_OFF
+ Mode privado del bot %s esta ara desactivat.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET canal SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ Mode Simbiosis ara activat en el canal %s.
+BOT_SET_SYMBIOSIS_OFF
+ Mode Simbiosis ara desactivat en el canal %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK canal opció {ON|OFF} [establiments]
+BOT_KICK_DISABLED
+ Ho sento, la configuració de kicker esta temporalment inabilitada.
+BOT_KICK_UNKNOWN
+ Opció %s desconeguda.
+ Escriu /msg %S HELP KICK per a més informació
+BOT_KICK_BAD_TTB
+ %s no pot ser pres com vegades a banegar
+
+BOT_KICK_BADWORDS_ON
+ El bot ara kickejara paraules malsonants. Utilitza la comanda BADWORDS
+ per a afegir o treure paraules.
+BOT_KICK_BADWORDS_ON_BAN
+ El bot ara kickejara paraules malsonants, i banejara després de
+ %d kicks al mateix usuari. Utilitza la comanda BADWORDS
+ per a afegir o treure paraules.
+BOT_KICK_BADWORDS_OFF
+ El bot ja no kickejara paraules malsonants.
+BOT_KICK_BOLDS_ON
+ El bot ara kickjeara negretes.
+BOT_KICK_BOLDS_ON_BAN
+ El bot ara kickjeara negretes, i banejara després de
+ %d kicks al mateix usuari.
+BOT_KICK_BOLDS_OFF
+ El bot ja no kickejara negretes.
+BOT_KICK_CAPS_ON
+ El bot ara kickejara majuscules (han de ser al menys
+ %d caràcters i %d%% del missatge senser).
+BOT_KICK_CAPS_ON_BAN
+ El bot ara kickejara majusculas (han de ser al menys
+ %d caràcters i %d%% del missatge senser), i banegara
+ després de %d kicks al mateix usuari.
+BOT_KICK_CAPS_OFF
+ El bot ja no kickejara majuscules.
+BOT_KICK_COLORS_ON
+ El bot ara kickejara colors.
+BOT_KICK_COLORS_ON_BAN
+ El bot ara kickejara colors, i banejara després de %d
+ kicks al mateix usuari.
+BOT_KICK_COLORS_OFF
+ El bot ja no kickejara colors.
+BOT_KICK_FLOOD_ON
+ El bot ara kickejara flood (%d linees en %d segons).
+BOT_KICK_FLOOD_ON_BAN
+ El bot ara kickejara flood (%d linees in %d segons), i
+ banejara després de %d kicks al mateix usuari.
+BOT_KICK_FLOOD_OFF
+ El bot ja no kickejara flood.
+BOT_KICK_REPEAT_ON
+ El bot ara kickejara repeticions (usuaris que repeteixin %d vegades
+ el mateix).
+BOT_KICK_REPEAT_ON_BAN
+ El bot ara kickejara repeticions (usuaris que repeteixin %d vegades
+ el mateix), i banejara després de %d
+ kicks al mateix usuari.
+BOT_KICK_REPEAT_OFF
+ El bot ja no kickejara repeticions.
+BOT_KICK_REVERSES_ON
+ El bot ara kickejara reversos.
+BOT_KICK_REVERSES_ON_BAN
+ El bot ara kickejara reversos, i banejara després de %d
+ kicks al mateix usuari.
+BOT_KICK_REVERSES_OFF
+ El bot ja no kickejara reversos.
+BOT_KICK_UNDERLINES_ON
+ El bot ara kickejara subratllats.
+BOT_KICK_UNDERLINES_ON_BAN
+ El bot ara kickejara subratllats, i banejara després de %d
+ kicks al mateix usuari.
+BOT_KICK_UNDERLINES_OFF
+ El bot ja no kickejara subratllats.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS canal {ADD|DEL|LIST|CLEAR} [paraula | llista] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Ho sento, la llista de paraules malsonants per a canals esta temporalment inabilitada.
+BOT_BADWORDS_REACHED_LIMIT
+ Ho sento, sols pots tenir %d paraules malsonants en un canal.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s ja existeix a la llista de paraules malsonants de %s.
+BOT_BADWORDS_ADDED
+ %s afegida a la llista de paraules malsonants de %s.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ No existeix la instància (#%d) a la llista de paraules malsonants de %s.
+BOT_BADWORDS_NOT_FOUND
+ %s no trobada a la llista de paraules malsonants de %s.
+BOT_BADWORDS_NO_MATCH
+ No existeixen paraules que concordin a la llista de paraules malsonants de %s.
+BOT_BADWORDS_DELETED
+ %s esborrada de la llista de paraules malsonants de %s.
+BOT_BADWORDS_DELETED_ONE
+ 1 paraula esborrada de la llista de paraules malsonants de %s.
+BOT_BADWORDS_DELETED_SEVERAL
+ %d paraules esborrades de la llista de paraules malsonants de %s.
+BOT_BADWORDS_LIST_EMPTY
+ La llista de paraules malsonants de %s esta buida.
+BOT_BADWORDS_LIST_HEADER
+ llista de paraules malsonants per a %s:
+ Num Paraula Tipo
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ La llista de paraules malsonants esta ara buida.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY canal text
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT canal text
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_EXCEPT
+ User matches channel except.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_BAD_NICK
+ Bot Nicks may only contain valid nick characters.
+BOT_BAD_HOST
+ Bot Hosts may only contain valid host characters.
+BOT_BAD_IDENT
+ Bot Idents may only contain valid characters.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Els serveis no han pogut canviar Modes. Estan ben configurats els teus servidors?
+OPER_BOUNCY_MODES_U_LINE
+ Els serveis no han pogut canviar Modes. Estan les linees U: dels teus servidors configurades correctament?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL missatge
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Opció STATS %s desconeguda.
+OPER_STATS_CURRENT_USERS
+ Actuals usuaris: %d (%d ops)
+OPER_STATS_MAX_USERS
+ Màxim numero d'usuaris: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Serveis amunt %d dies, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Serveis amunt %d dies, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Serveis amunt %d hores, %d minuts
+OPER_STATS_UPTIME_HM1S
+ Serveis amunt %d hores, %d minuts
+OPER_STATS_UPTIME_H1MS
+ Serveis amunt %d hores, %d minut
+OPER_STATS_UPTIME_H1M1S
+ Serveis amunt %d hores, %d minut
+OPER_STATS_UPTIME_1HMS
+ Serveis amunt %d hora, %d minuts
+OPER_STATS_UPTIME_1HM1S
+ Serveis amunt %d hora, %d minuts
+OPER_STATS_UPTIME_1H1MS
+ Serveis amunt %d hora, %d minut
+OPER_STATS_UPTIME_1H1M1S
+ Serveis amunt %d hora, %d minut
+OPER_STATS_UPTIME_MS
+ Serveis amunt %d minuts, %d segons
+OPER_STATS_UPTIME_M1S
+ Serveis amunt %d minuts, %d segon
+OPER_STATS_UPTIME_1MS
+ Serveis amunt %d minut, %d segons
+OPER_STATS_UPTIME_1M1S
+ Serveis amunt %d minut, %d segon
+OPER_STATS_BYTES_READ
+ Bytes llegits : %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Bytes escrits : %5d kB
+OPER_STATS_USER_MEM
+ Usuari : %6d registres, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Canal : %6d registres, %5d kB
+OPER_STATS_GROUPS_MEM
+ Grups NS : %6d registres, %5d kB
+OPER_STATS_ALIASES_MEM
+ Aliases NS : %6d registres, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d registres, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d registres, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d registres, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessions : %6d registres, %5d kB
+OPER_STATS_PROXY_MEM
+ Proxies : ^B%6d^B registres, ^B%5d^B kB
+OPER_STATS_AKILL_COUNT
+ Numero actual de AKILLs: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Temps d'expiració per defecte de AKILL: %d dies
+OPER_STATS_AKILL_EXPIRE_DAY
+ Temps d'expiració per defecte de AKILL: 1 dia
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Temps d'expiració per defecte de AKILL: %d hores
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Temps d'expiració per defecte de AKILL: 1 hora
+OPER_STATS_AKILL_EXPIRE_MINS
+ Temps d'expiració per defecte de AKILL: %d minuts
+OPER_STATS_AKILL_EXPIRE_MIN
+ Temps d'expiració per defecte de AKILL: 1 minut
+OPER_STATS_AKILL_EXPIRE_NONE
+ Temps d'expiració per defecte de AKILL: Sense expiració
+OPER_STATS_SGLINE_COUNT
+ Numero actual de SGLINEs: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Temps d'expiració per defecte de SGLINE: %d dies
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Temps d'expiració per defecte de SGLINE: 1 dia
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Temps d'expiració per defecte de SGLINE: %d hores
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Temps d'expiració per defecte de SGLINE: 1 hora
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Temps d'expiració per defecte de SGLINE: %d minuts
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Temps d'expiració per defecte de SGLINE: 1 minut
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Temps d'expiració per defecte de SGLINE: Sense expiració
+OPER_STATS_SQLINE_COUNT
+ Numero actual de SQLINEs: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Temps d'expiració per defecte de SQLINE: %d dies
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Temps d'expiració per defecte de SQLINE: 1 dia
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Temps d'expiració per defecte de SQLINE: %d hores
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Temps d'expiració per defecte de SQLINE: 1 hora
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Temps d'expiració per defecte de SQLINE: %d minuts
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Temps d'expiració per defecte de SQLINE: 1 minut
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Temps d'expiració per defecte de SQLINE: Sense expiració
+OPER_STATS_SZLINE_COUNT
+ Numero actual de SZLINEs: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Temps d'expiració per defecte de SZLINE: %d dies
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Temps d'expiració per defecte de SZLINE: 1 dia
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Temps d'expiració per defecte de SZLINE: %d hores
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Temps d'expiració per defecte de SZLINE: 1 hora
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Temps d'expiració per defecte de SZLINE: %d minuts
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Temps d'expiració per defecte de SZLINE: 1 minut
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Temps d'expiració per defecte de SZLINE: Sense expiració
+OPER_STATS_RESET
+ Estadistiques restablertes.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE canal Modes
+
+# CLEARMODES responses
+OPER_UMODE_SYNTAX
+ UMODE nick modes
+
+# OLINE responses
+OPER_UMODE_SUCCESS
+ Changed usermodes of %s.
+OPER_UMODE_CHANGED
+ %s changed your usermodes.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flags
+OPER_OLINE_SUCCESS
+ An O:Line with the flags %s has been added for %s.
+
+# CLEARMODES responses
+OPER_OLINE_IRCOP
+ You are now an IRC Operator.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES canal [ALL]
+OPER_CLEARMODES_DONE
+ Modes binaris i bans netegats del canal %s.
+OPER_CLEARMODES_ALL_DONE
+ Tots els Modes netegats del canal %s.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK canal usuari raó
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick newnick
+OPER_SVSNICK_NEWNICK
+ The nick %s is now being changed to %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | llista]
+OPER_ADMIN_SKELETON
+ Els serveis estan en Mode skeleton; la comanda ADMIN no esta disponible.
+OPER_ADMIN_EXISTS
+ %s ja esta present a la llista d'administradors de serveis.
+OPER_ADMIN_REACHED_LIMIT
+ Ho sento, sols pots tenir %d administradors de serveis.
+OPER_ADMIN_ADDED
+ %s afegit a la llista d'administradors de serveis.
+OPER_ADMIN_NOT_FOUND
+ %s no trobat a la llista d'administradors de serveis.
+OPER_ADMIN_NO_MATCH
+ No existeixen instàncies similars a la llista d'administradors de serveis.
+OPER_ADMIN_DELETED
+ %s esborrat de la llista d'administradors de serveis.
+OPER_ADMIN_DELETED_ONE
+ 1 instància esborrada de la llista d'administradors de serveis.
+OPER_ADMIN_DELETED_SEVERAL
+ %d instàncies esborrades de la llista d'administradors de serveis.
+OPER_ADMIN_LIST_EMPTY
+ La llista d'administradors de serveis esta buida.
+OPER_ADMIN_LIST_HEADER
+ Llista d'administradors de serveis:
+ Num Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ La llista d'administradors de serveis ha estat netegada.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | llista]
+OPER_OPER_SKELETON
+ Els serveis estan en Mode skeleton; la comanda OPER no esta disponible.
+OPER_OPER_EXISTS
+ %s ja existeix a la llista d'operadors de serveis.
+OPER_OPER_REACHED_LIMIT
+ Ho sento, sols pots tenir %d operadors de serveis.
+OPER_OPER_ADDED
+ %s afegit a la llista d'operadors de serveis.
+OPER_OPER_NOT_FOUND
+ %s no trobat a la llista d'operadors de serveis.
+OPER_OPER_NO_MATCH
+ No existeixen instàncies similars a la llista d'operadors de serveis.
+OPER_OPER_DELETED
+ %s esborrat de la llista d'operadors de serveis.
+OPER_OPER_DELETED_ONE
+ 1 instància esborrada de la llista d'operadors de serveis.
+OPER_OPER_DELETED_SEVERAL
+ %d instàncies esborrades de la llista d'operadors de serveis.
+OPER_OPER_LIST_EMPTY
+ La llista d'administradors de serveis esta buida.
+OPER_OPER_LIST_HEADER
+ Llista d'operadors de serveis:
+ Num Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ La llista d'operadors de serveis ha estat netegada.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+expiració] {mascara | llista} [raó]]
+OPER_AKILL_EXISTS
+ %s ja esta present a la llista de AKILLs.
+OPER_AKILL_ALREADY_COVERED
+ %s ja esta cobert per %s.
+OPER_AKILL_REACHED_LIMIT
+ Ho sento, sols pots tenir %d AKILLs.
+OPER_AKILL_NO_NICK
+ Recordatori: Les mascares AKILL no poden contenir nicks; asegura't de no incloure el nick en la teva mascara.
+OPER_AKILL_ADDED
+ %s afegit a la llista de AKILLs.
+OPER_AKILL_CHANGED
+ Temps d'expiració per a %s canviat.
+OPER_AKILL_NOT_FOUND
+ %s no trobat a la llista de AKILLs.
+OPER_AKILL_NO_MATCH
+ No existeixen instàncies similars a la llista de AKILLs.
+OPER_AKILL_DELETED
+ %s esborrat de la llista de AKILLs.
+OPER_AKILL_DELETED_ONE
+ 1 instància esborrada de la llista de AKILLs.
+OPER_AKILL_DELETED_SEVERAL
+ %d instàncies esborrades de la llista de AKILLs.
+OPER_AKILL_LIST_EMPTY
+ La llista de AKILLS esta buida.
+OPER_AKILL_LIST_HEADER
+ Llista actual de AKILLs:
+ Num Mascara Raó
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Llista actual de AKILLs:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (per %s en %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ La llista de AKILLs ha estat netegada.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiració] {mascara | llista}[:raó]]
+OPER_SGLINE_UNSUPPORTED
+ Ho sento, SGLINE no esta disponible en aquesta xarxa.
+OPER_SGLINE_EXISTS
+ %s ja existeix a la llista de SGLINEs.
+OPER_SGLINE_ALREADY_COVERED
+ %s ja esta cobert per %s.
+OPER_SGLINE_REACHED_LIMIT
+ Ho sento, sols pots tenir %d SGLINEs.
+OPER_SGLINE_ADDED
+ %s afegit a la llista de SGLINEs.
+OPER_SGLINE_CHANGED
+ Temps d'expiració per a %s canviat.
+OPER_SGLINE_NOT_FOUND
+ %s no trobat a a la llista de SGLINEs.
+OPER_SGLINE_NO_MATCH
+ No existeixen instàncies similars a la llista de SGLINEs.
+OPER_SGLINE_DELETED
+ %s esborrat de la llista de SGLINEs.
+OPER_SGLINE_DELETED_ONE
+ 1 instància esborrada de la llista de SGLINEs.
+OPER_SGLINE_DELETED_SEVERAL
+ %d instàncies esborrades de la llista de SGLINEs.
+OPER_SGLINE_LIST_EMPTY
+ La llista de SGLINEs esta buida.
+OPER_SGLINE_LIST_HEADER
+ Llista actual de SGLINEs:
+ Num Mascara Raó
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Llista actual de SGLINEs:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (per %s en %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ La llista de SGLINEs ha estat netegada.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiració] {mascara | llista} [raó]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ SQLINEs de canal no estan soportades pel teu IRCd, així que no les pots utilitzar.
+OPER_SQLINE_EXISTS
+ %s ja existeix a la llista de SQLINEs.
+OPER_SQLINE_ALREADY_COVERED
+ %s ja esta cobert per %s.
+OPER_SQLINE_REACHED_LIMIT
+ Ho sento, sols pots tenir %d SQLINEs.
+OPER_SQLINE_ADDED
+ %s afegit a la llista de SQLINEs.
+OPER_SQLINE_CHANGED
+ Temps d'expiració per a %s canviat.
+OPER_SQLINE_NOT_FOUND
+ %s no trobat a la llista de SQLINEs
+OPER_SQLINE_NO_MATCH
+ No existeixen instàncies similars a la llista de SQLINEs.
+OPER_SQLINE_DELETED
+ %s esborrat de la llista de SQLINEs.
+OPER_SQLINE_DELETED_ONE
+ 1 instància esborrada de la llista de SQLINEs.
+OPER_SQLINE_DELETED_SEVERAL
+ %d instàncies esborrades de la llista de SQLINEs.
+OPER_SQLINE_LIST_EMPTY
+ La llista de SQLINEs esta buida.
+OPER_SQLINE_LIST_HEADER
+ Llista actual de SQLINEs:
+ Num Mascara Raó
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Llista actual de SQLINEs:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (per %s en %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ La llista de SQLINEs ha estat netegada.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiració] {mascara | llista} [raó]]
+OPER_SZLINE_UNSUPPORTED
+ Ho sento, la comanda SZLINE no esta disponible en aquesta xarxa.
+OPER_SZLINE_EXISTS
+ %s ja existeix a la llista de SZLINEs.
+OPER_SZLINE_ALREADY_COVERED
+ %s ja esta cobert per %s.
+OPER_SZLINE_REACHED_LIMIT
+ Ho sento, sols pots tenir %d SZLINEs.
+OPER_SZLINE_ONLY_IPS
+ Recordatori: Sols pots afegir mascares IP a la llista de SZLINEs.
+OPER_SZLINE_ADDED
+ %s afegit a la llista de SZLINEs.
+OPER_SZLINE_CHANGED
+ Temps d'expiració de %s canviat.
+OPER_SZLINE_NOT_FOUND
+ %s no trobat a la llista de SZLINEs.
+OPER_SZLINE_NO_MATCH
+ No existeixen instàncies similars a la llista de SZLINEs.
+OPER_SZLINE_DELETED
+ %s esborrat de la llista de SZLINEs.
+OPER_SZLINE_DELETED_ONE
+ 1 instància esborrada de la llista de SZLINEs.
+OPER_SZLINE_DELETED_SEVERAL
+ %d instàncies esborrades de la llista de SZLINEs.
+OPER_SZLINE_LIST_EMPTY
+ La llista de SZLINEs esta buida.
+OPER_SZLINE_LIST_HEADER
+ Llista actual de SZLINEs:
+ Num Mascara Raó
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Llista actual de SZLINEs:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (per %s a %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ La llista de SZLINEs ha estat netegada.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET Opció estabilment
+OPER_SET_IGNORE_ON
+ Codi ignore sera utilitzat.
+OPER_SET_IGNORE_OFF
+ Codi ignore no sera utilitzat.
+OPER_SET_IGNORE_ERROR
+ L'establiment per a IGNORE ha de ser ON o OFF.
+OPER_SET_READONLY_ON
+ Serveis ara en Mode nomès lectura.
+OPER_SET_READONLY_OFF
+ Serveis ara en Mode de lectura-escriptura.
+OPER_SET_READONLY_ERROR
+ L'establiment per a READONLY ha de ser ON o OFF.
+OPER_SET_LOGCHAN_ON
+ Services is now reporting log messages to %s.
+OPER_SET_LOGCHAN_OFF
+ Services is no longer reporting log messages to a channel.
+OPER_SET_LOGCHAN_ERROR
+ Setting for LOGCHAN must be ON or OFF and LogChannel must be defined.
+OPER_SET_DEBUG_ON
+ Serveis ara en Mode debug.
+OPER_SET_DEBUG_OFF
+ Serveis ara en Mode no-debug.
+OPER_SET_DEBUG_LEVEL
+ Serveis ara en Mode debug (nivell %d).
+OPER_SET_DEBUG_ERROR
+ L'establiment per a DEBUG ha de ser ON, OFF, o un numero positiu.
+OPER_SET_NOEXPIRE_ON
+ Serveis ara en Mode no expire.
+OPER_SET_NOEXPIRE_OFF
+ Serveis ara en Mode expire.
+OPER_SET_NOEXPIRE_ERROR
+ Establiment per a NOEXPIRE ha de ser ON o OFF.
+OPER_SET_UNKNOWN_OPTION
+ Opció %s desconeguda.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} servidor
+OPER_NOOP_SET
+ Totes les linees O de %s han estat esborrades.
+OPER_NOOP_REVOKE
+ Totes les linees O de %s han estat esborrades.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE nom-del-servidor [raó]
+
+# RAW responses
+OPER_JUPE_HOST_ERROR
+ Please use a valid server name when juping
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW text
+
+# UPDATE responses
+OPER_UPDATING
+ Actualitzant les bases de dades.
+
+# RELOAD responses
+OPER_RELOAD
+ L'arxiu de configuració de serveis ha estat carregat novament.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN no definit; impossible arrencar un altre cop. Arranca un altre cop el script \2configure\2 i recompila Services per a incloure la comanda RESTART.
+
+# LISTIGNORE responses
+OPER_IGNORE_SYNTAX
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick]
+OPER_IGNORE_VALID_TIME
+ You have to enter a valid number as time.
+OPER_IGNORE_TIME_DONE
+ %s will now be ignored for %s.
+OPER_IGNORE_PERM_DONE
+ %s will now permanently be ignored.
+OPER_IGNORE_DEL_DONE
+ %s will no longer be ignored.
+OPER_IGNORE_LIST
+ Llista ignore de serveis:
+OPER_IGNORE_LIST_NOMATCH
+ %s not found on ignore list.
+OPER_IGNORE_LIST_EMPTY
+ La llista ignore esta buida.
+
+# KILLCLONES responses
+OPER_IGNORE_LIST_CLEARED
+ Ignore list has been cleared.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Impossible trobar a l'usuari %s.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Llista de canal:
+ Nom Modes de Usr. Tòpic
+OPER_CHANLIST_HEADER_USER
+ Llista del canal %s:
+ Nom Modes de Usr. Tòpic
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ Fi de la llista de canals.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Llista d'usuaris:
+ Nick Mascara
+OPER_USERLIST_HEADER_CHAN
+ llista d'usuaris de %s:
+ Nick Mascara
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Fi de la llista d'usuaris.
+
+# CACHE responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {hostname | patró} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Detecció de Proxy deshabilitada.
+OPER_CACHE_NOT_FOUND
+ %s no trobat al cau.
+OPER_CACHE_REMOVED
+ %s ha estat esborrat del cau.
+OPER_CACHE_HEADER
+ Hostname Estatus
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ Fi de la llista - %d/%d instàncies mostrades.
+OPER_CACHE_QUEUED
+ Encuat
+OPER_CACHE_PROGRESS
+ En progrès
+OPER_CACHE_NORMAL
+ Normal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ Proxy HTTP
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ON
+ You are now a SuperAdmin
+OPER_SUPER_ADMIN_OFF
+ You are no longer a SuperAdmin
+OPER_SUPER_ADMIN_SYNTAX
+ Setting for SuperAdmin must be ON or OFF.
+OPER_SUPER_ADMIN_WALL_ON
+ %s is now a Super-Admin
+OPER_SUPER_ADMIN_WALL_OFF
+ %s is no longer a Super-Admin
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ONLY
+ Only Super-Admins can use this command.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ This service is temporarly disabled, please try again later
+OPER_DEFCON_NO_CONF
+ The Defcon system must be enabled in the services.conf file
+OPER_DEFCON_CHANGED
+ Services are now at DEFCON %d
+OPER_DEFCON_WALL
+ %s Changed the DEFCON level to %d
+DEFCON_GLOBAL
+ The Defcon Level is now at Level: %d
+
+# Module strings
+
+OPER_MODULE_LOADED
+ Module %s loaded
+OPER_MODULE_UNLOADED
+ Module %s unloaded
+OPER_MODULE_LOAD_FAIL
+ Unable to load module %s
+OPER_MODULE_REMOVE_FAIL
+ Unable to remove module %s
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST
+ Module: %s
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Providing IRCD handler for: %s
+OPER_MODULE_NO_LIST
+ No modules currently loaded
+OPER_MODULE_NO_INFO
+ No information about module %s is available
+OPER_MODULE_INFO_SYNTAX
+ MODINFO FileName
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ The following commands have been loaded by a module:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [parametres]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+expiració] mascara límit raó
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {mascara | llista}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE numero posició
+OPER_EXCEPTION_DISABLED
+ Límits de sessions no disponibles.
+OPER_EXCEPTION_ALREADY_PRESENT
+ La mascara %s ja esta present a la llista d'excepcions.
+OPER_EXCEPTION_TOO_MANY
+ La llista d'excepcions al límit de sessiones esta plena!
+OPER_EXCEPTION_ADDED
+ Límit de sessió per a %s establert a %d.
+OPER_EXCEPTION_MOVED
+ Excepció per a %s (#%d) moguda a la posició %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ La instància no existeix (#%d) a la llista d'excepcions al límit de sessions.
+OPER_EXCEPTION_NOT_FOUND
+ %s no trobat a a la llista d'excepcions al límit de sessions.
+OPER_EXCEPTION_NO_MATCH
+ No existeixen instàncies similars a la llista d'excepcions al límit de sessions.
+OPER_EXCEPTION_DELETED
+ %s instàncies esborrades de la llista d'excepcions al límit de sessions.
+OPER_EXCEPTION_DELETED_ONE
+ 1 instància esborrada de la llista d'excepcions al límit de sessions.
+OPER_EXCEPTION_DELETED_SEVERAL
+ %d instàncies esborrades de la llista d'excepcions al límit de sessions.
+OPER_EXCEPTION_LIST_HEADER
+ llista d'excepcions al límit de sessions actual:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Num Límit Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (per %s a %s; %s)
+ Límit: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Límit de sessió invàlid. Ha de ser un sencer vàlido més gran o igual a zero i mes petit que %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Mascara invalida. Nomès mascares reals son valides ja que excepcions no son comparades a nicks o usernames.
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST límit | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST límit
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ El límit de sessió esta inhabilitat.
+OPER_SESSION_INVALID_THRESHOLD
+ Valor de umbral invàlid. Ha de ser un sencer vàlid més gran a 1.
+OPER_SESSION_NOT_FOUND
+ %s no trobat a la llista de sessió.
+OPER_SESSION_LIST_HEADER
+ Hosts amb un mínim de %d sessions:
+OPER_SESSION_LIST_COLHEAD
+ Sessions Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ El host %s actualment te %d sessions amb un límit de %d.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Sintaxis: EXCEPTION ADD [+expiració] mascara límit raó
+ EXCEPTION DEL {mascara | llista}
+ EXCEPTION MOVE numero posició
+ EXCEPTION LIST [mascara | llista]
+ EXCEPTION VIEW [mascara | llista]
+
+ Permet als administradors de serveis manipular la llista
+ de hosts que tenen un límit de sessió específic - permetent
+ a certes màquines, com servidors de shells, mantenir un nombre més alt
+ de clients al mateix temps. En quant un host arribi al seu límit
+ de sessions, tots els clients intentant conectarse desde aquest
+ host seran expulsats. Abans de expulsar usuaris, aquests son
+ notificats a traves de un /NOTICE del %S amb ajuda sobre
+ el límit de sessió. El contingut d'aquest notice es un establiment
+ de configuració.
+
+ EXCEPTION ADD afegeix la mascara de host donada a la llista de
+ excepcion. Teniu en compte que les mascares nick!usuari@host
+ i usuari@host son invalides. Nomès mascares reals com
+ irc.aujac.org i *.aujac.org, son permessas ja que el
+ límit de sessions no compta nicks o noms d'usuari.
+ Límit ha de ser un numero mes gran o igual a zero. Això determina
+ quantes sessions el host pot tenir en un cert temps. El valor
+ zero significa que el host no te límits de sessió. Veure la ajuda
+ sobre AKILL per a més detalls sobre el parametre opcional
+ expiració.
+ EXCEPTION DEL remou la mascara donada de la llista d'excepcions.
+ EXCEPTION MOVE mou l'excepció numero a posició. Les
+ excepcions entremig seran mogudes amunt o avall per a omplir l'espai.
+
+ EXCEPTION LIST i EXCEPTION VIEW mostra totes les
+ excepcions actuals; si la mascara opcional es donada, la llista es
+ limitada a les excepcions similars a la mascara. La diferencia
+ es que EXCEPTION VIEW es mes verbal, mostrant el nom de la
+ persona que va afegir l'excepció, el límit d'excepció, raó,
+ mascara de hosts i la data i hora d'expiració.
+
+ Pren nota de que un client conectant-se "utilitzara" la primera
+ excepció a la que el host s'assembli. Llargues llistes d'excepcions
+ i mascares que s'assemblin a moltes mascares possiblement contribueixin
+ al mal rendiment dels serveis.
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_SESSION
+ Sintaxis: SESSION LIST umbral
+ SESSION VIEW host
+
+ Permet als administradors de serveis veure la llista de sessions.
+
+ SESSION LIST llista hosts amb un mínim de umbral sessions.
+ L'umbral ha de ser un numero superior a 1. Això es per a prevenir
+ llistats accidentals del gran nombre de hosts de sessió.
+ SESSION VIEW mostra informació detallada sobre un host
+ específic - incloent el compte de sessió i el límit de sessió
+ actual.
+ El valor host no pot incluir comodins.
+
+ Mireu l'ajuda sobre EXCEPTION per a més informació sobre
+ límits de sessió i como establir-los per a hosts i grups específics
+ d'ara endavant.
+
+ Limitat a administradors de serveis.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Displays all Services Staff nicks along with level
+ and on-line status.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ The defcon system can be used to implement a pre-defined
+ set of restrictions to services useful during an attemtped
+ attack on the network.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * No new channel registrations
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * No new nick registrations
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * No MLOCK changes
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Force Chan Modes (%s) to be set on all channels
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Use the reduced session limit of %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill any NEW clients connecting
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignore any non-opers with message
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Silently ignore non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL any new clients connecting
+
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * No new memos sent
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+expiry] channel reason
+
+ Puts an AKILL for every nick on the specified channel. It
+ uses the entire and complete real ident@host for every nick,
+ then enforces the AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Notícies de Logon - %s] %s
+NEWS_OPER_TEXT
+ [Notícies de Oper - %s] %s
+NEWS_RANDOM_TEXT
+ [Notícies al Atzar - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Sintaxis: LOGONNEWS {ADD|DEL|LIST} [text|numero]
+NEWS_LOGON_LIST_HEADER
+ Notícies d'entrada:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ No hi ha notícies de entrada.
+NEWS_LOGON_ADD_SYNTAX
+ Sintaxis: LOGONNEWS ADD texto
+NEWS_LOGON_ADD_FULL
+ La llista de notícies esta plena!
+NEWS_LOGON_ADDED
+ Noves notícies d'entrada afegida (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Sintaxis: LOGONNEWS DEL {numero | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Notícia d'entrada #%d no trobada!
+NEWS_LOGON_DELETED
+ Notícia d'entrada #%d esborrada.
+NEWS_LOGON_DEL_NONE
+ No hi ha notícies d'entrada per a esborrar!
+NEWS_LOGON_DELETED_ALL
+ Totes les notícies d'entrada esborrades.
+
+NEWS_OPER_SYNTAX
+ Sintaxis: OPERNEWS {ADD|DEL|LIST} [texto|numero]
+NEWS_OPER_LIST_HEADER
+ notícies de oper:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_OPER_LIST_NONE
+ No hay notícies de oper.
+NEWS_OPER_ADD_SYNTAX
+ Sintaxis: OPERNEWS ADD texto
+NEWS_OPER_ADD_FULL
+ La llista de notícies esta plena!
+NEWS_OPER_ADDED
+ Nueva noticia de oper anadida (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Sintaxis: OPERNEWS DEL {numero | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Noticia de oper #%d no trobada!
+NEWS_OPER_DELETED
+ Noticia de oper #%d esborrada.
+NEWS_OPER_DEL_NONE
+ No hi ha notícies de oper per esborrar!
+NEWS_OPER_DELETED_ALL
+ Totes les notícies de oper esborrades.
+
+NEWS_RANDOM_SYNTAX
+ Sintaxis: RANDOMNEWS {ADD|DEL|LIST} [text|numero]
+NEWS_RANDOM_LIST_HEADER
+ Notícies al Azar:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s per %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ No hi ha notícies al azar.
+NEWS_RANDOM_ADD_SYNTAX
+ Sintaxis: RANDOMNEWS ADD text
+NEWS_RANDOM_ADD_FULL
+ La llista de notícies esta plena!
+NEWS_RANDOM_ADDED
+ Nova noticia a l'atzar afegida (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Sintaxis: RANDOMNEWS DEL {numero | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Noticia a l'atzar #%d no trobada!
+NEWS_RANDOM_DELETED
+ Notícia a l'atzar #%d esborrada.
+NEWS_RANDOM_DEL_NONE
+ No hi ha notícies a l'atzar per esborrar!
+NEWS_RANDOM_DELETED_ALL
+ Totes les notícies al azar esborrades.
+
+NEWS_HELP_LOGON
+ Sintaxis: LOGONNEWS ADD text
+ LOGONNEWS DEL {numero | ALL}
+ LOGONNEWS LIST
+
+ Edita o mostra la llista de notícies d'entrada. Quant un
+ usuari es connecta a la xarxa, aquest missatges li seran
+ enviats. (De tota manera, no mes de 3 missatges seran enviats
+ per evitar floodejar a l'usuari. Si hi ha més de 3 notícies,
+ els 3 ultims li seran enviades.)
+
+ LOGONNEWS LIST pot ser utilitzat per qualsevol operador
+ d'IRC per a llistar les notícies actuals. ADD o DEL nomès
+ pot ser utilitzat per administradors de serveis.
+
+NEWS_HELP_OPER
+ Sintaxis: OPERNEWS ADD text
+ OPERNEWS DEL {numero | ALL}
+ OPERNEWS LIST
+
+ Edita o mostra la llista de notícies. Quant un usuari es
+ transforma en operador (amb la comanda /oper), aquests
+ missatges li seran enviats. (De tota manera, no mes de 3 missatges seran
+ enviats per evitar floodejar a l'usuari. Si hi ha més de 3 notícies,
+ els 3 ultims li seran enviades.)
+
+ OPERNEWS LIST pot ser utilitzat per qualsevol operador d'IRC
+ per llistar les notícies d'operador actuals. ADD i DEL nomès
+ pot ser utilitzats per administradors de serveis.
+
+NEWS_HELP_RANDOM
+ Sintaxis: RANDOMNEWS ADD text
+ RANDOMNEWS DEL {numero | ALL}
+ RANDOMNEWS LIST
+
+ Edita o mostra la llista de missatges de noticia a l'atzar.
+ Quant un usuari es connecta a la xarxa, un (i nomès un) dels
+ missatges a l'atzar sera escollit i enviat a ells.
+
+ RANDOMNEWS LIST pot ser utilitzat per qualsevol operador
+ d'IRC per llistar la llista de notícies actual. ADD i DEL
+ nomès pot ser utilitzats per administradors de serveis.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S es un servei designat per donar informació sobre
+ serveis. Tòpics d'ajuda estan disponibles via les
+ comandes HELP dels altres clients de serveis:
+
+ /msg %s HELP
+ per mes informació sobre registrar nicknames
+
+ /msg %s HELP
+ per mes informació sobre registrar i controlar
+ canals
+
+ /msg %s HELP
+ per més informació sobre enviar missatges a usuaris no
+ en linea.
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ per més informació sobre establir un bot en el teu canal
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ %S Et permet "registrar" un nickname i
+ prevenir a d'altres utilitzar-lo. Les següents comandes
+ permeten el registre i manteniment de nicknames;
+ per a utilitzar-los, escriu /msg %S comanda.
+ per més informació sobre una comanda especifica
+ escriu /msg %S HELP comanda.
+
+ REGISTER Registra un nickname
+ GROUP Ingresa en un grup
+ IDENTIFY Per identificar-te amb la teva clau
+ ACCESS Modifica la llista d'adreçes autoritzades
+ SET Estableix proteccions, inclouent kills
+ DROP Cancela el registre d'un nickname
+ RECOVER Kickeja un usuari que estigui utilitzant el teu nickname
+ RELEASE Repren possesió del teu nick després de RECOVER
+ SENDPASS Vas oblidar la teva clau? Intenta això
+
+ Altres comandes: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS
+
+ NOTESE: Aquest servei intenta proveir una eina
+ pels usuaris d'IRC d'assegurar-se que la seva identitat no esta
+ compromessa, NO per facilitar el "robatori" de nicknames
+ o un altre acció maliciosa. L'abus de %S resultara, com a
+ mínim, en la perdua del nickname esmentat.
+
+NICK_HELP_EXPIRES
+ Nicknames en desus estan subjectes a l'expiració
+ automatica, en altres paraules, seran esborrats després
+ de %d dies.
+
+NICK_HELP_REGISTER
+ Sintaxis: REGISTER clau [email]
+
+ Registra el teu nickname a la base de dades de %S. Un
+ cop registrat, pots utilitzar les comandes SET i ACCESS
+ per configurar els parametres del teu nick al teu gust.
+ Assegura't de recordar la clau que vas fer servir per
+ registrar-te - la necessitaras per fer canvis en el teu nick
+ (Tingues en compte que les majuscules importen! AUJAC,
+ Aujac, i aujac són totes claus diferents!)
+
+ Guies per escollir claus:
+
+ Las claus no han de ser fàcils d'endevinar. Per exemple,
+ utilitzar el teu nom real com clau es una mala idea. Utilitzar
+ el teu nickname com a clau es una idea pitjor :( i,
+ de fet, %S no ho permetria. A mes, claus curtes
+ son vulnerables a ser encertades, aixi que hauries d'escollir una
+ clau de com a mínim 5 caràcters.
+ Per últim, el caràcter d'espai no pot ser utilitzat.
+
+ El parametre email es opcional i establira l'email pel
+ teu nick inmediatament. Com sigui, pot ser que sigui demanat
+ en certes xarxes.
+ La teva privacitat es respectada; aquest e-mail no sera donat a
+ terceres persones.
+
+ Aquesta comanda crea un nou grup pel teu nickname
+ que et permetra registrar altres nicks després compartint
+ la mateixa configuració, memos i privilegis. Per més
+ informació sobre aquesta característica, escriu /msg %S
+ HELP GROUP.
+
+NICK_HELP_GROUP
+ Sintaxis: GROUP grupo clau
+
+ Aquesta comanda fa que el teu nickname s'adhereixi al grup de nicknames
+ grup. clau es la de teu nickname.
+
+ L'unió a un grup et permetra compartir configuracions,
+ memos, i privilegis en canals amb tots els nicknames en un
+ grup, i molt més!
+
+ Un grup existeix sempre i quant sigui servible. Això
+ significa que si un nick del grup es eliminat, no perdràs
+ les caracteristiques compartides descrites anteriorment, sempre i
+ quant al menys un nick quedi al grup.
+
+ Pots utilitzar aquesta comanda encara que no estigui registrar el teu
+ nick. Si el teu nick ja esta registrat hauras d'identificar-te
+ abans d'utilitzar aquesta comanda. Escriu /msg %S HELP
+ IDENTIFY per més informació. Potser que no sigui possible
+ a la teva xarxa.
+
+ Es recomenable utilitzar aquesta comanda amb un nick no registrat ja
+ que sera registrat automaticament quant l'utilitzis.
+ Pots utilitzar-la amb un nick ja registrat (per canviar de grup)
+ sols si els administradors de la teva xarxa ho permeten.
+
+ Pots estar en un sol grup a la vegada. L'unió de
+ grups no es possible.
+
+ Tingues en compte: tots els nicks en un grup comparteixen la
+ mateixa clau.
+
+NICK_HELP_IDENTIFY
+ Sintaxis: IDENTIFY clau
+
+ Informa a %S que tu ets realment el propietari del teu nick.
+ Moltes comandes requereixen que t'identifiquis amb aquesta
+ comanda abans d'utilitzar-les. La clau hauria de ser la mateixa
+ que va ser enviada amb la comanda REGISTER.
+
+NICK_HELP_UPDATE
+ Syntax: UPDATE
+
+ Updates your current status, i.e. it checks for new memos,
+ sets needed chanmodes (ModeonID) and updates your vhost and
+ your userflags (lastseentime, etc).
+
+NICK_HELP_LOGOUT
+ Sintaxis: LOGOUT
+
+ Aquesta comanda inverteix l'efecte de IDENTIFY, o sigui,
+ et fa ja no reconeixible com a propietari del teu nick.
+ Tingues en compte que no et sera obligatori identificar-te
+ un altre cop.
+
+NICK_HELP_DROP
+ Sintaxis: DROP [nickname]
+
+ Elimina el teu nickname de la base de dades de %S. Un nick
+ que ha estat eliminat esta lliure per que qualsevol persona
+ el registri.
+
+ Pots eliminar un nick en el teu grupo indicant-lo com a
+ parametre nick.
+
+ Abans d'utilitzar aquesta comanda has d'identificar-te amb la teva
+ clau (/msg %S HELP IDENTIFY per més informació).
+
+NICK_HELP_ACCESS
+ Sintaxis: ACCESS ADD mascara
+ ACCESS DEL mascara
+ ACCESS LIST
+
+ Modifica o mostra la llista d'accés pel teu nick. Aquesta
+ és la llista d'adreces que seran automaticament
+ reconegudes per %S com autoritzades a utilitzar el nick. Si
+ vols utilitzar el nick des d'una adreça diferent,
+ has d'enviar una comanda IDENTIFY per fer que %S et
+ reconegui.
+
+ Exemples:
+
+ ACCESS ADD anyone@*.aujac.org
+ Permet accés a l'usuari anyone des de
+ qualsevol maquina en el domini aujac.org.
+
+ ACCESS DEL anyone@*.aujac.org
+ Anul.la la comanda anterior.
+
+ ACCESS LIST
+ Mostra la llista d'accés actual.
+
+NICK_HELP_SET
+ Sintaxis: SET Opció parametres
+
+ Estableix varies opcions per a nicknames. Opció pot ser
+ una de:
+
+ DISPLAY Estableix el display del teu grup amb serveis
+ PASSWORD Estableix la clau del teu nickname
+ LANGUAGE Estableix el llenguatge amb el que els serveis
+ t'enviaran missatges
+ URL Associa una URL amb el teu nickname
+ EMAIL Associa un E-mail amb el teu nickname
+ ICQ Associa un numero ICQ amb el teu nickname
+ GREET Associa un salutació amb el teu nickname
+ KILL Activa o desactiva la protecció
+ SECURE Activa o desactiva la seguretat de nickname
+ PRIVATE Preveu el teu nickname d'apareixer en un
+ /msg %S LIST
+ HIDE Oculta algunes parts de la teva informació
+ MSG canvia el metode de comunicació amb els
+ serveis
+
+ Per utilitzar aquest comanda, has d'identificar-te primer
+ utilitzant la teva clau (/msg %S HELP IDENTIFY
+ per mes informació).
+
+ Escriu /msg %S HELP SET opció per mes
+ informació sobre una opció especifica.
+
+NICK_HELP_SET_DISPLAY
+ Sintaxis: SET DISPLAY nou-display
+
+ canvia el display utilitzat per referir-te al teu grup de
+ nicks en serveis. El nou display HA DE SER un nick
+ del teu grup.
+
+NICK_HELP_SET_PASSWORD
+ Sintaxis: SET PASSWORD nueva-clau
+
+ Canvia la clau utilitzada per identificar-te com el
+ propietari del nick.
+
+NICK_HELP_SET_LANGUAGE
+ Sintaxis: SET LANGUAGE numero
+
+ Canvia el llenguatge que serveis utilitza per enviar-te missatges
+ (per exemple, al respondre a una comanda que enviis).
+ numero ha de ser escollit de la llista de llenguatges
+ soportats:
+
+
+NICK_HELP_SET_URL
+ Sintaxis: SET URL url
+
+ Associa l'URL donada amb el teu nickname. Aquesta URL
+ sera mostrada quant algu demani informació
+ sobre el teu nick amb la comanda INFO.
+
+NICK_HELP_SET_EMAIL
+ Sintaxis: SET EMAIL direccion
+
+ Associa el E-mail donat amb el teu nickname. L'e-mail
+ sera mostrat quant algu demani informació
+ sobre el teu nick amb la comanda INFO.
+
+NICK_HELP_SET_ICQ
+ Sintaxis: SET ICQ numero
+
+ Associa el numero ICQ donat amb el teu nickname. Aquest
+ numero sera mostrat quant algu soliciti
+ informació sobre el teu nick amb la comanda INFO.
+
+NICK_HELP_SET_GREET
+ Sintaxis: SET GREET missatge
+
+ Fa que el missatge introduit sigui la salutació pel teu nickname,
+ el que sera mostrat quant entris a un canal amb la
+ opció GREET habilitada, sempre i quant tinguis
+ l'accés necessari.
+
+NICK_HELP_SET_KILL
+ Sintaxis: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Canvia la protecció automàtica del teu nick a on o off.
+ Amb protecció on, si un altre usuari intenta utilitzar el teu nick,
+ tindra un minut per canviar de nick, desprès del qual
+ %S canviara el seu nick automaticament.
+
+ Si estableixes QUICK, l'usuari tibdrà nomès 20 segons
+ per canviar el nick en comptes dels 60 habituals. Si selecciones
+ IMMED, el nick del usuari sera canviat automaticament
+ sense ser avisat ni donar-li oportunitat de canviar-lo abans;
+ per favor no utilitzis aquesta opció excepte que ho consideris
+ necessari. A mes, els administradors de la xarxa poden haber
+ deshabilitat aquesta opció.
+
+NICK_HELP_SET_SECURE
+ Sintaxis: SET SECURE {ON | OFF}
+
+ Canvia les caracteristiques de seguretat de %S pel teu nick a on
+ u off. Amb SECURE establert, has d'especificar la teva clau
+ per ser reconegut com propietari del nick, a pesar de que la teva adreça
+ estigui a la llista d'accéss. D'altra banda, si estas a la llista
+ d'accés, %S no te auto-kickejara no important l'establiment de l'opció
+ KILL.
+
+NICK_HELP_SET_PRIVATE
+ Sintaxis: SET PRIVATE {ON | OFF}
+
+ Fa que %S activi o desactivi l'opció de privacitat del teu
+ nick. Amb PRIVATE establert,el teu nickname no apareixera en les
+ llistes de nicknames generades amb la comanda LIST de %S.
+ (D'altra banda, qualsevol persona que sapigue el teu nick podra comprobar
+ la teva informació utilitzant la comanda INFO.)
+
+NICK_HELP_SET_HIDE
+ Sintaxis: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Permet prevenir que certa informació sobre el teu nick sigui donada
+ quant es sol.licitada mitjançant la comanda %S INFO.
+ Pots ocultar la teva adreça e-mail (EMAIL), l'ultima
+ mascara usuari@host (USERMASK), i el teu últim missatge
+ quit (QUIT).
+ El segon parametre especifica si la informació ha de ser
+ ocultada (OFF) o mostrada (ON).
+
+NICK_HELP_SET_MSG
+ Sintaxis: SET MSG {ON | OFF}
+
+ Et permet escollir la forma en la que els serveis es
+ comunicaran amb tu. Amb MSG establert, els serveis
+ utilitzaran msgs, de l'altra forma utilitzaran notícies.
+
+NICK_HELP_RECOVER
+ Sintaxis: RECOVER nickname [clau]
+
+ Et permet recuperar el teu nickname si algú l'esta
+ utilitzant; Això fa el mateix que %S fa automaticament
+ si algú prova d'utilitzar un nick amb protecció de kill.
+
+ Quant utilitzes aquesta comanda, %S creara un fals usuari en
+ linea amb el mateix nickname de l'usuari que estas tractant
+ de recuperar. Això causa que els serveis IRC desconectin
+ a l'altre usuari. L'usuari fals romandra en linea per
+ un minut per assegurar que l'altre usuari no es reconecti
+ inmediatament; després del minut, pots reclamar el teu
+ nick. Com alternativa, utilitza la comanda RELEASE
+ (/msg %S HELP RELEASE) per recuperar el nick més aviat.
+
+ Per utilitzar la comanda RECOVER per un nick, la teva
+ adreça actual mostrada a /WHOIS ha d'estar a la llista
+ d'accés d'aquest nick, has d'estar identificat i en el
+ grup d'aquest nick, o has de proveir la clau correcta
+ per aquest nickname.
+
+NICK_HELP_RELEASE
+ Sintaxis: RELEASE nickname [clau]
+
+ Especifica a %S a esborrar qualsevol suspensió que tingui el teu nick
+ causada per protecció automatica de kill o per ús de la comanda
+ RECOVER. Per defecte, la suspensió dura un minut;
+ Aquesta comanda la finalitza abans.
+
+ Per utilitzar la comanda RELEASE per un nick, la teva
+ adreça actual mostrada a /WHOIS ha d'estar a la llista
+ d'accés d'aquest nick, has d'estar identificat i en el
+ grup d'aquest nick, o has de proveir la clau correcta
+ per aquest nickname.
+
+NICK_HELP_GHOST
+ Sintaxis: GHOST nickname [clau]
+
+ Termina una sessió IRC "fantasma" utilitzant el teu nick. Una
+ sessió fantasma és una connexió falsa, de tal manera que els
+ servidors IRC creuen esta en linea per una raó o altre.
+ Tipicament, això succeix si el teu ordinador es bloqueja o la
+ teva connexió a internet es talla mentres estas
+ a IRC.
+
+ Per utilitzar la comanda GHOST per un nick, la teva
+ adreça actual mostrada a /WHOIS ha d'estar a la llista
+ d'accés d'aquest nick, has d'estar identificat i en el
+ grup d'aquest nick, o has de proveir la clau correcta
+ per aquest nickname.
+
+NICK_HELP_INFO
+ Sintaxis: INFO nickname [ALL]
+
+ Mostra informació relativa al nick que s'especifiqui,
+ tal com el propietari del nick, l'ultima adreça utilitzada
+ i temps, i opcions del nick. Si estas identificat amb el
+ nick per el qual demanes informació i utilitzes el parametre
+ ALL, podras veure tota la informació; independentment de
+ si esta oculta o no.
+
+NICK_HELP_LIST
+ Sintaxis: LIST patró
+
+ Llista tots els nicknames que concordin amb el patró
+ donat, en el format nick!usuari@host. Nicks amb
+ l'opció PRIVATE establerta no seran mostrats.
+
+ Exemples:
+
+ LIST *!cistus@aujac.org
+ Llista tots els nicks registrats per cistus@aujac.org.
+
+ LIST *Bot*!*@*
+ Llista tots els nicks registrats amb Bot en els seus
+ noms (sensible a majuscules i miniscules).
+
+ LIST *!*@*.aujac.org
+ Llista tots els nicks registrats per usuaris amb el
+ domini aujac.org.
+
+NICK_HELP_ALIST
+ Syntax: ALIST [level]
+
+ Lists all channels you have access on. Optionally, you can specify
+ a level in XOP or ACCESS format. The resulting list will only
+ include channels where you have the given level of access.
+
+ Examples:
+ ALIST Founder
+ Lists all channels where you have Founder
+ access.
+
+ ALIST AOP
+ Lists all channels where you have AOP access
+ or greater.
+
+ ALIST 10
+ Lists all channels where you have level 10
+ access or greater.
+
+ Channels that have the NOEXPIRE option set will be prefixed by
+ an exclamation mark.
+
+NICK_HELP_GLIST
+ Sintaxis: GLIST
+
+ Llista tots els nicks en el teu grup.
+
+NICK_HELP_STATUS
+ Sintaxis: STATUS nickname...
+
+ Retorna informació sobre si l'usuari que utilitza el nick especificat
+ ha estat reconegut com el propietari del nickname.
+ La resposta te el següent format:
+
+ nickname codi-del-status
+
+ A on nickname es el nickname enviat amb la comanda, i
+ codi-del-status es un dels següents:
+
+ 0 - Usuari no esta en linea o el nick no esta registrat.
+ 1 - Usuari no reconegut com el propietari del nick.
+ 2 - Usuari reconegut sols mitjançant la llista d'accés.
+ 3 - Usuari reconegut mitjançant autentificació per clau.
+
+ Fins 16 nicknames poden ser enviats amb cada comanda. El
+ reste seran ignorats. Cap missatge d'error es generat si
+ el nickname no es donat.
+
+NICK_HELP_SENDPASS
+ Sintaxis: SENDPASS nickname
+
+ Envia la clau del nickname donat a l'adreça
+ e-mail establerta en el registre del nickname. Aquesta comanda
+ es sumament útil per recuperar claus perdudes.
+
+ Pot ser limitat a operadors d'IRC en certes
+ xarxes.
+
+ Aquesta comanda no esta disponible quant encriptació esta habilitada.
+
+NICK_SERVADMIN_HELP
+
+ Les següents comandes estan disponibles a administradors
+ de serveis:
+
+ GETPASS Recupera la clau per un nickname
+ (sols si encriptació esta deshabilitada)
+ FORBID Impossibilita que un nickname sigui utilitzat
+
+ Administradors de serveis poden també eliminar qualsevol
+ nickname sense tenir que identificar-se pel nick i poden
+ veure la llista d'accés per qualsevol nickname
+ (/msg %S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Sintaxis: LOGOUT [nickname [REVALIDATE]]
+
+ Sense un parametre, desfà l'efecte de la comanda IDENTIFY,
+ és a dir, fa que no siguis reconegut com l'autentic propietari del nick
+ Tingues en compte, que no seras necessari tornar-te a identificar.
+
+ Amb un parametre, fa lo mateix pel nick donat. Si
+ a més a més especifiques REVALIDATE, els serveis requeriran
+ a l'esmentat nick a reidentificar-se. Aquest ús esta limitat a
+ administradors de serveis.
+
+NICK_SERVADMIN_HELP_DROP
+ Sintaxis: DROP [nickname]
+
+ Sense un parametre, elimina el teu nickname de la base de dades de
+ %S.
+
+ Amb un parametre, elimina el nick esmentat de la base de
+ dades. Pots eliminar qualsevol nick del teu grup sense
+ privilegis especials. Eliminar qualsevol nick esta
+ limitat a administradors de serveis.
+
+NICK_SERVADMIN_HELP_SET
+
+ Administradors de serveis poden tambe establir
+ l'opció NOEXPIRE, amb la qual nicknames poden ser
+ previnguts abans de caducar. A més a més, administradors de
+ serveis poden establir opcions per qualsevol nickname
+ sense especificar una clau, utilitzant el format SET
+ nickname opció parametres.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Sintaxis: SET [nickname] NOEXPIRE {ON | OFF}
+
+ Estableix si el nick esmentat caducara o no. Establir-lo a ON
+ evita que el nickname caduqui. Si cap nickname es
+ especificat, estableix l'opció de no caducitat pel teu nick.
+
+ Limitat a administradors de serveis.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Administradors de serveis poden utilitzar el parametre
+ ALL amb qualsevol nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Sintaxis: LIST patró [FORBIDDEN] [NOEXPIRE]
+
+ Llista tots els nicknames registrats que concordin amb el
+ patró donat, en el format nick!usuari@host. Nicks amb
+ L'opció PRIVATE tan sols sera mostrada a administradors
+ de serveis. Nicks amb l'opció NOEXPIRE establerta tindran
+ un ! avantposat al nickname per a administradors de
+ serveis.
+
+ Si les opcions FORBIDDEN o NOEXPIRE son especificades, nomès nicks
+ que, respectivament, estan FORBIDDEN o estan establerts a
+ NOEXPIRE seran mostrats. Si totes dues opcions son especificades, tots dos
+ tipus de nicks seran mostrats. Aquestes opcions estan
+ limitades a administradors de serveis.
+
+ Exemples:
+
+ LIST *!cistus@aujac.org
+ Llista tots els nicks registrats per cistus@aujac.org.
+
+ LIST *Bot*!*@*
+ Llista tots els nicks registrats amb Bot en
+ els seus noms. (no sensible a majuscules i minuscules).
+
+ LIST * NOEXPIRE
+ Llista tots els nicks registrats que hagin estat establerts
+ a no caducitat.
+
+NICK_SERVADMIN_HELP_ALIST
+ Syntax: ALIST [nickname] [level]
+
+ With no parameters, lists channels you have access on. With
+ one parameter, lists channels that nickname has access
+ on. With two parameters lists channels that nickname has
+ level access or greater on.
+
+ This use limited to Services admins.
+
+NICK_SERVADMIN_HELP_GLIST
+ Sintaxis: GLIST [nickname]
+
+ Sense un parametre, llista tots els nicknames en el teu
+ grup.
+
+ Amb un parametre, llista tots els nicknames que hi ha
+ en el grup del nick esmentat.
+ El seu ús esta limitat a administradors de serveis.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Sintaxis: GETPASS nickname
+
+ Retorna la clau pel nickname donat. Tingues en compte
+ que quant aquesta comanda es utilitzada, un missatge inclouent
+ la persona que va executar la comanda i el nickname en el qual
+ va ser utilitzat sera establert i enviat com WALLOPS/GLOBOPS.
+
+ Limitat a administradors de serveis.
+
+ Aquesta comanda no esta disponible si encriptació esta habilitada.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Returns the matching nicks that used given email. Note that
+ you can not use wildcards for either user or emailhost. Whenever
+ this command is used, a message including the person who issued
+ the command and the email it was used on will be logged.
+
+ Limited to Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Sintaxis: FORBID nickname [raó]
+
+ Impedeix que un nickname sigui registrat o utilitzat per algú.
+ Pot ser cancel.lat eliminat el nick.
+
+ En algunes xarxes, la raó es necessaria.
+
+ Limitat a administradors de serveis.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ %S et permet registrar i controlar varis
+ aspectes dels canals. Sovint, %S pot prevenir
+ a usuaris maliciosos "pendre" canals limitant
+ qui esta permés a tenir privilegis d'operador.
+ Les comandes disponibles estan llistades a continuació;
+ Per a utilitzar-los, escriu /msg %S comanda.
+ Per més informació sobre una comanda especifica,
+ escriu /msg %S HELP comanda.
+
+ REGISTER Registra un canal
+ IDENTIFY T'identifica amb la teva clau
+ SET Establir opcions i informació d'un canal
+ AOP Modifica la llista d'usuaris AOP
+ SOP Modifica la llista d'usuaris SOP
+ ACCESS Modifica la llista d'usuaris privilegiats
+ LEVELS Redefine el significat de nivells d'accés
+ AKICK Manté la llista d'AutoKick
+ DROP Cancel.la l'enregistrament d'un canal
+ SENDPASS Ajuda a recuperar claus perdudes
+
+ Altres comandes: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO,
+ INVITE, KICK, LIST, LOGOUT, OP, UNBAN,
+ VOICE, VOP
+
+CHAN_HELP_UNREAL
+
+ Aquestes comandes tambe estan disponibles en aquesta xarxa:
+ DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER,
+ PROTECT
+
+CHAN_HELP_ULTIMATE
+
+ Aquestes comandes tambe estan disponibles en aquesta xarxa:
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ Aquestes comandes tambe estan disponibles en aquesta xarxa:
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Tingues en compte que qualsevol canal que no sigui utilitzat durant
+ %d dies (al qual cap usuari a la llista d'accés
+ del canal entri en aquest periode de temps) sera
+ automaticament eliminat.
+
+CHAN_HELP_REGISTER
+ Sintaxis: REGISTER canal clau descripció
+
+ Registra un canal en la base de dades de %S. Per a
+ utilitzar aquesta comanda, has de ser un operador en el
+ canal que intentis registrar. La clau es utilitzada amb
+ la comanda IDENTIFY per a permetre a altres fer
+ canvis en les opcions del canal posteriorment.
+ L'últim parametre, el qual ha de ser inclòs, és
+ una descripció general del propòsit del canal.
+
+ Quant registres un canal, ets reconegut com el
+ "fundador" del canal. El fundador del canal pot
+ canviar tots els parametres pel canal;
+ %S també donarà al fundador privilegis d'operador
+ automaticamente quant l'usuari entri al canal.
+ Esbrina sobre la comanda ACCESS
+ (/msg %S HELP ACCESS) Per més informació sobre
+ com donar aquests privilegis a altres usuaris del canal.
+
+ NOTA: Per registrar un canal has d'haver registrat
+ el teu nickname primer. Si encara no ho has fet, escriu
+ /msg %s HELP per més informació de com fer-ho.
+
+CHAN_HELP_IDENTIFY
+ Sintaxis: IDENTIFY canal clau
+
+ T'identifica amb %S com el fundador del canal especificat.
+ Moltes comandes requereixen que utilitzis aquesta comanda abans
+ d'utilitzar-los. La clau hauria de ser la mateixa que
+ vas enviar amb la comanda REGISTER.
+
+CHAN_HELP_LOGOUT
+ Sintaxis: LOGOUT canal nickname
+
+ Aquest comanda fa que el nickname donat ja no siguis identificat
+ en el canal especificat.
+
+ Si ets el fundador del canal, pots desconectar a
+ qui sigui, d'altra banda tan sols et pots desconnectar
+ a tu mateix.
+
+CHAN_HELP_DROP
+ Sintaxis: DROP canal
+
+ Desenregistra el canal especificat. Nomès pot ser utilitzat pel
+ fundador del canal, qui ha d'utilitzar primer la comanda
+ IDENTIFY.
+
+CHAN_HELP_SET
+ Sintaxis: SET canal opció parametres
+
+ Li permet al fundador del canal establir varies opcions
+ del canal i altres informacions.
+
+ Opcions disponibles:
+
+ FOUNDER Estableix el fundador d'un canal
+ SUCCESSOR Estableix el successor d'un canal
+ PASSWORD Estableix el password del fundador
+ DESC Estableix la descripció del canal
+ URL Associa una URL amb el canal
+ EMAIL Associa un E-mail amb el canal
+ ENTRYMSG Estableix un missatge a enviar als
+ usuaris quant entrin al canal
+ BANTYPE Estableix com els serveis posen bans
+ en el canal
+ MLOCK Fixa els Modes de canal on o off
+ KEEPTOPIC Rete el topic quant el canal no
+ esta en uso
+ OPNOTICE Envia una noticia quant les comandes
+ OP/DEOP son utilitzats
+ PEACE Regula l'ús de comandes critiques
+ PRIVATE Oculta el canal de la comanda LIST
+ RESTRICTED Restringeix l'accés al canal
+ SECURE Activa les opcions de seguretat de %S
+ SECUREOPS Estricte control de l'estatus de chanop
+ SECUREFOUNDER Estricto control de l'estatus de fundador
+ del canal
+ SIGNKICK Firma kicks fets amb la comanda KICK
+ TOPICLOCK El topic sols pot ser canviat amb
+ TOPIC
+ XOP Canvia el sistema de privilegis d'usuari
+
+ Escriu /msg %S HELP opció per més informació
+ sobre una opció en particular.
+
+CHAN_HELP_SET_FOUNDER
+ Sintaxis: SET canal FOUNDER nick
+
+ Canvia el fundador d'un canal. El nou nickname ha de
+ ser un d'enregistrat.
+
+CHAN_HELP_SET_SUCCESSOR
+ Sintaxis: SET canal SUCCESSOR nick
+
+ Canvia el successor d'un canal. Si el nickname fundador
+ caduca o es eliminat mentres el canal esta encara registrat,
+ el successor es convertira en el nou fundador del canal.
+ Però, si el successor ja te molts canals
+ registrats (%d), el canal sera eliminat, tal i com
+ si no hi haguès un successor. El nou nickname ha de ser un
+ d'enregistrat.
+
+CHAN_HELP_SET_PASSWORD
+ Sintaxis: SET canal PASSWORD clau
+
+ Estableix la clau utilitzada per identificar-se com el
+ fundador del canal.
+
+CHAN_HELP_SET_DESC
+ Sintaxis: SET canal DESC descripció
+
+ Estableix la descripció pel canal, la que es mostrada
+ amb les comandes LIST i INFO.
+
+CHAN_HELP_SET_URL
+ Sintaxis: SET canal URL [url]
+
+ Associa l'URL especificada amb el canal. Aquesta URL sera mostrada
+ quant algu sol.liciti informació sobre el canal amb
+ la comanda INFO. Si no s'especifica cap parametre,
+ esborra la URL actual pel canal.
+
+CHAN_HELP_SET_EMAIL
+ Sintaxis: SET canal EMAIL [direcció]
+
+ Associa l'adreça e-mail especificada amb el canal.
+ Aquesta adreça sera mostrada quant algu sol.liciti
+ informació sobre el canal amb la comanda INFO.
+ Si cap parametre es establert, borra l'adreça e-mail
+ actual pel canal.
+
+CHAN_HELP_SET_ENTRYMSG
+ Sintaxis: SET canal ENTRYMSG [missatge]
+
+ Especifica el missatge que sera enviat via /notice als
+ usuaris quant ingressin al canal. Si cap parametre
+ es especificat, cap missatge sera enviat al entrar al canal.
+
+CHAN_HELP_SET_BANTYPE
+ Sintaxis: SET canal BANTYPE tipus_de_ban
+
+ Especifica el tipus de ban que sera utilitzat pels
+ serveis quant necessitin banear algu
+ del teu canal.
+
+ Tipus de ban es un numero entre 0 i 3 que significa:
+
+ 0: ban de la forma *!usuari@host
+ 1: ban de la forma *!*usuari@host
+ 2: ban de la forma *!*@host
+ 3: ban de la forma *!*usuari@*.domini
+
+CHAN_HELP_SET_KEEPTOPIC
+ Sintaxis: SET canal KEEPTOPIC {ON | OFF}
+
+ Habilita o deshabilita l'opció de retenció de topic
+ per un canal. Quant la retenció de topic esta
+ establerta, el topic pel canal sera recordat
+ %S fins i tot després de que l'últim usuari
+ sorti del canal, i sigui restaurat la pròxima vegada que
+ el canal sigui creat.
+
+CHAN_HELP_SET_TOPICLOCK
+ Sintàxi: SET canal TOPICLOCK {ON | OFF}
+
+ Habilita o deshabilita L'opció de fixació de topic
+ per a un canal. Quan la fixació de topic està
+ establerta, %S no permetrà que el topico del canal
+ sigui canviat excepte amb la comanda TOPIC.
+
+CHAN_HELP_SET_MLOCK
+ Sintàxi: SET canal MLOCK Modes
+
+ Estableix el paràmetre de fixació de Modes pel canal.
+ %S et permet definir certs Modes de canal per a estar
+ sempre encesos o apagats o lliures d' estar un dels
+ anteriors.
+
+ El paràmetre Modes és construit de la mateixa forma
+ que La comanda /MODE; això significa, Modes seguits
+ per un + estan fixats encesos, i Modes seguits per
+ un - estan fixats apagats. tenir en compte que, a
+ difèrencia de La comanda MODE, cada us de SET MLOCK
+ esborrarà tots els Modes fixats prèviament abans de
+ establir els nous!
+
+ AdVeuretència: Si estableixes una clau amb fixació de Mode, com
+ en el segon exemple de més endevant, hauràs també d'establir la
+ Opció RESTRICTED pel canal (veure HELP SET RESTRICTED),
+ o qui sigui que entri al canal quan aquest és buit podrà veure la
+ clau!
+
+ Exemples:
+
+ SET #canal MLOCK +nt-iklps
+ Força els Modes n i t encesos, i els Modes i, k,
+ l, p i s apagats. El Mode m és deixat lliure per a
+ estar encès o apagat.
+
+ SET #canal MLOCK +knst-ilmp mi-key
+ Força els Modes k, n, s, i t encesos, i els Modes
+ i, l, m, i p apagats. També força la clau del canal
+ a ser "mi-clau".
+
+ SET #canal MLOCK +
+ Esborra la fixació de Modes; tots els Modes del canal
+ són lliures d'estar encesos o apagats.
+
+CHAN_HELP_SET_PEACE
+ Sintàxi: SET canal PEACE {ON | OFF}
+
+ Habilita o deshabilita l'opció de pau per a un
+ canal. Quan pau està establerta, un usuari no
+ podra expulsar, banejar o esborrar un estatus de canal
+ d'un usuari amb nivelll igual o superior a ell via
+ comandes de %S.
+
+CHAN_HELP_SET_PRIVATE
+ Sintàxi: SET canal PRIVATE {ON | OFF}
+
+ Habilita o deshabilita l'opció de privacitat per a un canal.
+ Quan privacitat està establerta, un /msg %S LIST no
+ inclourà el canal en cap llista.
+
+CHAN_HELP_SET_RESTRICTED
+ Sintàxi: SET canal RESTRICTED {ON | OFF}
+
+ Habilita o deshabilita l'opció de accés restringit
+ per a un canal. Quan l' accés restringit està
+ establert, Els usuaris seran inhabilitats de tenir
+ privilegis d'operador de canal. (usuaris amb accés
+ negatiu i, si seguretat de ops està establerta,
+ usuaris no a la llista de accés) seran
+ kickeajats i banejats del canal.
+
+CHAN_HELP_SET_SECURE
+ Sintàxi: SET canal SECURE {ON | OFF}
+
+ Habilita o deshabilita les característiques de seguretat
+ de %S per a un canal. Quan SECURE està
+ establert, només usuaris que haguin registrat els seus nicknames
+ amb %s i haguin utilitzat IDENTIFY amb la seva clau els serà
+ atorgat accés al canal controlat per la llista de
+ accés.
+
+CHAN_HELP_SET_SECUREOPS
+ Sintàxi: SET canal SECUREOPS {ON | OFF}
+
+ Habilita o deshabilita l'opció seguretat de ops per a un
+ canal. Quan seguretat de ops està establerta, usuaris
+ que no estaven a la llista d'usuaris no els serà permès
+ obtenir l' estatus d'operador de canal.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Sintàxi: SET canal SECUREFOUNDER {ON | OFF}
+
+ Habilita o deshabilita l'opció seguretat de fundador per a
+ un canal. Quan seguretat de fundador està establerta, només
+ el fundador real podrà eliminar el canal, canviar la seva clau,
+ el seu fundador i el seu sucesor, i no aquells que estiguin identificats
+ amb %S.
+
+CHAN_HELP_SET_SIGNKICK
+ Sintàxi: SET canal SIGNKICK {ON | LEVEL | OFF}
+
+ Habilita o deshabilita els kicks firmats per a un
+ canal. Quan SIGNKICK està establert, kicks
+ fets amb la comanda %S KICK tindran el
+ nick que ha fet servir la comanda en la raó.
+
+ Si uses LEVEL, aquells que tenen nivelll superior o
+ igual al nivelll SIGNKICK en el canal no tindran els seus kicks
+ firmats. Veure /msg %S HELP LEVELS per a més informació.
+
+CHAN_HELP_SET_XOP
+ Sintàxi: SET canal XOP {ON | OFF}
+
+ Habilita o deshabilita el sistema de llistes xOP per a un canal.
+ Quan XOP està establert, has de fer servir les comandes AOP/SOP/VOP
+ per a donar privilegis de canal a usuaris. D'altra manera
+ has de fer servir la comanda ACCESS.
+
+ Nota Tècnica: Quan canvies de llista d'accés a sistema
+ de llistes xOP, al teva definició de nivellls d'usuari serà
+ canviada, així que no tindras els mateixos valors si tornes a
+ canviar a llista de accés!
+
+ També hauries de comprovar si els teus usuaris estan a la llista xOP
+ corresponent després del canvi, ja que la deducció no és
+ sempre perfecta... de fet, no es recomana el fer servir llistes
+ xOP si vas canviar la definició de nivellls amb la comanda
+ LEVELS.
+
+ Canviar de llistes xOP al sistema de llistes d'accés no causa cap
+ problema.
+
+CHAN_HELP_SET_OPNOTICE
+ Sintàxi: SET canal OPNOTICE {ON | OFF}
+
+ Habilita o deshabilita l'opció de op-notice per a un canal.
+ Quan op-notice està establert, %S enviarà una noticia
+ a l'usuari del canal quan les comandes OP o DEOP siguin
+ utilitzades per a un usuari en el canal.
+
+CHAN_HELP_AOP
+ Sintàxi: AOP canal ADD nick
+ AOP canal DEL {nick | instancia | llista}
+ AOP canal LIST [mascara | llista]
+ AOP canal CLEAR
+
+ Manté la llista OP (AutoOP) per a un canal. La llista
+ AOP li dóna a l'usuari el dret de ser automàticament
+ opejat en el teu canal, desbanejat o convidar-se a ell mateix en cas de
+ ser necesàri, mostrar el missatge de salutació al entrar, etc.
+
+ La comanda AOP ADD agrega al nickname donat a la llista
+ AOP.
+
+ La comanda AOP DEL esborra el nickname donat de la
+ llista AOP. Si una llista de instàncies és donada, aquestes
+ instàncies són esborrades. (Veure l'exemple per a LIST més
+ endevant.)
+
+ La comanda AOP LIST mostra la llista AOP. Si una
+ mascara amb comodí és donada, només les instàncies
+ que concordin amb la mascara són mostrades. Si una llista de
+ instàncies és donada, sols aquestes instàncies són mostrades;
+ per exemple:
+
+ AOP #canal LIST 2-5,7-9
+ Mostra instàncies de AOP enumerades 2 a 5 i
+ 7 a 9.
+
+ La comanda AOP CLEAR neteja totes les instàncies de la
+ llista AOP.
+
+ Les comandes AOP ADD i AOP DEL està limitats a
+ SOPs o superior, mentre que la comanda AOP CLEAR
+ sols pot ser utilitzada per el fundador del canal. Tot i així,
+ qualsevol usuari a la llista AOP pot usar la comanda
+ AOP LIST.
+
+ Aquesta comanda pot haVeure sigut deshabilitada per al teu canal.
+ Si aquest és el cas, has de fer servir la llista d'accés. Veure
+ /msg %S HELP ACCESS per a informació sobre la llista
+ de accés i /msg %S HELP SET XOP per a saber com canviar
+ entre la llista de accés i el sistema de llistes xOP.
+
+CHAN_HELP_HOP
+ Sintàxi: HOP canal ADD nick
+ HOP canal DEL {nick | instancia | llista}
+ HOP canal LIST [mascara | llista]
+ HOP canal CLEAR
+
+ Manté la llista HOP (HalfOP) per a un canal. La llista
+ HOP li dóna a l'usuari el dret de ser automàticament
+ halfopejat en el teu canal.
+
+ La comanda HOP ADD agrega al nickname donat a la llista
+ HOP.
+
+ La comanda HOP DEL esborra el nickname donat de la
+ llista HOP. Si una llista d'instàncies és donada, aquestes
+ instàncies són esborrades. (Veure l'exemple per a LIST més
+ endevant.)
+
+ La comanda HOP LIST mostra la llista HOP. Si una
+ mascara amb comodí és donada, només les instàncies
+ que concordin amb la mascara són mostrades. Si una llista de
+ instàncies és donada, només aquestes instàncies són mostrades;
+ per exemple:
+
+ HOP #canal LIST 2-5,7-9
+ Mostra instàncies de HOP enumerades 2 a 5 y
+ 7 a 9.
+
+ La comanda HOP CLEAR neteja totes les instàncies de la
+ llista HOP.
+
+ Les comandes HOP ADD i HOP DEL estan limitades a
+ AOPs o superior, mentre que la comanda HOP CLEAR
+ sols pot ser utilitzada per el fundador del canal.
+
+ Aquesta comanda pot haber estat deshabilitada per al teu canal.
+ Si aquest és el cas, has de fer servir la llista d'accés. Veure
+ /msg %S HELP ACCESS per a informació sobre la llista
+ d'accés i /msg %S HELP SET XOP per a saber com canviar
+ entre la llista d'accés i el sistema de llistes xOP.
+
+CHAN_HELP_SOP
+ Sintàxi: SOP canal ADD nick
+ SOP canal DEL {nick | instancia | llista}
+ SOP canal LIST [mascara | llista]
+ SOP canal CLEAR
+
+ Manté la llista SOP (SuperOP) per a un canal. La llista
+ SOP li dóna a l'usuari els drets donats per la llista AOP,
+ i agrega aquells necesaris per a utilitzar les llistes de
+ AutoKick i BadWords, enviar i llegir memos de canal, etc.
+
+ La comanda SOP ADD afegeix el nickname donat a la llista
+ SOP.
+
+ La comanda SOP DEL esborra el nickname donat de la
+ llista SOP. Si una llista d'instàncies és dada, aquestes
+ instàncies són esborrades. (Veure l'exemple per a LIST més
+ endevant.)
+
+ La comanda SOP LIST mostra la llista SOP. Si una
+ mascara amb comodí és donada, només les instàncies
+ coincidents amb la mascara són mostrades. Si una llista de
+ instàncies és donada, sols aquestes instàncies són mostrades;
+ per exemple:
+
+ SOP #canal LIST 2-5,7-9
+ Mostra instàncies de SOP enumerades 2 a 5 i
+ 7 a 9.
+
+ La comanda SOP CLEAR neteja totes les instàncies de la
+ llista SOP.
+
+ Les comandes SOP ADD, SOP DEL i SOP CLEAR estan
+ limitades al fundador del canal. Qualsecol usuari de la
+ llista AOP pot fer servir la comanda SOP LIST.
+
+ Aquesta comanda pot haber sigut deshabilitada per al teu canal.
+ Si aquest és el cas, has de fer servir la llista d'accés. Veure
+ /msg %S HELP ACCESS per a informació sobre la llista
+ d'accés i /msg %S HELP SET XOP per a saber com canviar
+ entre la llista d'accés i el sistema de llistes xOP.
+
+CHAN_HELP_VOP
+ Sintàxi: VOP canal ADD nick
+ VOP canal DEL {nick | instancia | llista}
+ VOP canal LIST [mascara | llista]
+ VOP canal CLEAR
+
+ Manté la llista VOP (VOicePeople) per a un canal.
+ La llista VOP li dona a l'usuari el dret de ser
+ automàticament donat veu o donar-se veu a si mateix.
+
+ La comanda VOP ADD agrega el nickname donat a la llista
+ VOP.
+
+ La comanda VOP DEL esborra el nickname donat de la
+ llista VOP. Si una llista de instàncies és donada, aquestes
+ instàncies són esborrades. (Veure l'exemple per a LIST més
+ endevant.)
+
+ La comanda VOP LIST mostra la llista VOP. Si una
+ mascara amb comodí és donada, sols les instàncies
+ concordant amb la mascara són mostrades. Si una llista de
+ instàncies és donada, sols aquetes instàncies són mostrades;
+ per exemple:
+
+ VOP #canal LIST 2-5,7-9
+ mostra instàncies de VOP enumerades 2 a 5 i
+ 7 a 9.
+
+ La comanda VOP CLEAR neteja totes les instàncies de la
+ llista VOP.
+
+ Les comandes VOP ADD, VOP DEL i VOP LIST estan
+ limitades a AOPs o superior, mentre que la comanda
+ VOP CLEAR sols pot ser utilitzada per el fundador del
+ canal.
+
+ Aquesta comanda pot haber sigut deshabilitada per al teu canal.
+ Si aquest és el cas, has de fer servir la llista de accés. Veure
+ /msg %S HELP ACCESS per a informació sobre la llista
+ d'accés i /msg %S HELP SET XOP per a saber como canviar
+ entre la llista d'accés i el sistema de llistes xOP.
+
+CHAN_HELP_ACCESS
+ Sintàxi: ACCESS canal ADD nick nivell
+ ACCESS canal DEL {nick | indices | llista}
+ ACCESS canal LIST [mascara | llista]
+ ACCESS canal CLEAR
+
+ Manté la llista d'accés per a un canal. La llista
+ de accés específica quins usuaris estan permesos a tenir
+ l'estatus d'operador de canal o accés a comandes de
+ %S en el canal. Diferents nivellls d'usuaris permeten
+ accés a diferents subnivelles de privilegis;
+ /msg %S HELP ACCESS LEVELS per a informació més
+ específica. Qualsevol nick no present a la llista de
+ accés té un nivelll 0.
+
+ La comanda ACCESS ADD afegeix el nickname donat a la llista
+ d'accés amb el nivelll d'usuari donat; si el nick ja està
+ present a la llista, el nivelll d'accés és canviat al
+ especificat en la comanda. El nivelll especificat
+ ha de ser menys que el de l'usuari que fa la comanda, i si
+ el nick ja està a la llista d'accés, l'accés actual
+ del nick ha de ser menor que l'accés de l'usuari que fa la
+ comanda.
+
+ La comanda ACCESS DEL esborra el nick donat de la llista
+ d'accés. Si una llista d'instàncies és donada, aquestes instàncies
+ són esborrades. (Veure l'exemple per a LIST més endevant.)
+
+ La comanda ACCESS LIST mostra la llista d'accés. Si
+ una mascara amb comodí és donada, sols aquestes instàncies
+ concordant amb la mascara són mostrades. Si una llista de
+ instàncies és donada, sols aquestes instàncies són mostrades; per
+ exemple:
+
+ ACCESS #canal LIST 2-5,7-9
+ llista instàncies d'accés numerades 2 fins 5 i
+ 7 fins a 9.
+
+ La comanda ACCESS CLEAR neteja totes les instàncies
+ de la llista d'accés.
+
+CHAN_HELP_ACCESS_LEVELS
+ nivellls d'accés per a usuaris
+
+ Per defecte, els següents nivellls d'accés estan definits:
+
+ Fundador accés complet a les funcions de %S;
+ Op automàtico al entrar al canal. Notis
+ que sols una persona pot tenir estatus
+ de fundador (no pot ser donat fent servir la
+ comanda ACCESS).
+  10 accés a la comanda AKICK; Op automàtico.
+  5 Op automàtico.
+  3 Voice automàtico.
+  0 Cap privilegi especial; pot ser opejat
+ per altres ops (a menys que seguretat de
+ ops estigui establerta).
+  <0 No pot ser opejat.
+
+ Aquests nivellls poden ser canviats, o afegir-ne de nous,
+ fent servir la comanda LEVELS; escriu /msg %S HELP LEVELS
+ per a més informació.
+
+CHAN_HELP_AKICK
+ Sintàxi: AKICK canal ADD mascara [raó]
+ AKICK canal STICK mascara
+ AKICK canal UNSTICK mascara
+ AKICK canal DEL mascara
+ AKICK canal LIST [mascara]
+ AKICK canal VIEW [mascara]
+ AKICK canal ENFORCE
+ AKICK canal CLEAR
+
+ Manté la llista d'AutoKicks per a un canal. Si
+ un usuari de la llista de Autokicks intenta entrar
+ al canal, %S banejarà l'usuari del canal, després el
+ kickejarà.
+
+ La comanda AKICK ADD afegeix el nick o mascara de
+ usuari donat a la llista de Autokicks. Si una raó
+ es donada amb la comanda, aquesta raó serà utilitzada quan
+ l'usuari sigui kickejat; si no, la raó per defecte és
+ "Has sigut banejat del canal".
+
+ La comanda AKICK STICK baneja permanent la mascara
+ donada en el canal. Si algú intenta treure el ban,
+ %S l'establirà automàticament. No pot ser
+ usada per a nicks registrats.
+
+ La comanda AKICK UNSTICK cancela l'efecto de la
+ comanda AKICK STICK, així que serà possible esborrar
+ el ban del canal.
+
+ La comanda AKICK DEL esborra el nick o mascara donats
+ de la llista de AutoKicks. Tot i així, no esborra cap ban
+ posat per un AutoKick; aquells han de ser esborrats
+ manualment.
+
+ La comanda AKICK LIST mostra la llista de AutoKicks,
+ o opcionalment sols les instàncies de AutoKick
+ que concordin amb la mascara especificada.
+
+ La comanda AKICK VIEW és una versió més detallada
+ de la comanda AKICK LIST.
+
+ La comanda AKICK ENFORCE fa a %S a forçar la
+ llista AKICK actual esborrant als usuaris que
+ concordin amb la mascara AKICK.
+
+ La comanda AKICK CLEAR neteja totes les instàncies
+ de la llista de akicks.
+
+CHAN_HELP_LEVELS
+ Sintàxi: LEVELS canal SET tipo nivell
+ LEVELS canal {DIS | DISABLE} tipo
+ LEVELS canal LIST
+ LEVELS canal RESET
+
+ La comanda LEVELS permet un control fin sobre el
+ significat dels nivellls d'accés numèrics per a
+ canals. Amb aquesta comanda, pots definir el nivelll d'accés
+ requerit per a la majoria de les funcions de %S.
+ (Les comandes SET FOUNDER i SET PASSWORD, així com
+ aquesta comanda estan sempre restringidws al fundador del
+ canal.)
+
+ LEVELS SET permet canviar el nivelll d'accés per a una funció
+ o un grup de funcions. LEVELS DISABLE (o DIS abreviat)
+ deshabilita una característica automàtica o prohibeix accés a una
+ funció per a totss excepte el fundador del canal.
+ LEVELS LIST mostra els nivellls actuals per a cada funció o
+ grup de funcions. LEVELS RESET restableix els nivellls als
+ nivellls per defecte d'un canal acabat de crear (Veure
+ HELP ACCESS LEVELS).
+
+ Per a una llista de les características i funcions a les que
+ se'ls pot canviar els nivellls, Veure HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ Els següents nombres de característiques/funcions són
+ entesos. Cal tenir en compte que els nivellls per a AUTODEOP
+ i NOJOIN són nivellls màxims, mentre tots els altres
+ són nivellls mínims.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Sintàxi: INFO canal [ALL]
+
+ llista informació sobre el canal registrat donat,
+ incloent el seu fundador, temps de registració, últim
+ cop utilitzat, descripció i fixació de Modes, si existeixen.
+ Si ALL és especificat, el misatge d'entrada i
+ sucsesor també seran mostrats.
+
+ Per defecte, l'opció ALL està limitada a aquells
+ amb accés de fundador en el canal.
+
+CHAN_HELP_LIST
+ Sintàxi: LIST patró
+
+ llista tots els canals registrats concordant amb el patró
+ donat (canals amb l'opció PRIVATE establerta no són
+ llistats.)
+
+CHAN_HELP_OP
+ Sintàxi: OP [#canal [nick]]
+
+ Opeja al nick seleccionat en un canal. Si un nick no és
+ donat, t'opejarà a tu. Si el canal i el nick no són donats,
+ te opejarà en tots els canals en els que estiguis,
+ sempre i quan tinguis els permisos per a fer-ho.
+
+ Per defecte, limitat a AOPs o aquells amb nivelll d'
+ accés 5 i major en el canal.
+
+CHAN_HELP_DEOP
+ Sintàxi: DEOP [#canal [nick]]
+
+ Desopeja al nick seleccionado en un canal. Si el nick no és
+ donat, et desopejarà a tu. Si el canal i el nick no són donats,
+ et desopejarà a tu en tots els canals en els que estiguis,
+ sempre i quan tinguis els permisos per a fer-ho.
+
+ Per defecte, limitat a AOPs o aquells amb nivelll d'
+ accés 5 i major en el canal.
+
+CHAN_HELP_VOICE
+ Sintàxi: VOICE [#canal [nick]]
+
+ Dóna voice al nick seleccionat en un canal. Si el nick no
+ és donat, et donarà voice a ti. Si el canal i el nick no són
+ donats, et donarà voice en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a
+ fer-ho.
+
+ Per defecte, limitat AOPs o aquells amb nivelll d'
+ accés 5 i major en el canal, o a VOPs o aquells
+ amb nivelll 3 i major per a donar-se voice a si mateixos.
+
+CHAN_HELP_DEVOICE
+ Sintàxi: DEVOICE [#canal [nick]]
+
+ Treu voice al nick seleccionat en un canal. Si el nick no
+ és donat, et treurà voice a tu. Si el canal i el nick no són
+ donats, et treurà voice en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a fer-ho.
+
+ Per defecte, limitat a AOPs o aquells amb nivelll d'
+ accés 5 i major en el canal, o a VOPs o aquells amb
+ nivelll 3 i major per a donar-se voice a si mateixos.
+
+CHAN_HELP_HALFOP
+ Sintàxi: HALFOP [#canal [nick]]
+
+ Dóna Halfop al nick seleccionat en un canal. Si el nick no
+ és donat, et donarà halfop a tu. Si el canal i el nick no són
+ donats, et donarà halfop en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a fer-ho.
+
+ Per defecte, limitat a AOPs i aquells amb nivelll d'
+ accés 5 i major en el canal, o a HOPs o aquells amb nivelll
+ 4 i major per a donar-se halfop a si mateixos.
+
+CHAN_HELP_DEHALFOP
+ Sintàxi: DEHALFOP [#canal [nick]]
+
+ Treu Halfop al nick seleccionat en un canal. Si el nick no
+ és donat, et treurà halfop a tu. Si el canal i el nick no són
+ donats, et treurà halfop en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a fer-ho.
+
+ Per defecte, limitat a AOPs i aquells amb nivelll d'
+ accés 5 i major en el canal, o a HOPs o aquells amb
+ nivelll 4 i major per a treure's halfop a si mateixos.
+
+CHAN_HELP_PROTECT
+ Sintàxi: PROTECT [#canal [nick]]
+
+ Protejeix al nick seleccionat en un canal. Si el nick no és
+ donat, et protegirà a tu. Si el canal i el nick no són donats,
+ et protejirà en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a fer-ho..
+
+ Per defecte, limitat al fundador, o a SOPs o aquells
+ amb nivell 10 i major en el canal per a protejerse a si
+ mismos.
+
+CHAN_HELP_DEPROTECT
+ Sintàxi: DEPROTECT [#canal [nick]]
+
+ Desprotejeix al nick seleccionat en un canal. Si el nick no
+ és donat, et desprotegirà a tu. Si el canal i el nick no són
+ donats, et desprotegirà en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a fer-ho..
+
+ Per defecte, limitat al fundador, o a SOPs o aquells
+ amb nivelll 10 i major en el canal per a desprotegir-se a
+ si mateixos.
+
+CHAN_HELP_OWNER
+ Sintàxi: OWNER [#canal]
+
+ Et dóna l'estatus de propietari del canal. Si el canal no
+ és donat, et donarà estatus de propietari en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a fer-ho.
+
+ Limitad a aquells amb nivelll de fundador en el canal.
+
+CHAN_HELP_DEOWNER
+ Sintàxi: DEOWNER [#canal]
+
+ Esborra l'estatus de propietari del canal. Si el canal no
+ és donat, esborra l'estatus de propietari en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a fer-ho.
+
+ Limitat a aquells amb nivelll de fundador en el canal.
+
+CHAN_HELP_INVITE
+ Sintàxi: INVITE canal
+
+ Li diu a %S que et convidi al canal donat.
+
+ Per defecte, limitat a AOPs o aquells amb nivell 5
+ i major en el canal.
+
+CHAN_HELP_UNBAN
+ Sintàxi: UNBAN canal
+
+ Li diu a %S que esborri tots els bans que no permeten que
+ entris al canal donat.
+
+ Per defecte, limitat a AOPs o aquells amb nivell 5
+ i major en el canal.
+
+CHAN_HELP_KICK
+ Sintàxi: KICK [#canal [nick [raó]]]
+
+ Kickeja al nick seleccionat en el canal. Si el nick no és
+ donat, et kickejara a tu. Si el canal i el nick no són donats,
+ et kickejarà en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a fer-ho.
+
+ Per defecte, limitat a AOPs o aquells amb nivell d'
+ accés 5 i major en el canal.
+
+CHAN_HELP_BAN
+ Sintàxi: BAN [#canal [nick [raó]]]
+
+ Baneja un nick seleccionat en un canal. Si el nick no
+ és donat, et banejarà a ti. Si el canal i el nick no són donats,
+ et banejara en tots els canals en els que
+ estiguis, sempre i quan tinguis els permisos per a fer-ho.
+
+ Per defecte, limitat a AOPs o aquells amb nivell d'
+ accés 5 i major en el canal.
+
+CHAN_HELP_TOPIC
+ Sintàxi: TOPIC canal [topico]
+
+ Fa a %S establir el topic del canal al especificat.
+ Si el topic no és donat, un topic buit és establert.
+ Aquesta comanda és més util utilitzada en conjunt a SET
+ TOPICLOCK. Veure /msg %S HELP SET TOPICLOCK
+ per a més informació.
+
+ Per defecte, limitat a aquells amb nivell de fundador
+ en el canal.
+
+CHAN_HELP_CLEAR
+ Sintàxi: CLEAR canal que
+
+ Li diu a %S que netegi certs paràmetres en el canal.
+ que pot ser un dels següents:
+
+ MODES Reestableix totss los Modes en el canal (o sigui,
+ neteja els Modes i,k,l,m,n,p,s,t).
+ BANS neteja tots els bans en el canal.
+ EXCEPTS neteja tots els excepts en el canal.
+ OPS Esborra estatus d'operador de canal(Mode +o)
+ de tots els operadors de canal.
+ VOICES Esborra l'estatus "voice" (Mode +v) de qui
+ tingui aquest Mode establert.
+ USERS Explusa (kickea) tots els usuaris del canal.
+
+ Per defecte, el nivell d'accés en el canal ha de ser de
+ fundador.
+
+CHAN_HELP_GETKEY
+ Sintàxi: GETKEY canal
+
+ Retorna la clau del canal donat. Aquesta és una comanda
+ principalment per a ser utilitzada per bots i/o scripts,
+ així que el resultat és de la següent manera:
+
+ KEY <canal> <key>
+
+ key és "NO KEY" si no hi ha key establerta.
+
+CHAN_HELP_SENDPASS
+ Sintàxi: SENDPASS canal
+
+ Envia la clau del canal donat a l'adresa email establerta
+ en l'arxiu del nickname del fundador. Aquesta comanda
+ és sumament útil per a recuperar claus perdudes.
+
+ pot ser limitat a Operadors de IRC en certas xarxes.
+
+ Aquesta comanda no és disponible quan l'encriptació està habilitada.
+
+CHAN_SERVADMIN_HELP
+
+ Les següents comandes estan disponibles per a administradors
+ de serveis:
+
+ GETPASS Retorna la clau de fundador per a un canal
+ (sols si l'encriptació esta deshabilitada)
+ FORBID Evita que un canal es faci servir
+ STATUS Retorna el nivell d'accés actual d'un
+ usuari en un canal
+ CLIST llista tots els canals en els que l'usuari
+ sigui fundador
+
+ Administradors de serveis també poden eliminar un canal
+ sense haver d'identificar-se per mitjà d'una clau, i poden
+ Veure l'accés, AKICK, i paràmetres de les llistes de nivells per a
+ qualsevol canal.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Sintàxi: LOGOUT canal [nickname]
+
+ Aquesta comanda ha fa que el nick seleccionat no sigui identificat
+ pel canal donat.
+
+ Si tu ets el fundador del canal, pots desconectar a
+ qui sigui, sinó només et pots desconectar a
+ tu mateix.
+
+ Si ets un administrador de serveis, pots
+ desconectar a qui sigui d'un canal sense ser el fundador
+ del canal. A més, pots omitir el paràmetro nickname;
+ això desconectara a tots els usuaris identificados
+ del canal.
+
+CHAN_SERVADMIN_HELP_DROP
+ Sintàxi: DROP canal
+
+ Desregistra el canal donat. Només
+ administradors de serveis poden eliminar un
+ canal per el qual no s'haguin identificado.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Administradors de serveis poden tambié establir la
+ Opció NOEXPIRE, amb la qual s'evita que els canals
+ expirin. A més, administradors de
+ serveis poden establir opcions per a qualsevol canal
+ sense haver d'identificarse per clau en el canal.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Sintàxi: SET canal NOEXPIRE {ON | OFF}
+
+ Estableix si el canal expirarà. Establint-lo
+ a ON evita que el canal expiri.
+
+ limitat a administradors de serveis.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Administradors de serveis poden utilitzar el paràmetre
+ ALL amb qualsevol canal
+
+CHAN_SERVADMIN_HELP_LIST
+ Sintàxi: LIST patró [FORBIDDEN] [NOEXPIRE]
+
+ llista tots els canals registrats concordant amb el patró donat.
+ canals amb l'opció PRIVATE establreta sols seran mostrats
+ a administradors de serveis. canals amb l'opció NOEXPIRE
+ tindran un ! davant del nom del canal per a
+ administradors de serveis.
+
+ Si les opcions FORBIDDEN o NOEXPIRE son donades, sols canals
+ que, respectivament, tenen FORBID o NOEXPIRE establert seran
+ mostrats. Si ambdues opcions són donades, ambdós tipus de canals
+ seran mostrats. Aquestes opcions estan limitadas a
+ administradors de serveis.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Sintàxi: GETPASS canal
+
+ Retorna la clau pel canal donat. tenir en compte
+ que quan aquesta comanda es fa servir, un missatge incloent la
+ persona que va executar la comanda i el canal en el que es va fer servir
+ seran seguits i enviats com a WALLOPS/GLOBOPS.
+
+ limitat a administradors de serveis.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Sintàxi: FORBID canal [raó]
+
+ Prohibeix a qualsevol de registrar o usar el canal
+ donat. pot ser cancelat eliminant el canal.
+
+ Raó pot ser requerida en certas xarxes.
+
+ limitat a administradors de serveis.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND channel [reason]
+
+ Disallows anyone from registering or using the given
+ channel. May be cancelled by using the UNSUSPEND
+ command to preserve all previous channel data/settings.
+
+ Reason may be required on certain networks.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Releases a suspended channel. All data and settings
+ are preserved from before the suspension.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Sintàxi: STATUS canal nickname
+
+ Retorna el nivell d'accés actual del nick donat
+ en el canal donat. La resposta és de la forma:
+
+ STATUS canal nickname nivell-de-accés
+
+ Si un error es dóna, la resposta serà de la forma:
+
+ STATUS ERROR missatge-de-error
+
+ limitat a administradors de serveis.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S és una utilitat que permet a usuaris de IRC
+ enviar missatges curts a altres usuaris de IRC, estiguin
+ en linea o no, o a canals(*). Ambdós el nickname que
+ envia i el nickname o canal destinataris han d'estar
+ registrats per a enviar un memo.
+
+ Les comandes de %S incloen:
+
+ SEND Envia un memo a un nick o canal
+ CANCEL Cancela l'últim memo enviat
+ LIST llista els teus memos
+ READ Llegeix un o més memos
+ DEL Esborra un o més memos
+ SET Estableix opcions relacionades a memos
+
+MEMO_HELP_ADMIN
+ SENDALL Send a memo to all registered users
+
+MEMO_HELP_OPER
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_FOOTER
+
+ escriu /msg %S HELP comando per a més ajuda en
+ qualsevol de les comandes llistades anteriorment.
+
+ (*) Per defecte, qualsevol usuari amb al menys nivell
+ d'accés 10 en un canal pot lleguir els memos del
+ canal. Això pot ser canviat amb la comanda
+ LEVELS de %s.
+
+MEMO_HELP_SEND
+ Sintàxi: SEND {nick | canal} text-del-memo
+
+ Envia un memo al nick o canal donat, que conté
+ text-del-memo. A l'enviar a un nickname, aquest
+ rebrà noticia de que ell/ella té un nou memo. El nick
+ o canal receptors han d'estar registrats.
+
+MEMO_HELP_CANCEL
+ Sintàxi: CANCEL {nick | canal}
+
+ Cancela l'ultim memo enviat al nick o canal donat,
+ sempre i quan no hagi sigut llegit al moment en el que
+ vas fer servir la comanda.
+
+MEMO_HELP_LIST
+ Sintàxi: LIST [canal] [llista | NEW]
+
+ llista els memos que tens actualment. Amb NEW, llista
+ només els memos nous (no llegits). Memos nous estan
+ marcats amb un "*" a l'esquerra del nobre del memo.
+ També pots especificar una llista de nombres, com en el
+ exemple més endevant:
+
+ LIST 2-5,7-9
+ llista memos enumerats 2 a 5 i 7 a 9.
+
+MEMO_HELP_READ
+ Sintàxi: READ [canal] {nombre | llista | LAST | NEW}
+
+ T'envia el text dels memos especificats. Si LAST és
+ donat, t'envia l'ultim memo rebut. si NEW és donat, t'
+ envia tots els teus memos nous. D'altra forma, t'envia el
+ memo nombre nombre. També pots donar una llista de
+ nombres, com en el exemple:
+
+ READ 2-5,7-9
+ mostra els memos enumerats 2 a 5 i 7 a 9.
+
+MEMO_HELP_DEL
+ Sintàxi: DEL [canal] {nombre | llista | LAST | ALL}
+
+ Esorra el o els memos especificats. pots donar multiples
+ nombres o rangs de nombres en lloc d'un solo, com en el
+ exemple.
+
+ If LAST is given, the last memo will be deleted.
+ Si ALL és donat, esborra tots els teus memos.
+
+ exemples:
+
+ DEL 1
+ Esorra el teu primer memo.
+
+ DEL 2-5,7-9
+ Esborra els memos enumerats 2 a 5 i 7 a 9.
+
+MEMO_HELP_SET
+ Sintàxi: SET Opció paràmetros
+
+ Estableix varies opcions de memos. Opció pot ser una de:
+
+ NOTIFY Canvia quan seràs notificat sobre de
+ nous memos (sols per a nicknames)
+ LIMIT Estableix el màxim nombre de memos que
+ pots rebre
+
+ escriu /msg %S HELP SET Opció per a més informació
+ sobre una opció específica.
+
+MEMO_HELP_SET_NOTIFY
+ Sintàxi: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Canvia quan se't notificarà de nous memos:
+
+ ON Notificació de memos quan et conectis,
+ quan treguis /AWAY, i quan
+ s'enviin
+ LOGON Sols seras notificat de memos quan et conectis
+ o quan treguis /AWAY.
+ NEW Sols seras notificat de memos quan se't
+ enviin.
+ OFF No rebràs cap notificació per memos.
+
+ ON és escencialment LOGON i NEW combinats.
+
+MEMO_HELP_SET_LIMIT
+ Sintàxi: SET LIMIT [canal] límit
+
+ Estableix el màxim nombre de memos que tu (o el canal donat)
+ pots tenir. Si queda a 0, ningú podrà
+ enviar-te memos. A més, no pots establir el límit més
+ alt que %d.
+
+MEMO_HELP_INFO
+ Sintàxi: INFO [canal]
+
+ mostra informació del nombre de memos que tens,
+ quants d'ells encar no han sigut llegits, i quants memos
+ pots rebre. Amb un paràmetre, mostra la mateixa
+ informació pel canal donat.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Sintàxi: SET LIMIT [usuari | canal] {límit | NONE} [HARD]
+
+ Estableix el màxim nombre de memos un usuari o canal està
+ permès. Establir el límit a 0 evita a l'usuari
+ de rebre memos; posar-lo a NONE permet a l'usuari
+ de rebre i guardar els memos que vulgui. Si no dones un
+ nickname o canal, el teu propi límit està establert.
+
+ Afegir HARD evita al usuari de canviar el límit. No
+ afegir HARD té l'efect contrari, permetent a l'
+ usuari canviar el límit (encara que un límit previ hagui sigut establert
+ amb HARD).
+
+ L'us de la comanda SET LIMIT està limitat a
+ administradors de serveis. altres usuaris poden
+ només establir límits per a ells mateixos o per a un canal en
+ el que tinguin certos privilegos, no podenn esborrar el seu
+ límit, no poden establir el límit més enllà de %d, i no
+ poden establir un límit hard.
+
+MEMO_SERVADMIN_HELP_INFO
+ Sintàxi: INFO [nick | canal]
+
+ Sense un paràmetro, mostra informació del nombre
+ de memos que tens, quants d' ells encara no s'han
+ llegit, i el nombre total de memos que pots rebre.
+
+ amb un canal de paràmetre, mostra la mateixa informació
+ pel canal donat.
+
+ amb un nickname de paràmetr, mostra la misma
+ informació pel nickname donat. Aquest us està
+ limitat a administradors de serveis.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Syntax: STAFF memo-text
+
+ Sends all services staff a memo containing memo-text.
+ Note: If you have opers on both the oper list and the
+ admin list they will recive the memo twice. The same
+ applies for oper's on the Root list as well as other
+ lists.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL memo-text
+
+ Sends all registered users a memo containing memo-text.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ Comandes per a %S:
+ GLOBAL Envia un missatge a totss els usuaris
+ STATS mostra estatus dels serveis i la xarxa
+ OPER LIST Llista tots els operadors de serveis
+ ADMIN LIST Llista tots els administradors de
+ serveis
+
+OPER_HELP_OPER_CMD
+ Comandes disponibles sols per a operadors i administradors
+ de serveis:
+ MODE Canvia els Modes d'un canal
+ KICK Kickeja un usuari d'un canal
+ CLEARMODES neteja els Modes d'un canal
+ KILLCLONES Mata tots els usuaris en un host
+ AKILL Manipula la llista AKILL
+ SGLINE Manipula la llista SGLINE
+ SQLINE Manipula la llista SQLINE
+ SZLINE Manipula la llista SZLINE
+
+OPER_HELP_ADMIN_CMD
+ Comandes disponibles només a administradors de serveis:
+ OPER Modifica la llista d'operadors de serveis
+ CHANLIST Llista tots els records de canal
+ USERLIST Llista tots els records d'usuaris
+ LOGONNEWS Defineix missatges per a ser mostrats a usuaris
+ al conectarse
+ RANDOMNEWS Defineix missatges per a ser mostrats a usuaris
+ al conectarse
+ OPERNEWS Defineix missatges per a ser mostrats a usuaris
+ al transformar-se en operadors
+ SESSION Mostra la llista de sessions de host
+ EXCEPTION Modifica la llista de límit de sessió
+ CACHE Llista cau de hostnames utilitzats pel detector
+ de proxys
+ NOOP Temporalment elimina totes les linees O:
+ d'un servidor remotamente
+ JUPE "Jupiter" (Mart,Saturn....) un servidor
+ SET Estableix varies opcions globals dels serveis
+ RELOAD Recarrega la configuració dels serveis
+ UPDATE Força a la base de dades dels serveis a
+ ser actualitzada a disc inmediatament
+ QUIT Termina el programa de serveis sense grabar les dades
+ RESTART Guarda la base de dades dels serveis i
+ reinicia els serveis
+ QUIT Termina el programa de serveis sense guardar
+ els canvis
+ SHUTDOWN Termina el programa de serveis guardant els
+ canvios
+
+ Comandes disponibles nomès pel super-usuari de serveis:
+ ADMIN Modifica la llista d'administradors de
+ serveis
+
+OPER_HELP_ROOT_CMD
+ Commands available to Serivces Roots only:
+ MODLOAD Load a module
+ MODUNLOAD Un-Load a module
+ MODLIST List loaded modules
+ MODINFO Info about a loaded module
+
+OPER_HELP_LOGGED
+ Noticia: Totes les comandes enviades a %S son monitorejades!
+
+OPER_HELP_GLOBAL
+ Sintàxi: GLOBAL missatge
+
+ Permet als IRCops a enviar missatges als usuaris de
+ la xarxa. El missatge sera enviat desde el nick %s.
+
+OPER_HELP_STATS
+ Sintàxi: STATS [AKILL | ALL | RESET]
+
+ Sense una opció, mostra el nom actual d'usuaris i
+ IRCops en linea (excluient els serveis), el màxim
+ nombre d'usuaris desde que els serveis s'han iniciat, i
+ el temps que els serveis han estat funcionant.
+
+ Amb L'opció AKILL, mostra la mida actual de la
+ llista AKILL i l'actual temps d'expiració per defecte.
+
+ L'opció ALL esta sols disponible per administradors de
+ serveis, i mostra informació en el us de memòria dels
+ serveis. Utilitzar aquesta opció pot congelar els
+ serveis per un curt periode de temps en xarxes grans,
+ aixi que no es recomana utilitzar sovint.
+
+ L'opció RESET estableix el nombre màxim d'usuaris
+ al nombre d'usuaris actualment presents en la xarxa.
+
+ UPTIME pot ser utilitzat com a sinònim per STATS.
+
+OPER_HELP_OPER
+ Sintàxi: OPER ADD nick
+ OPER DEL {nick | nom | llista}
+ OPER LIST [mascara | llista]
+ OPER CLEAR
+
+ Permet als administradors de serveis afegir o
+ eliminar nicknames a la llista d'operadors de
+ serveis. Un usuari amb el seu nickname a la llista
+ d'operadors de serveis i que ha estat identificat
+ amb %s podra accedir a comandes d'operador de
+ serveis.
+
+ La comanda OPER ADD afegeix el nickname donat a la
+ llista d'operadors de serveis.
+
+ La comanda OPER DEL elimina el nickname donat de
+ la llista d'operadors de serveis. Si una llista de
+ instàncies es especificada, aquestes instàncies son esborrades.
+ (Veure l'exemple per a LIST especificat més endavant.)
+
+ La comanda OPER LIST mostra la llista
+ d'operadors de serveis. Si s'especifica una mascara, nomès
+ les instàncies que concordin amb la mascara són
+ mostrades. Si s'especifica una llista de noms es , nomès aquestes
+ instàncies son mostrades; per exemple:
+
+ OPER LIST 2-5,7-9
+ Llista instàncies d'operadors de serveis
+ enumerades de 2 a 5 i de 7 a 9.
+
+ La comanda OPER CLEAR neteja totes les instàncies
+ de la llista d'operadors de serveis.
+
+ Qualsevol operador d'IRC pot utilitzar la forma
+ OPER LIST de la comanda. Tots les altres utilitats estan
+ limitats als administradors de serveis.
+
+OPER_HELP_ADMIN
+ Sintàxi: ADMIN ADD nick
+ ADMIN DEL {nick | nom | llista}
+ ADMIN LIST [mascara | llista]
+ ADMIN CLEAR
+
+ Permet al root de serveis afegir o eliminar nicknames
+ a la llista d'administradors de serveis. Un usuari
+ el nickname del qual estigui a la llista d'administradors de
+ serveis i que ha estat identificat amb %s podra
+ accedir a comandes d'administradors de serveis.
+
+ La comanda ADMIN ADD afegeix el nickname especificat a la llista
+ d'administradors de serveis.
+
+ La comanda ADMIN DEL elimina el nickname especificat de la
+ llista d'administradors de serveis. Si una llista
+ d'instàncies es especificada, aquestes instàncies son esborrades.
+ (Veure l'exemple per LIST que s'especifica més endavant.)
+
+ La comanda ADMIN LIST mostra la llista
+ d'administradors de serveis. Si s'especifica una mascara, nomès
+ les instàncies que concordin amb la mascara són mostrades;
+ per exemple:
+
+ ADMIN LIST 2-5,7-9
+ Llista instàncies de la llista d'administradors de
+ serveis enumerades de 2 a 5 i de 7 a 9.
+
+ La comanda ADMIN CLEAR neteja totes les instàncies de
+ la llista d'administradors de serveis.
+
+ Qualsevol operador d'IRC pot utilitzar la forma ADMIN LIST
+ de la comanda. Tots les altres utilitats estan limitades al
+ root de serveis.
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST} [time] [nick]
+
+ Allows Services Admins to make Services ignore an user for
+ a certain time or until the next restart. The default time
+ format is seconds. You can specify it by using units. Valid
+ units are: s for seconds, m for minutes, h for hours and
+ d for days. Combinations of these units are not permitted. To
+ make Services permanently ignore the user type 0 as time.
+
+OPER_HELP_MODE
+ Sintàxi: MODE canal Modes
+
+ Permet als operadors de serveis establir modes de canal
+ per a qualsevol canal. Els parametres son els mateixos que per la
+ comando estandart /MODE.
+
+ Limitat a operadors de serveis.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user modes
+
+ Allows Services admins to set user modes for any user.
+ Parameters are the same as for the standard /MODE
+ command.
+
+ Limited to Services admins.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Allows Services admins to give Operflags to any user.
+ Flags have to be prefixed with a "+" or a "-". To
+ remove all flags simply type a "-" instead of any flags.
+
+ Limited to Services admins.
+
+OPER_HELP_CLEARMODES
+ Sintàxi: CLEARMODES canal [ALL]
+
+ Neteja tots els modes binarios (i,k,l,m,n,p,s,t) i
+ bans del canal. Si s'especifica ALL, tambe neteja
+ tots els ops i voices (modes +o i +v) del canal.
+
+ Limitat a operadors de serveis.
+
+OPER_HELP_KICK
+ Sintàxi: KICK canal usuari raó
+
+ Permet als IRCops kickejar un usuari de qualsevol
+ canal. Els parametres son els mateixos que per la comanda
+ /KICK. El missatge de kick tindra el nickname del IRCop
+ que envia la comanda KICK; per exemple:
+
+ *** SpamMan ha estat kickejat del canal #aujac per %S (cistus (Flood))
+
+ Limitat a operadors de serveis.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick newnick
+
+ Forcefully changes a user's nickname from nick to newnick.
+
+ Limited to Services admins
+
+OPER_HELP_AKILL
+ Sintàxi: AKILL ADD [+expiració] mascara raó
+ AKILL DEL {mascara | nom | llista}
+ AKILL LIST [mascara | llista]
+ AKILL VIEW [mascara | llista]
+ AKILL CLEAR
+
+ Permet als operadors de serveis manipular la llista de
+ AKILLS. Si un usuari coincideix amb una mascara en la
+ llista de AKILLS i s'esta intentant connectar, els serveis enviaran
+ un KILL a aquest usuari i, en tipus de servidors soportats,
+ notificara a tots els servidors que afegeixin un ban (linea K)
+ per la mascara de l'usuari.
+
+ AKILL ADD afegeix la mascara usuari@host especificada a la llista
+ de AKILLS per la raó especificada (que HA DE SER especificada).
+ expiració es especificada com un sencer seguit de
+ d (dies), h (hores), o m (minuts). Combinacions (com
+ 1h30m) no estan permesses. Si un especificador d'unitats no
+ es inclòs, per defecte seran dies (o sigui +30 nomès
+ significa 30 dies). Per afegir un AKILL que no caduqui, utilitza +0.
+ Si la mascara a afegir comença amb un +, s'ha d'especificar
+ un temps d'expiració. El temps d'expiració per defecte actual de AKILLS
+ pot ser consultat amb la comanda STATS AKILL.
+
+ La comanda AKILL DEL esborra la mascara especificada de la llista
+ d'AKILLS si esta present. Si s'especifica una llista de noms,
+ aquestes instàncies son esborrades. (Veure l'exemple per LIST
+ especificat més endavant.)
+
+ La comanda AKILL LIST mostra la llista d'AKILLS.
+ Si s'especifica una mascara, nomès les instàncies coincidents
+ amb la mascara són mostrades. Si s'especifica una llista de noms,
+ nomès aquestes instàncies son mostrades; per exemple:
+
+ AKILL LIST 2-5,7-9
+ Llista les instàncies de AKILL enumerades de 2 a 5 i de 7
+ a 9.
+
+ AKILL VIEW es una versió més verbal d'AKILL LIST, i
+ mostrara qui va afegir un AKILL, la data en que va ser afegit,
+ i quan caducara, així com tambe la mascara usuari@host
+ i la raó.
+
+ AKILL CLEAR neteja totes les instàncies de la llista d'AKILLS.
+
+ Limitat a operadors de serveis.
+
+OPER_HELP_SGLINE
+ Sintàxi: SGLINE ADD [+expiració] mascara:raó
+ SGLINE DEL {mascara | nom | llista}
+ SGLINE LIST [mascara | llista]
+ SGLINE VIEW [mascara | llista]
+ SGLINE CLEAR
+
+ Permet als operadors de serveis manipular la llista
+ de SGLINES. Si un usuari amb un nom real concordant
+ amb una mascara SGLINE s'intenta connectar, els serveis
+ l'impediran aconseguir una sessió d'IRC.
+
+ SGLINE ADD afegeix la mascara de nom real especificada a la
+ llista de SGLINES per la raó especificada (obligatori).
+ expiració es especificada com un sencer
+ seguit de d (dies), h (hores), o m
+ (minuts). Combinacions (com 1h30m) no estan
+ permesses. Si l'especificació de la unitat no es
+ especificada, per defecte són dies (és a dir +30 nomès
+ significa 30 dies). Per afegir una SGLINE que no caduqui,
+ utilitza +0. Si la mascara de nom real especificada comença amb
+ +, el temp d'expiració ha de ser especificat, encara que sigui
+ el mateix que el per defecte. El temps actual d'expiració
+ per defecte per SGLINES pot ser consultat amb la comanda
+ STATS AKILL.
+ Nota: Ja que la mascara de nom real pot contenir
+ espais, el separador entre aquest i la raó es un signe de
+ dos punts.
+
+ La comanda SGLINE DEL esborra la mascara especificada de la
+ llista de SGLINES si esta present. Si s'especifica una llista de
+ instàncies, aquestes instàncies son esborrades. (Veure
+ l'exemple per LIST especificat més endavant.)
+
+ La comanda SGLINE LIST mostra la llista de SGLINES. Si
+ s'especifica una mascara, nomès les instàncies concordant amb
+ la mascara són mostrades. Si s'especifica una llista de instàncies,
+ nomès aquestes instàncies son mostrades; per exemple:
+
+ SGLINE LIST 2-5,7-9
+ Llista instàncies de SGLINES enumerades de 2 a 5 i de 7
+ a 9.
+
+ SGLINE VIEW es una versió més verbal que SGLINE LIST,
+ i mostrara qui va fegir la SGLINE, la data en la que va
+ ser afegida, i quan caducara, a més de la mascara de nom real
+ i la raó.
+
+ SGLINE CLEAR neteja totes les instàncies de la llista de
+ SGLINES.
+
+ Limitat a operadors de serveis.
+
+OPER_HELP_SQLINE
+ Sintàxi: SQLINE ADD [+expiració] mascara raó
+ SQLINE DEL {mascara | nom | llista}
+ SQLINE LIST [mascara | llista]
+ SQLINE VIEW [mascara | llista]
+ SQLINE CLEAR
+
+ Permet als operadors de serveis manipular la llista
+ de SQLINES. Si un usuari amb un nick concordant amb una
+ mascara SQLINE s'intenta connectar, els serveis li
+ impediran aconseguir una sessió d'IRC.
+
+ Si el primer caràcter de la mascara es #, els serveis
+ evitaran l'ús dels canals coincidents (a IRCds
+ que ho soportin).
+
+ SQLINE ADD afegeix la mascara de nom real especificada a la
+ llista de SQLINES per la raó especificada (que s'ha d'especficar).
+ expiració es especificada como un sencer
+ seguit de d (dies), h (hores), o m
+ (minuts). Combinacions (com 1h30m) no estan
+ permesses. Si l'especificació de la unitat no es
+ especificada, per defecte són dies (és a dir +30 nomès
+ significa 30 dies). Per afegir una SQLINE que no caduqui,
+ utilitzar +0. Si la mascara de nom real especificada comença amb
+ +, el temps d'expiració ha de ser especificat, encara que sigui
+ el mateix que el per defecte. El temps actual d'expiració
+ per defecte per SQLINES pot ser consultat amb la comanda
+ STATS AKILL.
+
+ La comanda SQLINE DEL esborra la mascara especificada de la
+ llista de SQLINES si esta present. Si s'especifica una llista de
+ instàncies, aquestes instàncies son esborrades. (Veure
+ l'exemple per LIST especificat més endavant.)
+
+ La comanda SQLINE LIST mostra la llista de SQLINES. Si
+ s'especifica una mascara, nomès les instàncies coincidents amb
+ la mascara son mostrades. Si s'especifica una llista de instàncies,
+ sols esas instàncies son mostrades; per exemple:
+
+ SQLINE LIST 2-5,7-9
+ llista instàncies de SQLINES enumerades de 2 a 5 i de 7
+ a 9.
+
+ SQLINE VIEW es una versió més verbal que SQLINE LIST,
+ i mostrara qui va afegir la SQLINE, la data en la que va
+ ser afegida, i quan caducara, a més de la mascara de nom real
+ i la raó.
+
+ SQLINE CLEAR neteja totes les instàncies de la llista de
+ SQLINES.
+
+ Limitat a operadors de serveis.
+
+OPER_HELP_SZLINE
+ Sintàxi: SZLINE ADD [+expiració] mascara raó
+ SZLINE DEL {mascara | nom | llista}
+ SZLINE LIST [mascara | llista]
+ SZLINE VIEW [mascara | llista]
+ SZLINE CLEAR
+
+ Permet als operadors de serveis manipular la
+ llista de SZLINES. Si un usuari amb una IP concordant
+ amb una mascara de la llista de SZLINES intenta connectar-se,
+ els serveis le impediran obtenir una sessió d'IRC
+ (és a dir, si la IP te un PTR RR o no).
+
+ SZLINE ADD afegeix la mascara IP especificada a la llista de
+ SZLINES per la raó especificada (que s'ha d'especificar).
+ expiració es especificada com un sencer seguit
+ de d (dias), h (hores), o m (minuts).
+ Combinacions (com 1h30m) no estan permesses. Si
+ una especificació d'unitat no es especificada, per
+ defecte es dies (és a dir, +30 significa
+ 30 dies). Per afegir una SZLINE que no caduqui, utilitzar
+ +0. Si la mascara a afegir comença amb un
+ +, el temps d'expiració ha de ser especificat, encara
+ que sigui el mateix que el per defecte. El temps actual
+ d'expiració per defecte per SZLINES pot ser
+ consultat amb la comanda STATS AKILL.
+
+ La comanda SZLINE DEL esborra la mascara especificada de la
+ llista de SZLINES si esta present. Si s'especifica una llista de
+ instàncies, aquestes instàncies son esborrades. (Veure
+ l'exemple per LIST especificat més endavant.)
+
+ La comanda SZLINE LIST mostra la llista de SZLINES.
+ Si s'especifica una mascara, nomès aquellas instàncies
+ coincidents amb la mascara són mostrades. Si s'especifica una llista
+ de instàncies, nomès aquestes instàncies són mostrades;
+ per exemple:
+
+ SZLINE LIST 2-5,7-9
+ Llista instàncies SZLINE enumerades de 2 a 5 i de 7
+ a 9.
+
+ SZLINE VIEW es una versió més verbal de SZLINE LIST,
+ i mostrara qui va afegir una SZLINE, la data en la que
+ va ser afegida, i quan caducara, a més de la mascara IP i
+ la raó.
+
+ SZLINE CLEAR neteja totes les instàncies de la llista
+ de SZLINES.
+
+ Limitat a operadors de serveis.
+
+OPER_HELP_SET
+ Sintàxi: SET opció parametres
+
+ Estableix varies opcions globals de serveis.
+ Noms de opcions actualment definides són:
+ READONLY Estableix Mode nomès lectura o nomès escritura
+ LOGCHAN Report log messages to a channel
+ DEBUG Activa o desactiva el Mode debug
+ NOEXPIRE Activa o desactiva el Mode no expire
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_SET_READONLY
+ Sintàxi: SET READONLY {ON | OFF}
+
+ Estableix el mode nomès lectura a activat o desactivat. En mode
+ nomès lectura, els usuaris normals no podran modificar dades
+ de serveis, incloent accés a llistes de canals i
+ nicknames, etc. IRCops amb suficients privilegis amb
+ els serveis podren modificar la llista AKILL de
+ serveis i eliminar o prohibir nicknames i canals, però
+ cap d'aquests canvios sera guardat excepte que el
+ mode nomès lectura es desactivi abans de que els serveis
+ siguin desactivats o reiniciats.
+
+ Aquesta opció es equivalent a l'opció -readonly en
+ la linea de comandes.
+
+OPER_HELP_SET_LOGCHAN
+ Syntax: SET LOGCHAN {ON | OFF}
+
+ With this setting on, Services will send its logs to a specified
+ channel as well as the log file. LogChannel must also be defined
+ in the Services configuration file for this setting to be of any
+ use.
+
+ Note: This can have strong security implications if your log
+ channel is not properly secured.
+
+OPER_HELP_SET_DEBUG
+ Sintàxi: SET DEBUG {ON | OFF | nom}
+
+ Estableix el mode debug a activat o desactivat. En mode debug,
+ tota la informació enviada desde i cap als serveis,
+ a més de un numero de missatges són escrits a l'arxiu
+ de log. Si s'especifica nom, el mode debug es
+ activat, amb el nivell de debug especificat a nom.
+
+ Aquesta opció es equivalent a l'opció -debug en
+ la linea de comandes.
+
+OPER_HELP_SET_NOEXPIRE
+ Sintàxi: SET NOEXPIRE {ON | OFF}
+
+ Estableix el mode no expire a activat o desactivat. En
+ mode no expire, nicks, canals, akills i excepcions
+ no caducaran fins que l'opció sigui desactivada.
+
+ Aquaquesta opció es equivalent a l'opció -noexpire
+ en la linea de comandes.
+
+OPER_HELP_SET_SUPERADMIN
+ Syntax: SET SUPERADMIN {ON | OFF}
+
+ Setting this will grant you extra privlages such as the
+ ability to be "founder" on all channel's etc...
+
+ This opion is _NOT_ persistant, and should only be used when
+ needed, and set back to OFF when no longer needed.
+
+
+OPER_HELP_NOOP
+ Sintàxi: NOOP SET servidor
+ NOOP REVOKE servidor
+
+ NOOP SET esborra totes les linees O: del
+ servidor especificat i killeja a tots els IRCops actuals
+ per a prevenir-los de fer rehash en el servidor
+ (ja que això cancel.laria l'efecte).
+
+ NOOP REVOKE fa que les linees 0: disponibles novament
+ en el servidor especificat.
+
+ Nota: El servidor no es testejat pels
+ serveis.
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_JUPE
+ Sintàxi: JUPE servidor [raó]
+
+ Li diu als serveis que fagin jupiter (saturn, mart,...) a un servidor
+ -- és a dir, crear un "servidor" fals conectant als
+ serveis el qual preveu al servidor real de
+ connectar-se. El jupe pot ser eliminat utilitzant la comanda
+ estandart SQUIT. Si una raó es especificada, es afegida
+ en el camp d'informació sobre el servidor; d'altra
+ banda, el camp de informació sobre el servidor tindra
+ el text "Juped per <nick>", mostrant el nickname
+ de la persona que va jupitejar el servidor.
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_RAW
+ Sintàxi: RAW text
+
+ Envia una linea de text directament al servidor al qual
+ els serveis estan connectats. Aquesta comanda te un
+ us molt limitat i pot malmetre una xarxa si es
+ utilitzat de manera impròpia. NO UTILITZIS aquesta COMANDA a
+ no ser que estiguis absolutament seguro del que fas!
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_UPDATE
+ Sintàxi: UPDATE
+
+ Força als serveis a actualitzar tots els arxius de
+ la base de dades tan aviat como enviis la comanda.
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_RELOAD
+ Sintàxi: RELOAD
+
+ Força als serveis a recarregar l'arxiu de
+ configuració. Tenir en compe que algunes directives
+ necessiten que els serveis es reinicin de nou per tenir
+ efecte (tal com nicknames dels serveis, activació
+ de la limitació de sessions, etc.)
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_QUIT
+ Sintàxi: QUIT
+
+ Força als serveis a parar inmediatament; les bases de
+ dades no son guardades. Aquesta comanda no ha de ser utilitzada
+ excepte que les còpies en la memòria semblin espatllades i no
+ hagin de ser guardades. Per parar normalment, utilitza la comanda
+ SHUTDOWN.
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_SHUTDOWN
+ Sintàxi: SHUTDOWN
+
+ Força als serveis a guardar totes les bases de
+ datos i parar.
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_RESTART
+ Sintàxi: RESTART
+
+ Força als serveis a guardar totes les bases de
+ dades i després parar i arrancar de nou.
+ (es a dir, finalitzar el programa e inmediatament reiniciar
+ el programa de nou).
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_KILLCLONES
+ Sintàxi: KILLCLONES nick
+
+ Killeja tots els usuaris amb el mateix host a nick.
+ Un AKILL temporal, de la forma *@host, es afegit
+ per prevenir al client ofensor de reconnectar-se
+ inmediatament. Un wallops es tambe enviat indicant
+ qui utilitza la comanda, quin host fou afectat i quants
+ usuaris van ser killejats. Aquesta comanda és útil per
+ eliminar multiples clons de la xarxa.
+
+ Limitat a operadors de serveis.
+
+OPER_HELP_CHANLIST
+ Sintàxi: CHANLIST [{patró | nick} [SECRET]]
+
+ Llista tots els canals actualment en ús en la xarxa IRC,
+ estiguin registrats o no.
+
+ Si s'especifica patró, llista nomès els canals que concordin amb ell.
+ Si s'especifica un nickname, llista nomès els canals en els que l'usuari
+ hi sigui. Si s'especifica SECRET, llista nomès els canals que
+ concordin amb patró i que tinguin modes +s o +p.
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_USERLIST
+ Sintàxi: USERLIST [{patró | canal} [INVISIBLE]]
+
+ Llista tots els usuaris actualment en linea en la xarxa IRC,
+ estiguin registrats o no.
+
+ Si s'especifica patró, llista nomès els usuaris que concordin
+ amb ell (ha de ser amb el format nick!usuari@host). Si s'especifica canal,
+ llista nomès els usuaris que estiguin en el canal donat. Si s'especifica
+ INVISIBLE, nomès els usuaris amb la bandera +i seran
+ llistats.
+
+ Limitat a administradors de serveis.
+
+OPER_HELP_CACHE
+ Sintàxi: CACHE DEL hostname
+ CACHE LIST patró [QUEUED | ALL]
+
+ La comanda CACHE DEL esborra el host especificat del cau.
+ Això nomès esta indicat per a propòsits de debug.
+
+ La comanda CACHE LIST llista tots els proxies trobats que
+ concordin amb el patró especificat. Si s'especifica l'opció QUEUED,
+ llistara tots els processos encuats o en progres, i si s'especifica
+ l'opció ALL, llistara tots els hostnames a cau.
+
+ Limitat a administradors de serveis.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD FileName
+
+ This command loads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ This command unloads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO FileName
+
+ This command lists information about the specified loaded module
+
+ Limited to Services Roots.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S et permet crear un bot en el teu propi canal.
+ Això ha estat creat per a usuaris que no poden
+ tenir un bot en un host o configurar un bot, o per a us en xarxes
+ que no permeten bots d'usuaris. Comandes
+ disponibles estan llistades més endavant; per a
+ utilitzar-los, escriu /msg %S comanda. per a més
+ informació sobre un comanda especifica, escriu
+ /msg %S HELP comanda.
+
+ BOTLIST Llista bots disponibles
+ ASSIGN Assigna un bot a un canal
+ SET Configura opcions de bots
+ KICK Configura kickers
+ BADWORDS Manté una llista de paraules malsonants
+
+ Altres comandos: ACT INFO SAY UNASSIGN
+
+ El bot entrara a un canal quan hi hagin
+ %d usuari(s) en ell.
+
+BOT_HELP_BOTLIST
+ Sintàxi: BOTLIST
+
+ Llista tots els bots disponibles en aquesta xarxa.
+
+BOT_HELP_ASSIGN
+ Sintàxi: ASSIGN canal nick
+
+ Assigna un bot especificat per nick al canal.
+ Desprès d'això pots configurar el bot segons
+ les teves necessitats.
+
+BOT_HELP_UNASSIGN
+ Sintàxi: UNASSIGN canal
+
+ Desassigna un bot d'un canal. A l'utilitzar aquesta comanda
+ el bot ja no entrara al canal. De totes maneres, la configuració
+ del bot pel canal es enmagatzemada, així et sera possible
+ reassignar un bot sense haver de configurar-lo de nou.
+
+BOT_HELP_INFO
+ Sintàxi: INFO {canal | nick}
+
+ Permet veure la informació de %S sobre un canal o
+ bot. Si el parametre es un canal, rebràs informació
+ així como kickers activats. Si el parametre es un nick,
+ rebràs informació sobre el bot, així com temps
+ de creació o nom de canals en els que aquest estigui.
+
+BOT_HELP_SET
+ Sintàxi: SET canal opció parametres
+
+ Configura opcions de bot. Opció pot ser uno de:
+
+ DONTKICKOPS Per a protegir ops contra kicks de bots
+ DONTKICKVOICES Per a protegir voices contra kicks de bots
+ GREET Habilita missatges de benvinguda
+ FANTASY Habilita comandoe de fantasia
+ SYMBIOSIS Permet al bot a actuar como un bot real
+
+ Escriu /msg %S HELP SET opció per més informació
+ sobre una opció especifica.
+
+ Nota: L'accés a aquesta comanda esta controlat pel
+ nivell SET.
+
+BOT_HELP_SET_DONTKICKOPS
+ Sintàxi: SET canal DONTKICKOPS {ON|OFF}
+
+ Habilita o deshabilita el mode de protecció d'ops
+ en un canal. En habilitar-lo, ops no seran
+ kickejats pel bot, encara que no concideixen amb
+ el nivell NOKICK.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Sintàxi: SET canal DONTKICKVOICES {ON|OFF}
+
+ Habilita o deshabilita el mode de protecció de voices
+ en un canal. En hbilitarlo, voices no seran
+ kickejatos pel bot, encara que no coincideixin amb
+ el nivell NOKICK.
+
+BOT_HELP_SET_FANTASY
+ Sintàxi: SET canal FANTASY {ON|OFF}
+
+ Habilita o deshabilita el mode de fantasia
+ en un canal. En habilitar-lo, els usuaris podran
+ utilitzar les comandes !op, !deop, !voice, !devoice,
+ !kick, !kb, !unban, !seen en un canal (investiga
+ com utilitzar-los; intenta amb o sense nick per cadascú
+ i amb raó per a alguns?).
+
+ Cal dir que els usuaris que desitgin utilitzar comandes
+ de fantasia HAN DE DISPOSSAR del nivell necessari
+ pel nivell FANTASIA i altres depenent
+ de la comanda si es requereix (per exemple, per a
+ utilitzar !op, l'usuari ha de tenir suficient
+ accés pel nivell OPDEOP).
+
+BOT_HELP_SET_GREET
+ Sintàxi: SET canal GREET {ON|OFF}
+
+ Habilita o deshabilita el mode de asludo en
+ un canal. En habilitar-lo, el bot mostrara els
+ missatges dels usuaris que entrin al canal,
+ sempre i quan tinguin el suficient accés
+ al canal.
+
+BOT_HELP_SET_SYMBIOSIS
+ Sintàxi: SET canal SYMBIOSIS {ON|OFF}
+
+ Habilita o dehsabilita el mode simbiosis en
+ un canal. En habilitar-lo, el bot fara qualsevol
+ cosa que normalmente hauria fet %s en els
+ canals, tal como modes, KICKS i fins tot els
+ missatges d'entrada.
+
+BOT_HELP_KICK
+ Sintàxi: KICK canal opció parametres
+
+ Configura els kickers de bot. opció pot ser una de:
+
+ BOLDS Estableix si el bot kickejara negretes
+ BADWORDS Estableix si el bot kickejara paraules malsonants
+ CAPS Estableix si el bot kickejara majuscules
+ COLORS Estableix si el bot kickea colors
+ FLOOD Estableix si el bot kickejara usuaris
+ que floodejan
+ REPEAT Estableix si el bot kickejara usuaris
+ que repeteixen com l'allioli
+ REVERSES Estableix si el bot kickejara reversos
+ UNDERLINES Estableix si el bot kickejara subratllats
+
+ Escriu /msg %S HELP KICK Opció per més
+ informació sobre una opció especifica.
+
+ Nota: L'accés a aquesta comanda es control.lat pel
+ nivell SET.
+
+BOT_HELP_KICK_BOLDS
+ Sintàxi: KICK canal BOLDS {ON|OFF} [ttb]
+
+ Estableix el kick per negretes a actvitat o desactivat.
+ En habilitar-lo, aquesta opció li diu al bot que kickegi
+ usuaris que utilitzin negretes.
+
+ ttb es el numero de cops que un usuari sera kickejat
+ abans de ser banejat. No cal especificar ttb per a deshabilitar
+ el sistema de ban un cop activat.
+
+BOT_HELP_KICK_COLORS
+ Sintàxi: KICK canal COLORS {ON|OFF} [ttb]
+
+ Estableix el kick per colors a activat o desactivat.
+ En habilitar-lo, aquesta opció li diu al bot que kickegi
+ usuaris que utilitzin colors.
+
+ ttb es el numero de cops que un usuari sera kickejat
+ abans de ser banejat. No cal especificar ttb per a deshabilitar
+ el sistema de ban un cop activat.
+
+BOT_HELP_KICK_REVERSES
+ Sintàxi: KICK canal REVERSES {ON|OFF} [ttb]
+
+ Estableix el kick per reversos a activat o desactivat.
+ En habilitar-lo, aquesta opció li diu al bot que kickegi
+ usuaris que utilitzin reversos.
+
+ ttb es el numero de cops que un usuari sera kickejat
+ abans de ser banejat. No cal especificar ttb per a deshabilitar
+ el sistema de ban un cop activat.
+
+BOT_HELP_KICK_UNDERLINES
+ Sintàxi: KICK canal UNDERLINES {ON|OFF} [ttb]
+
+ Estableix el kick per subratllats a activat o apagat.
+ En habilitar-lo, aquesta opció li diu al bot que kickegi
+ usuaris que utilitzin subratllats.
+
+ ttb es el numero de cops que un usuari sera kickejat
+ abans de ser banejat. No cal especificar ttb per a deshabilitar
+ el sistema de ban un cop activat.
+
+BOT_HELP_KICK_CAPS
+ Sintàxi: KICK canal CAPS {ON|OFF} [ttb [min [porcentaje]]]
+
+ Estableix el kick per mayusculas a activat o desactivat.
+ En habilitar-lo, aquesta opció le diu al bot que kickegi
+ usuaris que estiguin escrivint en majuscules.
+
+ El bot kickeja nomès si hi ha com a mínim min majuscules
+ i que constitueixin com a mínim porcentatge%% del total
+ del text (si no s'especifica, per defecte s'estableix a 10
+ caràcters i 25%%).
+
+ ttb es el numero de cops que un usuari sera kickejat
+ abans de ser banejat. No cal especificar ttb per a deshabilitar
+ el sistema de ban un cop activat.
+
+BOT_HELP_KICK_FLOOD
+ Sintàxi: KICK canal FLOOD {ON|OFF} [ttb [ln [segs]]]
+
+ Estableix el kick per flood a activat o desactivat.
+ En habilitar-lo, aquesta opció li diu al bot que kickegi
+ usuaris que estiguin floodejant el canal utilitzant com a mínim
+ ln linees en segs segons (si no s'especifica, per
+ defecte es establert a 6 linees en 10 segons).
+
+ ttb es el numero de cops que un usuari sera kickejat
+ abans de ser banejat. No cal especificar ttb per a deshabilitar
+ el sistema de ban un cop activat.
+
+BOT_HELP_KICK_REPEAT
+ Sintàxi: KICK #canal REPEAT {ON|OFF} [ttb [num]]
+
+ Estableix el kick per repetició a activat o desactivat.
+ En habilitar-lo, aquesta opció li diu al bot que kickegi
+ usuaris que estiguin repetint num cops (si num no s'especifica,
+ per defecte es establert a 3).
+
+ ttb es el numero de cops que un usuari sera kickejat
+ abans de ser banejat. No cal especificar ttb per a deshabilitar
+ el sistema de ban un cop activat.
+
+BOT_HELP_KICK_BADWORDS
+ Sintàxi: KICK #canal BADWORDS {ON|OFF} [ttb]
+
+ Estableix el kick per paraules malsonants a activat o desactivat.
+ En habilitar-lo, aquesta opció li diu al bot que kickegi
+ usuaris que utilitzin certes paraules al canal.
+
+ Pots definir paraules malsonants pel teu canal utilitzant la comanda
+ BADWORDS. Escriu /msg %S HELP BADWORDS per més informació.
+
+ ttb es el numero de cops que un usuari sera kickejat
+ abans de ser banejat. No cal especificar ttb per a deshabilitar
+ el sistema de ban un cop activat.
+
+BOT_HELP_BADWORDS
+ Sintàxi: BADWORDS canal ADD paraula [SINGLE | START | END]
+ BADWORDS canal DEL {paraula | nom | llista}
+ BADWORDS canal LIST [mascara | llista]
+ BADWORDS canal CLEAR
+
+ Mante la llista de paraules malsonants per un canal. La llista
+ de paraules malsonants determina quines paraules han de donar peu a ser kickejats
+ Quan el kick per paraules malsonants esta habilitat. Per més
+ informació, escriu /msg %S HELP KICK BADWORDS.
+
+ La comanda BADWORDS ADD afegeix una paraula a la llista
+ de paraules malsonants. Si s'especifica SINGLE, el kick es
+ fara nomès si l'usuari du la paraula completa. Si s'especifica
+ START, el kick es fara nomès si l'usuari
+ escriu una paraula que comenci amb paraula.
+ Si no s'especifica END, el kick es fara nomès si
+ l'usuari escriu una paraula que finalitzi amb paraula. Si
+ no s'especifica res, un kick es farà cada vegada que
+ paraula sigui escrita per un usuari.
+
+ La comanda BADWORDS DEL esborra la paraula esmantada de la
+ llista de paraules malsonants. Si s'especifica una llista de noms, aquestes
+ instàncies son esborrades. (Veure l'exemple per LIST especificat més
+ endavant).
+
+ La comanda BADWORDS LIST mostra la llista de bad
+ words. Si s'especifica una mascara, nomès les instàncies
+ concordant amb la mascara són mostrades. Si s'especifica una llista
+ de noms, nomès aquestes instàncies son mostrades;
+ per exemple:
+
+ BADWORDS #canal LIST 2-5,7-9
+ Llista paraules malsonants enumerades de 2 a 5 i de 7 a 9.
+
+ La comanda BADWORDS CLEAR neteja totes les instàncies
+ de la llista de paraules malsonants.
+
+BOT_HELP_SAY
+ Sintàxi: SAY canal text
+
+ Fa que el bot escrigui el text especificat en el canal especificat.
+
+BOT_HELP_ACT
+ Sintàxi: ACT canal text
+
+ Fa que el bot fagi l'equivalent a la comanda "/me"
+ en el canal especificat utilitzant el text especificat.
+
+BOT_SERVADMIN_HELP
+
+ La següent comanda està disponible per administradors
+ de serveis:
+
+ BOT Manté la llista de bots de la xarxa
+
+BOT_SERVADMIN_HELP_BOT
+ Sintaxi: BOT ADD nick usuari host real
+ BOT CHANGE nick-ant nick-nue [usuari [host [real]]]
+ BOT DEL nick
+ BOT LIST
+
+ Permet als administradors de serveis crear, modificar
+ i esborrar bots que usuaris podran usar en els seus propis
+ canals.
+
+ BOT ADD afegeix un bot con el nickname, usuari, host
+ i nombre reial donats. Ja que no es fan comprovacions
+ d'integritat per aquests parametres, tingues molta cura.
+ BOT CHANGE permet cambiar el nickname, usuari, host
+ o nom real d'un bot sense tenir que esborrar-lo (i la
+ informació associada a ell).
+ BOT DEL esborra el bot donat de la llista de bots.
+ BOT LIST es un àlies de BOTLIST i només llista
+ tots els bots disponibles en la xarxa.
+
+ Nota: Si fas un bot amb un nick ja enregistrat,
+ sera eliminat. A més, si un usuari està actualment
+ usant el nick, serà killejat.
+
+BOT_SERVADMIN_HELP_SET
+
+ Aquestes opcions estan reservades a administradors de
+ Serveis:
+
+ NOBOT Evita a un bot de ser assignat
+ a un canal
+ PRIVATE Evita a un bot de ser assignat
+ per algú mes que un operador
+ d'IRC
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+
+ Sintaxi: SET canal NOBOT {ON|OFF}
+
+ Aquesta opció fa al canal no sigui assignable. Si un
+ bot ja està assignat al canal, es desassignara
+ automàticament quan habiliteu aquesta opció.
+
+ Limitat a administradors de serveis.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Sintaxi: SET nick-del-bot PRIVATE {ON|OFF}
+
+ Aquesta opció evita un bot de ser assignat
+ a un canal per usuaris que no son operadors
+ d'IRC.
+
+ Limitat a administradors de serveis.
+HOST_EMPTY
+ The vhost list is empty.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ vhost for %s set to %s.
+HOST_IDENT_SET
+ vhost for %s set to %s@%s.
+HOST_SETALL
+ vhost for group %s set to %s.
+HOST_DELALL
+ vhosts for group %s have been removed.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost for group %s set to %s@%s.
+HOST_SET_ERROR
+ Error! A vhost can only contain A-Z, a-z, 0-9, '.' and '-'.
+HOST_SET_IDENT_ERROR
+ A vhost ident must be in the format of a valid ident
+HOST_SET_TOOLONG
+ Error! The vhost is too long, please use a host shorter than %d characters.
+HOST_SET_IDENTTOOLONG
+ Error! The Ident is too long, please use an ident shorter than %d characters.
+HOST_NOREG
+ User %s not found in the nickserv db.
+HOST_SET_SYNTAX
+ Syntax /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Access Denied.
+HOST_NOT_ASSIGNED
+ Please contact an Operator to get a vhost assigned to this nick.
+HOST_ACTIVATED
+ Your vhost of %s is now activated.
+HOST_IDENT_ACTIVATED
+ Your vhost of %s@%s is now activated.
+HOST_ID
+ Please identify to services first.
+HOST_NOT_REGED
+ You need to register before a vhost can be assigned to you.
+HOST_DEL
+ vhost for %s removed.
+HOST_DEL_SYNTAX
+ Syntax: /msg %s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Your vhost was removed. To re-enable the standard host cloaking, type /mode %s +x
+HOST_NO_VIDENT
+ Your IRCD does not support vIdent's, if this is incorrect, please report this as a possible bug
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_GROUP
+ All vhost's in the group %s have been set to %s
+HOST_IDENT_GROUP
+ All vhost's in the group %s have been set to %s@%s
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_LIST_FOOTER
+ Displayed all records (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Displayed records from %d to %d
+HOST_LIST_KEY_FOOTER
+ Displayed records matching key %s (Count: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ %S commands:
+ ON Activates your assigned vhost
+ OFF Deactivates your assigned vhost
+
+HOST_OPER_HELP
+ Commands available to services operators only:
+ SET Set the vhost of another user
+ SETALL Set the vhost for all nicks in a group
+ DEL Delete the vhost of another user
+ LIST Displays one or more vhost entries.
+
+HOST_ADMIN_HELP
+ Commands available to services admins only:
+
+HOST_HELP_ON
+ Syntax: ON
+
+ Activates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see the vhost instead of your real IP address.
+
+HOST_HELP_SET
+ Syntax: SET <nick> <hostmask>.
+
+ Sets the vhost for the given nick to that of the given
+ hostmask. If your IRCD supports vIdents, then using
+ SET <nick> <ident>@<hostmask> set idents for users as
+ well as vhosts.
+
+ Limited to Services operators.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Deletes the vhost for all nick's in the same group as
+ that of the given nick.
+
+ Limited to Host Removers.
+
+
+HOST_HELP_SETALL
+ Syntax: SETALL <nick> <hostmask>.
+
+ Sets the vhost for all nicks in the same group as that
+ of the given nick. If your IRCD supports vIdents, then
+ using SETALL <nick> <ident>@<hostmask> will set idents
+ for users as well as vhosts.
+
+ * NOTE, this will not update the vhost for any nick's
+ added to the group after this command was used.
+
+ Limited to Services operators.
+
+HOST_HELP_OFF
+ Syntax: OFF
+
+ Deactivates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see your real IP address.
+
+HOST_HELP_DEL
+ Syntax: DEL <nick>
+
+ Deletes the vhost assigned to the given nick from the
+ database.
+
+ Limited to Services operators.
+
+HOST_HELP_LIST
+ Syntax: LIST [<key>|<#X-Y>]
+
+ This command lists registered vhosts to the operator
+ if a Key is specified, only entries whos nick or vhost match
+ the pattern given in <key> are displayed e.g. Rob* for all
+ entries beginning with "Rob"
+
+ If a #X-Y style is used, only entries between the range of X
+ and Y will be displayed, e.g. #1-3 will display the first 3
+ nick/vhost entries.
+
+ The list uses the value of NSListMax as a hard limit for the
+ number of items to display to a operator at any 1 time.
+
+ Limited to Services operators.
+
+HOST_HELP_GROUP
+ Syntax: GROUP
+
+ This command allows users to set the vhost of thier
+ CURRENT nick to be the vhost for all nicks in the same
+ group.
diff --git a/lang/de.l b/lang/de.l
new file mode 100644
index 000000000..21928224a
--- /dev/null
+++ b/lang/de.l
@@ -0,0 +1,6380 @@
+# Deutsches Language file.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# Translated by chemical <chem@gmx.net>,shine <dh@shinewelt.de>
+# - Solltest du irgendwelche Rechtschreibfehler oder sonstige
+# Verbesserungsvorschläge haben, immer her damit!
+#
+# letzte Änderung: 28.02.2003
+#
+#
+# This program is free but copyrighted software; see the file COPYING for
+# details.
+#
+# Based on the original code of Services by Andy Church.
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ Deutsch (German)
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+# %b %d %H:%M:%S %Y %Z
+ %d.%b.%Y, %H:%M:%S %Z
+
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a, %d.%B.%Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %d.%b.%Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Son
+ Mon
+ Die
+ Mit
+ Don
+ Fre
+ Sam
+# %A
+STRFTIME_DAYS_LONG
+ Sonntag
+ Montag
+ Dienstag
+ Mittwoch
+ Donnerstag
+ Freitag
+ Samstag
+# %b
+STRFTIME_MONTHS_SHORT
+ Jan
+ Feb
+ Mär
+ Apr
+ Mai
+ Jun
+ Jul
+ Aug
+ Sep
+ Okt
+ Nov
+ Dez
+# %B
+STRFTIME_MONTHS_LONG
+ Januar
+ Februar
+ März
+ April
+ Mai
+ Juni
+ Juli
+ August
+ September
+ Oktober
+ November
+ Dezember
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Interner Fehler - kann Anfrage nicht verarbeiten.
+UNKNOWN_COMMAND
+ Unbekannter Befehl %s.
+UNKNOWN_COMMAND_HELP
+ Unbekannter Befehl %s. "/msg %s HELP" für Hilfe.
+SYNTAX_ERROR
+ Syntax: %s
+MORE_INFO
+ /msg %s HELP %s für weitere Informationen.
+NO_HELP_AVAILABLE
+ Keine Hilfe verfügbar für %s.
+OBSOLETE_COMMAND
+ Dieser Befehl ist überholt; benutze stattdessen %s.
+
+BAD_USERHOST_MASK
+ Maske sollte in dieser Form sein: user@host.
+BAD_EXPIRY_TIME
+ Ungültige Auslaufzeit.
+USERHOST_MASK_TOO_WIDE
+ %s ist zu allgemeingültig; bitte benutze eine genauere Hostmaske.
+
+SERVICE_OFFLINE
+ %s sind derzeit nicht verfügbar, bitte versuche es später noch einmal.
+READ_ONLY_MODE
+ Achtung: Services sind im Read-Only-Modus; Änderungen werden nicht übernommen!
+
+PASSWORD_INCORRECT
+ Falsches Passwort.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Zugriff verweigert.
+PERMISSION_DENIED
+ Berechtigung nicht ausreichend.
+RAW_DISABLED
+ RAW wurde deaktiviert. Um RAW nutzen zu können, muss DisableRaw in der Services Config Datei deaktiviert werden.
+
+MORE_OBSCURE_PASSWORD
+ Bitte versuche es nochmal mit einem besseren Passwort.
+ Passworte sollten mindestens 5 Zeichen lang sein und nichts mit deinem
+ Nick zu tun haben. Weiterhin kann keine Leer- oder
+ Tabulatortaste enthalten sein.
+
+PASSWORD_TRUNCATED
+ Achtung: Dein Passwort wurde auf %d Zeichen gekürzt.
+
+NICK_NOT_REGISTERED
+ Dein Nick ist nicht registriert.
+NICK_NOT_REGISTERED_HELP
+ Dein Nick ist nicht registriert. Benutze /msg %s HELP für weitere Hilfe, wie du deinen Nick registrieren kannst.
+NICK_X_NOT_REGISTERED
+ Nick %s ist nicht registriert.
+NICK_X_IN_USE
+ Nick %s wird derzeit benutzt.
+NICK_X_NOT_IN_USE
+ Nick %s wird derzeit nicht benutzt.
+NICK_X_NOT_ON_CHAN
+ %s ist derzeit nicht im channel %s.
+NICK_X_FORBIDDEN
+ Nick %s sollte nicht registriert bzw benutzt werden.
+NICK_X_FORBIDDEN_OPER
+ Nick %s wurde verboten von %s:
+ %s
+NICK_X_ILLEGAL
+ Nick %s ist ein illegaler Nickname und kann nicht benutzt werden.
+NICK_X_TRUNCATED
+ Nick %s wurde auf %d Zeichen gekürzt.
+CHAN_X_NOT_REGISTERED
+ Channel %s ist nicht registriert.
+CHAN_X_NOT_IN_USE
+ Channel %s existiert nicht.
+CHAN_X_FORBIDDEN
+ Channel %s sollte nicht registriert bzw benutzt werden.
+CHAN_X_FORBIDDEN_OPER
+ Channel %s wurde verboten von %s:
+ %s
+CHAN_X_SUSPENDED
+ Suspended: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Um diesen Befehl nutzen zu können, musst du dich identifizieren.
+ Versuch es erneut nach /msg %s IDENTIFY password.
+CHAN_IDENTIFY_REQUIRED
+ Um diesen Befehl nutzen zu können, musst du dich identifizieren.
+ Versuch es erneut nach /msg %s IDENTIFY %s password.
+
+MAIL_DISABLED
+ eMail-Handling der Services wurde deaktiviert.
+MAIL_INVALID
+ eMail-Adresse für %s ist ungültig.
+MAIL_X_INVALID
+ %s ist keine gültige eMail-Adresse.
+MAIL_LATER
+ Die Services können gerade keine Mail verschicken; bitte versuche es später noch einmal.
+MAIL_DELAYED
+ Bitte warte noch %d Sekunden und versuche es dann erneut.
+
+NO_REASON
+ Kein Grund
+UNKNOWN
+ <unbekannt>
+
+# Duration system
+DURATION_DAY
+ 1 Tag
+DURATION_DAYS
+ %d Tage
+DURATION_HOUR
+ 1 Stunde
+DURATION_HOURS
+ %d Stunden
+DURATION_MINUTE
+ 1 Minute
+DURATION_MINUTES
+ %d Minuten
+DURATION_SECOND
+ 1 Sekunde
+DURATION_SECONDS
+ %d Sekunden
+
+# Human readable expiration
+NO_EXPIRE
+ läuft nicht aus
+EXPIRES_SOON
+ verfällt beim nächstem Datenbank-Update
+EXPIRES_M
+ verfällt in %d Minuten
+EXPIRES_1M
+ verfällt in %d Minute
+EXPIRES_HM
+ verfällt in %d Stunden, %d Minuten
+EXPIRES_H1M
+ verfällt in %d Stunden, %d Minute
+EXPIRES_1HM
+ verfällt in %d Stunde, %d Minuten
+EXPIRES_1H1M
+ verfällt in %d Stunde, %d Minute
+EXPIRES_D
+ verfällt in %d Tagen
+EXPIRES_1D
+ verfällt in %d Tag
+
+# Generic Footer message
+END_OF_ANY_LIST
+ End of %s list.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Dieser Nick gehört schon jemand anderem. Bitte wähle einen anderen.
+ (Wenn der Nick dir gehört, tippe /msg %s IDENTIFY password.)
+NICK_IS_SECURE
+ Dieser Nickname ist registriert und geschützt. Wenn es dein Nick
+ ist, tippe /msg %s IDENTIFY password. Ansonsten wähle bitte
+ einen anderen Nick.
+NICK_MAY_NOT_BE_USED
+ Dieser Nickname kann nicht benutzt werden. Bitte wähle einen anderen.
+FORCENICKCHANGE_IN_1_MINUTE
+ Wenn du ihn nicht innerhalb einer Minute identifizierst, wird er automatisch geändert.
+FORCENICKCHANGE_IN_20_SECONDS
+ Wenn du ihn nicht innerhalb von 20 Sekunden identifizierst, wird er automatisch geändert.
+FORCENICKCHANGE_NOW
+ Dieser Nickname ist registriert, du kannst ihn nicht benutzen.
+FORCENICKCHANGE_CHANGING
+ Dein Nickname wurde geändert in %s
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER password [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER password email
+NICK_REGISTRATION_DISABLED
+ Sorry, das Registrieren von Nicknames ist derzeit deaktiviert.
+NICK_REGISTRATION_FAILED
+ Sorry, Registrierung fehlgeschlagen.
+NICK_REG_PLEASE_WAIT
+ Bitte warte %d Sekunden, bevor der REGISTER Befehl wieder funktioniert.
+NICK_CANNOT_BE_REGISTERED
+ Nickname %s kann nicht registriert werden.
+NICK_ALREADY_REGISTERED
+ Nickname %s ist bereits registriert!
+NICK_REGISTERED
+ Nickname %s ist unter deinem Host registriert worden: %s
+NICK_PASSWORD_IS
+ Dein Passwort ist %s - behalte es für spätere Benutzung.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP Ziel Passwort
+NICK_GROUP_DISABLED
+ Sorry, das Gruppieren von Nicknames ist derzeit deaktiviert.
+NICK_GROUP_FAILED
+ Sorry, Gruppieren fehlgeschlagen.
+NICK_GROUP_PLEASE_WAIT
+ Bitte warte %d Sekunden, bevor der GROUP Befehl wieder funktioniert.
+NICK_GROUP_CHANGE_DISABLED
+ Dein Nick ist bereits registriert; tippe /msg %s DROP um ihn zu löschen.
+NICK_GROUP_SAME
+ Du bist bereits Mitglied der Gruppe %s.
+NICK_GROUP_TOO_MANY
+ Es sind zu viele Nicks in %s's Gruppe; Liste sie auf und lösche einige davon.
+ Tippe /msg %s HELP GLIST und /msg %s HELP DROP für weitere Infos.
+NICK_GROUP_JOINED
+ Du bist jetzt in der Gruppe %s vertreten.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY Passwort
+NICK_IDENTIFY_FAILED
+ Sorry, die Identifizierung ist fehlgeschlagen.
+NICK_IDENTIFY_SUCCEEDED
+ Passwort akzeptiert - du bist nun angemeldet.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Du musst eine eMail-Adresse für deinen Nick angeben.
+ NickServ kann dir dann dein Passwort per Mail senden, falls du es
+ vergessen solltest.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Tippe /msg %S SET EMAIL eMail wenn du deine eMail-Adresse einstellen willst.
+ Deine Privatsphäre wird respektiert; diese eMail-Adresse ist Dritten nicht
+ zugänglich.
+
+# LOGOUT responses
+NICK_ALREADY_IDENTIFIED
+ Du bist bereits angemeldet.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status aktualisiert (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Du wurdest ausgeloggt.
+NICK_LOGOUT_X_SUCCEEDED
+ Nick %s wurde erfolgreich ausgeloggt.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ Ausloggen von %s nicht möglich, da es sich um einen Services Administrator handelt.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Sorry, das Entfernen von Nicknames ist derzeit deaktiviert.
+NICK_DROPPED
+ Die Registrierung deines Nicknamens wurde gelöscht.
+NICK_X_DROPPED
+ Nickname %s wurde aus der Datenbank entfernt.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET Option Parameter
+NICK_SET_SERVADMIN_SYNTAX
+ SET [Nick] Option Parameters
+NICK_SET_DISABLED
+ Sorry, das Ändern der Optionen wurde deaktiviert.
+NICK_SET_UNKNOWN_OPTION
+ Unbekannte SET Option %s.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ Unbekannte SET Option %s, oder der Nickname ist nicht registriert.
+NICK_SET_OPTION_DISABLED
+ Option %s kann in diesem Netzwerk nicht benutzt werden.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ Der neue "Anführer" MUSS ein Nick in deiner Nickname-Gruppe sein!
+NICK_SET_DISPLAY_CHANGED
+ Der neue "Anführer" deiner Nickname-Gruppe ist jetzt %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Sorry, konnte dein Passwort nicht ändern.
+NICK_SET_PASSWORD_CHANGED
+ Passwort geändert.
+NICK_SET_PASSWORD_CHANGED_TO
+ Passwort geändert in %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE Nummer
+NICK_SET_LANGUAGE_UNKNOWN
+ Unbekannte Sprachen-Nummer %d. Tippe /msg %s HELP SET LANGUAGE um eine Liste aller verfügbaren Sprachen zu erhalten.
+NICK_SET_LANGUAGE_CHANGED
+ Sprache wurde geändert zu Deutsch.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL zu %s geändert.
+NICK_SET_URL_UNSET
+ URL entfernt.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ eMail-Adresse zu %s geändert.
+NICK_SET_EMAIL_UNSET
+ eMail-Adresse wurde entfernt.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ Du kannst in diesem Netzwerk deine eMail-Adresse nicht entfernen.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ ICQ-Nummer auf %s gesetzt.
+NICK_SET_ICQ_UNSET
+ ICQ-Nummer wurde entfernt.
+NICK_SET_ICQ_INVALID
+ %s ist keine gültige ICQ-Nummer.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Begrüssungsnachricht wurde zu %s geändert.
+NICK_SET_GREET_UNSET
+ Begrüssungsnachricht wurde entfernt.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ Kill-Schutz ist jetzt ON.
+NICK_SET_KILL_QUICK
+ Kill-Schutz ist jetzt ON, mit einer geringeren Wartezeit.
+NICK_SET_KILL_IMMED
+ Kill-Schutz ist jetzt ON, ohne Wartezeit.
+NICK_SET_KILL_IMMED_DISABLED
+ Die IMMED Option ist in diesem Netzwerk nicht verfügbar.
+NICK_SET_KILL_OFF
+ Kill-Schutz ist nun OFF.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ Nick-Sicherheit ist jetzt ON.
+NICK_SET_SECURE_OFF
+ Nick-Sicherheit ist jetzt OFF.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ Privat-Option ist jetzt ON.
+NICK_SET_PRIVATE_OFF
+ Privat-Option ist jetzt OFF.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Deine eMail-Adresse wird jetzt in der %s INFO Anzeige nicht mehr erscheinen.
+NICK_SET_HIDE_EMAIL_OFF
+ Deine eMail-Adresse wird jetzt in der %s INFO Anzeige erscheinen.
+NICK_SET_HIDE_MASK_ON
+ Deine letzte Hostmaske user@host wird jetzt in der %s INFO Anzeige nicht mehr erscheinen.
+NICK_SET_HIDE_MASK_OFF
+ Deine letzte Hostmaske user@host wird jetzt in der %s INFO erscheinen.
+NICK_SET_HIDE_QUIT_ON
+ Deine letzte Quit-Message wird jetzt in der %s INFO Anzeige nicht mehr erscheinen.
+NICK_SET_HIDE_QUIT_OFF
+ Deine letzte Quit-Message wird jetzt in der %s INFO Anzeige erscheinen.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Services werden dir jetzt durch messages antworten.
+NICK_SET_MSG_OFF
+ Services werden dir jetzt durch notices antworten.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [Nickname] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ Nick %s wird nicht auslaufen.
+NICK_SET_NOEXPIRE_OFF
+ Nick %s wird auslaufen.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mask]
+NICK_ACCESS_ALREADY_PRESENT
+ Mask %s ist bereits auf der Access-Liste.
+NICK_ACCESS_REACHED_LIMIT
+ Sorry, du kannst nur %d Einträge auf der Access-Liste speichern.
+NICK_ACCESS_ADDED
+ %s wurde zu deiner Access-Liste hinzugefügt.
+NICK_ACCESS_NOT_FOUND
+ %s wurde nicht auf deiner Access-Liste gefunden.
+NICK_ACCESS_DELETED
+ %s wurde von deiner Access-Liste entfernt.
+NICK_ACCESS_LIST
+ Access-Liste:
+NICK_ACCESS_LIST_X
+ Access-List von %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s ist %s
+NICK_INFO_SERVICES_OPER
+ %s ist ein Services-Operator.
+NICK_INFO_SERVICES_ADMIN
+ %s ist ein Services-Admin.
+NICK_INFO_ADDRESS
+ Letzte gesehene Hostmask: %s
+NICK_INFO_ADDRESS_ONLINE
+ ist online von: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s ist derzeit online.
+NICK_INFO_TIME_REGGED
+ Registriert seit: %s
+NICK_INFO_LAST_SEEN
+ Letztes Mal gesehen: %s
+NICK_INFO_LAST_QUIT
+ Letzte Quit-Nachricht: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ eMail-Adresse: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Grussnachricht: %s
+NICK_INFO_OPTIONS
+ Optionen: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Kill-Schutz
+NICK_INFO_OPT_SECURE
+ Secure-Modus
+NICK_INFO_OPT_PRIVATE
+ Privat
+NICK_INFO_OPT_MSG
+ Message Mode
+NICK_INFO_OPT_NONE
+ Keine
+NICK_INFO_NO_EXPIRE
+ Dieser Nickname wird nicht auslaufen.
+NICK_INFO_FOR_MORE
+ Für weitere Informationen, tippe /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST Muster
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST Muster [FORBIDDEN] [NOEXPIRE] [UNCONFIRMED]
+NICK_LIST_HEADER
+ Liste der gefundenen Einträge %s:
+NICK_LIST_RESULTS
+ Ende der Liste - %d/%d Treffer angezeigt.
+
+# GLIST responses
+NICK_ALIST_SYNTAX
+ ALIST nickname
+NICK_ALIST_HEADER
+ Channels auf die du Zugriff hast:
+ Num Channel Level Description
+NICK_ALIST_HEADER_X
+ Channels auf die %s Zugriff hat:
+ Num Channel Level Description
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ Ende der Liste - %d/%d Treffer angezeigt.
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Liste der Nicks in deiner Gruppe:
+NICK_GLIST_HEADER_X
+ Liste der Nicknamen in der Gruppe von %s:
+NICK_GLIST_FOOTER
+ %d Nicks in der Gruppe.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER Nickname [Passwort]
+NICK_NO_RECOVER_SELF
+ Du kannst dich nicht selber recovern!
+NICK_RECOVERED
+ Der User, der mit deinem Nick online gewesen ist, wurde gekillt.
+ Tippe /msg %s RELEASE %s ein, um ihn vor dem 1-Minute-Timeout zurückzubekommen.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE Nickname [Password]
+NICK_RELEASE_NOT_HELD
+ Nick %s ist nicht gesperrt.
+NICK_RELEASED
+ Die Services haben den Nick wieder verfügbar gemacht.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST Nickname [Passwort]
+NICK_NO_GHOST_SELF
+ Du kannst dich doch nicht selber ghosten!
+NICK_GHOST_KILLED
+ Ghost mit deinem Nick wurde entfernt.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS Nickname
+NICK_GETPASS_UNAVAILABLE
+ GETPASS nicht verfügbar, da die Verschlüsselung aktiviert ist.
+NICK_GETPASS_PASSWORD_IS
+ Passwort von %s ist %s.
+
+# SENDPASS responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host Keine WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Passende Emails %s bis %s.
+NICK_GETEMAIL_NOT_USED
+ Keine eingetragenen Emails für %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS Nickname
+NICK_SENDPASS_UNAVAILABLE
+ SENDPASS Befehl nicht verfügbar, da die Verschlüsselung aktiviert ist.
+NICK_SENDPASS_SUBJECT
+ Nick-Passwort (%s)
+NICK_SENDPASS_HEAD
+ Hi,
+NICK_SENDPASS_LINE_1
+ Du wolltest dir dein Passwort von dem Nick %s mailen lassen.
+NICK_SENDPASS_LINE_2
+ Das Passwort ist %s. Aus Sicherheitsgründen solltest du das Passwort nach Erhalt dieser eMail ändern.
+NICK_SENDPASS_LINE_3
+ Wenn du nicht weisst, warum du diese Mail erhalten hast, ignoriere sie bitte.
+NICK_SENDPASS_LINE_4
+ BITTE NICHT AUF DIESE NACHRICHT ANTWORTEN!
+NICK_SENDPASS_LINE_5
+ %s Administratoren.
+NICK_SENDPASS_OK
+ Das Passwort von %s wurde per eMail verschickt.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID Nickname [Reason]
+NICK_FORBID_SYNTAX_REASON
+ FORBID Nickname Reason
+NICK_FORBID_SUCCEEDED
+ Der Nick %s ist nun verboten.
+NICK_FORBID_FAILED
+ Konnte den Nick %s nicht verbieten!
+
+# Nick Registration responses
+NICK_REQUESTED
+ Dieser Nick wurde bereits angefordert, bitte prüfe deinen Email Account für das Passwort.
+NICK_REG_RESENT
+ Dein Passcode wurde noch einmal an %s geschickt.
+NICK_REG_UNABLE
+ Nick konnte NICHT registriert werden, versuche es später noch einmal.
+NICK_IS_PREREG
+ Dieser Nick benötigt das Email Bestätigungs Passwort vor Abschluß der Registrierung.
+NICK_ENTER_REG_CODE
+ Ein Password wurde zu %s gesendet, bitte tippe /msg %s confirm <passcode> um die Registrierung abzuschließen.
+NICK_CONFIRM_NOT_FOUND
+ Registrieungs Stufe 1 ist eventuell abgelaufen, bitte nutze zuerst "/msg %s register <password> <email>".
+NICK_CONFIRM_INVALID
+ Ein ungültiger Passcode wurde eingegeben, prüfe bitte deine Email und gib den Code erneut ein.
+NICK_REG_MAIL_SUBJECT
+ Nickname Registrierung (%s)
+NICK_REG_MAIL_HEAD
+ Hi,
+NICK_REG_MAIL_LINE_1
+ Du hast die Registrierung des Nicknamen %s angefordert.
+NICK_REG_MAIL_LINE_2
+ Bitte tippe " /msg %s confirm %s " zum Abschluß der Registrierung ein.
+NICK_REG_MAIL_LINE_3
+ Wenn du nicht weisst, warum du diese Mail erhalten hast, ignoriere sie bitte.
+NICK_REG_MAIL_LINE_4
+ BITTE NICHT AUF DIESE NACHRICHT ANTWORTEN!
+NICK_REG_MAIL_LINE_5
+ Die %s Administratoren.
+NICK_GETPASS_PASSCODE_IS
+ Passcode für %s ist %s.
+NICK_FORCE_REG
+ Nickname %s bestätigt
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Automatischer Channel-Operator Status
+CHAN_LEVEL_AUTOVOICE
+ Automatischer Voice-Status
+CHAN_LEVEL_AUTOHALFOP
+ Automatischer Half-Op Status
+CHAN_LEVEL_AUTOPROTECT
+ Automatischer Founder-Status
+CHAN_LEVEL_AUTODEOP
+ Channel-Operator-Status nicht erlaubt
+CHAN_LEVEL_NOJOIN
+ Der Channel kann nicht betreten werden, da er RESTRICTED ist.
+CHAN_LEVEL_INVITE
+ INVITE-Befehl erlaubt
+CHAN_LEVEL_AKICK
+ AKICK-Befehl erlaubt
+CHAN_LEVEL_SET
+ SET-Befehl erlaubt (nicht FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ CLEAR-Befehl erlaubt
+CHAN_LEVEL_UNBAN
+ UNBAN-Befehl erlaubt
+CHAN_LEVEL_OPDEOP
+ OP/DEOP-Befehl erlaubt
+CHAN_LEVEL_ACCESS_LIST
+ Ansicht der Channel-Access-Liste erlaubt
+CHAN_LEVEL_ACCESS_CHANGE
+ Änderungen an der Channel-Access-Liste erlaubt
+CHAN_LEVEL_MEMO
+ Erlaubnis Channel-Memos zu lesen
+CHAN_LEVEL_ASSIGN
+ Erlaubnis Bots hinzuzufügen / zu entfernen
+CHAN_LEVEL_BADWORDS
+ BADWORDS-Befehl erlaubt
+CHAN_LEVEL_NOKICK
+ Wird nicht durch den Bot-Kicker gekicked
+CHAN_LEVEL_FANTASIA
+ Darf die Befehle des Fantasia-Mode benutzen
+CHAN_LEVEL_SAY
+ SAY/ACT-Befehl erlaubt
+CHAN_LEVEL_GREET
+ Grussmeldung wird angezeigt
+CHAN_LEVEL_VOICEME
+ Erlaubnis sich selbst zu (de)voicen
+CHAN_LEVEL_VOICE
+ VOICE/DEVOICE-Befehl erlaubt
+CHAN_LEVEL_GETKEY
+ GETKEY-Befehl erlaubt
+CHAN_LEVEL_OPDEOPME
+ Erlaubnis sich selbst zu (de)op'en
+CHAN_LEVEL_HALFOPME
+ Erlaubnis sich selbst zu (de)halfop'en
+CHAN_LEVEL_HALFOP
+ HALFOP/DEHALFOP-Befehl erlaubt
+CHAN_LEVEL_PROTECTME
+ Erlaubnis, selber den Schutz ein/auszuschalten
+CHAN_LEVEL_PROTECT
+ PROTECT-DEPROTECT-Befehl erlaubt
+CHAN_LEVEL_KICKME
+ Erlaubnis, sich selbst zu kicken
+CHAN_LEVEL_KICK
+ KICK-Befehl erlaubt
+CHAN_LEVEL_SIGNKICK
+ Kein signierter Kick wenn SIGNKICK LEVEL genutzt wird
+
+# Automatic responses
+CHAN_LEVEL_BANME
+ Erlaubnis, sich selbst zu bannen
+CHAN_LEVEL_BAN
+ Erlaubnis, BAN zu nutzen
+CHAN_LEVEL_TOPIC
+ Erlaubnis, TOPIC zu nutzen
+CHAN_LEVEL_INFO
+ Erlaubnis, INFO mit der ALL Option zu nutzen
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Dieser Channel wurde registriert von %s.
+CHAN_NOT_ALLOWED_OP
+ Du hast keine Erlaubnis, den Operator-Status in %s zu benutzen.
+CHAN_MAY_NOT_BE_USED
+ Dieser Channel kann nicht benutzt werden.
+CHAN_NOT_ALLOWED_TO_JOIN
+ Dir ist es nicht erlaubt, diesen Channel zu betreten.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER channel password description
+CHAN_REGISTER_DISABLED
+ Sorry, die Registrierung von Channels ist derzeit deaktiviert.
+CHAN_REGISTER_NOT_LOCAL
+ Lokale Channels können nicht registriert werden.
+CHAN_MUST_REGISTER_NICK
+ Du musst erst deinen Nick registrieren. Tippe /msg %s HELP für die Hilfe dafür ein.
+CHAN_MUST_IDENTIFY_NICK
+ Bitte identifiziere dich zuerst durch %s, in dem du diesen Befehl benutzt:
+ /msg %s IDENTIFY password
+CHAN_MAY_NOT_BE_REGISTERED
+ Channel %s kann nicht registriert werden.
+CHAN_ALREADY_REGISTERED
+ Channel %s ist bereits registriert!
+CHAN_MUST_BE_CHANOP
+ Du musst Channel-Operator sein um diesen Channel zu registrieren.
+CHAN_REACHED_CHANNEL_LIMIT
+ Sorry, du hast bereits %d Channels auf deinen Namen registriert.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Sorry, du hast bereits das Limit von %d registrierten Channels erreicht.
+CHAN_REGISTRATION_FAILED
+ Sorry, Registrierung fehlgeschlagen.
+CHAN_REGISTERED
+ Channel %s ist registriert unter deinem Nicknamen: %s
+CHAN_PASSWORD_IS
+ Dein Channel-Passwort ist %s - behalte es für spätere Benutzung.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY channel password
+CHAN_IDENTIFY_FAILED
+ Sorry, Identifizierung ist fehlgeschlagen.
+CHAN_IDENTIFY_SUCCEEDED
+ Passwort akzeptiert - du hast jetzt Founderlevel-Zugriff auf %s.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT channel nickname
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT channel [nickname]
+CHAN_LOGOUT_SUCCEEDED
+ User %s wurde vom Channel %s ausgeloggt.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Alle identifizierten User wurden vom Channel ausgeloggt %s.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP Channel
+CHAN_DROP_DISABLED
+ Sorry, das Entfernen von Channel-Registrierungen ist derzeit deaktiviert.
+CHAN_DROPPED
+ Channel %s wurde aus der Datenbank entfernt.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET channel option parameter
+CHAN_SET_DISABLED
+ Sorry, Channel-Optionen sind derzeit deaktiviert.
+CHAN_SET_UNKNOWN_OPTION
+ Unbekannte SET-Option %s.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s hat zu viele Channels auf seinen Namen registriert.
+CHAN_FOUNDER_CHANGED
+ Founder von %s wurde geändert zu %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Vertreter von %s wurde geändert zu %s.
+CHAN_SUCCESSOR_UNSET
+ Der Eintrag des Vertreters für%s wurde entfernt.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s kann nicht gleichzeitig Gründer und Vertreter im Channel %s sein.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Sorry, konnte das Passwort nicht ändern.
+CHAN_PASSWORD_CHANGED
+ %s Passwort wurde geändert.
+CHAN_PASSWORD_CHANGED_TO
+ %s Passwort wurde geändert zu %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ Beschreibung von %s wurde geändert zu %s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ URL von %s wurde geändert zu %s.
+CHAN_URL_UNSET
+ URL von %s wurde entfernt.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ eMail-Adresse von %s wurde geändert in %s.
+CHAN_EMAIL_UNSET
+ eMail-Adresse von %s wurde entfernt.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Eintrittsmeldung von %s wurde geändert.
+CHAN_ENTRY_MSG_UNSET
+ Eintrittsmeldung von %s wurde entfernt.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s ist kein gültiger Ban-Typ.
+CHAN_SET_BANTYPE_CHANGED
+ Ban-Typ für den Channel %s ist jetzt #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Unbekanntes Mode-Zeichen: %c wurde ignoriert.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Mode %c wurde ignoriert, da du diesen Mode nicht festsetzen kannst.
+CHAN_SET_MLOCK_L_REQUIRED
+ Lock Mode +L setzt das Festsetzen des Modes +l vorraus.
+CHAN_SET_MLOCK_K_REQUIRED
+ Du musst auch Mode +i festsetzen um Mode +K festsetzen zu können.
+CHAN_MLOCK_CHANGED
+ Mode lock für Channel %s geändert zu %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET channel KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Topic-Wiederherstellung ist jetzt ON.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic-Wiederherstellung ist jetzt OFF.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET channel TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic-Sperre ist jetzt ON.
+CHAN_SET_TOPICLOCK_OFF
+ Topic-Sperre ist jetzt OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PEACE_SYNTAX
+ SET channel PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace-Modus ist nun ON.
+CHAN_SET_PEACE_OFF
+ Peace-Modus ist nun OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET channel PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Privat-Modus ist nun ON.
+CHAN_SET_PRIVATE_OFF
+ Privat-Modus ist nun OFF.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET channel SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Op-Sicherheit ist jetzt ON.
+CHAN_SET_SECUREOPS_OFF
+ Op-Sicherheit ist jetzt OFF.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET channel SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure-Founder-Option ist jetzt ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure-Founder-Option ist jetzt OFF.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET channel RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Beschränkter Zugriff ist jetzt ON.
+CHAN_SET_RESTRICTED_OFF
+ Beschränkter Zugriff ist jetzt OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET channel SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Secure-Option ist jetzt ON.
+CHAN_SET_SECURE_OFF
+ Secure-Option ist jetzt OFF.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET channel SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Signierte Kicks sind jetzt ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Signierte Kicks sind jetzt ON, hängt aber vom Zugriffslevel des Users ab.
+CHAN_SET_SIGNKICK_OFF
+ Signierte Kicks sind jetzt OFF.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET channel OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-Notice ist jetzt ON.
+CHAN_SET_OPNOTICE_OFF
+ Op-Notice ist jetzt OFF.
+
+# SET NOEXPIRE responses
+CHAN_SET_XOP_SYNTAX
+ SET channel XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP-list-System ist nun ON.
+CHAN_SET_XOP_OFF
+ xOP-list-System is nun OFF.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET channel NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ Channel %s wird nicht mehr auslaufen.
+CHAN_SET_NOEXPIRE_OFF
+ Channel %s wird nach einer bestimmten Zeit auslaufen.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Sorry, du kannst maximal %d AOP/SOP/VOP Einträge in einem Channel haben.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Du kannst diesen Befehl nicht benutzen. Benutze Stattdessen ACCESS.
+ Tippe /msg %s HELP ACCESS für weitere Informationen.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_AOP_DISABLED
+ Sorry, die Channel AOP Liste kann derzeit nicht geändert werden.
+CHAN_AOP_NICKS_ONLY
+ Die Channel AOP Liste darf nur registrierte Nicks enthalten.
+CHAN_AOP_ADDED
+ %s wurde der %s AOP Liste hinzugefügt.
+CHAN_AOP_MOVED
+ %s wurde auf die %s AOP Liste verschoben.
+CHAN_AOP_NO_SUCH_ENTRY
+ Kein solcher Eintrag (#%d) in der %s AOP Liste.
+CHAN_AOP_NOT_FOUND
+ %s wurde nicht in der %s AOP Liste gefunden.
+CHAN_AOP_NO_MATCH
+ Keine passenden Einträge in der %s AOP Liste.
+CHAN_AOP_DELETED
+ %s gelöscht von der %s AOP Liste.
+CHAN_AOP_DELETED_ONE
+ 1 Eintrag wurde von der %s AOP Liste gelöscht.
+CHAN_AOP_DELETED_SEVERAL
+ %d Einträge wurden von der %s AOP Liste gelöscht.
+CHAN_AOP_LIST_EMPTY
+ Die %s AOP Liste ist leer.
+CHAN_AOP_LIST_HEADER
+ AOP Liste für %s:
+ Num Nick
+CHAN_AOP_CLEAR
+ Die Channel AOP Liste wurde geleert.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_HOP_DISABLED
+ Sorry, die Channel HOP kann derzeit nicht geändert werden.
+CHAN_HOP_NICKS_ONLY
+ Die Channel HOP Liste darf nur registrierte Nicks enthalten.
+CHAN_HOP_ADDED
+ %s wurde der %s HOP Liste hinzugefügt.
+CHAN_HOP_MOVED
+ %s wurde auf die %s HOP Liste verschoben.
+CHAN_HOP_NO_SUCH_ENTRY
+ Kein solcher Eintrag (#%d) in der %s HOP Liste.
+CHAN_HOP_NOT_FOUND
+ %s wurde nicht gefunden in der %s HOP Liste.
+CHAN_HOP_NO_MATCH
+ Keine passenden Einträge in der %s HOP Liste.
+CHAN_HOP_DELETED
+ %s wurde gelöscht von der %s HOP Liste.
+CHAN_HOP_DELETED_ONE
+ 1 Eintrag wurde von der %s HOP Liste gelöscht.
+CHAN_HOP_DELETED_SEVERAL
+ %d Einträge wurdenvon der %s HOP Liste gelöscht.
+CHAN_HOP_LIST_EMPTY
+ Die %s HOP Liste ist leer.
+CHAN_HOP_LIST_HEADER
+ HOP Liste für %s:
+ Num Nick
+CHAN_HOP_CLEAR
+ Die Channel HOP Liste wurde geleert.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_SOP_DISABLED
+ Sorry, die Channel SOP Liste kann derzeit nicht geändert werden.
+CHAN_SOP_NICKS_ONLY
+ Die Channel SOP Liste darf nur registrierte Nicks enthalten.
+CHAN_SOP_ADDED
+ %s wurde der %s SOP Liste hinzugefügt.
+CHAN_SOP_MOVED
+ %s wurde auf %s SOP Liste verschoben.
+CHAN_SOP_NO_SUCH_ENTRY
+ Kein solcher Eintrag (#%d) in der %s SOP Liste.
+CHAN_SOP_NOT_FOUND
+ %s wurde nicht gefunden in der %s SOP Liste.
+CHAN_SOP_NO_MATCH
+ Keine passenden Einträge in der %s SOP Liste.
+CHAN_SOP_DELETED
+ %s wurde von der %s SOP Liste gelöscht.
+CHAN_SOP_DELETED_ONE
+ 1 Eintrag wurde von der %s SOP Liste gelöscht.
+CHAN_SOP_DELETED_SEVERAL
+ %d Einträge wurden von der %s SOP Liste gelöscht.
+CHAN_SOP_LIST_EMPTY
+ Die %s SOP Liste ist leer.
+CHAN_SOP_LIST_HEADER
+ SOP Liste für %s:
+ Num Nick
+CHAN_SOP_CLEAR
+ Die Channel SOP Liste wurde geleert.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_VOP_DISABLED
+ Sorry, die Channel VOP Liste kann derzeit nicht geändert werden.
+CHAN_VOP_NICKS_ONLY
+ Die Channel VOP Liste darf nur registrierte Nicks enthalten.
+CHAN_VOP_ADDED
+ %s wurde der %s VOP Liste hinzugefügt.
+CHAN_VOP_MOVED
+ %s wurde auf die %s VOP Liste verschoben.
+CHAN_VOP_NO_SUCH_ENTRY
+ Kein solcher Eintrag (#%d) in der %s VOP Liste.
+CHAN_VOP_NOT_FOUND
+ %s wurde nicht gefunden in der %s VOP Liste.
+CHAN_VOP_NO_MATCH
+ Keine passenden Einträge in der %s VOP Liste.
+CHAN_VOP_DELETED
+ %s wurde gelöscht von der %s VOP Liste.
+CHAN_VOP_DELETED_ONE
+ 1 Eintrag wurde von der %s VOP Liste gelöscht.
+CHAN_VOP_DELETED_SEVERAL
+ %d Einträge wurden von der %s VOP Liste gelöscht.
+CHAN_VOP_LIST_EMPTY
+ Die %s VOP Liste ist leer.
+CHAN_VOP_LIST_HEADER
+ VOP Liste für %s:
+ Num Nick
+CHAN_VOP_CLEAR
+ Die Channel VOP Liste wurde geleert.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS channel {ADD|DEL|LIST|CLEAR} [nick [level] | entry-list]
+CHAN_ACCESS_XOP
+ Du kannst dieses Command nicht nutzen.
+ Nutze stattdessen die AOP, SOP und VOP Commands.
+ Tippe /msg %s HELP command für weitere Informationen.
+CHAN_ACCESS_DISABLED
+ Sorry, das Ändern der Channel-Access-Liste wurde zwischenzeitig deaktiviert.
+CHAN_ACCESS_LEVEL_NONZERO
+ Access-Level muss grösser 0 sein.
+CHAN_ACCESS_LEVEL_RANGE
+ Access-Level muss zwischen %d und einschliesslich %d liegen.
+CHAN_ACCESS_NICKS_ONLY
+ Die Channel Access Liste darf nur registrierte Nicks enthalten.
+CHAN_ACCESS_REACHED_LIMIT
+ Sorry, aber die Access-Liste ist auf %d Einträge beschränkt.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Access-Level für %s in %s ist unverändert auf %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Access-Level für %s in %s wurde geändert auf %d.
+CHAN_ACCESS_ADDED
+ %s wurde zur Access-Liste von %s hinzugefügt mit Level %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ Kein solcher Eintrag (#%d) auf der Access-Liste von %s.
+CHAN_ACCESS_NOT_FOUND
+ %s wurde auf der Access-Liste von %s nicht gefunden.
+CHAN_ACCESS_NO_MATCH
+ Es existieren keine entsprechenden Einträge in der Access-Liste von %s.
+CHAN_ACCESS_DELETED
+ %s wurde von der Access-Liste von %s entfernt.
+CHAN_ACCESS_DELETED_ONE
+ 1 Eintrag wurde aus der Access-Liste von %s entfernt.
+CHAN_ACCESS_DELETED_SEVERAL
+ %d Einträge wurden aus der Access-Liste von %s entfernt.
+CHAN_ACCESS_LIST_EMPTY
+ Die Access-Liste von %s ist leer.
+CHAN_ACCESS_LIST_HEADER
+ Access-Liste für %s:
+ Num Lev Nick
+CHAN_ACCESS_LIST_FOOTER
+ Ende der Access-liste.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ Die Access-Liste wurde geleert.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK channel {ADD | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-or-usermask]
+CHAN_AKICK_DISABLED
+ Sorry, das Bearbeiten der AutoKick-Liste wurde zwischenzeitlich deaktiviert.
+CHAN_AKICK_ALREADY_EXISTS
+ %s existiert bereits auf der AutoKick-Liste von %s.
+CHAN_AKICK_REACHED_LIMIT
+ Sorry, du kannst nur max. %d Einträge auf der AutoKick-Liste haben.
+CHAN_AKICK_ADDED
+ %s wurde der AutoKick-Liste von %s hinzugefügt.
+CHAN_AKICK_NO_SUCH_ENTRY
+ Kein solcher Eintrag (#%d) auf der Autokick-Liste von %s gefunden.
+CHAN_AKICK_NOT_FOUND
+ %s wurde nicht auf der AutoKick-Liste von %s gefunden.
+CHAN_AKICK_NO_MATCH
+ Keine entsprechenden Einträge auf der AutoKick-Liste von %s gefunden.
+CHAN_AKICK_STUCK
+ %s ist nun stetig aktiviert im %s.
+CHAN_AKICK_UNSTUCK
+ %s ist nun nicht mehr stetig aktiviert im %s.
+CHAN_AKICK_DELETED
+ %s wurde von der Autokick-Liste von %s gefunden.
+CHAN_AKICK_DELETED_ONE
+ 1 Eintrag der AutoKick-Liste von %s entfernt.
+CHAN_AKICK_DELETED_SEVERAL
+ %d Einträge wurden aus der AutoKick-Liste von %s entfernt.
+CHAN_AKICK_LIST_EMPTY
+ Die Autokick-Liste von %s ist leer.
+CHAN_AKICK_LIST_HEADER
+ Autokick-Liste von %s:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s%s
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (von %s am %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (stuck) (by %s on %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE für %s erledigt; %d user betroffen.
+CHAN_AKICK_CLEAR
+ Autokick-Liste wurde geleert.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS channel {SET | DIS[ABLE] | LIST | RESET} [item [level]]
+CHAN_LEVELS_XOP
+ Das Command ist in diesem Modus nutzlos - Deaktiviere zuerst XOP.
+CHAN_LEVELS_RANGE
+ Der Level kann nur zwischen %d und einschliesslich %d liegen.
+CHAN_LEVELS_CHANGED
+ Der Level für %s für den Channel %s wurde geändert auf %d.
+CHAN_LEVELS_UNKNOWN
+ Einstellung %s ist unbekannt. Tippe /msg %s HELP LEVELS DESC für eine ausführliche Einstellungsliste.
+CHAN_LEVELS_DISABLED
+ %s wurde deaktiviert im Channel %s.
+CHAN_LEVELS_LIST_HEADER
+ Zugriffslevel für Channel %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (deaktiviert)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (nur Gründer)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ Zugriffslevel für %s wurden auf Standardwerte zurückgesetzt.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO channel [ALL]
+CHAN_INFO_HEADER
+ Informationen über den Channel %s:
+CHAN_INFO_FOUNDER
+ Gründer: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Gründer: %s
+CHAN_INFO_SUCCESSOR
+ Vertreter: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Vertreter: %s
+CHAN_INFO_DESCRIPTION
+ Beschreibung: %s
+CHAN_INFO_ENTRYMSG
+ Eintrittsnachricht: %s
+CHAN_INFO_TIME_REGGED
+ Registriert: %s
+CHAN_INFO_LAST_USED
+ Zuletzt benutzt: %s
+CHAN_INFO_LAST_TOPIC
+ Letztes Topic: %s
+CHAN_INFO_TOPIC_SET_BY
+ Topic gesetzt von: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ eMail-Adresse: %s
+CHAN_INFO_BANTYPE
+ Ban-Typ: %d
+CHAN_INFO_OPTIONS
+ Optionen: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Topic-Wiederherstellung
+CHAN_INFO_OPT_OPNOTICE
+ OP Notice
+CHAN_INFO_OPT_PEACE
+ Peace
+CHAN_INFO_OPT_PRIVATE
+ Privat
+CHAN_INFO_OPT_RESTRICTED
+ Restricted Access
+CHAN_INFO_OPT_SECURE
+ Secure
+CHAN_INFO_OPT_SECUREOPS
+ Secure Ops
+CHAN_INFO_OPT_SECUREFOUNDER
+ Secure Founder
+CHAN_INFO_OPT_SIGNKICK
+ Signierte kicks
+CHAN_INFO_OPT_TOPICLOCK
+ Topic-Sperre
+CHAN_INFO_OPT_XOP
+ xOP lists system
+CHAN_INFO_OPT_NONE
+ Keine
+CHAN_INFO_MODE_LOCK
+ Mode lock: %s
+CHAN_INFO_NO_EXPIRE
+ Dieser Channel wird nicht auslaufen.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST pattern
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Liste passender Einträge zu %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Ende der Liste - %d/%d Treffer gezeigt.
+
+# CLIST responses
+CHAN_INVITE_SYNTAX
+ INVITE channel
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN channel
+CHAN_UNBANNED
+ Dein Ban in %s wurde entfernt.
+
+# CLEAR responses
+CHAN_TOPIC_SYNTAX
+ TOPIC channel [topic]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR channel what
+CHAN_CLEARED_BANS
+ Alle Bans in %s wurden entfernt.
+CHAN_CLEARED_EXCEPTS
+ Alle Excepts in %s wurden entfernt.
+CHAN_CLEARED_MODES
+ Alle Channel-Modes von %s wurden zurückgesetzt.
+CHAN_CLEARED_OPS
+ Alle Op-Flags wurden im Channel %s entfernt.
+CHAN_CLEARED_VOICES
+ Alle Voice-Flatgs wurden im Channel %s entfernt.
+CHAN_CLEARED_USERS
+ Alle User wurden aus Channel %s gekicked.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS channel
+CHAN_GETPASS_UNAVAILABLE
+ GETPASS Befehl nicht verfügbar, da die Datenbank verschlüsselt ist.
+CHAN_GETPASS_PASSWORD_IS
+ Passwort für Channel %s ist %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS channel
+CHAN_SENDPASS_UNAVAILABLE
+ SENDPASS Befehl nicht verfügbar, da die Datenbank verschlüsselt ist.
+CHAN_SENDPASS_SUBJECT
+ Channel-Passwort (%s)
+CHAN_SENDPASS_HEAD
+ Hi,
+CHAN_SENDPASS_LINE_1
+ Du hast das Passwortes für deinen Channel %s angefordert.
+CHAN_SENDPASS_LINE_2
+ Das Passwort ist %s. Aus Sicherheitsgründen solltest du das Passwort bei Erhalt dieser Nachricht ändern.
+CHAN_SENDPASS_LINE_3
+ Wenn du nicht weisst, warum du diese Mail empfangen hast, ignoriere Sie bitte.
+CHAN_SENDPASS_LINE_4
+ AUF DIESE MAIL BITTE NICHT ANTWORTEN!
+CHAN_SENDPASS_LINE_5
+ %s, die Administration.
+CHAN_SENDPASS_OK
+ Passwort von %s wurde per eMail versandt.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID channel [reason]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID channel reason
+CHAN_FORBID_SUCCEEDED
+ Channel %s hat jetzt den Status "verboten".
+CHAN_FORBID_FAILED
+ Konnte den Status "verboten" bei %s nicht setzen!
+
+# Misc responses
+CHAN_FORBID_REASON
+ Dieser Channel wurde verboten.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND channel [reason]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND channel reason
+CHAN_SUSPEND_SUCCEEDED
+ Channel %s ist nun auf SUSPENDED gesetzt.
+CHAN_SUSPEND_FAILED
+ SUSPEND konnte in Channel %s nicht aktiviert werden!
+CHAN_SUSPEND_REASON
+ Dieser Channel wurde auf SUSPENDED gesetzt.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND channel
+CHAN_UNSUSPEND_ERROR
+ Kein # vor dem Channelnamen gefunden.
+CHAN_UNSUSPEND_SUCCEEDED
+ Channel %s ist nun nicht mehr auf SUSPENDED gesetzt.
+CHAN_UNSUSPEND_FAILED
+ Channel %s konnte nicht auf UNSUSPENED gesetzt werden!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s passt zur Exception von %s und kann nicht gebannt werden, solange die Exception nicht gelöscht wird.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Du hast eine neue Memo.
+MEMO_HAVE_NEW_MEMOS
+ Du hast %d neue Memos.
+MEMO_TYPE_READ_LAST
+ Tippe /msg %s READ LAST um sie zu lesen.
+MEMO_TYPE_READ_NUM
+ Tippe /msg %s READ %d um sie zu lesen.
+MEMO_TYPE_LIST_NEW
+ Tippe /msg %s LIST NEW um eine Auflistung deiner neuen Memos zu erhalten.
+MEMO_AT_LIMIT
+ Warnung: Du hast die maximale Anzahl gespeicherter Memos erreicht (%d). Du kannst keine weiteren Nachrichten empfangen, bis du einige deiner jetzigen Memos gelöscht hast.
+MEMO_OVER_LIMIT
+ Warnung: Du hast die maximale Anzahl gespeicherter Memos überschritten (%d). Du kannst keine weiteren Memos empfangen, bis du einige deiner jetzigen Memos gelöscht hast.
+MEMO_X_MANY_NOTICE
+ Es gibt %d benachrichtigungen für den Channel %s.
+MEMO_X_ONE_NOTICE
+ Es gibt %d Benachrichtigung für Channel %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ Es gibt eine neue Nachricht für Channel %s.
+ Tippe /msg %s READ %s %d um sie zu lesen.
+MEMO_NEW_MEMO_ARRIVED
+ Du hast eine neue Nachricht von %s empfangen.
+ Tippe /msg %s READ %d um sie zu lesen.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ Du hast keine Memos.
+MEMO_X_HAS_NO_MEMOS
+ %s hat keine Memos.
+MEMO_DOES_NOT_EXIST
+ Memo %d existiert nicht!
+MEMO_LIST_NOT_FOUND
+ Keine entsprechenden Memos gefunden.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | channel} memo-text
+MEMO_SEND_DISABLED
+ Sorry, der Memo-Versand wurde kurzzeitig deaktiviert.
+MEMO_SEND_PLEASE_WAIT
+ Bitte warte %d Sekunden bis du den SEND Befehl wieder benutzen kannst.
+MEMO_X_GETS_NO_MEMOS
+ %s kann keine Memos empfangen.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s hat zu viele Memos gespeichert und kann keine weiteren empfangen.
+MEMO_SENT
+ Memo wurde an %s versandt.
+
+# CANCEL responses
+MEMO_MASS_SENT
+ Ein Massen-Memo wurde an alle regsitrierte User gesendet.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | channel}
+MEMO_CANCEL_DISABLED
+ Sorry, das Widerrufen von Memos wurde deaktiviert.
+MEMO_CANCEL_NONE
+ Kein Memo konnte widerrufen werden.
+MEMO_CANCELLED
+ Die letzte Memo an %s wurde widerrufen.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [channel] [list | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ Du hast keine neuen Memos.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s hat keine Memos.
+MEMO_LIST_MEMOS
+ Memos für %s. Um sie zu lesen, tippe /msg %s READ num
+MEMO_LIST_NEW_MEMOS
+ Neue Memos für %s. Um sie zu lesen, tippe /msg %s READ num
+MEMO_LIST_CHAN_MEMOS
+ Memos für %s. Um sie zu lesen, tippe /msg %s READ %s num
+MEMO_LIST_CHAN_NEW_MEMOS
+ Neue Memos für %s. Um sie zu lesen, tippe /msg %s READ %s num
+MEMO_LIST_HEADER
+ Num Sender Datum/Zeit
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [channel] {list | LAST | NEW}
+MEMO_HEADER
+ Memo %d von %s (%s). Um sie zu löschen, tippe /msg %s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d von %s (%s). Um sie zu löschen, tippe /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [channel] {num | list | ALL}
+MEMO_DELETED_NONE
+ Es wurden keine Memos gelöscht.
+MEMO_DELETED_ONE
+ Memo %d wurde gelöscht.
+MEMO_DELETED_SEVERAL
+ Memos %s wurden gelöscht.
+MEMO_DELETED_ALL
+ Alle deine Memos wurden gelöscht.
+MEMO_CHAN_DELETED_ALL
+ Alle Memos für den Channel %s wurden gelöscht.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET option parameters
+MEMO_SET_DISABLED
+ Sorry, MEMO SET Befehl wurde kurzzeitig deaktiviert.
+MEMO_SET_UNKNOWN_OPTION
+ Unbekannte SET Option %s.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s wird dich beim Einloggen über eingegangene Memos informieren.
+MEMO_SET_NOTIFY_LOGON
+ %s wird dich beim Einloggen oder bei der Rückkehr aus /AWAY über eingegangene Memos informieren.
+MEMO_SET_NOTIFY_NEW
+ %s wird dich benachrichtigen, sobald neue Memos für dich eintreffen.
+MEMO_SET_NOTIFY_OFF
+ %s wird dich nicht länger beim Eintreffen neuer Memos benachrichtigen.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [channel] limit
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [user | channel] {limit | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Du hast keine Berechtigung dein Memo-Limit zu ändern.
+MEMO_SET_LIMIT_FORBIDDEN
+ Du hast keine Berechtigung das Memo-Limit für %s zu ändern.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ Du kannst dein Memo-Limit nicht höher als %d setzen.
+MEMO_SET_LIMIT_TOO_HIGH
+ Du kannst das Memo-Limit für %s nicht höher als %d setzen.
+MEMO_SET_LIMIT_OVERFLOW
+ Das Memo-Limit ist zu gross, es wird reduziert auf %d.
+MEMO_SET_YOUR_LIMIT
+ Dein Memo-Limit wurde auf %d gesetzt.
+MEMO_SET_YOUR_LIMIT_ZERO
+ Du wirst ab sofort keine Memos mehr empfangen können.
+MEMO_UNSET_YOUR_LIMIT
+ Dein Memo-Limit wurde aufgehoben.
+MEMO_SET_LIMIT
+ Memo-Limit von %s wurde auf %d gesetzt.
+MEMO_SET_LIMIT_ZERO
+ Memo-Limit von %s wurde auf 0 gesetzt, kein Memo-Empfang für ihn mehr möglich.
+MEMO_UNSET_LIMIT
+ Memo-Limit von %s wurde aufgehoben.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [channel]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | channel]
+MEMO_INFO_NO_MEMOS
+ Du hast keine Memos.
+MEMO_INFO_MEMO
+ Du hast eine neue Memo.
+MEMO_INFO_MEMO_UNREAD
+ Du hast derzeit eine ungelesene Memo.
+MEMO_INFO_MEMOS
+ Du hast %d Memos.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Du hast insgesamt %d Memos, davon ist eine ungelesen.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Du hast insgesamt %d Memos, davon sind %d ungelesen.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Du hast insgesamt %d Memos; alle davon sind ungelesen.
+MEMO_INFO_LIMIT
+ Dein Memo-Limit liegt bei %d.
+MEMO_INFO_HARD_LIMIT
+ Dein Memo-Limit liegt bei %d, und kann nicht geändert werden.
+MEMO_INFO_LIMIT_ZERO
+ Dein Memo-Limit liegt bei 0; du kannst keine Memos empfangen.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Dein Memo-Limit liegt bei 0; du kannst keine Memos empfangen. Das Limit kann von dir nicht verändert werden.
+MEMO_INFO_NO_LIMIT
+ Du hast kein Limit in der Anzahl deiner Memos.
+MEMO_INFO_NOTIFY_OFF
+ Du wirst nicht benachrichtigt bei neuen Memos.
+MEMO_INFO_NOTIFY_ON
+ Du wirst bei neuen Memos benachrichtigt, wenn du dich identifizierst bzw wenn sie eintreffen.
+MEMO_INFO_NOTIFY_RECEIVE
+ Du wirst bei neuen Memos benachrichtigt, wenn sie eintreffen.
+MEMO_INFO_NOTIFY_SIGNON
+ Du wirst bei neuen Memos benachrichtigt, wenn du dich identifizierst.
+MEMO_INFO_X_NO_MEMOS
+ %s hat derzeit keine Memos.
+MEMO_INFO_X_MEMO
+ %s hat derzeit eine Memo.
+MEMO_INFO_X_MEMO_UNREAD
+ %s hat derzeit eine ungelesene Memo.
+MEMO_INFO_X_MEMOS
+ %s hat derzeit %d Memos.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s hat derzeit %d Memos, von denen eine ungelesen ist.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s hat derzeit %d Memos, von denen %d ungelesen sind.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s hat derzeit %d Memos; von denen alle ungelesen sind.
+MEMO_INFO_X_LIMIT
+ %s's Memo-Limit liegt bei %d.
+MEMO_INFO_X_HARD_LIMIT
+ %s's Memo-Limit liegt bei %d, und kann nicht geändert werden.
+MEMO_INFO_X_NO_LIMIT
+ %s hat kein Memo-Limit.
+MEMO_INFO_X_NOTIFY_OFF
+ %s wird bei neuen Memos nicht benachrichtigt.
+MEMO_INFO_X_NOTIFY_ON
+ %s wird beim Logon und bei Ankunft neuer Memos benachrichtigt.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s wird bei Ankunft neuer Memos benachrichtigt.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s wird beim Logon über neuer Memos benachrichtigt.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Bot %s gibt es nicht.
+BOT_NOT_ASSIGNED
+ Ein Bot muss dem Channel zugewiesen werden, bevor dieser Befehl funktioniert.
+ Tippe /msg %S HELP ASSIGN für weitere Informationen.
+BOT_NOT_ON_CHANNEL
+ Der Bot ist nicht im Channel %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ Benutze nicht das Wort %s in diesem Channel!
+BOT_REASON_BADWORD_GENTLE
+ Pass bitte auf was du sagst!
+BOT_REASON_BOLD
+ Im Channel ist keine fettgedruckte-Schrift erlaubt!
+BOT_REASON_CAPS
+ Schalte Caps-Lock aus!
+BOT_REASON_COLOR
+ Keine Farben im Channel benutzen!
+BOT_REASON_FLOOD
+ Hör auf zu flooden!
+BOT_REASON_REPEAT
+ Hör auf dich dauernd zu wiederholen!
+BOT_REASON_REVERSE
+ Nicht invertiert schreiben!
+BOT_REASON_UNDERLINE
+ Keine Unterstreichungen in diesem Channel benutzen!
+
+# !seen replies
+BOT_SEEN_BOT
+ Hey, du hast mich gefunden %s!
+BOT_SEEN_YOU
+ Wieder auf der Suche nach dir selbst, %s?
+BOT_SEEN_ON_CHANNEL
+ %s ist doch im Channel!
+BOT_SEEN_ON_CHANNEL_AS
+ %s ist derzeit im Channel (als %s)!
+BOT_SEEN_ON
+ %s wurde zuletzt vor %s gesehen.
+BOT_SEEN_NEVER
+ %s hab ich noch nie gesehen.
+BOT_SEEN_UNKNOWN
+ Ich kenne %s nicht.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick user host real
+ BOT CHANGE oldnick newnick [user [host [real]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ Bot %s existiert bereits.
+BOT_BOT_CREATION_FAILED
+ Sorry, Erstellung des Bots ist fehlgeschlagen.
+BOT_BOT_READONLY
+ Sorry, das Verändern von Bot-Einstellungen ist derzeit deaktiviert.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) wurde zur Bot-Liste hinzugefügt.
+BOT_BOT_ANY_CHANGES
+ Das alten Informationen stimmen mit den neuen überein.
+BOT_BOT_CHANGED
+ Bot %s wurde geändert auf %s!%s@%s (%s)
+BOT_BOT_DELETED
+ Bot %s wurde gelöscht.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Bot-Liste:
+BOT_BOTLIST_PRIVATE_HEADER
+ Bots reserved to IRC operators:
+BOT_BOTLIST_FOOTER
+ %d Bots verfügbar.
+BOT_BOTLIST_EMPTY
+ Es sind derzeit keine Bots verfügbar.
+ Frag einen Services Admin, ob er einen erstellt.
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN chan nick
+BOT_ASSIGN_READONLY
+ Sorry, das Zuweisen von Bots ist derzeit deaktiviert.
+BOT_ASSIGN_ALREADY
+ Bot %s ist bereits dem Channel %s zugewiesen.
+BOT_ASSIGN_ASSIGNED
+ Bot %s wurde dem Channel %s zugewiesen.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN chan
+BOT_UNASSIGN_UNASSIGNED
+ Der Bot von %s wurde entfernt.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {chan | nick}
+BOT_INFO_NOT_FOUND
+ %s ist kein gültiger Bot bzw. registrierter Channel.
+BOT_INFO_BOT_HEADER
+ Information vom Bot %s:
+BOT_INFO_BOT_MASK
+ Hostmaske: %s@%s
+BOT_INFO_BOT_REALNAME
+ Echter Name: %s
+BOT_INFO_BOT_CREATED
+ Erstellt: %s
+BOT_INFO_BOT_USAGE
+ benutzt in: %d Channel(s)
+BOT_INFO_BOT_OPTIONS
+ Options : %s
+BOT_INFO_OPT_PRIVATE
+ Private
+BOT_INFO_CHAN_HEADER
+ Information von Channel %s:
+BOT_INFO_CHAN_BOT
+ Bot nick : %s
+BOT_INFO_CHAN_BOT_NONE
+ Bot nick : noch nicht zugewiesen.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Bad words kicker : %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Bad words kicker : %s (%d Kick(s) bis zum Ban)
+BOT_INFO_CHAN_KICK_BOLDS
+ Bolds kicker : %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Bolds kicker : %s (%d Kick(s) bis zum Ban)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Caps kicker : %s (Minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Caps kicker : %s (%d Kick(s) bis zum Ban; Minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Caps kicker : %s
+BOT_INFO_CHAN_KICK_COLORS
+ Colors kicker : %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Colors kicker : %s (%d Kick(s) bis zum Ban)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Flood kicker : %s (%d Zeilen in %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Flood kicker : %s (%d Kick(s) bis zum Ban; %d Zeilen in %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Flood kicker : %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Repeat kicker : %s (%d Mal)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Repeat kicker : %s (%d Kick(s) bis zum Ban; %d Mal)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Repeat kicker : %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Reverses kicker : %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Reverses kicker : %s (%d Kick(s) bis zum Ban)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Underlines kicker : %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Underlines kicker : %s (%d Kick(s) bis zum Ban)
+BOT_INFO_ACTIVE
+ aktiv
+BOT_INFO_INACTIVE
+ nicht aktiv
+BOT_INFO_CHAN_OPTIONS
+ Optionen : %s
+BOT_INFO_OPT_DONTKICKOPS
+ Op-Schutz
+BOT_INFO_OPT_DONTKICKVOICES
+ Voice-Schutz
+BOT_INFO_OPT_FANTASY
+ Fantasy-Mode
+BOT_INFO_OPT_GREET
+ Eintrittsmeldung
+BOT_INFO_OPT_NOBOT
+ Kein Bot
+BOT_INFO_OPT_SYMBIOSIS
+ Symbiosis
+BOT_INFO_OPT_NONE
+ Keine
+
+# SET responses
+BOT_SET_SYNTAX
+ SET channel option settings
+BOT_SET_DISABLED
+ Sorry, die SET-Optionen sind derzeit deaktiviert.
+BOT_SET_UNKNOWN
+ Unbekannte Option %s.
+ Tippe /msg %S HELP SET für weitere Informationen.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET channel DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Bot wird keine Ops kicken im %s.
+BOT_SET_DONTKICKOPS_OFF
+ Bot wird Ops kicken im %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET channel DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Bot wird keine Voices kicken im %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Bot wird Voices kicken im %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET channel FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Fantasy mode ist jetzt ON im %s.
+BOT_SET_FANTASY_OFF
+ Fantasy mode ist jetzt OFF im %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET channel GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Eintrittsmeldung ist jetzt ON im %s.
+BOT_SET_GREET_OFF
+ Eintrittsmeldung ist jetzt OFF im %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET botname NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ No-Bot-Mode ist jetzt ON im Channel %s.
+BOT_SET_NOBOT_OFF
+ No-Bot-Mode ist jetzt OFF im Channel %s.
+
+# SET SYMBIOSIS
+BOT_SET_PRIVATE_SYNTAX
+ SET botname PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Private-Mode des Bots im %s ist nun ON.
+BOT_SET_PRIVATE_OFF
+ Private-Mode des Bots im %s ist nun OFF.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET channel SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ Symbiosis-Mode ist jetzt ON im %s.
+BOT_SET_SYMBIOSIS_OFF
+ Symbiosis-Mode ist jetzt OFF im %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK channel option {ON|OFF} [settings]
+BOT_KICK_DISABLED
+ Sorry, die Konfiguration des Kickers ist derzeit deaktiviert.
+BOT_KICK_UNKNOWN
+ Unbekannte Option %s.
+ Tippe /msg %S HELP KICK für weitere Informationen.
+BOT_KICK_BAD_TTB
+ %s ist eine ungültige Ban-Zeit.
+
+BOT_KICK_BADWORDS_ON
+ Bot wird jetzt auf bad words achten und kicken. Benutze den BADWORDS
+ Befehl um Wörter zur Liste hinzuzufügen oder zu entfernen.
+
+BOT_KICK_BADWORDS_ON_BAN
+ Bot wird jetzt auf bad words achten und einen Ban setzen
+ nach %d kicks. Benutze den BADWORDS Befehl um Wörter zur Liste
+ hinzuzufügen oder zu entfernen.
+
+BOT_KICK_BADWORDS_OFF
+ bad word Kick ist jetzt deaktiviert.
+BOT_KICK_BOLDS_ON
+ Bot kickt jetzt Leute, die fett schreiben.
+BOT_KICK_BOLDS_ON_BAN
+ Bot kickt jetzt Leute, die fett schreiben und setzt einen Ban nach
+ %d Kicks des Users.
+BOT_KICK_BOLDS_OFF
+ bold Kick ist jetzt deaktiviert.
+BOT_KICK_CAPS_ON
+ Bot wird jetzt User mit GROSSSCHRIFT kicken (es müssen allerdings
+ %d Zeichen und %d%% der gesamten Nachricht sein).
+BOT_KICK_CAPS_ON_BAN
+ Bot wird jetzt User mit GROSSSCHRIFT kicken (es müssen allerdings
+ %d Zeichen und %d%% der gesamten Nachricht sein), und wird nach %d Kicks
+ einen Ban setzen.
+BOT_KICK_CAPS_OFF
+ Der Bot wird GROSSSCHRIFT ignorieren und nicht kicken.
+BOT_KICK_COLORS_ON
+ Bot kickt jetzt Leute, die farbig schreiben.
+BOT_KICK_COLORS_ON_BAN
+ Bot kickt jetzt Leute, die farbig schreiben, und wird einen Ban nach
+ %d Kicks setzen.
+BOT_KICK_COLORS_OFF
+ Bot wird jetzt farbige Schrift ignorieren und nicht kicken.
+BOT_KICK_FLOOD_ON
+ Bot wird jetzt Flooder kicken (%d Zeilen in %d Sekunden).
+BOT_KICK_FLOOD_ON_BAN
+ Bot wird jetzt Flooder kicken (%d Zeilen in %d Sekunden), und wird einen
+ Ban setzen nach %d Kicks.
+BOT_KICK_FLOOD_OFF
+ Bot wird jetzt Flooder ignorieren und nicht kicken.
+BOT_KICK_REPEAT_ON
+ Bot kickt jetzt Leute die sich wiederholen ( %d Mal das Gleiche)
+BOT_KICK_REPEAT_ON_BAN
+ Bot kickt jetzt Leute die sich wiederholen ( %d Mal das Gleiche), und setzt
+ einen Ban nach %d Kicks.
+BOT_KICK_REPEAT_OFF
+ Bot ignoriert jetzt jetzt Leute die sich wiederholen und wird nicht kicken.
+BOT_KICK_REVERSES_ON
+ Bot kickt Leute, die invertiert schreiben.
+BOT_KICK_REVERSES_ON_BAN
+ Bot kickt Leute, die invertiert schreiben, und setzt einen Ban nach %d
+ Kicks.
+BOT_KICK_REVERSES_OFF
+ Bot wird jetzt invertierten Schriftstil ignorieren und nicht kicken.
+BOT_KICK_UNDERLINES_ON
+ Bot kickt jetzt Leute, die unterstrichen schreiben.
+BOT_KICK_UNDERLINES_ON_BAN
+ Bot kickt jetzt Leute, die unterstrichen schreiben, und setzt einen Ban
+ nach %d Kicks.
+BOT_KICK_UNDERLINES_OFF
+ Bot wird jetzt unterstrichenen Text ignorieren und nicht kicken.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS channel {ADD|DEL|LIST|CLEAR} [word | entry-list] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Sorry, das Ändern der Bad Words-Liste ist derzeit deaktiviert.
+BOT_BADWORDS_REACHED_LIMIT
+ Sorry, du kannst nur %d Einträge in der Bad Words-Liste eines Channels haben.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s existiert bereits in der Bad Words-Liste von %s.
+BOT_BADWORDS_ADDED
+ %s zur Bad Words-Liste von %s hinzugefügt.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ Kein solcher Eintrag (#%d) wurde in der Bad Words-Liste von %s gefunden.
+BOT_BADWORDS_NOT_FOUND
+ %s nicht in der Bad Words-Liste von %s gefunden.
+BOT_BADWORDS_NO_MATCH
+ Keine entsprechenden Einträge zu %s in der Bad Words-Liste gefunden.
+BOT_BADWORDS_DELETED
+ %s wurde aus der Bad Words-Liste von %s entfernt.
+BOT_BADWORDS_DELETED_ONE
+ 1 Eintrag wurde aus der Bad Words-Liste von %s entfernt.
+BOT_BADWORDS_DELETED_SEVERAL
+ %d Einträge wurden aus der Bad Words-Liste von %s entfernt.
+BOT_BADWORDS_LIST_EMPTY
+ Die Bad Words-Liste von %s ist leer.
+BOT_BADWORDS_LIST_HEADER
+ Bad Words-Liste von %s:
+ Num Wort Typ
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ Die Bad Words-Liste ist jetzt leer.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY channel text
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT channel text
+
+# Errors
+BOT_EXCEPT
+ User stimmt mit Channel Exception überein.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_BAD_NICK
+ Bot Nicks dürfen nur gültige Zeichen enthalten.
+BOT_BAD_HOST
+ Bot Hosts dürfen nur gültige Zeichen enthalten.
+BOT_BAD_IDENT
+ Bot Idents dürfen nur gültige Zeichen enthalten.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Services können die Modes nicht ändern. Ist der Server richtig konfiguriert?
+OPER_BOUNCY_MODES_U_LINE
+ Services können die Modes nicht ändern. Sind die U:lines des
+ Servers richtig konfiguriert?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL Nachricht
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Unbekannte STATS Option %s.
+OPER_STATS_CURRENT_USERS
+ Derzeit eingeloggte User: %d (%d Oper)
+OPER_STATS_MAX_USERS
+ Maximum: %d (%s)
+
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Services laufen seit %d Tagen, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Services laufen seit %d Tag, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Services laufen seit %d Stunden, %d Minuten
+OPER_STATS_UPTIME_HM1S
+ Services laufen seit %d Stunden, %d Minuten
+OPER_STATS_UPTIME_H1MS
+ Services laufen seit %d Stunden, %d Minute
+OPER_STATS_UPTIME_H1M1S
+ Services laufen seit %d Stunden, %d Minute
+OPER_STATS_UPTIME_1HMS
+ Services laufen seit %d Stunde, %d Minuten
+OPER_STATS_UPTIME_1HM1S
+ Services laufen seit %d Stunde, %d Minuten
+OPER_STATS_UPTIME_1H1MS
+ Services laufen seit %d Stunde, %d Minute
+OPER_STATS_UPTIME_1H1M1S
+ Services laufen seit %d Stunde, %d Minute
+OPER_STATS_UPTIME_MS
+ Services laufen seit %d Minuten, %d Sekunden
+OPER_STATS_UPTIME_M1S
+ Services laufen seit %d Minuten, %d Sekunde
+OPER_STATS_UPTIME_1MS
+ Services laufen seit %d Minute, %d Sekunden
+OPER_STATS_UPTIME_1M1S
+ Services laufen seit %d Minute, %d Sekunde
+OPER_STATS_BYTES_READ
+ Bytes gelesen : %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Bytes geschrieben : %5d kB
+OPER_STATS_USER_MEM
+ User : %6d Einträge, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Channel : %6d Einträge, %5d kB
+OPER_STATS_GROUPS_MEM
+ NickServ-Gruppen : %6d Einträge, %5d kB
+OPER_STATS_ALIASES_MEM
+ NickServ-Aliase : %6d Einträge, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d Einträge, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d Einträge, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d Einträge, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Verbindungen : %6d Einträge, %5d kB
+OPER_STATS_PROXY_MEM
+ Proxies : %6d records, %5d kB
+OPER_STATS_AKILL_COUNT
+ Aktuelle Anzahl von AKILLs: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Standard Auslaufzeit von AKILLs: %d Tage
+OPER_STATS_AKILL_EXPIRE_DAY
+ Standard Auslaufzeit von AKILLs: 1 Tag
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Standard Auslaufzeit von AKILLs: %d Stunden
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Standard Auslaufzeit von AKILLs: 1 Stunde
+OPER_STATS_AKILL_EXPIRE_MINS
+ Standard Auslaufzeit von AKILLs: %d Minuten
+OPER_STATS_AKILL_EXPIRE_MIN
+ Standard Auslaufzeit von AKILLs: 1 Minute
+OPER_STATS_AKILL_EXPIRE_NONE
+ Standard Auslaufzeit von AKILLs: Kein Auslauf, permanent
+OPER_STATS_SGLINE_COUNT
+ Aktuelle Anzahl von SGLINEs: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Standard Auslaufzeit von SGLINEs: %d Tage
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Standard Auslaufzeit von SGLINEs: 1 Tag
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Standard Auslaufzeit von SGLINEs: %d Stunden
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Standard Auslaufzeit von SGLINEs: 1 Stunde
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Standard Auslaufzeit von SGLINEs: %d Minuten
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Standard Auslaufzeit von SGLINEs: 1 Minute
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Standard Auslaufzeit von SGLINEs: Kein Auslauf, permanent
+OPER_STATS_SQLINE_COUNT
+ Aktuelle Anzahl von SQLINEs: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Standard Auslaufzeit von SQLINEs: %d days
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Standard Auslaufzeit von SQLINEs: 1 day
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Standard Auslaufzeit von SQLINEs: %d hours
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Standard Auslaufzeit von SQLINEs: 1 hour
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Standard Auslaufzeit von SQLINEs: %d minutes
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Standard Auslaufzeit von SQLINEs: 1 minute
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Standard Auslaufzeit von SQLINEs: No expiration
+OPER_STATS_SZLINE_COUNT
+ Aktuelle Anzahl von SZLINEs: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Standard Auslaufzeit von SZLINEs: %d Tage
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Standard Auslaufzeit von SZLINEs: 1 Tag
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Standard Auslaufzeit von SZLINEs: %d Stunden
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Standard Auslaufzeit von SZLINEs: 1 Stunde
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Standard Auslaufzeit von SZLINEs: %d Minuten
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Standard Auslaufzeit von SZLINEs: 1 Minute
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Standard Auslaufzeit von SZLINEs: Kein Auslauf, permanent
+OPER_STATS_RESET
+ Statistiken zurückgesetzt.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE channel modes
+
+# UMODE respondes
+OPER_UMODE_SYNTAX
+ UMODE nick modes
+
+# UMODE responses
+OPER_UMODE_SUCCESS
+ Usermodes von %s geändert.
+OPER_UMODE_CHANGED
+ %s hat deine Usermodes geändert.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flags
+OPER_OLINE_SUCCESS
+ Operflags %s wurden für %s hinzugefügt.
+OPER_OLINE_IRCOP
+ Du bist nun ein IRC Operator.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES channel [ALL]
+OPER_CLEARMODES_DONE
+ Alle binären Modes und Bans wurden aus dem Channel %s entfernt.
+OPER_CLEARMODES_ALL_DONE
+ Alle Modes wurden vom Channel %s zurückgesetzt.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK channel user reason
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick newnick
+OPER_SVSNICK_NEWNICK
+ The nick %s is now being changed to %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+OPER_ADMIN_SKELETON
+ Services sind im Basis-Modus; das ADMIN-Kommando ist nicht verfügbar.
+OPER_ADMIN_EXISTS
+ %s existiert bereits auf der Services Admin-Liste.
+OPER_ADMIN_REACHED_LIMIT
+ Sorry, du kannst nur %d Services Admins haben.
+OPER_ADMIN_ADDED
+ %s wurde zur Liste der Services Admins hinzugefügt.
+OPER_ADMIN_NOT_FOUND
+ %s wurde nicht auf der Liste der Services Admins gefunden.
+OPER_ADMIN_NO_MATCH
+ Keine entsprechenden Einträge auf der Liste der Services Admins gefunden.
+OPER_ADMIN_DELETED
+ %s wurde aus der Liste der Services Admins entfernt.
+OPER_ADMIN_DELETED_ONE
+ Es wurde 1 Eintrag aus der Liste der Services Admins entfernt.
+OPER_ADMIN_DELETED_SEVERAL
+ Es wurden %d Einträge aus der Liste der Services Admins entfernt.
+OPER_ADMIN_LIST_EMPTY
+ Services Admin-Liste ist leer.
+OPER_ADMIN_LIST_HEADER
+ Services Admin-Liste:
+ Num Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Die Liste der Services Admins wurde geleert.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+OPER_OPER_SKELETON
+ Services sind im Basis-Modus; das OPER-Kommando ist nicht verfügbar.
+OPER_OPER_EXISTS
+ %s existiert bereits auf der Services Operatoren-Liste.
+OPER_OPER_REACHED_LIMIT
+ Sorry, du kannst nur %d Services Operatoren haben.
+OPER_OPER_ADDED
+ %s wurde zur Liste der Services Operatoren hinzugefügt.
+OPER_OPER_NOT_FOUND
+ %s wurde nicht auf der Liste der Services Operatoren gefunden.
+OPER_OPER_NO_MATCH
+ Keine entsprechenden Einträge auf der Liste der Services Operatoren gefunden.
+OPER_OPER_DELETED
+ %s wurde aus der Liste der Services Operatoren entfernt.
+OPER_OPER_DELETED_ONE
+ Es wurde 1 Eintrag aus der Liste der Services Operatoren entfernt.
+OPER_OPER_DELETED_SEVERAL
+ Es wurden %d Einträge aus der Liste der Services Operatoren entfernt.
+OPER_OPER_LIST_EMPTY
+ Die Services Operatoren-Liste ist leer.
+OPER_OPER_LIST_HEADER
+ Liste der Services Operatoren:
+ Num Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ Die Liste der Services Operatoren wurde geleert.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_AKILL_EXISTS
+ %s existiert bereits auf der AKILL-Liste.
+OPER_AKILL_ALREADY_COVERED
+ %s wird bereits von %s getroffen.
+OPER_AKILL_REACHED_LIMIT
+ Sorry, du kannst nur %d AKILLs haben.
+OPER_AKILL_NO_NICK
+ Achtung: AKILL-Masken dürfen keine Nicknamen enthalten; stelle sicher, dass du keinen in der Hostmaske eingetragen hast.
+OPER_AKILL_ADDED
+ %s wurde zur AKILL-Liste hinzugefügt.
+OPER_AKILL_CHANGED
+ Auslaufzeit von %s geändert.
+OPER_AKILL_NOT_FOUND
+ %s wurde nicht auf der AKILL-Liste gefunden.
+OPER_AKILL_NO_MATCH
+ Keine entsprechenden Einträge auf der AKILL-Liste.
+OPER_AKILL_DELETED
+ %s wurde von der AKILL-Liste entfernt.
+OPER_AKILL_DELETED_ONE
+ Es wurde 1 Eintrag von der AKILL-Liste entfernt.
+OPER_AKILL_DELETED_SEVERAL
+ Es wurden %d Einträge von der AKILL-Liste entfernt.
+OPER_AKILL_LIST_EMPTY
+ Die AKILL-Liste ist leer.
+OPER_AKILL_LIST_HEADER
+ Aktuelle AKILL-Liste:
+ Num Maske Grund
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Aktuelle AKILL-Liste:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (von %s am %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ Die AKILL-Liste wurde geleert.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list}[:reason]]
+OPER_SGLINE_UNSUPPORTED
+ Sorry, SGLINE ist in diesem Netz nicht verfügbar.
+OPER_SGLINE_EXISTS
+ %s existiert bereits auf der SGLINE-Liste.
+OPER_SGLINE_ALREADY_COVERED
+ %s wird bereits durch %s getroffen.
+OPER_SGLINE_REACHED_LIMIT
+ Sorry, du kannst nur %d SGLINEs haben.
+OPER_SGLINE_ADDED
+ %s wurde zur SGLINE-Liste hinzugefügt.
+OPER_SGLINE_CHANGED
+ Auslaufzeit von %s geändert.
+OPER_SGLINE_NOT_FOUND
+ %s wurde nicht auf der SGLINE-Liste gefunden.
+OPER_SGLINE_NO_MATCH
+ Keine entsprechenden Einträge auf der SGLINE-Liste.
+OPER_SGLINE_DELETED
+ %s wurde von der SGLINE-Liste entfernt.
+OPER_SGLINE_DELETED_ONE
+ Es wurde 1 Eintrag aus der SGLINE-Liste entfernt.
+OPER_SGLINE_DELETED_SEVERAL
+ Es wurden %d Einträge aus der SGLINE-Liste entfernt.
+OPER_SGLINE_LIST_EMPTY
+ Die SGLINE-Liste ist leer.
+OPER_SGLINE_LIST_HEADER
+ Aktuelle SGLINE-Liste:
+ Num Maske Grund
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Aktuelle SGLINE-Liste:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (von %s am %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ Die SGLINE-Liste wurde geleert.
+
+# SZLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Channel SQLINEs werden nicht von deinem IRCd unterstützt, folglich kannst du sie nicht nutzen.
+OPER_SQLINE_EXISTS
+ %s existiert bereits in der SQLINE Liste.
+OPER_SQLINE_ALREADY_COVERED
+ %s wird bereits durch %s getroffen.
+OPER_SQLINE_REACHED_LIMIT
+ Sorry, du kannst nur %d SQLINEs haben.
+OPER_SQLINE_ADDED
+ %s wurde zur SQLINE-Liste hinzugefügt.
+OPER_SQLINE_CHANGED
+ Auslaufzeit von %s geändert.
+OPER_SQLINE_NOT_FOUND
+ %s wurde nicht auf der SQLINE-Liste gefunden.
+OPER_SQLINE_NO_MATCH
+ Keine entsprechenden Einträge auf der SQLINE-Liste.
+OPER_SQLINE_DELETED
+ %s wurde von der SQLINE-Liste entfernt.
+OPER_SQLINE_DELETED_ONE
+ Es wurde 1 Eintrag aus der SQLINE-Liste entfernt.
+OPER_SQLINE_DELETED_SEVERAL
+ Es wurden %d Einträge aus der SQLINE-Liste entfernt.
+OPER_SQLINE_LIST_EMPTY
+ SQLINE Liste ist leer.
+OPER_SQLINE_LIST_HEADER
+ Aktuelle SQLINE Liste:
+ Num Mask Reason
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Aktuelle SQLINE Liste:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ Die SQLINE-Liste wurde geleert.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_SZLINE_UNSUPPORTED
+ Sorry, SZLINE ist in diesem Netz nicht verfügbar.
+OPER_SZLINE_EXISTS
+ %s existiert bereits auf der SZLINE-Liste.
+OPER_SZLINE_ALREADY_COVERED
+ %s wird bereits durch %s getroffen.
+OPER_SZLINE_REACHED_LIMIT
+ Sorry, du kannst nur %d SZLINEs haben.
+OPER_SZLINE_ONLY_IPS
+ Achtung: Man kann nur IP-Masken zur SZLINE-Liste hinzufügen.
+OPER_SZLINE_ADDED
+ %s wurde zur SZLINE-Liste hinzugefügt.
+OPER_SZLINE_CHANGED
+ Auslaufzeit von %s geändert.
+OPER_SZLINE_NOT_FOUND
+ %s wurde nicht auf der SZLINE-Liste gefunden.
+OPER_SZLINE_NO_MATCH
+ Kein entsprechender Eintrag in der SZLINE-Liste gefunden.
+OPER_SZLINE_DELETED
+ %s wurde von der SZLINE-Liste entfernt.
+OPER_SZLINE_DELETED_ONE
+ Es wurde 1 Eintrag aus der SZLINE-Liste entfernt.
+OPER_SZLINE_DELETED_SEVERAL
+ Es wurden %d Einträge aus der SZLINE-Liste entfernt.
+OPER_SZLINE_LIST_EMPTY
+ Die SZLINE-Liste ist leer.
+OPER_SZLINE_LIST_HEADER
+ Aktuelle SZLINE-Liste:
+ Num Maske Grund
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Aktuelle SZLINE-Liste:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (von %s am %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ Die SZLINE-Liste wurde geleert.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET option setting
+OPER_SET_IGNORE_ON
+ Ignore code wird benutzt.
+OPER_SET_IGNORE_OFF
+ Ignore code wird nicht benutzt.
+OPER_SET_IGNORE_ERROR
+ Die Einstellung von IGNORE kann nur ON oder OFF sein.
+OPER_SET_READONLY_ON
+ Services sind jetzt im read-only Modus.
+OPER_SET_READONLY_OFF
+ Services sind jetzt im read-write Modus.
+OPER_SET_READONLY_ERROR
+ Der Wert für READONLY muss entweder ON oder OFF sein.
+OPER_SET_LOGCHAN_ON
+ Die Services werden nun Logmessages an %s senden.
+OPER_SET_LOGCHAN_OFF
+ Die Services werden nun nicht mehr länger Logmessages an einen Channel senden.
+OPER_SET_LOGCHAN_ERROR
+ Die Logchannel Option muss auf ON oder OFF gesetzt werden und LogChannel muss definiert sein.
+OPER_SET_DEBUG_ON
+ Die Services sind jetzt im Debug-Modus.
+OPER_SET_DEBUG_OFF
+ Die Services sind nicht mehr im Debug-Modus.
+OPER_SET_DEBUG_LEVEL
+ Die Services sind jetzt im Debug-Modus (Level %d).
+OPER_SET_DEBUG_ERROR
+ Die Einstellung von DEBUG kann nur ON, OFF, oder eine positive Zahl sein.
+OPER_SET_NOEXPIRE_ON
+ Services sind jetzt im No Expire Modus.
+OPER_SET_NOEXPIRE_OFF
+ Services sind jetzt im Expire Modus.
+OPER_SET_NOEXPIRE_ERROR
+ Die Einstellung von NOEXPIRE kann nur ON oder OFF sein.
+OPER_SET_UNKNOWN_OPTION
+ Unbekannte Option %s.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} server
+OPER_NOOP_SET
+ Alle O:Lines von %s wurden temporär entfernt.
+OPER_NOOP_REVOKE
+ Alle O:lines von %s wurden wiederhergestellt.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE servername [reason]
+
+# RAW responses
+OPER_JUPE_HOST_ERROR
+ Benutze bitte einen gültigen hostnamen, wenn du jupiterst
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW text
+
+# UPDATE responses
+OPER_UPDATING
+ Datenbanken wurden aktualisiert.
+
+# RELOAD responses
+OPER_RELOAD
+ Die Konfigurationsdatei wurde neu eingelesen.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN wurde nicht definiert; Neustart nicht möglich. Benutze erneut das configure-Skript und kompiliere die Services erneut mit aktiviertem RESTART-Befehl.
+
+# IGNORE respondes
+OPER_IGNORE_SYNTAX
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick]
+OPER_IGNORE_VALID_TIME
+ Du musst eine zulässige Zahl als Zeit eingeben.
+OPER_IGNORE_TIME_DONE
+ Nick %s wird nun für %s ignoriert.
+OPER_IGNORE_PERM_DONE
+ Nick %s will wird nun permanent ignoriert.
+OPER_IGNORE_DEL_DONE
+ Nick %s wird nicht länger ignoriert.
+OPER_IGNORE_LIST
+ Services Ignore Liste:
+OPER_IGNORE_LIST_NOMATCH
+ Nick %s wurde nicht in der Ignore Liste gefunden.
+OPER_IGNORE_LIST_EMPTY
+ Ignore Liste ist leer.
+OPER_IGNORE_LIST_CLEARED
+ Die Ignore Liste wurde geleert.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Kann User %s nicht finden.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Channel-Liste:
+ Name User Topic
+OPER_CHANLIST_HEADER_USER
+ %s Channel-Liste:
+ Name User Topic
+OPER_CHANLIST_RECORD
+ %-20s %4d %s
+OPER_CHANLIST_END
+ Ende der Channel-Liste.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ User-Liste:
+ Nick Maske
+OPER_USERLIST_HEADER_CHAN
+ %s User-Liste:
+ Nick Maske
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Ende der User-Liste.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {hostname | pattern} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Proxy Detektor ist deaktiviert.
+OPER_CACHE_NOT_FOUND
+ %s wurde nicht im Cache gefunden.
+OPER_CACHE_REMOVED
+ %s wurde aus dem Cache gelöscht.
+OPER_CACHE_HEADER
+ Hostname Status
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ Ende der Liste - %d/%d passende Einträge angezeigt.
+OPER_CACHE_QUEUED
+ in der Warteschlange
+OPER_CACHE_PROGRESS
+ in Bearbeitung
+OPER_CACHE_NORMAL
+ Normal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ HTTP proxy
+OPER_SUPER_ADMIN_ON
+ Du bist nun ein Super-Admin.
+OPER_SUPER_ADMIN_OFF
+ Du bist nun kein Super-Admin mehr.
+OPER_SUPER_ADMIN_SYNTAX
+ Super-Admin muss ON oder OFF sein.
+OPER_SUPER_ADMIN_WALL_ON
+ %s ist nun ein Super-Admin.
+OPER_SUPER_ADMIN_WALL_OFF
+ %s verlässt den Super-Admin Mode.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ONLY
+ Only Super-Admins can use this command.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ Dieser service ist derzeit deaktiviert, bitte versuche es später nochmal
+OPER_DEFCON_NO_CONF
+ Das Defcon-System muss in der services.conf aktiviert worden sein
+OPER_DEFCON_CHANGED
+ Services sind nun beim DEFCON %d
+OPER_DEFCON_WALL
+ %s hat das DEFCON-Level geändert zu %d
+DEFCON_GLOBAL
+ Das Defcon-Level ist nun auf Level: %d
+
+# Module strings
+
+OPER_MODULE_LOADED
+ Module %s geladen
+OPER_MODULE_UNLOADED
+ Module %s entfernt
+OPER_MODULE_LOAD_FAIL
+ Kann Module %s nicht laden
+OPER_MODULE_REMOVE_FAIL
+ Kann Module %s nicht entfernen
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileNamee
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST
+ Module: %s
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Unterstützte command: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Unterstützte IRCD's für: %s
+OPER_MODULE_NO_LIST
+ derzeit keine module geladen
+OPER_MODULE_NO_INFO
+ Es sind keine Informationen für das Module %s verfügbar
+OPER_MODULE_INFO_SYNTAX
+ MODINFO FileName
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ Die folgenden Befehle wurden durch ein Module geladen:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [params]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+expiry] mask limit reason
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {mask | list}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE num position
+OPER_EXCEPTION_DISABLED
+ Eingeschränkte Verbindungen sind deaktiviert.
+OPER_EXCEPTION_ALREADY_PRESENT
+ Die Hostmaske %s ist bereits auf der Liste für eingeschränkte Verbindungen.
+OPER_EXCEPTION_TOO_MANY
+ Die Liste für eingeschränkte Verbindungen ist voll!
+OPER_EXCEPTION_ADDED
+ Verbindungslimit für %s geändert auf %d.
+OPER_EXCEPTION_MOVED
+ Exception for %s (#%d) moved to position %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ Kein solcher Eintrag (#%d) in der Liste der Verbindungs-
+ einschränkungen.
+OPER_EXCEPTION_NOT_FOUND
+ %s nicht gefunden in der Liste der Verbindungs-
+ einschränkungen.
+OPER_EXCEPTION_NO_MATCH
+ Keine entsprechenden Einträge in der Liste der
+ Verbindungseinschränkungen.
+OPER_EXCEPTION_DELETED
+ %s wurde von der Liste der Verbindungseinschränkungen
+ entfernt.
+OPER_EXCEPTION_DELETED_ONE
+ Es wurde 1 Eintrag von der Liste der Verbindungs-
+ einschränkungen entfernt.
+OPER_EXCEPTION_DELETED_SEVERAL
+ Es wurden %d Einträge von der Liste der Verbindungs-
+ einschränkungen entfernt.
+OPER_EXCEPTION_LIST_HEADER
+ Aktuelle Liste für eingeschränkte Verbindungen:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Num Limit Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (by %s on %s; %s)
+ Limit: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Ungültige Verbindungseinschränkung. Es muss eine gültige Integer-Zahl sein, grösser oder gleich
+ Null aber kleiner als %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Ungültige Hostmask. Nur echte Hostmasken sind gültig als Einträge (ohne Nicks und Idents).
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST limit | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST limit
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ SESSION Kommando ist deaktiviert.
+OPER_SESSION_INVALID_THRESHOLD
+ Ungültiger Wert. Es muss eine gültige grade Zahl sein, die grösser als 1 ist.
+OPER_SESSION_NOT_FOUND
+ Es wurde keine Verbindung von %s gefunden.
+OPER_SESSION_LIST_HEADER
+ Hosts mit mindestens %d Verbindungen:
+OPER_SESSION_LIST_COLHEAD
+ Verbindungen Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ Der Host %s hat momentan %d Verbindungen und ein Limit von %d.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Syntax: EXCEPTION ADD [+expiry] mask limit reason
+ EXCEPTION DEL {mask | list}
+ EXCEPTION MOVE num position
+ EXCEPTION LIST [mask | list]
+ EXCEPTION VIEW [mask | list]
+
+ Erlaubt es Services Admins, die Liste der Verbindungs-
+ einschränkungen zu bearbeiten - dadurch kann man bestimmte
+ Hosts, z.b. Shell-Server, auf eine bestimmte Anzahl
+ von gleichzeitigen Verbindungen einschränken. Hat ein
+ Host dieses Limit erreicht, werden weitere User von
+ die connecten wollen (von dem Host), gekilled. Bevor sie
+ gekilled werden, bekommen sie eine Notice vom %S,
+ damit sie wissen, warum sie vom Netz getrennt wurden.
+
+ EXCEPTION ADD fuegt die angegebene Hostmask zu der
+ Liste der Verbindungseinschränkungen hinzu.
+ Beachte, dass nick!user@host und user@host keine richtigen
+ Hostmasken sind!
+ Nur echte Hosts, wie z.B. box.host.dom und *.host.dom
+ sind zulässig, weil für eingeschränkte Verbindungen die Nicks
+ oder Idents nicht von Interesse sind.
+ limit muss eine Nummer grösser oder gleich 0 sein, und legt
+ fest, viele Verbindungen von diesem Host gemacht werden dürfen.
+ Ein limit von Null bedeutet, dass dieser Host keine ein-
+ geschränkte Verbindung hat. Siehe die AKILL Hilfe fuer
+ weitere Informationen über das Format des optionalen expiry
+ Parameters.
+
+ EXCEPTION DEL entfernt den Host von der Liste.
+
+ EXCEPTION MOVE verschiebt den Eintrag mit der Nummer num
+ auf die Position position. Die Einträge dazwischen werden
+ hoch bzw runtergeschoben um die Lücken zu füllen.
+
+ EXCEPTION LIST und EXCEPTION VIEW zeigt alle
+ aktuellen Verbindungseinschränkungen; wird die optionale
+ Maske angegeben, werden nur die entsprechenden Einträge aus
+ der Liste angezeigt. Der Unterschied zwischen den beiden
+ Befehlen liegt darin, dass EXCEPTION VIEW ausführlicher ist;
+ Es zeigt unter anderem den Namen der Person, die den Eintrag
+ erstellt hat, dessen Grund, das Limit, die Hostmaske und
+ die Auslaufzeit.
+
+ Beachte das ein verbindender Client die erste Beschränkung
+ die auf seinen Host zutrifft, "benutzen" wird. Grosse und
+ weit treffende Einträge in der Liste der Verbindungs-
+ einschränkungen senken die Performance der Services.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_SESSION
+ Syntax: SESSION LIST threshold
+ SESSION VIEW host
+
+ Zeigt Services Admins eine Liste mit Hosts, die eine
+ bestimmte Anzahl Verbindungen zum Chat-Netz haben.
+
+ SESSION LIST zeigt die Hosts mit mindestens threshold
+ gleichzeitigen Verbindungen.
+ Der threshold muss eine Nummer grösser als 1 sein. Dies
+ soll verhindern, dass aus Versehen eine riesige Liste
+ von Einzelsitzungen ausgegeben wird.
+
+ SESSION VIEW ist etwas ausführlicher und zeigt mehr
+ Informationen über den bestimmten Host - mit
+ Anzahl Verbindungen und dessen Limit. Der Wert bei
+ host kann keine Platzhalter (Wildcards) enthalten.
+
+ Siehe die Hilfe zu EXCEPTION um weitere Informationen
+ über das Einschränken von Verbindungen zu erhalten.
+
+ Beschränkt auf Services Admins.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Zeigt alle Nicks, die Zugriff auf die Services haben samt Level
+ und Online-Status.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ Das Defcon-System kann benutzt werden, um vordefinierte Einstellung
+ von einschränkungen der Services einzubinden - nützlich während
+ versuchter Angriffe auf das Netzerk.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * Keine neuen Channel-Registrierungen
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * Keine neuen Nick-Registrierungen
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * keine MLOCK änderungen
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Zwingt alle channels die Modes (%s) zu setzen
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Benutzt das reduzierte Session-Limit von %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Killt jeden NEU verbindenden Clienten
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignoriert jeden non-opers mit Nachrichten
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Stilles ignorieren von non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * Setzt einen AKILL auf jeden NEU verbindenden Clienten
+
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * Es werden keine neuen Memos gesendet
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+expiry] channel reason
+
+ Setzt einen AKILL für jeden Nick des angegebenen Channels. Es
+ werden die Einträge und komplette reale ident@host für jeden Nick
+ benutzt, dann wird der AKILL durchgeführt.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Logon News - %s] %s
+NEWS_OPER_TEXT
+ [Oper News - %s] %s
+
+NEWS_RANDOM_TEXT
+ [Random News - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Syntax: LOGONNEWS {ADD|DEL|LIST} [text|num]
+NEWS_LOGON_LIST_HEADER
+ Logon News Einträge:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s von %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ Es gibt keine Logon News.
+NEWS_LOGON_ADD_SYNTAX
+ Syntax: LOGONNEWS ADD text
+NEWS_LOGON_ADD_FULL
+ Die News-Liste ist voll!
+NEWS_LOGON_ADDED
+ Neuer Logon News-Eintrag hinzugefügt (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Syntax: LOGONNEWS DEL {num | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Logon News-Eintrag #%d konnte nicht gefunden werden!
+NEWS_LOGON_DELETED
+ Logon News-Eintrag #%d wurde gelöscht.
+NEWS_LOGON_DEL_NONE
+ Keine zu löschenden Einträge in der Logon News-Liste gefunden.
+NEWS_LOGON_DELETED_ALL
+ Alle Logon-News wurden entfernt.
+
+NEWS_OPER_SYNTAX
+ Syntax: OPERNEWS {ADD|DEL|LIST} [text|num]
+NEWS_OPER_LIST_HEADER
+ Oper News Einträge:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_OPER_LIST_NONE
+ Es gibt keine Oper-News.
+NEWS_OPER_ADD_SYNTAX
+ Syntax: OPERNEWS ADD text
+NEWS_OPER_ADD_FULL
+ Die News-Liste ist voll!
+NEWS_OPER_ADDED
+ Neuer Oper-News-Eintrag hinzugefügt (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Syntax: OPERNEWS DEL {num | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Oper-News-Eintrag #%d nicht gefunden!
+NEWS_OPER_DELETED
+ Oper-News-Eintrag #%d wurde entfernt.
+NEWS_OPER_DEL_NONE
+ Keine Oper-News-Einträge zu löschen!
+NEWS_OPER_DELETED_ALL
+ Alle Oper-News-Einträge wurden entfernt.
+
+NEWS_RANDOM_SYNTAX
+ Syntax: RANDOMNEWS {ADD|DEL|LIST} [text|num]
+NEWS_RANDOM_LIST_HEADER
+ Random news Einträge:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Keine random news vorhanden.
+NEWS_RANDOM_ADD_SYNTAX
+ Syntax: RANDOMNEWS ADD text
+NEWS_RANDOM_ADD_FULL
+ Die News Liste ist voll!
+NEWS_RANDOM_ADDED
+ Neuer random news Eintrag hinzugefügt (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Syntax: RANDOMNEWS DEL {num | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Random news Eintrag #%d nicht gefunden!
+NEWS_RANDOM_DELETED
+ Random news Eintrag #%d gelöscht.
+NEWS_RANDOM_DEL_NONE
+ Keine random news Einträge zu löschen!
+NEWS_RANDOM_DELETED_ALL
+ Ale random news Einträge wurden gelöscht.
+
+NEWS_HELP_LOGON
+ Syntax: LOGONNEWS ADD text
+ LOGONNEWS DEL {num | ALL}
+ LOGONNEWS LIST
+
+ Zeigt oder bearbeitet die Liste der Logon News.
+ Nach dem Connect des Users werden diese Nachrichten
+ angezeigt. (Es werden jedoch nur max. 3 angezeigt, um ein
+ Flooding des Users zu verhindern. Wenn mehr als 3 News
+ existieren, werden nur die 3 neuesten angezeigt.)
+
+ LOGONNEWS LIST kann von jedem IRC Operator benutzt werden
+ um die aktuelle Liste der Logon News anzeigen zu lassen.
+ ADD oder DEL können allerdings nur von Services Admins
+ ausgeführt werden.
+
+NEWS_HELP_OPER
+ Syntax: OPERNEWS ADD text
+ OPERNEWS DEL {num | ALL}
+ OPERNEWS LIST
+
+ Zeigt oder bearbeitet die Liste der Oper-News.
+ Nachdem sich ein User die Oper-Flags gesetzt hat (mit dem
+ /OPER Befehl) werden ihm diese Nachrichten angezeigt.
+ (Es werden jedoch nur max. 3 Nachrichten angezeigt, um ein
+ Flooding des Users zu verhindern. Wenn mehr als 3 News
+ existieren, werden nur die 3 neüsten angezeigt.)
+
+ OPERNEWS LIST kann von jedem IRC Operator benutzt werden
+ um die aktuelle Liste der Oper-News anzeigen zu lassen.
+ ADD oder DEL können allerdings nur von Services Admins
+ ausgeführt werden.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+NEWS_HELP_RANDOM
+ Syntax: RANDOMNEWS ADD text
+ RANDOMNEWS DEL {num | ALL}
+ RANDOMNEWS LIST
+
+ Bearbeitet die Liste der Random News Messages oder zeigt diese an.
+ Wenn ein User zum Network connectet, eine (und nur eine!) dieser
+ Random News Messages wird zufällig gewählt und an den User gesendet.
+
+ RANDOMNEWS LIST kann von jedem IRC Operator genutzt werden um die
+ aktuellen News Messages aufzulisten. ADD und DEL können nur von
+ Services Admins genutzt werden.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S dient dazu, Hilfe und weitere Informationen zu den Services
+ auszugeben. Eine Themenübersicht bekommt man mit Hilfe des
+ HELP Befehls der anderen Services:
+
+ /msg %s HELP
+ für Informationen zum Registrieren der Nicknames
+
+ /msg %s HELP
+ für Informationen zum Registrieren und Kontrollieren der
+ Channels
+
+ /msg %s HELP
+ für Informationen zum Senden von Memos an User, die im
+ Moment nicht online sind
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ für Informationen wie man einen Bot in einem Channel
+ einrichtet
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ Mit %S kannst du einen Nicknamen "registrieren" und somit
+ verhindern, dass andere ihn nutzen. Die folgenden Befehle
+ erlauben die Registrierung und das Ändern der Einstellungen
+ von den Nicknamen; um sie zu benutzen, tippe
+ /msg %S command. Für weitergehende Infos zu
+ einem bestimmten Befehl, tippe /msg %S HELP command.
+
+ REGISTER Registriert einen Nicknamen
+ GROUP Verwaltung von Nickname-Gruppierungen
+ IDENTIFY Identifizierung des Nicknames
+ ACCESS Liste der autorisierten Adressen
+ SET Optionen einstellen, auch Kill-Schutz
+ DROP Die Registrierung eines Nicks löschen
+ RECOVER User killen, der deinen Nicknamen
+ verwendet
+ RELEASE Regain custody of your nick after RECOVER
+ SENDPASS Passwort vergessen? Versuch das hier..
+
+ Weitere Befehle: GHOST, ALIST, INFO, LIST, LOGOUT, STATUS
+
+ WARNUNG: Dieser Service soll den Usern einen Weg
+ ermöglichen, den Missbrauch ihres Nicknames zu verhindern.
+ Es ist NICHT dazu gedacht, Nicknames zu stehlen oder
+ in Massen zu reservieren. Missbrauch von %S wird
+ geahndet und resultiert mindestens im Verlust deiner
+ registrierten Nicks.
+
+NICK_HELP_EXPIRES
+
+ Nicknames die seit einer längeren Zeit nicht mehr
+ genutzt wurden, werden durch den automatischen Auslauf
+ nach %d Tagen aus der Datenbank entfernt.
+
+NICK_HELP_REGISTER
+ Syntax: REGISTER password [email]
+
+ Registriert deinen Nicknamen in der Datenbank von
+ %S. Nachdem dein Nick registriert ist, kannst du mit den
+ SET und ACCESS Befehlen die Einstellungen deines
+ Nicks anpassen wie du es möchtest. Stell bitte
+ sicher, dass du dir das Passwort bei der Registrierung
+ merkst - du wirst es brauchen, wenn du später
+ Änderungen an den Einstellungen vornehmen willst!
+
+ (Beachte auch, dass Gross/Kleinschreibung unterschieden
+ werden! ANOPE, Anope, und anope sind
+ verschiedene Passworte!)
+
+ Richtlinien bei der Auswahl eines Passwortes:
+
+ Passworte sollten nicht einfach zu erraten sein.
+ Zum Beispiel deinen echten Namen als Passwort zu nehmen
+ ist eine schlechte Idee. Deinen Nicknamen selbst
+ als Passwort zu nehmen, ist eine noch viel schlechtere
+ Idee ;) und ausserdem würde %S es auch nicht erlauben.
+ Weiterhin sind kurze Passworte anfällig bei Trial-
+ and-Error-Versuchen, also sollte es zumindest 5 Zeichen
+ lang sein.
+ Zu guter letzt solltest du auch keine Leerzeichen im
+ Passwort verwenden.
+
+ Der Parameter email ist optional und ermöglicht
+ Nickserv dir dein Passwort per Mail zu senden, falls
+ du es vergessen haben solltest.
+ Deine Privatsphäre wird respektiert, deine eMail-
+ Adresse wird keinem Dritten verfügbar gemacht.
+
+ Dieser Befehl (REGISTER) erstellt auch ausserdem
+ eine neue Gruppe für deinen Nick, die dir erlaubt,
+ nachher weitere Nicks in diese Gruppe aufzunehmen,
+ die dann automatisch die gleiche Konfiguration und
+ Channel-Privilegien bekommen. Für weitere Infos
+ über diese Funktion tippe /msg %S HELP GROUP.
+
+NICK_HELP_GROUP
+ Syntax: GROUP target password
+
+ Dieser Befehl verbindet deinen Nicknamen mit der
+ Gruppe von target. password ist das Passwort
+ des Target-Nicknamen.
+
+ Das Teilnehmen in der Gruppe teilt deine Konfiguration,
+ Memos und Channel-Privilegien mit allen Nicknames der
+ Gruppe, und vieles mehr!
+
+ Eine Gruppe existiert so lange es sinnvoll ist. Dies
+ bedeutet, dass selbst wenn die Gruppe geDROPed wird,
+ die geteilten Konfigurationen/Rechte erhalten bleiben,
+ so lange mindestens ein Nick der Gruppe verbleibt.
+
+ Dieser Befehl lässt sich sogar verwenden, wenn dein Nick
+ (noch) nicht registriert ist. Wenn er jedoch registriert
+ ist, musst du dich vorher identifizieren. Tippe
+ /msg %S HELP IDENTIFY für weitere Infos.
+
+ Es wird allerdings empfohlen diesen Befehl mit einem
+ nicht-registrierten Nick zu verwenden, da der Nick
+ automatisch registriert wird, wenn er der Gruppe beitritt.
+ Das Beitreten einer Gruppe mit einem bereits registrierten
+ Nick kann durch die Netzwerk-Administratoren gesperrt
+ sein.
+
+ Du kannst nur in einer Gruppe zur gleichen Zeit sein.
+ Das Zusammenführen verschiedener Gruppen ist nicht
+ möglich.
+
+ Achtung: Alle Mitglieder einer Gruppe haben dasselbe
+ Passwort.
+
+NICK_HELP_IDENTIFY
+ Syntax: IDENTIFY password
+
+ Beweist %S, dass du wirklich der Besitzer
+ dieses Nicks bist. Viele Befehle erzwingen, dass
+ du dich vorher hiermit autorisierst, bevor du sie
+ benutzen kannst. Das Passwort ist das von deiner
+ Registrierung, die du mit dem REGISTER Befehl
+ gesetzt hast.
+
+NICK_HELP_UPDATE
+ Syntax: UPDATE
+
+ Updatet deinen derzeiten Status, z.B. prüft es auf neue Nachrichten,
+ setzt benötigte Channel-Modes (ModeonID), aktualisiert deinen Vhost und
+ deine userflags (lastseentime, etc).
+
+NICK_HELP_LOGOUT
+ Syntax: LOGOUT
+
+ Dieses Kommando macht den Effekt des IDENTIFY Befehls
+ rückgängig. NickServ erkennt dich also nicht mehr als
+ den Besitzer des Nicks. Beachte jedoch, dass du nicht
+ mehr gewarnt wirst, dich erneut zu identifizieren.
+
+NICK_HELP_DROP
+ Syntax: DROP [nickname]
+
+ Entfernt die Registrierung deines Nicknames aus
+ der Datenbank von %S. Ein gedroppter Nick kann
+ von jedem jederzeit wieder registriert werden.
+
+ Du kannst auch einen Nicknamen innerhalb deiner
+ Gruppe entfernen lassen, wenn du ihn als Parameter
+ bei nickname angibst.
+
+ Wenn du dieses Kommando benutzen willst, musst du
+ dich vorher mit deinem Passwort identifizieren.
+ (/msg %S HELP IDENTIFY für weitere Infos).
+
+NICK_HELP_ACCESS
+ Syntax: ACCESS ADD mask
+ ACCESS DEL mask
+ ACCESS LIST
+
+ Zeit oder bearbeitet die Zugriffsliste für
+ deinen Nick. Durch diese Liste erkennt %S
+ dich automatisch als berechtigt, diesen Nick
+ zu nutzen. Wenn du den Nick von anderen Adressen
+ verwenden willst, musst du dich durch das
+ IDENTIFY Kommando einloggen, damit %S
+ dich erkennt.
+
+ Beispiele:
+
+ ACCESS ADD anyone@*.bepeg.com
+ Erlaubt zugriff vom User anyone von
+ jedem Host aus der bepeg.com Domain.
+
+ ACCESS DEL anyone@*.bepeg.com
+ Hebt den oben genannten Befehl wieder auf.
+
+ ACCESS LIST
+ Zeigt die aktuelle Zugriffsliste an.
+
+NICK_HELP_SET
+ Syntax: SET option parameters
+
+ Stellt verschiedene Optionen zu deinem Nicknamen ein.
+ option kann eines der folgenden Werte sein:
+
+ DISPLAY Ändert den "Ursprung" deiner Gruppe
+ PASSWORD Setzt das Passwort deines Nicks neu
+ LANGUAGE Stellt die Sprache ein, in der dir die
+ Services antworten sollen.
+ URL Verbindet eine URL mit deinem Nick
+ EMAIL Verbindet eine öffentliche eMail-Adresse
+ mit deinem Nicknamen
+ ICQ Trägt deine ICQ-Nummer unter den Infos
+ zu deinem Nick ein.
+ GREET Stellt eine Begrüssungsmeldung für deinen
+ Nick ein.
+ KILL Stellt Kill-Schutz an oder aus.
+ SECURE Aktiviert/Deaktiviert den Sicherheitsmodus
+ für deinen Nick
+ PRIVATE Verhindert das Erscheinen deines Nicks auf
+ der Liste von /msg %S LIST
+ HIDE Versteckt bestimmte Informationen deines
+ Nicks
+ MSG Ändert die Methode, wie die Services mit
+ dir kommunizieren
+
+ Wenn du eines dieser Optionen nutzen willst, musst du dich
+ vorher identifizeren.
+ (/msg %S HELP IDENTIFY für weitere Infos.)
+
+ Tippe /msg %S HELP SET option für Erläuterungen
+ zu einer bestimmten oben genannten Option.
+
+NICK_HELP_SET_DISPLAY
+ Syntax: SET DISPLAY new-display
+
+ Ändert den virtuellen "Anführer" deiner Gruppe in den
+ Services. Der wert von new-display MUSS ein Nickname
+ in deiner Gruppe sein.
+
+ Hinweis: Dieser Befehl ändert keine Zugriffsrechte
+ des einzelnen Nicks, er wird nur als "Ursprung" der Gruppe
+ in der Liste aufgeführt.
+
+NICK_HELP_SET_PASSWORD
+ Syntax: SET PASSWORD new-password
+
+ Ändert das Passwort, mit dem du dich als Besitzer des
+ Nicks identifizierst.
+
+NICK_HELP_SET_LANGUAGE
+ Syntax: SET LANGUAGE number
+
+ Stellt die Sprache ein, mit der die Services mit dir
+ kommunizieren. (Zum Beispiel in einer Antwort auf einen
+ Befehl den du gesendet hast.)
+
+ number muss von der folgenden Liste der unter-
+ stützten Sprachen ausgewählt werden:
+
+NICK_HELP_SET_URL
+ Syntax: SET URL url
+
+ Verbindet die angegebene URL mit deinem Nicknamen.
+ Diese URL wird angezeigt, wenn jemand Informationen
+ über deinen Nick mit dem INFO Befehl anfordert.
+
+NICK_HELP_SET_EMAIL
+ Syntax: SET EMAIL address
+
+ Verbindet die angegebene eMail-Adresse mit deinem
+ Nicknamen. Diese Adresse wird angezeigt, wenn jemand
+ Informationen über deinen Nick mit dem INFO
+ Befehl anfordert.
+
+NICK_HELP_SET_ICQ
+ Syntax: SET ICQ number
+
+ Verbindet die angegebene ICQ Nummer mit deinem Nick.
+ Diese Nummer wird angezeigt, wenn jemand Informationen
+ über deinen Nick mit dem INFO Befehl anfordert.
+
+NICK_HELP_SET_GREET
+ Syntax: SET GREET message
+
+ Die angegebene Message wird als Begrüssungsnachricht
+ gesendet, wenn du in einen Channel eintrittst, der
+ die GREET Option eingeschaltet hat. Vorausgesetzt
+ du hast den nötigen Zugriffslevel in der Access-Liste
+ des Channels.
+
+NICK_HELP_SET_KILL
+ Syntax: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Stellt den automatischen Schutz des Nicknames durch
+ einen Kill an oder aus. Nimmt ein User deinen Nick,
+ hat er eine Minute Zeit sich zu identifizieren,
+ danach wird er, bei eingeschaltetem Schutz, durch
+ %S umbenannt in einen Zufallsnamen.
+
+ Bei der Einstellung QUICK wird Wartezeit zum
+ Identifizieren auf 20 Sekunden herabgesenkt. Bei
+ IMMED wird der User sofort ohne Warnung
+ umbenannt, wenn er nicht auf der Zugriffsliste des
+ Nicks steht; bitte benutze diese Option nicht
+ unnötigerweise.
+ Ausserdem ist es möglich, dass die Netz-Admins
+ diese Option deaktiviert haben.
+
+NICK_HELP_SET_SECURE
+ Syntax: SET SECURE {ON | OFF}
+
+ Stellt die Sicherheitsfunktionen von %S für deinen
+ Nick an oder aus. Mit eingeschaltetem SECURE
+ musst du dich immer identifizieren, egal ob deine
+ Hostmaske auf der Zugriffsliste für den Nick
+ steht oder nicht. Wenn du allerdings auf
+ der Zugriffsliste stehst, wird %S bei
+ fehlender Identifizierung den Nick nicht killen
+ (ist von der KILL Option unabhängig).
+
+NICK_HELP_SET_PRIVATE
+ Syntax: SET PRIVATE {ON | OFF}
+
+ Ändert %S's Privat-Modus für deinen Nick.
+ Mit eingeschaltetem PRIVATE wird dein Nickname
+ nicht auf Listen erscheinen, die durch %S's LIST
+ Kommando erstellt wurden.
+
+ (Jeder der deinen Nick kennt, kann gezielt mit dem
+ INFO Kommando Informationen über deinen Nick
+ abrufen, unabhängig vom Privat-Modus.)
+
+NICK_HELP_SET_HIDE
+ Syntax: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Erlaubt es dir, bestimmte Informationen in der Ausgabe
+ von %S INFO zu verstecken.
+ Du kannst deine eMail-Adresse verstecken (EMAIL), die
+ zuletzt gesehene user@host-Maske (USERMASK) und die
+ letzte Quit-Nachricht (QUIT).
+ Der zweite Parameter bestimmt, ob die Information angezeigt
+ werden soll (OFF) oder nicht (ON).
+
+NICK_HELP_SET_MSG
+ Syntax: SET MSG {ON | OFF}
+
+ Bestimmt den Modus, mit dem sich die Services mit dir
+ unterhalten.
+ Ist MSG eingeschaltet, benutzen die Services Messages
+ (Queries), ansonsten werden dir die Antworten als Notices
+ geschickt (Standard).
+
+NICK_HELP_RECOVER
+ Syntax: RECOVER nickname [password]
+
+ Ermöglicht es dir, deinen Nicknamen wieder freizugeben,
+ wenn jemand anderes ihn angenommen hat; diese Funktion
+ wird auch durch %S genutzt, wenn jemand einen Nick
+ mit Kill-Schutz anzunehmen.
+
+ Bei Aufruf dieses Kommandos wird %S einen virtuellen
+ User mit dem gleichen Nick online schalten den du
+ recovern willst. Die Folge davon ist, dass der User,
+ der deinen Nick angenommen hatte, vom Server getrennt
+ wird. Der virtuelle User von den Services wird noch
+ 1 Minute online bleiben, um sicherzustellen, dass der
+ andere User nicht sofort neu connected; Nach dieser
+ Minute wird der Nick wieder freigegeben und du kannst
+ ihn annehmen.
+
+ Als Alternative gibt es das RELEASE Kommando,
+ (/msg %S HELP RELEASE) um deinen Nick
+ schneller zurückzubekommen.
+
+ Als Vorraussetzung für das RECOVER Kommando
+ muss deine aktuelle Adresse (siehe Ausgabe von /WHOIS)
+ auf der Zugriffsliste des zu recovernden Nicks oder in
+ dessen Gruppe sein. Als dritte Möglichkeit kannst du
+ das Passwort für den Nick angeben.
+
+NICK_HELP_RELEASE
+ Syntax: RELEASE nickname [password]
+
+ Durch %S wird die Nickname-Sperre, ausgelöst
+ durch z.B. den Automatischen Kill-Schutz oder durch
+ Verwendung des RECOVER Kommandos, aufgehoben.
+ Standardmässig hält diese Sperre 1 Minute, dieses
+ Kommando setzt den Nick früher wieder frei.
+
+ Als Vorraussetzung für die Verwendung des RELEASE
+ Kommandos für einen Nick, muss deine aktuelle Hostmaske
+ (siehe /WHOIS) in der Zugriffsliste des entsprechenden
+ Nicks oder in der Gruppe des Nicks sein.
+ Weiterhin musst du das richtige Passwort für den Nick
+ haben.
+
+NICK_HELP_GHOST
+ Syntax: GHOST nickname [password]
+
+ Trennt eine "geisternde" IRC Verbindung, die deinen
+ Nick besitzt. Eine solche Verbindung ist eine
+ die nicht wirklich verbunden ist bzw im Begriff ist,
+ getrennt zu werden. Normalerweise passiert dies,
+ wenn dein Computer abstürtzt oder deine Internet-
+ Verbindung zusammenbricht, wenn du im IRC bist.
+
+ Wenn du das GHOST Kommando benutzen willst,
+ muss deine aktuelle Hostmaske (siehe /WHOIS) in der
+ Zugriffsliste des entsprechenden Nicks oder
+ in der Gruppe des Nicks sein.
+ Weiterhin musst du das richtige Passwort für den Nick
+ haben.
+
+NICK_HELP_INFO
+ Syntax: INFO nickname [ALL]
+
+ Zeigt Informationen über den angegebenen Nick, zum
+ Beispiel den Besitzer des Nicks, die letzte gesehene
+ Adresse und dessen Uhrzeit und die Optionen des Nicks.
+ Wenn du dich für den Nick über den du Infos anzeigen
+ willst identifiziert hast, und den Parameter ALL
+ benutzt, werden alle Informationen angezeigt.
+ (Egal ob sie versteckt sind oder nicht.)
+
+NICK_HELP_LIST
+ Syntax: LIST pattern
+
+ Listet alle registrierten Nicknamen auf, die auf das
+ Suchmuster (pattern) passen, im Format nick!user@host.
+ Nicks mit aktivierter PRIVATE Option werden allerdings
+ nicht angezeigt.
+
+ Beispiele:
+
+ LIST *!joeuser@foo.com
+ Zeigt alle Nicks an, deren Besitzer joeuser@foo.com
+ ist.
+
+ LIST *Bot*!*@*
+ Zeigt alle registrierten Nicks mit Bot in ihrem
+ Ident (Gross/Kleinschreibung wird nicht unterschieden).
+
+ LIST *!*@*.bar.org
+ Listet alle Nicks von Usern in der bar.org
+ Domain.
+
+
+ NICK_HELP_ALIST
+ Syntax: ALIST [level]
+
+ Listet dir alle Channels auf, auf die du Zugriff hast. Zusätzlich
+ kannst du ein Level im XOP oder ACCESS Format angeben. Es werden
+ dann nur Channels aufgelistet, in denen du dieses Level hast.
+
+ Beispiele:
+ ALIST Founder
+ Listet alle Chans auf, in denen du Founder Access hast.
+
+ ALIST AOP
+ Listet alle Chans auf, in denen dein Zugriffslevel AOP
+ oder höher beträgt.
+
+ ALIST 10
+ Listet alle Chans auf, in dnen dein Zugriffslevel 10
+ oder höher beträgt.
+
+ Channels mit der NOEXPIRE Option sind mit einem Ausrufezeichen
+ markiert.
+NICK_HELP_ALIST
+ Syntax: ALIST [level]
+
+ Listet alle Channels auf, auf denen du Zugriff hast. Optional kannst du
+ das Level-Format (XOP oder ACCESS) bestimmen. Die daraus resultierende
+ liste wird nur Channels enthalten, wo du den entsprechenden
+ Zugriffslevel hast.
+
+ Examples:
+ ALIST Founder
+ Listet alle Channels auf, in denen du Founder-Access hast.
+
+ ALIST AOP
+ Listet alle Channels auf, in denen du AOP-Access oder höher
+ hast.
+
+ ALIST 10
+ Listet alle Channels auf, in denen du das Zugriffs-Level 10
+ oder höher hast..
+
+ Channels, die die NOEXPIRE Option gesetztist, haben ein
+ Ausrufezeiche als Prefix.
+
+NICK_HELP_GLIST
+ Syntax: GLIST
+
+ Führt alle Nicks auf, die in deiner Gruppe enthalten sind.
+
+NICK_HELP_STATUS
+ Syntax: STATUS nickname...
+
+ Liefert einen Wert zurück, der besagt, ob der augenblickliche
+ Nutzer des Nicks der identifizierte Eigentümer ist, oder nicht.
+ Die Antwort hat das Format:
+
+ nickname status-code
+
+ wobei nickname der Nick ist, der mit dem Kommando angefragt
+ wurde, und status-code eine der folgenden Werte:
+
+ 0 - User ist nicht online or Nick nicht registriert
+ 1 - User wird nicht als Eigentümer erkannt
+ 2 - User wird als Eigentümer erkannt durch die
+ Zugriffsliste
+ 3 - User wird als Eigentümer erkannt durch die
+ Identifizierung mit Passwort
+
+ Bis zu 16 Nicknamen können dem Kommando übergeben werden;
+ der Rest wird ignoriert. Es wird keine Fehlermeldung
+ ausgegeben, wenn kein Nick angegeben wird.
+
+NICK_HELP_SENDPASS
+ Syntax: SENDPASS nickname
+
+ Sendet das Passwort des angegebenen Nicks zu der damit
+ verbundenen eMail-Adresse aus der NickServ-Datenbank.
+ Dieses Kommando ist wirklich nützlich, wenn du dein
+ Passwort vergessen haben solltest.
+
+ Kann in manchen Netzen auf IRC Operatoren begrenzt
+ sein.
+
+ Dieses Kommando ist nicht verfügbar, wenn die Datenbanken
+ verschlüsselt angelegt sind.
+
+NICK_SERVADMIN_HELP
+
+ Die folgenden Kommandos sind für Services Admins
+ verfügbar:
+
+ GETPASS Das Passwort eines Nicks aus der
+ Datenbank auslesen (nur wenn keine
+ Verschlüsselung aktiv ist)
+ FORBID Einen bestimmten Nick verbieten
+
+ Services Admins können auch registrierte Nicks löschen,
+ ohne sich für den jeweiligen Nick identifizieren zu
+ müssen. Zusätzlich können sie die Zugriffsliste eines
+ jeden Nicks ansehen und bearbeiten (siehe /msg %S
+ ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Syntax: LOGOUT [nickname [REVALIDATE]]
+
+ Ohne angegebenen Parameter, macht dieses Kommando die
+ Wirkung von IDENTIFY rückgängig; zum Beispiel
+ wirst du nicht mehr als Eigentümer des Nicks erkannt.
+ Beachte jedoch, dass du nicht erneut zur Identifizierung
+ aufgefordert wirst.
+
+ Mit angegebenem Parameter passiert das gleiche für den
+ Nicknamen. Wenn du zusätzlich REVALIDATE angibst, wird
+ Services dich auffordern, dich erneut für den Nick
+ zu identifizieren.
+
+ Diese Funktion ist beschränkt auf die Services Admins.
+
+NICK_SERVADMIN_HELP_DROP
+ Syntax: DROP [nickname]
+
+ Ohne angegebenen Parameter entfernt es deinen Nicknamen
+ aus der Datenbank von %S.
+
+ Mit dem Nicknamen als Parameter, wird dieser Nickname
+ von der Datenbank entfernt. Du kannst jeden Nick in
+ deiner Gruppe ohne bestimmte Privilegien entfernen.
+
+ Das Entfernen eines beliebigen Nicks ist beschränkt
+ auf Services Admins.
+
+NICK_SERVADMIN_HELP_SET
+
+ Als zusätzliche Option können die Services das
+ NOEXPIRE-Flag an einem Nick setzen, dass diesen
+ vor dem Auslaufen bei Nichtnutzung verhindert.
+
+ Zusätzlich können Services Admins die Optionen
+ eines belieben Nicks verändern, ohne vorher
+ ein Passwort für den Nick einzugeben; dafür gilt
+ das Format SET nickname option parameters.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Syntax: SET [nickname] NOEXPIRE {ON | OFF}
+
+ Stellt den Auslauf bei Nichtnutzung des angegebenen
+ Nicknamen ein. Setzt man diesen Wert auf ON, wird
+ der Nick nicht auslaufen. Wird kein Parameter über-
+ geben, wird das No-Expire Flag deines Nicks geändert.
+
+ Diese Funktion ist beschränkt auf Services Admins.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Services Admins können den ALL Parameter für
+ jeden beliebigen Nick benutzen.
+
+NICK_SERVADMIN_HELP_LIST
+ Syntax: LIST pattern [FORBIDDEN] [NOEXPIRE]
+
+ Zeigt alle registrierten Nicknamen an, die einem bestimmten
+ Muster (pattern), nick!user@host, entsprechen.
+ Nicks mit aktivierter PRIVATE-Option werden nur
+ Services Admins angezeigt. Nicks bei denen das
+ NOEXPIRE eingeschaltet ist, werden ein ! vor ihrem
+ Eintrag in der Liste haben (nur bei Services Admins).
+
+ Bei Angabe des Parameters FORBIDDEN oder NOEXPIRE werden
+ nur Nicks aufgelistet, die das entsprechende Flag gesetzt
+ haben. Wenn beide Parameter gleichzeitig angegeben, nur
+ Nicks, die beide Flags eingeschaltet haben. Diese
+ Funktion ist beschränkt auf Services Admins.
+
+ Beispiele:
+
+ LIST *!joeuser@foo.com
+ Zeigt alle Nicknamen die von joeuser@foo.com
+ besessen werden.
+
+ LIST *Bot*!*@*
+ Listet alle registrierten Nicknamen die Bot in
+ ihrem Ident haben (unabhängig von Gross/Klein-
+ schreibung).
+
+ LIST * NOEXPIRE
+ Zeigt alle registrierten Nicks an, die das NOEXPIRE
+ Flag gesetzt haben.
+
+NICK_SERVADMIN_HELP_ALIST
+ Syntax: ALIST [nickname] [level]
+
+ Mit keinen Parametern werden alle Channels aufgelistet, auf
+ die du Zugriff hast. Mit einem Parameter werden alle Channels
+ aufgelistet, auf die nickname Zugriff hat. Mit zwei
+ Parametern werden alle Channel aufgelistet, in denen nickname
+ Zugriffslevel level oder höher hat.
+
+ Beschränkt auf Services admins.
+
+NICK_SERVADMIN_HELP_GLIST
+ Syntax: GLIST [nickname]
+
+ Wird kein Parameter angegeben, werden alle Nicks in
+ deiner Gruppe angezeigt.
+
+ Ansonsten werden alle Nicks, die in der Gruppe des
+ angegebenen Nicks sind, aufgelistet. Diese Funktion
+ ist beschränkt auf Services Admins.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Syntax: GETPASS nickname
+
+ Liest das Passwort von nickname aus der Datenbank aus.
+ Beachte dass wenn jemand dieses Kommando nutzt,
+ diese Aktion im Logbuch der Services vermerkt wird.
+ Zusätzlich wird eine Nachricht an alle Oper per
+ WALLOPS/GLOBOPS ausgesandt.
+
+ Beschränkt auf Services Admins.
+
+ Dieses Kommando ist nicht verfügbar bei aktivierter
+ Verschlüsselung.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Gibt die passenden Nicks auf, welche die gegebene email benutzen.
+ Beachte, dass du keine wildcards für den User oder emailhost
+ verwenden kannst. Immer, wenn dieser Befehl benutzt wird, wird eine
+ Nachricht mit dem Nick der Person mitgeloggt, welche diesen Befehl
+ ausführt.
+
+ Limited to Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Syntax: FORBID nickname [reason]
+
+ Verhindert, dass der angegebene Nickname registriert
+ oder genutzt wird. Diese Einschränkung kann durch
+ DROPen des Nicks aufgehoben werden.
+
+ In bestimmten Netzen wird ein Grund (reason) für das
+ Verbot benötigt.
+
+ Beschränkt auf Services Admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ Mit Hilfe von %S kann man Channel registrieren und
+ eine Vielzahl von Kontrolloptionen einstellen. %S
+ kann zum Beispiel das "Takeover" von Channels verhindern,
+ in dem man die Channel-Op Privilegien auf bestimmte
+ registrierte Nicks begrenzt. Verfügbare Kommandos
+ sind unten aufgelistet; um sie zu benutzen tippe
+ /msg %S command. Für weitere Informationen
+ zu einem bestimmten Befehl, tippe /msg %S
+ HELP command.
+
+ REGISTER Einen Channel registrieren
+ IDENTIFY Sich mit Passwort als Founder (z.B.)
+ des Channels identifizieren
+ SET Bestimmte Channel-Optionen und
+ Informationen einstellen
+ ACCESS Die Liste der priviligierten User
+ bearbeiten
+ LEVELS Die Einstellungen verschiedener
+ Zugriffslevel neu definieren
+ AKICK Die Autokick-Liste bearbeiten
+ DROP Registrierung eines Channels aufheben
+ SENDPASS Hilft bei vergessenen Passwörtern
+
+ Weitere Kommandos: CLEAR, DEOP, DEVOICE, GETKEY, INFO,
+ INVITE, KICK, LIST, LOGOUT, OP,
+ UNBAN, VOICE
+
+CHAN_HELP_UNREAL
+
+ Diese Befehle stehen zusätzlich in diesem
+ Netzwerk zur Verfügung:
+ HALFOP, DEHALFOP, PROTECT, DEPROTECT
+
+CHAN_HELP_ULTIMATE
+
+ Diese Befehle stehen zusätzlich in diesem
+ Netzwerk zur Verfügung:
+
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ Diese Befehle stehen zusätzlich in diesem
+ Netzwerk zur Verfügung:
+
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Beachte das jeder Channel der für %d Tage nicht
+ genutzt wird (bzw wenn kein User aus der Zugriffs-
+ liste diese bestimmte Zeit nicht erscheint), wird
+ die Registrierung des Channels automatisch
+ auslaufen.
+
+CHAN_HELP_REGISTER
+ Syntax: REGISTER channel password description
+
+ Registriert einen Channel in der Datenbank von %S.
+ Wenn du dieses Kommando nutzen möchtest, musst du
+ Operator-Status in dem Channel besitzen. Das
+ Passwort, dass du mit dem IDENTIFY Kommando
+ einstellst, erlaubt es später anderen Änderungen
+ am Channel durchzuführen.
+ Der letzte Parameter, der angegeben werden muss,
+ sollte eine allgemeine Beschreibung des Channels bzw
+ dessen Zweck beinhalten.
+
+ Wenn du einen Channel registrierst, wird dein Nick
+ als Founder (Gründer) eingetragen. Der Channel-
+ Founder kann alle Einstellungen des Channels
+ bearbeiten, und wird automatisch beim Joinen des
+ Channels durch %S mit Founder/Operator-
+ Privilegien ausgestattet.
+ Mit Hilfe des ACCESS Kommandos (tippe
+ /msg %S HELP ACCESS) kann man einen Teil dieser
+ Privilegien anderen registrierten Nicks ebenfalls
+ erteilen.
+
+ Hinweis: Für das Registrieren eines Channels
+ musst du einen registrierten und identifizierten
+ Nick benutzen. Hast du dies noch nicht getan,
+ tippe/msg %s HELP um weitere Informationen
+ darüber zu erhalten.
+
+CHAN_HELP_IDENTIFY
+ Syntax: IDENTIFY channel password
+
+ Identifiziert durch gegenüber %S als Gründer
+ (Founder) des angegebenen Channels. Viele
+ Befehle benötigen diesen Schritt, bevor du sie
+ benutzen kannst. Das Passwort ist das, das du beim
+ REGISTER Kommando angegeben hattest.
+
+CHAN_HELP_LOGOUT
+ Syntax: LOGOUT channel nickname
+
+ Hebt die Identifizierung als Channel-Founder für
+ den angegebenen Channel wieder auf.
+
+ Wenn du der Channel-Founder bist, kannst du jeden
+ ausloggen, jeder andere nur sich selbst.
+
+CHAN_HELP_DROP
+ Syntax: DROP channel
+
+ Entfernt die Registrierung des angegebenen Channels.
+ Kann nur vom Channel-Founder benutzt werden,
+ der sich vorher mit dem IDENTIFY zu erkennen
+ geben muss.
+
+CHAN_HELP_SET
+ Syntax: SET channel option parameters
+
+ Erlaubt es dem Channel-Founder bestimmte Optionen
+ und Informationen des Channels zu ändern.
+
+ Verfügbare Optionen:
+
+ FOUNDER Stellt den Gründer des Channels ein
+ SUCCESSOR Stellt den Vertreter des Founders ein
+ PASSWORD Ändert das Passwort des
+ Channel-Founders
+ DESC Ändert die Channel-Beschreibung
+ URL Verbindet eine URL mit dem Channel
+ EMAIL Verbindet eine eMail-Adresse mit dem
+ Channel
+ ENTRYMSG Stellt eine Begrüssungsmeldung des
+ Channels ein
+ TOPIC Ändert das Topic im Channel
+ BANTYPE Ändert den Ban-Typ, den die Services
+ in dem Channel anwenden
+ KEEPTOPIC Topic behalten, wenn Channel nicht
+ benutzt wird
+ TOPICLOCK Topic kann nur durch TOPIC
+ geändert werden
+ MLOCK Channel-Modes fest einstellen
+ PRIVATE Den Channel vom /LIST-Befehl verstecken
+ RESTRICTED Eingeschränkter Zugriff auf den Channel
+ SECURE Aktiviert %S's Sicherheits-
+ funktionen
+ SECUREOPS Strengere Kontrolle des Op-Status im
+ Channel
+ SECUREFOUNDER Strengere Kontrolle des Founder-Status
+ SIGNKICK Kicks durch ChanServ in dem Channel
+ werden durch den Kicker signiert
+ OPNOTICE Sendet eine Notice wenn Op/Deop-Kommandos
+ benutzt werden
+
+ Tippe /msg %S HELP option für weitere Informationen
+ zu einem bestimmten Kommando.
+
+CHAN_HELP_SET_FOUNDER
+ Syntax: SET channel FOUNDER nick
+
+ Ändert den Gründer (Founder) eines Channels. Der neue
+ Nick muss registriert sein.
+
+CHAN_HELP_SET_SUCCESSOR
+ Syntax: SET channel SUCCESSOR nick
+
+ Ändert den Vertreter des Gründers in dem Channel. Wenn
+ der Nickname des Gründers ausläuft oder gedropped wird,
+ wenn der Channel registriert ist, wird der Vertreter
+ der neue Gründer des Channels. Wenn jedoch der
+ Vertreter bereits zu viele Channels registriert hat
+ (max %d), wird der Channel gedropped.
+
+ Der Nickname des Vertreters muss registriert sein.
+
+CHAN_HELP_SET_PASSWORD
+ Syntax: SET channel PASSWORD password
+
+ Ändert das Passwort, dass dich als Founder (Gründer)
+ des Channels identifiziert.
+
+CHAN_HELP_SET_DESC
+ Syntax: SET channel DESC description
+
+ Ändert die Beschreibung für einen Channel, die bei
+ dem LIST und INFO Kommando angezeigt wird.
+
+CHAN_HELP_SET_URL
+ Syntax: SET channel URL [url]
+
+ Verbindet die angegebene URL mit dem Channel. Diese
+ URL wird angezeigt, wenn jemand Informationen
+ über den Channel mit dem INFO Kommando abfragt.
+ Wird kein Parameter angegeben, wird die aktuelle
+ URL gelöscht.
+
+CHAN_HELP_SET_EMAIL
+ Syntax: SET channel EMAIL [address]
+
+ Verbindet die angegebene eMail-Adresse mit dem
+ Channel. Diese eMail-Adresse wird angezeigt,
+ wenn jemand Informationen über den Channel mit
+ dem INFO Kommando abfragt.
+ Wird kein Parameter angegeben, wird die aktuelle
+ eMail-Adresse gelöscht.
+
+CHAN_HELP_SET_ENTRYMSG
+ Syntax: SET channel ENTRYMSG [message]
+
+ Ändert die Nachricht, die User beim Joinen des
+ Channels per /notice bekommen. Wird kein Parameter
+ angegeben, wird keine Nachricht beim Joinen
+ angezeigt.
+
+CHAN_HELP_SET_BANTYPE
+ Syntax: SET channel BANTYPE bantype
+
+ Stellt den Ban-Typ für den Channel ein, den die
+ Services anwenden, wenn sie einen Ban eintragen
+ (z.B. bei einem Auto-Kick).
+
+ bantype muss einer der folgenden Werte sein:
+
+ 0: Ban in der Form *!user@host
+ 1: Ban in der Form *!*user@host
+ 2: Ban in der Form *!*@host
+ 3: Ban in der Form *!*user@*.domain
+
+CHAN_HELP_SET_KEEPTOPIC
+ Syntax: SET channel KEEPTOPIC {ON | OFF}
+
+ Aktiviert oder deaktiviert die Topic Wiederherstellung für
+ den Channel. Wird diese Option eingeschaltet, wird das
+ Topic des Channels gespeichert durch %S; selbst wenn
+ der letzte User den Channel verlässt, wird es
+ wiederhergestellt sobald jemand wieder in den Channel
+ kommt.
+
+CHAN_HELP_SET_TOPICLOCK
+ Syntax: SET channel TOPICLOCK {ON | OFF}
+
+ Aktiviert oder deaktiviert die topic lock-Option
+ für den angegebenen Channel.
+ Wenn topic lock eingeschaltet ist, wird %S jede
+ Änderung des Topics verhindern/rückgängig machen,
+ ausser es wurde durch TOPIC eingestellt.
+
+CHAN_HELP_SET_MLOCK
+ Syntax: SET channel MLOCK modes
+
+ Stellt den Mode-Lock-Parameter für den angegebenen
+ Channel ein. %S ermöglicht es dir, einzustellen,
+ dass bestimmte Modi immer aus bzw an sein müssen.
+
+ Die Modi die gelockt werden können sind i, k, l,
+ m, n, p, s, and t; jede einzelne dieser Modi kann
+ ein/aus oder gar nicht gelockt werden. Der modes Parameter
+ ist genauso aufgebaut wie das jeweilige /MODE Kommando; dies
+ bedeutet, Modi die durch ein + gekennzeichnet sind, sind aktiviert;
+ Durch ein - sind sie deaktiviert.
+
+ Warnung: Wenn du den Channel mit Hilfe des SET MLOCK
+ Befehls mit einem Key (Passwort) schützt, solltest du
+ zusätzlich die RESTRICTED Option für den Channel ein-
+ schalten (siehe HELP SET RESTRICTED), oder jeder der in
+ diesen Channel kommt wenn er leer ist kann den Key sehen!
+
+ Beispiele:
+
+ SET #channel MLOCK +nt-iklps
+ Erzwingt die Channel-Modi n und t auf an, die i,
+ k,l,p und s aus. Mode m wird nicht explizit gelockt
+ und kann wahlweise an oder ausgeschaltet werden.
+
+ SET #channel MLOCK +knst-ilmp mein-key
+ Erzwingt die Modi k, n, s und t an, die Modi i, l, m,
+ und p aus. Weiterhin wird der Channel-Key fest auf
+ "mein-key" eingestellt.
+
+ SET #channel MLOCK +
+ Entfernt alle gelockten Channel-Modi; jeder Modus
+ kann nun wahlweise an- oder ausgeschaltet werden.
+
+CHAN_HELP_SET_PEACE
+ Syntax: SET channel PEACE {ON | OFF}
+
+ Aktiviert oder deaktiviert die peace Option. Wenn
+ peace aktiviert ist, kann ein User einen anderen User
+ mit gleichem oder höherem Zugriffslevel nicht mehr per
+ %S kicken, bannen oder dessen Channelstatus löschen.
+
+CHAN_HELP_SET_PRIVATE
+ Syntax: SET channel PRIVATE {ON | OFF}
+
+ Schaltet den Privat-Modus für einen Channel an
+ oder aus. Wird er aktiviert, wird der Channel in der
+ Ausgabe von/msg %S LIST nicht mehr auftauchen.
+
+CHAN_HELP_SET_RESTRICTED
+ Syntax: SET channel RESTRICTED {ON | OFF}
+
+ Aktiviert oder deaktiviert den restricted access
+ (beschränkter Zugriff)-Modi für einen Channel. Wenn
+ restricted access eingeschaltet ist, werden
+ User die sonst keinen Channel Operator-Status besitzen
+ würden (Nicks mit negativem Zugriffslevel, oder wenn
+ Secure Ops aktiv ist: Nicks die nicht auf der
+ Zugriffsliste sind) vom Channel gekicked und gebanned.
+
+CHAN_HELP_SET_SECURE
+ Syntax: SET channel SECURE {ON | OFF}
+
+ Aktiviert oder deaktiviert die Sicherheitsfunktionen
+ von %S für den angegebenen Channel.
+ Wird SECURE eingeschaltet, werden nur registrierte
+ Nicks (durch %s) die per Passwort
+ identifiziert sind in den Channel gelassen, so wie es
+ in der Zugriffsliste des Channels steht.
+
+CHAN_HELP_SET_SECUREOPS
+ Syntax: SET channel SECUREOPS {ON | OFF}
+
+ Ändert die Secure-Ops Option für einen Channel.
+ Wird diese Option eingeschaltet, können Nicks, die nicht
+ auf der Zugriffsliste des Channels stehen, keinen Op-Status
+ erhalten.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Syntax: SET channel SECUREFOUNDER {ON | OFF}
+
+ Aktiviert oder deaktiviert die Secure Founder-Option
+ für einen Channel.
+ Wird diese Option eingeschaltet, kann nur der "echte"
+ Gründer des Channels diesen DROPen, das Passwort und den
+ Successor verändern; und nicht derjenige, der sich per
+ IDENTIFY gegenüber %S als Gründer (Founder) identifiziert
+ hat.
+
+CHAN_HELP_SET_SIGNKICK
+ Syntax: SET channel SIGNKICK {ON | LEVEL | OFF}
+
+ Aktiviert oder deaktiviert signierte Kicks für einen
+ Channel. Ist SIGNKICK aktiviert, wird der Reason
+ eines Kicks der durch %S KICK ausgeführt wurde, durch
+ den Nicknamen des Kickers signiert.
+
+ Wird LEVEL benutzt, werden Kicks durch Nicknamen
+ deren Level grösser oder gleich dem SIGNKICK Level ist,
+ nicht durch den Nicknamen signiert.
+ Siehe /msg %S HELP LEVELS für weitere Informationen.
+
+CHAN_HELP_SET_XOP
+ Syntax: SET channel XOP {ON | OFF}
+
+ Aktiviert oder deaktiviert das xOP Listen System für einen Channel.
+ Wenn XOP aktiviert ist, musst du AOP/SOP/VOP
+ Commands nutzen, um Zugriffslevel festlegen zu können. Andernfalls
+ musst du das ACCESS Command nutzen.
+
+ Technische Bemerkung: Wenn du vom Access zum xOP System
+ wechselst, werden die Zugriffslevel geändert, folglich wirst du
+ nicht die selben Werte finden, wenn du zu Access zurückwechselst.
+
+ Du solltest nach einem Wechsel zum xOP System darauf achten,
+ dass die User das richtige Level besitzen, da das Umwechseln
+ auf Vermutung basiert und nicht immer perfekt funktioniert.
+ Es ist nicht empfohlen nach einer Änderung der Levels das xOP
+ System zu nutzen.
+
+ Der Wechsel vom xOP System zum Access System fuktioniert
+ jedoch fehlerfrei.
+
+CHAN_HELP_SET_OPNOTICE
+ Syntax: SET channel OPNOTICE {ON | OFF}
+
+ Aktiviert oder deaktiviert die Op-Notice Option für
+ einen Channel.
+ Wird Op-Notice eingeschaltet, sendet %S eine
+ Notice an den Channel wenn OP oder DEOP Kommandos
+ benutzt werden.
+
+CHAN_HELP_AOP
+ Syntax: AOP channel ADD nick
+ AOP channel DEL {nick | entry-num | list}
+ AOP channel LIST [mask | list]
+ AOP channel CLEAR
+
+ Verwaltet die AOP (AutoOP) Liste eines Channels. Die
+ AOP Liste gibt Usern automatisch Operator Status in deinem
+ und gibt ihnen das Recht die Commands UNBAN und INVITE.
+ zu nutzen, beim Betreten des Channels werden die Greet
+ Messages dieser User angezeigt, usw.
+
+ Das AOP ADD Command fügt den jeweiligen Nick zur AOP Liste
+ hinzu.
+
+ Das AOP DEL Command löscht den jeweiligen Nick aus der
+ AOP Liste. Wenn mehrere Eintragsnummern angegeben werden,
+ werden diese Einträge gelöscht. (Siehe Beispiel bei LIST.)
+
+
+ Das AOP LIST Command zeigt die aktuelle AOP Liste. Wenn
+ Wildcard Masks angegeben werden, werden nur die betroffenen
+ Einträge angezeigt. Werden mehrere Eintragsnummern angegeben,
+ werden nur diese Einträge angezeigt, zB:
+
+ AOP #channel LIST 2-5,7-9
+ Listet die AOP Einträge 2 bis 5 und 7 bis 9.
+
+ Das AOP CLEAR Command löscht alle Einträge der AOP Liste.
+
+ AOP ADD und AOP DEL sind auf SOPs beschränkt, während
+ AOP CLEAR nur vom Channel Founder genutzt werden kann.
+ Jeder User auf der AOP Liste kann das AOP LIST Command nutzen.
+
+ Dieses Command kann für deinen Channel ausgeschaltet sein, in
+ diesem Fall nutze bitte die Access Liste. Für weitere Infos zur
+ Access Liste, tippe bitte /msg %S HELP ACCESS und
+ /msg %S HELP SET XOP für Infos über den Wechsel vom xOP und
+ vom Access System.
+
+CHAN_HELP_HOP
+ Syntax: HOP channel ADD nick
+ HOP channel DEL {nick | entry-num | list}
+ HOP channel LIST [mask | list]
+ HOP channel CLEAR
+
+ Verwaltet die HOP (HalfOP) Liste eines Channels. User auf
+ dieser Liste werden automatisch gehalfopt, wenn sie joinen.
+
+ Das HOP ADD Command fügt den jeweiligen Nick zur HOP Liste
+ hinzu.
+
+ Das HOP DEL Command löscht den jeweiligen Nick aus der
+ HOP Liste. Wenn mehrere Eintragsnummern angegeben werden,
+ werden diese Einträge gelöscht. (Siehe Beispiel bei LIST.)
+
+
+ Das HOP LIST Command zeigt die aktuelle HOP Liste. Wenn
+ Wildcard Masks angegeben werden, werden nur die betroffenen
+ Einträge angezeigt. Werden mehrere Eintragsnummern angegeben,
+ werden nur diese Einträge angezeigt, zB:
+
+ HOP #channel LIST 2-5,7-9
+ Listet die HOP Einträge 2 bis 5 und 7 bis 9.
+
+ Das HOP CLEAR Command löscht alle Einträge der HOP Liste.
+
+ HOP ADD, HOP DEL und HOP LIST sind auf AOPs oder
+ höher beschränkt, während HOP CLEAR nur vom Founder genutzt
+ werden kann.
+
+ Dieses Command kann für deinen Channel ausgeschaltet sein, in
+ diesem Fall nutze bitte die Access Liste. Für weitere Infos zur
+ Access Liste, tippe bitte /msg %S HELP ACCESS und
+ /msg %S HELP SET XOP für Infos über den Wechsel vom xOP und
+ vom Access System.
+
+CHAN_HELP_SOP
+ Syntax: SOP channel ADD nick
+ SOP channel DEL {nick | entry-num | list}
+ SOP channel LIST [mask | list]
+ SOP channel CLEAR
+
+ Verwaltet die SOP (SuperOP) Liste eines Channels. Ein User
+ in der SOP Liste besitzt die selben Rechte wie ein AOP und kann
+ zusätzlich die AutoKick und BadWord Listen bearbeiten, Channel-
+ memos lesen und senden, usw.
+
+ Das SOP ADD Command fügt den jeweiligen Nick zur SOP Liste
+ hinzu.
+
+ Das SOP DEL Command löscht den jeweiligen Nick aus der
+ SOP Liste. Wenn mehrere Eintragsnummern angegeben werden,
+ werden diese Einträge gelöscht. (Siehe Beispiel bei LIST.)
+
+
+ Das SOP LIST Command zeigt die aktuelle SOP Liste. Wenn
+ Wildcard Masks angegeben werden, werden nur die betroffenen
+ Einträge angezeigt. Werden mehrere Eintragsnummern angegeben,
+ werden nur diese Einträge angezeigt, zB:
+
+ SOP #channel LIST 2-5,7-9
+ Listet die SOP Einträge 2 bis 5 und 7 bis 9.
+
+ Das SOP CLEAR Command löscht alle Einträge der SOP Liste.
+
+ SOP ADD, SOP DEL und SOP CLEAR sind auf den Channel-
+ founder beschränkt. SOP LIST kann von jedem AOP genutzt
+ werden.
+
+ Dieses Command kann für deinen Channel ausgeschaltet sein, in
+ diesem Fall nutze bitte die Access Liste. Für weitere Infos zur
+ Access Liste, tippe bitte /msg %S HELP ACCESS und
+ /msg %S HELP SET XOP für Infos über den Wechsel vom xOP und
+ vom Access System.
+
+CHAN_HELP_VOP
+ Syntax: VOP channel ADD nick
+ VOP channel DEL {nick | entry-num | list}
+ VOP channel LIST [mask | list]
+ VOP channel CLEAR
+
+ Verwaltet die VOP (Voice) Liste eines Channels.VOPs
+ bekommen automatisch Voice, wenn sie den Channel betreten.
+
+ Das VOP ADD Command fügt den jeweiligen Nick zur VOP Liste
+ hinzu.
+
+ Das VOP DEL Command löscht den jeweiligen Nick aus der
+ VOP Liste. Wenn mehrere Eintragsnummern angegeben werden,
+ werden diese Einträge gelöscht. (Siehe Beispiel bei LIST.)
+
+
+ Das VOP LIST Command zeigt die aktuelle VOP Liste. Wenn
+ Wildcard Masks angegeben werden, werden nur die betroffenen
+ Einträge angezeigt. Werden mehrere Eintragsnummern angegeben,
+ werden nur diese Einträge angezeigt, zB:
+
+ VOP #channel LIST 2-5,7-9
+ Listet die VOP Einträge 2 bis 5 und 7 bis 9.
+
+ Das VOP CLEAR Command löscht alle Einträge der VOP Liste.
+
+ VOP ADD, VOP DEL und VOP LIST sind auf AOPs oder
+ höher beschränkt, wärend VOP CLEAR nur vom Channelfounder
+ genutzt werden kann.
+
+ Dieses Command kann für deinen Channel ausgeschaltet sein, in
+ diesem Fall nutze bitte die Access Liste. Für weitere Infos zur
+ Access Liste, tippe bitte /msg %S HELP ACCESS und
+ /msg %S HELP SET XOP für Infos über den Wechsel vom xOP und
+ vom Access System.
+
+CHAN_HELP_ACCESS
+ Syntax: ACCESS channel ADD nick level
+ ACCESS channel DEL {nick | entry-num | list}
+ ACCESS channel LIST [mask | list]
+ ACCESS channel CLEAR
+
+ Verwaltet die Zugriffsliste für einen Channel. Diese
+ Liste sagt aus, welchem User Channel-Op-Status ermöglicht
+ oder wem Zugriff auf %S Kommandos des Channels
+ freigeschaltet werden soll.
+
+ Verschiedene Zugriffslevel bestimmen den Zugriff auf
+ Privilegien, die dieser User dann im Channel besitzt;
+ tippe /msg %S HELP ACCESS LEVELS für weitere Infos.
+ Jeder Nick, der nicht auf der Zugriffsliste steht, hat
+ automatisch einen Level von 0.
+
+ Das ACCESS ADD Kommando fügt einen Nick mit dem
+ angegeben Level auf die Zugriffsliste ein; wenn der Nick
+ schon auf der Liste steht, wird der Level nur geändert.
+ Der angegebene level muss kleiner als der des Users
+ sein, der diesen Befehl aufruft; und wenn der Nick schon
+ auf der Zugriffsliste steht, muss sein aktueller Level
+ ebenfalls kleiner sein, als von dem User, der den
+ Befehl aufruft.
+
+ Mit ACCESS DEL Kommando wird ein Nick von der Zugriffs-
+ liste entfernt. Wenn eine Liste von Nummern angegeben wird,
+ werden diese Einträge entfernt (siehe die Beispiele
+ für LIST weiter unten).
+
+ Das ACCESS LIST Kommando zeigt die Zugriffsliste eines
+ Channels an. Wird eine Bereichsliste angegeben, werden die
+ entsprechenden Einträge angezeigt, zum Beispiel:
+
+ ACCESS #channel LIST 2-5,7-9
+ Zeigt Einträge mit den Nummern 2 bis 5 und
+ 7 bis 9 an.
+
+ Durch ACCESS CLEAR werden alle Einträge der
+ Zugriffsliste entfernt.
+
+CHAN_HELP_ACCESS_LEVELS
+ User Zugriffslevel
+
+ Standardmässig sind die Zugriffslevel wie folgt
+ definiert:
+
+ Founder (Gründer) vollständiger Zugriff auf
+ den Channel und alle dazugehörigen
+ Funktionen durch %S; wird
+ automatisch mit Op-Status versehen beim
+ Joinen. Beachte dass nur eine Person den
+ Founder-Status besitzen kann (kann auch
+ nicht durch das ACCESS Kommando
+ erteilt werden).
+  10 Zugriff auf AKICK, hat Auto-Op.
+  5 Automatischer Op-Status.
+  3 Automatischer Voice-Status.
+  0 Keine speziellen Privilegien; kann durch
+ andere Ops Channel-Operator werden
+ (ausser Secure-Ops ist aktiv).
+  <0 Kann keinen Operator-Status erlangen.
+
+ Neue Levels können Levels hinzugefügt oder verändert
+ werden mit Hilfe des LEVELS Kommandos; tippe /msg
+ %S HELP LEVELS für weitere Informationen.
+
+CHAN_HELP_AKICK
+ Syntax: AKICK channel ADD mask [reason]
+ AKICK channel DEL mask
+ AKICK channel LIST [mask]
+ AKICK channel VIEW [mask]
+ AKICK channel ENFORCE
+ AKICK channel CLEAR
+
+ Verwaltet die AutoKick-Liste für einen Channel.
+ Wenn ein User joined, der auf der AutoKick-Liste steht,
+ wird %S einen Ban auf den User setzen und ihn
+ dann kicken.
+
+ Mit Hilfe von AKICK ADD kann man Nicks oder Hostmasken
+ der AutoKick-Liste hinzufügen. Wird ein reason beim
+ Befehl angegeben, wird dieser als Kick-Reason für den
+ User genutzt; ohne Reason wird standardmässig
+ "You have been banned from the channel" verwendet.
+
+ Durch das AKICK DEL Kommando wird ein Eintrag von der
+ AutoKick-Liste entfernt. Es entfernt jedoch nicht die Bans,
+ die noch im Channel von ChanServ gesetzt sind; diese
+ müssen manuell entfernt werden.
+
+ Der AKICK STICK Befehl bannt die gegebenne Maske
+ dauerhft vom Channel. Falls jemand versucht, den Ban zu
+ entfernen, wird %S ihn automatisch neu setzen. Kann
+ nicht für registrierte Nicks genutzt werden.
+
+ Der AKICK UNSTICK Befehl macht den AKICK STICK
+ Befehl wieder rückgängig, sodass der Ban wieder
+ entfernt werden kann.
+
+ Das AKICK LIST Kommando zeigt den Inhalt einer
+ AutoKick-Liste an; oder optional die Einträge, die auf
+ das angegebene Muster passen.
+
+ Das Ergebnis von AKICK VIEW ist im Grunde das Gleiche
+ wie das von AKICK LIST, jedoch werden mehr Informationen
+ angezeigt.
+
+ Durch AKICK ENFORCE wird %S gezwungen, die
+ aktuelle AutoKick-Liste auf den Channel anzuwenden
+ und User, die ein Muster der Liste treffen, zu entfernen.
+
+ Das AKICK CLEAR Kommando entfernt alle Einträge aus
+ Der AutoKick-Liste.
+
+CHAN_HELP_LEVELS
+ Syntax: LEVELS channel SET type level
+ LEVELS channel {DIS | DISABLE} type
+ LEVELS channel LIST
+ LEVELS channel RESET
+
+
+ Das LEVELS Kommando erlaubt eine feinere Regelung
+ der Zugriffslevel eines Channels. Mit diesem Kommando
+ kann man Zugriffslevel definieren, die die meisten
+ Funktionen von %S abdecken. (SET FOUNDER und SET PASSWORD,
+ genau wie dieses Kommando, sind beschränkt auf den Channel-
+ Founder.)
+
+ LEVELS SET erlaubt einem Zugriffslevel eine Änderung seiner
+ Funktion bzw Gruppe von Funktionen. LEVELS DISABLE (oder
+ DIS als Abkürzung) deaktiviert eine automatische Funktion
+ oder verweigert den Zugriff auf jeden anderen ausser den
+ Channel-Founder.
+
+ Durch LEVELS LIST werden die aktuellen Levels und ihre
+ Funktionen aufgelistet. LEVELS RESET setzt alle Level auf
+ die Standardwerte eines neu erzeugten Channels zurück
+ (siehe HELP ACCESS LEVELS).
+
+ Für eine Auflistung der Funktionen, die diese Parameter
+ haben, siehe HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ Die folgenden Befehle/Funktionen werden unterstützt.
+ Beachte bitte, dass die hier angegebenen Level für
+ AUTODEOP und NOJOIN Maximum-Levels sind, alle anderen
+ hingegegen sind Minimum-Level.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Syntax: INFO channel [ALL]
+
+ Zeigt Informationen über einen registrierten Channel;
+ seinen Gründer, das Datum der Registrierung, die
+ letzte Nutzung, seine Beschreibung und Mode-Locks,
+ wenn welche eingestellt sind. Wenn du als Founder
+ (Gründer) identifiziert bist und den Parameter
+ ALL angibst, wird die Eintrittsmeldung und
+ die Successors (Vertreter) ebenfalls angezeigt.
+
+CHAN_HELP_LIST
+ Syntax: LIST pattern
+
+ Listet alle registrierten Channels, die dem Muster
+ entsprechen, auf. (Alle Channels mit aktiviertem
+ PRIVATE-Flag werden nicht angezeigt.)
+
+CHAN_HELP_OP
+ Syntax: OP [#channel [nick]]
+
+ Setzt den Operator-Status des angegebenen Nicks in
+ dem Channel. Wird kein Nick angegeben, wird
+ ChanServ dich oppen, vorausgesetzt, du hast die
+ entsprechenden Rechte in der Zugriffsliste um
+ diesen Befehl auszuführen.
+
+ Standardmässig ist dafür ein Level von 5 oder
+ grösser erforderlich.
+
+CHAN_HELP_DEOP
+ Syntax: DEOP [#channel [nick]]
+
+ Entfernt den Operator-Status eines bestimmten Nicks in
+ dem Channel. Wird kein Nick angegeben, wird ChanServ
+ dich deoppen. Wird weder Channel noch Nick als Parameter
+ übergeben, wird ChanServ dich in allen Channels deoppen
+ in denen du die entsprechenden Rechte hast.
+
+ Standardmässig ist dafür ein Level von 5 oder
+ grösser erforderlich.
+
+CHAN_HELP_VOICE
+ Syntax: VOICE [#channel [nick]]
+
+ Erteilt dem angegebenen Nick Voice-Status in dem
+ Channel. Wird kein Nick angegeben, wird ChanServ dich
+ voicen. Wird weder Channel noch Nick angegeben, wird
+ ChanServ dich in allen Channels voicen, in denen du
+ die entsprechenden Rechte hast.
+
+ Standardmässig brauchst du dafür ein Level von 5
+ um anderen Voice zu erteilen, oder Level 3 um dich
+ selbst zu voicen.
+
+CHAN_HELP_DEVOICE
+ Syntax: DEVOICE [#channel [nick]]
+
+ Entfernt den Voice-Status des Nicks in dem Channel.
+ Wird kein Nick angegeben, wird ChanServ dich devoicen.
+ Wird weder Channel noch Nick angegeben, wird ChanServ
+ dich in allen Channels voicen, in denen du die
+ entsprechenden Rechte hast.
+
+ Standardmässig brauchst du dafür ein Level von 5
+ um andere zu devoicen, oder Level 3 um dich selbst
+ vom Voice-Flag zu befreien.
+
+CHAN_HELP_HALFOP
+ Syntax: HALFOP [#channel [nick]]
+
+ Setzt den Half-Op-Status des angegebenen Nicks in dem
+ Channel. Wird kein Nick angegeben, wird ChanServ dich
+ halfoppen. Wird weder Channel noch Nick angegeben,
+ wird ChanServ dich in allen Channels halfoppen, in denen
+ du die entsprechenden Rechte hast.
+
+ Standardmässig brauchst du dafür ein Level von 5
+ um andere zu halfoppen, oder Level 4 um dich selbst zu
+ halfoppen.
+
+CHAN_HELP_DEHALFOP
+ Syntax: DEHALFOP [#channel [nick]]
+
+ Entfernt den Half-Op-Status des angegebenen Nicks in dem
+ Channel. Wird kein Nick angegeben, wird ChanServ dich
+ dehalfoppen. Wird weder Channel noch Nick angegeben,
+ wird ChanServ dich in allen Channels dehalfoppen, in denen
+ du die entsprechenden Rechte hast.
+
+ Standardmässig brauchst du dafür ein Level von 5
+ um andere zu dehalfoppen, oder Level 4 um dich selbst zu
+ dehalfoppen.
+
+CHAN_HELP_PROTECT
+ Syntax: PROTECT [#channel [nick]]
+
+ Beschützt den angegebenen Nick in dem Channel. Wird kein
+ Nick angegeben, wird ChanServ dich beschützen. Wird weder
+ Nick noch Channel angegeben, wird ChanServ dich in allen
+ Channels beschützen in denen du die entsprechenden
+ Rechte hast.
+
+ Standardmässig lässt sich diese Funktion vom Founder
+ aufrufen oder von denjenigen mit Level 10 und grösser,
+ die den Schutz auf sich selbst anwenden.
+
+CHAN_HELP_DEPROTECT
+ Syntax: DEPROTECT [#channel [nick]]
+
+ Entfernt den Schutz auf den angegebenen Nick in dem Channel.
+ Wird kein Nick angegeben, wird ChanServ dich nicht mehr
+ beschützen. Wird weder Nick noch Channel angegeben, wird
+ ChanServ dich in allen Channels nicht länger schützen,
+ in denen du die entsprechenden Rechte hast.
+
+ Standardmässig lässt sich diese Funktion vom Founder
+ aufrufen oder von denjenigen mit Level 10 und grösser,
+ die den Schutz von sich selbst aufheben wollen.
+
+CHAN_HELP_OWNER
+ Syntax: OWNER [#channel]
+
+ Gibt dir Owner Status im Channel. Für den Fall, dass
+ kein Channel angegeben wird, wird dir in jedem Channel,
+ in dem du ausreichend Rechte besitzt, Owner Status
+ gegeben.
+
+ Benötigt Founder Zugriffslevel im jeweiligen Channel.
+
+CHAN_HELP_DEOWNER
+ Syntax: DEOWNER [#channel]
+
+ Nimmt dir Owner Status im Channel. Für den Fall, dass
+ kein Channel angegeben wird, wird dir in jedem Channel,
+ in dem du ausreichend Rechte besitzt, Owner Status
+ genommen.
+
+ Benötigt Founder Zugriffslevel im jeweiligen Channel.
+
+CHAN_HELP_INVITE
+ Syntax: INVITE channel
+
+ Diese Funktion erlaubt es dir, dich durch %S in den
+ angegebenen Channel einladen zu lassen. Standardmässig
+ wird dies nur ausgeführt, wenn den Nick auf der
+ Zugriffsliste des Channels einen Level grösser 0 hat.
+
+CHAN_HELP_UNBAN
+ Syntax: UNBAN channel
+
+ Durch %S werden alle Bans entfernt, die dich am joinen
+ des Channels hindern. Eine Vorraussetzung dafür ist
+ allerdings, dass dein Level in dem Channel grösser als
+ 0 ist.
+
+CHAN_HELP_KICK
+ Syntax: KICK [#channel [nick [reason]]]
+
+ Kickt den ausgewählten Nick aus dem Channel. Wird
+ kein Nick angegeben, wird ChanServ dich (!) kicken.
+ Wenn weder Nick noch Channel angegeben werden, wird
+ ChanServ dich aus allen Channels kicken, in denen
+ du die entsprechenden Rechte hast.
+
+ Standardmässig ist für diese Funktion ein Level
+ von mindestens 5 erforderlich.
+
+CHAN_HELP_BAN
+ Syntax: BAN [#channel [nick [reason]]]
+
+ Bannt einen Nick im Channel. Falls kein Nick angegeben
+ wird, wirst du gebannt. Falls kein Nick und kein Channel
+ angegeben werden, wirst du in allen Channels gebannt,
+ vorausgesetzt du hast die nötige Berechtigung.
+
+ Standardmässig auf AOPs oder User mit Access Level 5 oder
+ höher beschränkt.
+
+CHAN_HELP_TOPIC
+ Syntax: TOPIC channel [topic]
+
+ Veranlasst %S ein Topic im Channel zu setzen. Falls topic
+ nicht angegeben wird, wird ein leeres Topic gesetzt. Dieses
+ Command ist vor allem in Verbindung mit SET TOPICLOCK
+ nützlich. Tippe /msg %S HELP SET TOPICLOCK für weitere
+ Informationen.
+
+ Standardmässig auf Founder beschränkt.
+
+CHAN_HELP_CLEAR
+ Syntax: CLEAR channel what
+
+ Sagt %S, dass es bestimmte Einstellungen
+ in einem Channel zurücksetzen soll. Die Option
+ kann eine der folgenden sein:
+
+ MODES Setzt alle Modes in dem Channel zurück.
+ (z.B. Mode i,k,l,m,n,p,s und t)
+ BANS Entfernt alle Bans in dem Channel
+ EXCEPTS Entfernt alle Excepts in dem Channel
+ OPS Entfernt jeden Operator-Status (mode +o)
+ in dem Channel.
+ VOICES Entfernt alle Voice-Flags (mode +v) in
+ dem Channel.
+ USERS Entfernt (kickt) alle User aus dem Channel.
+
+ Standardmässig muss dein Zugriffslevel in diesem Channel
+ mindestens 10 betragen.
+
+CHAN_HELP_GETKEY
+ Syntax: GETKEY channel
+
+ Liefert den Key des angegebenen Channels zurück. Dieses
+ Kommando wird am häufigsten von Bots und/oder Skripten
+ genutzt, daher wird das Ergebnis in dieser Form
+ zurückgeliefert:
+
+ KEY <channel> <key>
+
+ key ist "NO KEY", wenn kein Key eingestellt ist.
+
+CHAN_HELP_SENDPASS
+ Syntax: SENDPASS channel
+
+ Sendet das Passwort des angegebenen Channels an die
+ eMail-Adresse, die dem Founder in der Datenbank
+ assoziiert ist. Dieses Kommando ist sehr nützlich,
+ wenn man mit dem Problem des vergessenen Passwortes
+ konfrontiert wird.
+
+ Kann in einigen Netzen auf IRC Operatoren beschränkt
+ sein.
+
+ Dieses Kommando ist nicht verfügbar, wenn die
+ Datenbank verschlüsselt gespeichert wird.
+
+CHAN_SERVADMIN_HELP
+
+ Die folgenden Kommandos sind zusätzlich für
+ Services Admins verfügbar:
+
+ GETPASS Liest das Passwort des Channel-Founders
+ aus der Datenbank aus (wenn die
+ Verschlüsselung deaktiviert ist)
+ FORBID Verhindert die Nutzung eines Channels
+ STATUS Liefert das Zugriffslevel eines Users
+ in dem Channel
+
+ Services Admins können weiterhin beliebige Channels
+ DROPen, Zugriffslisten oder Channel-Einstellungen
+ ansehen ohne sich vorher für den Channel identifizieren
+ zu müssen.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Syntax: LOGOUT channel [nickname]
+
+ Durch dieses Kommando wird dich ChanServ nicht mehr als
+ identifiziert für den angegebenen Channel betrachten.
+
+ Wenn du der Founder (Gründer) dieses Channels bist, kannst
+ du jeden ausloggen, ansonsten nur dich selbst.
+
+ Bist du ein Services Admin, kannst du jeden des
+ angegebenen Channels ausloggen, ohne Founder-Rechte
+ des Channels zu besitzen. Weiterhin musst du den
+ Parameter Nickname nicht unbedingt angeben; dies hat zur
+ Folge, dass jeder Nick aus dem Channel ausgeloggt wird.
+
+CHAN_SERVADMIN_HELP_DROP
+ Syntax: DROP channel
+
+ Entfernt die Registrierung des angegebenen Channels aus
+ der Datenbank; zusätzlich werden Zugriffslisten,
+ Einstellungen usw mit aus der Datenbank entfernt.
+
+ Nur Services Admins können Channel DROPen, ohne
+ sich vorher gegenüber dem Channel als Founder zu
+ identifizieren.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Services Admins können zusätzlich die Option NOEXPIRE
+ an einem Channel setzen; dies verhindert den automatischen
+ Auslauf des Channels.
+
+ Weiterhin können Services Admins Einstellungen eines
+ Channels verändern, ohne sich vorher für ihn
+ identifizieren zu müssen.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Syntax: SET channel NOEXPIRE {ON | OFF}
+
+ Ändert das NOEXPIRE-Flag an einem Channel. Wird es
+ auf ON gestellt, wird der Channel bei Nichtnutzung
+ nicht auslaufen.
+
+ Diese Funktion ist beschränkt auf Services Admins.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Services Admins können den ALL Parameter bei jedem
+ Channel benutzen.
+
+CHAN_SERVADMIN_HELP_LIST
+ Syntax: LIST pattern [FORBIDDEN] [NOEXPIRE]
+
+ Zeigt alle registrierten Channels die auf das angegebene
+ Muster (Pattern) treffen.
+ Channels mit aktivierter PRIVATE Option werden nur Services
+ Admins angezeigt. Channels mit aktivem NOEXPIRE werden in der
+ Liste ein ! vor dem Eintrag haben.
+
+ Wird FORBIDDEN oder NOEXPIRE angegeben, werden nur Channels
+ mit dem entsprechenden Flag angezeigt. Werden beide Optionen
+ angegeben, werden nur Channels angezeigt, die mindestens eins
+ der entsprechenden Flags gesetzt haben. Diese Funktionen sind
+ beschränkt auf Services Admins.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Syntax: GETPASS channel
+
+ Liest das Founder-Passwort des angegebenen Channels
+ aus der Datenbank von ChanServ aus.
+ Beachte dass wenn jemand dieses Kommando nutzt,
+ diese Aktion im Logbuch der Services vermerkt wird.
+ Zusätzlich wird eine Nachricht an alle Oper per
+ WALLOPS/GLOBOPS ausgesandt.
+
+ Beschränkt auf Services Admins.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Syntax: FORBID channel [reason]
+
+ Verbietet die Nutzung bzw die Registrierung des
+ angegebenen Channels.
+ Die Wirkung wird wieder aufgehoben durch DROPen
+ des Channels.
+
+ Bei einigen Netzen muss evtl ein Grund angegeben
+ werden.
+
+ Beschränkt auf Services Admins.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND channel [reason]
+
+ Verbietet jegliche Nutzung des Channels. Kann durch
+ das UNSUSPEND Command wieder aufgehoben werden,
+ wobei alle vorherigen Einstellungen wieder übernommen
+ werden.
+
+ Reason kann auf manchen Networks notwendig sein.
+
+ Beschränkt auf Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Gibt einen Channel, der auf SUSPEND gesetzt ist,
+ wieder frei. Alle vorherigen Einstellungen werden
+ übernommen.
+
+ Beschränkt auf Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Syntax: STATUS channel nickname
+
+ Liefert den Zugriffslevel des angegebenen Nick aus dem
+ Channel. Die Antwort erfolgt in dieser Form:
+
+ STATUS channel nickname access-level
+
+ Tritt ein Fehler auf, wird die Antwort in dieser Form
+ zurückgeliefert:
+
+ STATUS ERROR error-message
+
+ Beschränkt auf Services Admins.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S ist eine Einrichtung, die es erlaubt,
+ dass sich IRC User untereinander kurze Textnachrichten
+ senden; egal ob die Empfänger zu dem Zeitpunkt online
+ sind oder nicht.
+ Als Empfänger können auch Channels angegeben werden (*).
+
+ Sowohl der Nick des Senders als auch Empfängers müssen
+ registriert sein, um eine Memo versenden zu können.
+
+ %S's Kommandos beinhalten:
+
+ SEND Sendet eine Memo an einen Nick oder Channel
+ CANCEL Annulliert deine letzte gesendete Memo
+ LIST Erzeugt eine Liste deiner Memos
+ READ Lesen einer oder mehrerer Memos
+ DEL Löschen einer oder mehrerer Memos
+ SET Stellt bestimmte Optionen ein in Hinsicht
+ auf Memos
+ INFO Zeigt Informationen bezüglich deiner Memos an
+
+MEMO_HELP_ADMIN
+ SENDALL Sendet eine Nachricht an alle registrierten
+ User.
+
+MEMO_HELP_OPER
+ STAFF Sendet allen opers/admins eine Nachricht.
+
+MEMO_HELP_FOOTER
+
+ Type /msg %S HELP command für hilfe bei jedem der
+ oben aufgeführten Befehle.
+
+ (*) Bei der Standarteinstellung kann jeder User mit einem
+ Access-Level auf den Channel von 10 oder höher die
+ Channel-Nachrichten lesen. Dies kann mit dem
+ %s LEVELS Befehl geändert werden.
+
+MEMO_HELP_SEND
+ Syntax: SEND {nick | channel} memo-text
+
+ Sendet an nick oder channel die Memo mit dem
+ Inhalt memo-text. Wird an einen Nicknamen
+ gesendet, erhält der Empfänger eine Notice, dass
+ er/sie eine neue Memo hat.
+ Der Empfänger (Nick/Channel) muss registriert sein.
+
+MEMO_HELP_CANCEL
+ Syntax: CANCEL {nick | channel}
+
+ Widerruft die letzte Memo die du an den angegebenen Nick
+ oder Channel gesendet hast, vorrausgesetzt sie ist noch
+ nicht gelesen worden.
+
+MEMO_HELP_LIST
+ Syntax: LIST [channel] [list | NEW]
+
+ Führt alle Memos auf, die du im Moment gespeichert hast.
+ Mit dem Parameter NEW werden nur neue, ungelesene, Memos
+ aufgelistet. Ungelesene Memos sind durch ein "*" markiert,
+ links neben ihrer Nummer. Du kannst auch einen Bereich
+ von Nummern definieren; siehe das Beispiel:
+
+ LIST 2-5,7-9
+ Zeigt Memos mit den Nummern 2 bis 5 und 7 bis 9.
+
+MEMO_HELP_READ
+ Syntax: READ [channel] {num | list | LAST | NEW}
+
+ Schickt dir den Inhalt der Memo, die du lesen möchtest.
+ Wird LAST angegeben, bekommst du die Memo die du als
+ letztes erhalten hast. Mit NEW werden dir alle neuen,
+ ungelesenen, Memos geschickt.
+
+ Andernfalls kannst du auch mit Hilfe der Memo-Nummer
+ num oder einer Bereichsliste dir Memos anzeigen
+ lassen, zum Beispiel so:
+
+ READ 2-5,7-9
+ Zeigt den Inhalt der Memos 2 bis 5 und 7 bis 9.
+
+MEMO_HELP_DEL
+ Syntax: DEL [channel] {num | list | LAST | ALL}
+
+ Entfernt Memos aus deinem Postfach. Du kannst mehrere
+ Nummern oder Bereiche angeben anstatt einer einzelnen
+ Nummer; wie das zweite Beispiel zeigt.
+
+ Wird LAST angegeben, wird die letzte Memo gelöscht.
+ Wird ALL angegeben, werden alle deine Memos
+ entfernt.
+
+ Beispiele:
+
+ DEL 1
+ Löscht dein Memo mit der Nummer 1.
+
+ DEL 2-5,7-9
+ Löscht Memos mit den Nummern 2 bis 5 und 7 bis 9.
+
+MEMO_HELP_SET
+ Syntax: SET option parameters
+
+ Stellt verschiedene Optionen bezüglich der Memos ein.
+ option kann einer der Parameter sein:
+
+ NOTIFY Stellt ein, wann du benachrichtigt wirst,
+ wenn du eine neue Memo bekommst.
+
+ LIMIT Ändert die maximale Anzahl Memos, die
+ du empfangen kannst.
+
+ Tippe /msg %S HELP SET option für weitere Infos
+ über eine bestimmte Option.
+
+MEMO_HELP_SET_NOTIFY
+ Syntax: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Ändert den Zeitpunkt, wann MemoServ dich über neue
+ eingegangene Memos informiert:
+
+ ON Du wirst über neue Nachrichten informiert,
+ wenn du dich identifizierst, /AWAY aufhebst,
+ und wenn sie an dich gesandt werden.
+ LOGON Du wirst nur benachrichtigt, wenn du dich
+ identifizierst oder das /AWAY rückgängig
+ machst.
+ NEW Du wirst nur informiert, wenn sie an dich
+ gesendet werden.
+ OFF Es wird keine Benachrichtigung über neue
+ Memos stattfinden.
+
+ ON ist eine Kombination aus LOGON und NEW.
+
+MEMO_HELP_SET_LIMIT
+ Syntax: SET LIMIT [channel] limit
+
+ Ändert das Limit der Anzahl der Memos, die du
+ (oder der angegebene Channel) haben darf. Wird dies auf
+ 0 gesetzt, kann dir niemand mehr Memos senden.
+ Du kannst es jedoch auch nicht höher als %d setzen.
+
+MEMO_HELP_INFO
+ Syntax: INFO [channel]
+
+ Zeigt Informationen über die Anzahl der Memos die du
+ hast, wie viele davon ungelesen sind und wie viele
+ du max. empfangen kannst. Mit angegebenem Parameter
+ wird die gleiche Information über den Channel angezeigt.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Syntax: SET LIMIT [user | channel] {limit | NONE} [HARD]
+
+ Ändert die max. Anzahl von Memos die ein User oder
+ Channel haben kann. Das setzen dieser Grenze auf 0
+ verhindert das Empfangen jeglicher Memos; wird
+ hingegen NONE eingestellt, kann der User so
+ viele Memos empfangen und behalten wie er will.
+ Wird kein User oder Channel angegeben, veränderst
+ du dein eigenes Limit.
+
+ Durch den Zusatzparameter HARD wird eine Änderung
+ des Limits durch den entsprechenden User verhindert.
+ Wird dieser Parameter nicht angegeben, hat das den
+ gegenteiligen Effekt - der User kann sein Limit
+ ändern (sogar wenn das vorherige Limit auf
+ HARD eingestellt war).
+
+ Die Nutzung des SET LIMIT Kommandos ist beschränkt
+ auf Services Admins. Jeder andere User kann nur das
+ Limit von sich selbst oder dem Channel ändern, in dem
+ er einen entsprechenden Zugriffslevel besitzt; er kann
+ auch nicht die Grenze von %d Memos überschreiten.
+ Das HARD Kommando kann er auch nicht nutzen.
+
+MEMO_SERVADMIN_HELP_INFO
+ Syntax: INFO [nick | channel]
+
+ Ohne Parameter werden Informationen über dein Postfach
+ angezeigt; die Anzahl Memos die du hast, die davon neu
+ bzw ungelesen sind, und wie viele Memos du max.
+ empfangen kannst.
+
+ Mit einem Channel als Parameter werden die entsprechenden
+ Informationen über den Channel angezeigt.
+
+ Wird eine Nickname übergeben, werden die entsprechenden
+ Informationen über den Nicknamen angezeigt. Diese
+ Funktion ist beschränkt auf Services Admins.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Syntax: STAFF memo-text
+
+ Sendet allen Usern mit Zugriff auf die Services eine Nachricht mit
+ dem memo-text.
+ Note: Wenn du Operatoren ion beide der Services-Zugriffs-Listen
+ (oper und admin) hast, so werden diese alle diese Nachricht erhalten.
+ Das gleichte trifft für die Operatoren auf der Root-Liste zu.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL memo-text
+
+ Sends allen registrieten Usern eine Nachricht mit dem
+ memo-text.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ Kommandos von %S:
+ GLOBAL Eine Notice an alle User schicken
+ STATS Status des Netzes und der Services anzeigen
+ OPER LIST Alle Services Operatoren anzeigen
+ ADMIN LIST Alle Services Admins anzeigen
+ STAFF Display Services staff and online status
+
+OPER_HELP_OPER_CMD
+ Kommandos, auf die nur Services Operatoren und
+ Services Admins Zugriff haben:
+ MODE Channel-Modes ändern
+ KICK Einen User aus einem beliebigen
+ Channel kicken
+ CLEARMODES Die Modes eines Channels zurücksetzen
+ KILLCLONES Kill all users that have a certain host
+ AKILL Die AutoKill-Liste bearbeiten
+ SGLINE Die SGLINE-Liste bearbeiten
+ SZLINE Die SZLINE-Liste bearbeiten
+
+OPER_HELP_ADMIN_CMD
+ Kommandos, auf die nur Services Admins Zugriff haben:
+ SESSION Hosts mit einer bestimmten Anzahl
+ Verbindungen auflisten
+ EXCEPTION Bearbeiten der Liste der
+ eingeschränkten Verbindungen
+ KILLCLONES Alle User mit einem bestimmten Host killen
+ CHANLIST Alle registrierten Channel anzeigen
+ USERLIST Alle registrierten Nicks anzeigen
+ OPER Die Services Operatoren Liste bearbeiten
+ LOGONNEWS Logon News bearbeiten
+ OPERNEWS Oper News bearbeiten
+ NOOP Alle O:-Lines temporär deaktivieren
+ JUPE Einen Server "jupitern"
+ IGNORE die Services Ignore Liste bearbeiten
+ UMODE User Modes ändern
+ OLINE einem User Operflags setzen
+ SET Verschiedene Services Optionen einstellen
+ UPDATE Die Services Datenbänke sofort speichern
+ RELOAD Die Konfigurationsdatei neu einlesen
+ QUIT Services _ohne_ Speichern der Datenbanken
+ beenden
+ RESTART Datenbanken speichern und Services
+ neustarten
+ SHUTDOWN Datenbanken speichern und Services beenden
+
+ Kommando, auf die nur Services Roots (diese sind
+ fest in der services.conf eingetragen) Zugriff haben:
+ ADMIN Liste der Services Admins bearbeiten
+
+OPER_HELP_ROOT_CMD
+ Commands available to Serivces Roots only:
+ MODLOAD Lädt ein Module
+ MODUNLOAD Entfernt ein Module
+ MODLIST Listet die geladenen Module auf
+ MODINFO Info über ein geladenes Module
+
+OPER_HELP_LOGGED
+ Achtung: Alle Kommandos die an %S gesendet werden,
+ werden geloggt!
+
+OPER_HELP_GLOBAL
+ Syntax: GLOBAL message
+
+ Ermöglicht es IRCops eine Nachricht an alle User auf
+ dem Netzwerk zu senden. Die Nachricht wird als
+ Absender %s tragen.
+
+OPER_HELP_STATS
+ Syntax: STATS [AKILL | ALL | RESET]
+
+ Wird keine Option angegeben, wird eine kurze Statistik
+ ausgegeben. Sie enthält die aktuelle Anzahl verbundener
+ User, IRCops (inklusive den Services), die max. Anzahl
+ gleichzeitig verbundener User seitdem die Services
+ gestartet wurde und die Uptime.
+
+ Mit der AKILL Option, wird die aktuelle Grösse der
+ AutoKill-Liste ausgegeben und dessen standardmässige
+ Auslaufzeit.
+
+ Die ALL Option ist nur für Services Admins verfügbar;
+ sie zeigt unter anderem den aktuellen Speicherverbrauch
+ der Services. Dieses Kommando kann auf einem grossen
+ Netzwerk dazu führen, dass die Services für kurze
+ Zeit nicht mehr ansprechbar sind, also übertreib es nicht.
+
+ Durch RESET werden einige Werte der Statistik zurück-
+ gesetzt, unter anderem die max. Anzahl gleichzeitig
+ verbundener User.
+
+ UPTIME kann als Synonym für STATS verwendet
+ werden.
+
+OPER_HELP_OPER
+ Syntax: OPER ADD nick
+ OPER DEL {nick | entry-num | list}
+ OPER LIST [mask | list]
+ OPER CLEAR
+
+ Erlaubt es Services Admins bestimmte Nicks in die Liste
+ der Services Opers aufnehmen oder zu entfernen. Ein
+ User der sich für diesen Nick gegenüber %s
+ identifiziert hat und auf der Liste der Services Opers
+ ist, hat Zugriff auf die Kommandos von OperServ.
+
+ Mit OPER ADD wird der angegebene Name auf die Liste der
+ Services Operatoren hinzugefügt.
+
+ Durch OPER DEL wird der angegebene Nick von der Liste
+ entfernt. Wird ein Bereich von Zahlen übergeben, werden
+ die entsprechenden Einträge gelöscht. (Siehe das Beispiel
+ für LIST weiter unten.)
+
+ Das OPER LIST Kommando zeigt den Inhalt der Liste der
+ Services Operatoren. Wird eine Maske mit Platzhaltern
+ (Wildcards) angegeben, werden die entsprechenden Einträge
+ angezeigt. Wird eine Zahlenbereich angegeben, werden
+ ebenfalls nur die entsprechenden Einträge angezeigt,
+ zum Beispiel:
+
+ OPER LIST 2-5,7-9
+ Zeigt die Einträge 2 bis 5 und 7 bis 9 aus
+ der Services Operatoren-Liste.
+
+ Durch OPER CLEAR werden alle Einträge aus dieser Liste
+ entfernt.
+
+ Jeder IRC Operator kann das OPER LIST Kommando verwenden;
+ alle weiteren sind beschränkt auf Services Admins.
+
+OPER_HELP_ADMIN
+ Syntax: ADMIN ADD nick
+ ADMIN DEL {nick | entry-num | list}
+ ADMIN LIST [mask | list]
+ ADMIN CLEAR
+
+ Erlaubt es Services Roots bestimmte Nicks in die Liste
+ der Services Admins aufnehmen oder zu entfernen. Ein
+ User der sich für diesen Nick gegenüber %s
+ identifiziert hat und auf der Liste der Services Admins
+ ist, hat Zugriff auf die Admin Kommandos von OperServ.
+
+ Mit ADMIN ADD wir der angegebene Name auf die Liste der
+ Services Admins hinzugefügt.
+
+ Durch ADMIN DEL wird der angegebene Nick von der Liste
+ entfernt. Wird ein Bereich von Zahlen übergeben, werden
+ die entsprechenden Einträge gelöscht. (Siehe das Beispiel
+ für LIST weiter unten.)
+
+ Das ADMIN LIST Kommando zeigt den Inhalt der Liste der
+ Services Admins. Wird eine Maske mit Platzhaltern
+ (Wildcards) angegeben, werden die entsprechenden Einträge
+ angezeigt. Wird eine Zahlenbereich angegeben, werden
+ ebenfalls nur die entsprechenden Einträge angezeigt,
+ zum Beispiel:
+
+ ADMIN LIST 2-5,7-9
+ Zeigt die Einträge 2 bis 5 und 7 bis 9 aus der
+ Liste der Services Admins.
+
+ Mit Hilfe von ADMIN CLEAR wird die Liste der Services
+ Admins komplett geleert.
+
+ Jeder IRC Operator kann das Kommando ADMIN LIST nutzen,
+ jegliches andere Kommando kann nur von einem Services Root
+ aufgerufen werden.
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick]
+
+ Erlaubt es Services Admins einen Nick eine bestimmte Zeit
+ oder bis zum nächsten Restart von den Services ignorieren
+ zu lassen. Das Standard Zeit Format ist Sekunden, du kannst
+ es aber über Units bestimmen. Zulässige Units sind: s für
+ Sekunden, m für Minuten, h für Stunden und d für Tage.
+ Kombinationen dieser Units sind nicht erlaubt. Um einen User
+ permanent ignorieren zu lassen, tippe 0 als Zeit.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_MODE
+ Syntax: MODE channel modes
+
+ Erlaubt es Services Operatoren die Channel Modes eines
+ beliebigen Channels zu verändern. Der Paramater hat das
+ gleiche Format wie der normale /MODE Befehl.
+
+ Beschränkt auf Services Operatoren.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user modes
+
+ Erlaubt es Services Admins die Usermodes eines beliebigen
+ Users zu ändern. Der Paramater hat das gleiche Format wie
+ der normale /MODE Befehl.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Erlaubt es Services Admins einem User Operflags zu setzen.
+ Den Flags muss ein "+" oder ein "-" vorangestellt werden.
+ Um alle Operflags zu entfernen, nutze einfach ein "-" ohne
+ Operflags.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_CLEARMODES
+ Syntax: CLEARMODES channel [ALL]
+
+ Entfernt alle Modes (i,k,l,m,n,p,s,t) und Bans eines
+ Channels. Wird ALL angegeben, werden ebenfalls alle
+ Op-Flags und Voices (+o und +v Modi) entfernt.
+
+ Beschränkt auf Services Operatoren.
+
+OPER_HELP_KICK
+ Syntax: KICK channel user reason
+
+ Erlaubt es IRCops einen User aus einem beliebigen
+ Channel zu kicken. Die Parameter sind dieselben
+ wie für das normale /KICK Kommando.
+ Die Kick-Nachricht wird den Nick des IRCops
+ vor dem Reason haben; zum Beispiel:
+
+ *** SpamMan has been kicked off channel #my_channel by %S (chemical (Flood))
+
+ Beschränkt auf Services Operators.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick newnick
+
+ Erzwingt die Änderung des Nicks eines User zu dem neuen Nick.
+
+ Beschränkt auf Services admins
+
+OPER_HELP_AKILL
+ Syntax: AKILL ADD [+expiry] mask reason
+ AKILL DEL {mask | entry-num | list}
+ AKILL LIST [mask | list]
+ AKILL VIEW [mask | list]
+ AKILL CLEAR
+
+ Erlaubt es Services Operatoren die AutoKill-Liste zu
+ bearbeiten. Versucht ein User zu connecten der einen
+ entsprechenden Eintrag auf der AKILL-Liste hat, werden
+ die Services ihn killen und, falls der Server dies
+ unterstützt, einen Ban (K-line) für den User setzen.
+
+ AKILL ADD fügt die angegebene user@host-Maske mit
+ dem reason (dieser muss angegeben werden) zur AKILL-
+ Liste hinzu. Mit Hilfe von expiry lässt sich eine bestimmte
+ Auslaufzeit dieses Eintrags definieren.
+ expiry wird durch eine Ganzzahl angegeben, gefolgt von
+ einem Buchstaben:
+ d (Tage), h (Stunden), oder m (Minuten). Kombinationen
+ (wie zum Beispiel 1h30m) sind nicht zulässig. Wird kein
+ Buchstabe angegeben, wird von Tagen ausgegangen (also +30
+ bedeutet dann z.B. 30 Tage). Um einen AKILL-Eintrag zu
+ erstellen, der nicht ausläuft, benutze +0. Fängt die Usermaske
+ mit einem + an, muss eine Auslaufzeit (expiry) definiert
+ werden, auch wenn es die Standard-Zeit ist. Die Standard-
+ Auslaufzeit für einen AKILL kann man unter STATS AKILL finden.
+
+ Das AKILL DEL Kommando entfernt die angegebene Maske von
+ der AKILL-Liste, sofern ein solcher Eintag existiert. Wird
+ eine Liste von Nummern angegeben, werden diese Einträge
+ entfernt. (Siehe das Beispiel für LIST weiter unten.)
+
+ Mit Hilfe von AKILL LIST wird die AKILL Liste angezeigt.
+ Werden Platzhalter (Wildcards) in der Maske angegeben, werden
+ nur die entsprechenden Einträge angezeigt. Die Ausgabe
+ lässt sich ebenfalls durch einen Zahlenbereich begrenzen,
+ wie das Beispiel zeigt:
+
+ AKILL LIST 2-5,7-9
+ Zeigt nur die Einträge 2 bis 5 und 7 bis 9.
+
+ AKILL VIEW ist eine ausführlichere Version des AKILL LIST
+ Kommandos und zeigt zusätzlich, wer einen Eintrag wann
+ erstellt hat, wann er ausläuft und natürlich die user@host
+ Maske mit dem Grund.
+
+ AKILL CLEAR entfernt alle Einträge aus der AKILL-Liste.
+
+ Beschränkt auf Services Operatoren.
+
+OPER_HELP_SGLINE
+ Syntax: SGLINE ADD [+expiry] mask:reason
+ SGLINE DEL {mask | entry-num | list}
+ SGLINE LIST [mask | list]
+ SGLINE VIEW [mask | list]
+ SGLINE CLEAR
+
+ Erlaubt es Services Operatoren die SGLINE-Liste zu
+ bearbeiten. Versucht ein User zu connecten dessen
+ Realname auf einen Eintrag in der SGLINE-Liste trifft,
+ werden die Services ihn den Connect auf das IRC Netz
+ nicht ausführen lassen.
+
+ SGLINE ADD fügt die angegebene Realnamen-Maske mit
+ dem Grund (muss angegeben werden) zur SGLINE-Liste
+ hinzu. Mit Hilfe von expiry lässt sich eine bestimmte
+ Auslaufzeit dieses Eintrags definieren.
+ expiry wird durch eine Ganzzahl angegeben, gefolgt von
+ einem Buchstaben:
+ d (Tage), h (Stunden), oder m (Minuten). Kombinationen
+ (wie zum Beispiel 1h30m) sind nicht zulässig. Wird kein
+ Buchstabe angegeben, wird von Tagen ausgegangen (also +30
+ bedeutet dann z.B. 30 Tage). Um einen SGLINE-Eintrag zu
+ erstellen, der nicht ausläuft, benutze +0. Beginnt
+ die Realnamen-Maske mit einem +, an, muss eine
+ Auslaufzeit (expiry) definiert werden, auch wenn es die
+ Standard-Zeit ist. Die Standard-Auslaufzeit für eine
+ SGLINE kann man unter STATS AKILL finden.
+
+ Beachte: Da die Realnamen-Maske Leerzeichen enthalten kann,
+ ist das Trennzeichen zwischen der Maske und dem Reason
+ ein Doppelpunkt.
+
+ Das SGLINE DEL Kommando entfernt die angegebene Maske
+ von der SGLINE-Liste, sofern ein solcher Eintag existiert.
+ Wird eine Liste von Nummern angegeben, werden diese
+ Einträge entfernt. (Siehe das Beispiel für LIST weiter
+ unten.)
+
+ Mit Hilfe von SGLINE LIST wird die SGLINE-Liste
+ angezeigt. Werden Platzhalter (Wildcards) in der Maske
+ angegeben, werden nur die entsprechenden Einträge
+ angezeigt. Die Ausgabe lässt sich ebenfalls durch einen
+ Zahlenbereich begrenzen, wie das Beispiel zeigt:
+
+ SGLINE LIST 2-5,7-9
+ Zeigt nur die Einträge 2 bis 5 und 7 bis 9.
+
+ SGLINE VIEW ist eine ausführlichere Version des
+ SGLINE LIST Kommandos und zeigt zusätzlich, wer einen
+ Eintrag wann erstellt hat, wann er ausläuft und
+ natürlich die user@host Maske mit dem Grund.
+
+ SGLINE CLEAR entfernt alle Einträge aus der
+ SGLINE-Liste.
+
+ Beschränkt auf Services Operatoren.
+
+OPER_HELP_SQLINE
+ Syntax: SQLINE ADD [+expiry] mask reason
+ SQLINE DEL {mask | entry-num | list}
+ SQLINE LIST [mask | list]
+ SQLINE VIEW [mask | list]
+ SQLINE CLEAR
+
+ Erlaubt Services Operatoren die SQLINE Liste zu bearbeiten.
+ Falls ein User mit passendem Nick versucht, zu connecten,
+ werden die Services ihn den Connect nich ausführen lassen.
+
+ Wenn der erste Buchstabe ein # ist, werden die Services die
+ Nutzung des betreffenden Channels nicht zulassen (bei IRCds,
+ die dieses Feature unterstützen).
+
+ SQLINE ADD fügt den angegeben Nick mit dem Grund (muss
+ angegeben werden) zur SGLINE-Liste hinzu. ^_expiry^_ wird
+ durch eine Ganzzahl angegeben, gefolgt von einem Buchstaben:
+ d (Tage), h (Stunden), oder m (Minuten).
+ Kombinationen sind nicht erlaubt. Wird kein Buchstabe angegeben,
+ wird von Tagen ausgegangen (also +30 bedeutet 30 Tage).
+ Um einen SQLINE-Eintrag zu erstellen, der nicht ausläuft,
+ benutze+0.
+ Beginnt die Maske mit einem +, muss eine Auslaufzeit
+ (expiry) definiert werden, auch wenn es die Standard-Zeit ist.
+ Die Standard-Auslaufzeit für eine SQLINE kann man unter
+ STATS AKILL finden.
+
+ Das SQLINE DEL Command entfernt die betreffende Maske von
+ der SQLINE Liste. Wird eine Liste von Nummern angegeben,
+ werden diese Einträge entfernt. (Siehe das Beispiel für LIST
+ weiter unten.)
+
+ Mit Hilfe von SQLINE LIST wird die SQLINE-Liste angezeigt.
+ Werden Wildcards in der Maske angegeben, werden nur die
+ entsprechenden Einträge angezeigt. Die Ausgabe lässt sich
+ ebenfalls durch einen Zahlenbereich begrenzen:
+
+ SQLINE LIST 2-5,7-9
+ Zeigt die SQLINE Einträge 2 bis 5 und 7 bis 9 an.
+
+ SQLINE VIEW ist eine ausführlichere Version von SQLINE LIST
+ und zeigt an, wer eine SQLINE gesetzt hat, das Datum und wann
+ diese ausläuft, ausserdem die Mask und den Grund.
+
+ SQLINE CLEAR löscht alle Einträge der SQLINE Liste.
+
+ Beschränkt auf Services Operatoren.
+
+OPER_HELP_SZLINE
+ Syntax: SZLINE ADD [+expiry] mask reason
+ SZLINE DEL {mask | entry-num | list}
+ SZLINE LIST [mask | list]
+ SZLINE VIEW [mask | list]
+ SZLINE CLEAR
+
+ Erlaubt es Services Operatoren die SZLINE-Liste zu
+ bearbeiten. Versucht ein User zu connecten dessen
+ IP auf einen entsprechenden Eintrag auf der SZLINE-
+ Liste passt, wird der Server seine IRC Verbindung
+ verhindern (unabhängig davon, ob die IP einen
+ PTR-Record hat oder nicht.)
+
+ SZLINE ADD fügt die angegebene IP-Maske mit dem
+ Reason (muss angegeben werden) zur SZLINE-Liste
+ hinzu. Mit Hilfe von expiry lässt sich eine bestimmte
+ Auslaufzeit dieses Eintrags definieren.
+ expiry wird durch eine Ganzzahl angegeben, gefolgt von
+ einem Buchstaben:
+ d (Tage), h (Stunden), oder m (Minuten). Kombinationen
+ (wie zum Beispiel 1h30m) sind nicht zulässig. Wird kein
+ Buchstabe angegeben, wird von Tagen ausgegangen (also +30
+ bedeutet dann z.B. 30 Tage). Um einen SZLINE-Eintrag zu
+ erstellen, der nicht ausläuft, benutze +0. Fängt die
+ IP-Maske mit einem + an, muss eine Auslaufzeit
+ (expiry) definiert werden, auch wenn es die Standard-Zeit
+ ist. Die Standard-Auslaufzeit für eine SZLINE kann man
+ unter STATS AKILL finden.
+
+ Das SZLINE DEL Kommando entfernt die angegebene Maske
+ von der SZLINE-Liste, sofern ein solcher Eintag existiert.
+ Wird eine Liste von Nummern angegeben, werden diese Einträge
+ entfernt. (Siehe das Beispiel für LIST weiter unten.)
+
+ Mit Hilfe von SZLINE LIST wird die SZLINE-Liste angezeigt.
+ Werden Platzhalter (Wildcards) in der Maske angegeben, werden
+ nur die entsprechenden Einträge angezeigt. Die Ausgabe
+ lässt sich ebenfalls durch einen Zahlenbereich begrenzen,
+ wie das Beispiel zeigt:
+
+ SZLINE LIST 2-5,7-9
+ Zeigt nur die Einträge 2 bis 5 und 7 bis 9.
+
+ SZLINE VIEW ist eine ausführlichere Version des
+ SZLINE LIST Kommandos und zeigt zusätzlich, wer einen
+ Eintrag wann erstellt hat, wann er ausläuft und natürlich
+ die IP Maske mit dem Grund.
+
+ SZLINE CLEAR entfernt alle Einträge aus der SZLINE-Liste.
+
+ Beschränkt auf Services Operatoren.
+
+OPER_HELP_SET
+ Syntax: SET option setting
+
+ Ändert globale Einstellungen der Services Optionen.
+ Diese Optionen lassen sich ändern:
+
+ READONLY Nur-Lese Modus der Datenbank an
+ oder aus
+ LOGCHAN Zeigt Logmessages in einem Chan
+ DEBUG Debug-Modus der Services an oder
+ aus
+ NOEXPIRE Den Auslauf-Modus der Services
+ an oder aus
+ SUPERADMIN Den Super-Admin Modus an oder aus
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_SET_READONLY
+ Syntax: SET READONLY {ON | OFF}
+
+ Schaltet den Read-Only-Mode an oder aus. Im
+ Read-Only-Modus können normale User nichts mehr
+ an den Datenbanken der Services ändern, dies beinhaltet
+ Channel und Nicknamen-Zugriffslisten, etc. IRCops mit
+ genügend Rechten werden weiterhin Änderungen an der
+ AKILL-Liste, Nicknamen sperren oder DROPen dürfen;
+ aber diese Änderungen werden nicht gespeichert, bis
+ der Read-Only-Mode deaktiviert wurde bevor die
+ Services beendet oder neu gestartet werden.
+
+ Diese Option ist äquivalent mit der Befehlszeilen-
+ Option -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Syntax: SET LOGCHAN {ON | OFF}
+
+ Mit dieser Option senden die Services alle Logeinträge zum
+ angegebenen Channel. LogChannel muss in der Services Config
+ Datei aktiviert sein.
+
+ Anmerkung: Diese Option kann ein großes Sicherheitsproblem
+ darstellen, wenn der Logchannel nicht ausreichend
+ gesichert ist.
+
+OPER_HELP_SET_DEBUG
+ Syntax: SET DEBUG {ON | OFF | num}
+
+ Schaltet den Debug-Modus an oder aus. Wird der aktiviert,
+ werden alle Daten von/an die Services gesendet werden
+ (und ein paar anderen Debug-Meldungen) in ein Logfile
+ geschrieben. Wird num angegeben, wird der Debugging
+ Level auf num gesetzt.
+
+ Diese Option ist äquivalent mit der Befehlszeilen-
+ Option -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Syntax: SET NOEXPIRE {ON | OFF}
+
+ Setzt den No-Expire-Mode an oder aus. Wird er
+ aktiviert, werden Nicks, Channels und AKILLs nicht
+ auslaufen bis dieser Modus wieder ausgeschaltet
+ wird.
+
+ Diese Option ist äquivalent mit der Befehlszeilen-
+ Option -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Syntax: SET SUPERADMIN {ON | OFF}
+
+ Der Super-Admin Modus verleiht dir zusätzliche Rechte, wie
+ zB. Founder in jedem Channel, etc.
+
+ Dieser Modus ist nicht dauerhaft und sollte nur genutzt
+ werden, wenn er wirklich gebraucht wird. Danach sollte er
+ sofort wieder ausgeschaltet werden.
+
+OPER_HELP_NOOP
+ Syntax: NOOP SET server
+ NOOP REVOKE server
+
+ NOOP SET entfernt temporär alle O:Lines des
+ angegebenen Servers und killt alle IRCops die
+ gegenwärtig auf diesem verbunden sind, und verhindert
+ so das rehashen des Servers (dieses würde die Funktion
+ aufheben).
+
+ NOOP REVOKE macht alle O:Lines wieder verfügbar auf
+ dem angegebenen Server.
+
+ Achtung: Der Server wird in keinster Weise
+ von den Services geprüft.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_JUPE
+ Syntax: JUPE server [reason]
+
+ Durch die Services wird ein Server "gejupitert". Dies
+ bedeutet, dass ein Server vorgetäuscht und so der
+ echte Server daran gehindert wird, zu connecten. Der
+ "Server" kann durch das normale SQUIT-Kommando
+ entfernt werden. Wird ein Grund (reason) angegeben,
+ wird dieser im Server Informationsfeld angezeigt,
+ ansonsten nur "Jupitered by <nick>".
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_RAW
+ Syntax: RAW text
+
+ Sendet die Zeichenkette von text direkt an den Server,
+ zu denen die Services verbunden sind. Dieses Kommando
+ hat einen sehr beschränkten Nutzenfaktor, und kann
+ leicht den Ablauf des Netzes stören, wenn es falsch
+ benutz wird. BENUTZE DIESES KOMMANDO NICHT so lange
+ du nicht genau weisst, was du tust!
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_UPDATE
+ Syntax: UPDATE
+
+ Erzwingt die Services, sofort alle Datenbanken auf der
+ Festplatte zu aktualisieren.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_RELOAD
+ Syntax: RELOAD
+
+ Die Services werden bei diesem Befehl die Konfigurations-
+ datei neu einlesen. Beachte das für einige Direktiven
+ trotzdem ein Neustart der Services erforderlich ist, um
+ sie wirksam zu machen (so wie die Services Nicknamen,
+ Aktivierung der Verbindungseinschränkungen, etc.)
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_QUIT
+ Syntax: QUIT
+
+ Zwingt die Services, sich sofort zu beenden; die
+ Datenbanken werden dabei nicht gespeichert.
+ Dieses Kommando sollte nicht benutzt werden, ausser
+ die Datenbanken sollen wirklich nicht aktualisiert
+ werden. Für das normale Beenden der Services sollte
+ das Kommando SHUTDOWN benutzt werden.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_SHUTDOWN
+ Syntax: SHUTDOWN
+
+ Die Services werden durch dieses Kommando normal
+ beendet und die Datenbanken werden gespeichert.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_RESTART
+ Syntax: RESTART
+
+ Die Services werden sich bei diesem Kommando beenden,
+ die Datenbanken speichern, und danach neustarten
+ (die ausführbare Datei erneut aufrufen).
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_KILLCLONES
+ Syntax: KILLCLONES nick
+
+ Killt alle User die den gleichen Hostnamen haben wie
+ nick. Ein temporärer AKILL, in der Form *@host
+ wird ebenfalls aktiviert, dass die Klone daran hindert,
+ sofort neu zu connecten. Es wird zusätzlich eine
+ wallops gesendet, die alle Oper darüber informiert,
+ wer das Kommando genutzt hat und wieviele Hosts
+ betroffen waren. Es ist nützlich, wenn man mehrere
+ Klones vom Netz entfernen möchte.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_CHANLIST
+ Syntax: CHANLIST [{pattern | nick} [SECRET]]
+
+ Zeigt alle Channel an, die augenblicklich benutzt werden,
+ egal ob sie registriert sind oder nicht.
+
+ Wird ein Muster (pattern) angegeben, werden nur die
+ dem Muster entsprechenden Channel angezeigt. Wird ein
+ Nickname angegeben, werden nur die Channels aufgelistet,
+ in denen sich der User mit dem Nick befindet. Wird
+ zusätzlich der Parameter SECRET angegeben, werden nur
+ Channel aufgelistet, die Mode +s oder Mode +p gesetzt
+ haben.
+
+ Beschränkt auf Services Admins.
+
+OPER_HELP_USERLIST
+ Syntax: USERLIST [{pattern | channel} [INVISIBLE]]
+
+ Listet alle User auf, die gerade im IRC Netzwerk sind; egal ob
+ ihr Nick registriert ist oder nicht.
+
+ Wird ein Muster (pattern) angegeben, werden nur die User
+ angezeigt, auf die das Muster passt (es muss im Format
+ nick!user@host sein). Wird ein Channel angegeben, werden
+ nur die User angezeigt, die in diesem Channel sind. Wird
+ zusätzlich INVISIBLE angegeben, werden nur User mit dem Flag
+ +i angezeigt.
+
+ Beschränkt auf Services Admins.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_CACHE
+ Syntax: CACHE DEL hostname
+ CACHE LIST pattern [QUEUED | ALL]
+
+ Das CACHE DEL Command löscht den angegeben Hostnamen aus dem
+ Cache. Dieses Command ist ausschließlich für DEBUG Zwecke.
+
+ Das CACHE LIST Command listet alle Proxies auf, die dem
+ angegebenen Muster entsprechen. Falls die QUEUED Option
+ mitangegeben wird, werden alle Scans in der Warteschlange und
+ alle Scans die gerade laufen, angezeigt. Wenn die ALL Option
+ mitangegeben wird, werden alle Hostnamen aufgelistet.
+
+ Beschränkt auf Services admins.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD FileName
+
+ Dieser Befehl lädt das benannte Module aus dem
+ modules - Verzeichnis.
+
+
+ Beschränkt auf Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ Dieser befehl entfernt das benannte Module aus dem
+ modules - Verzeichnis.
+
+ Beschränkt auf Services Roots.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO FileName
+
+ Dieser Befehl listet Information Über das benannte geladene
+ Module auf.
+
+ Beschränkt auf Services Roots.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST
+
+ Listet alle derzeit geladenen Module auf.
+
+ Beschränkt auf Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S ist dafür geschaffen, Bots in Channels
+ einzubringen. Geschaffen wurde er für User, die
+ selber keinen Bot aufetzen können, oder auch Netzwerke,
+ die Bots verbieten. Mögliche Befehle siehe unten,
+ die Syntax ist /msg %S command.
+
+ Für weitere Hilfe zu einem bestimmten Kommando
+ tippe /msg %S HELP Kommando
+
+ BOTLIST Zeigt alle vorhandenen Bots
+ ASSIGN Weist einem Channel einen Bot zu
+ SET Konfiguriert die Bot-Optionen
+ KICK Konfiguriert den Kicker (s.u.)
+ BADWORDS Verwaltet die Bad-Word-Liste
+
+ Weitere Kommandos: ACT, INFO, SAY, UNASSIGN
+
+ Ein Bot betritt den Channel erst, wenn sich %d User
+ in diesem befinden.
+
+BOT_HELP_BOTLIST
+ Syntax: BOTLIST
+
+ Zeigt alle verfügbaren Bots des Netzwerkes.
+
+BOT_HELP_ASSIGN
+ Syntax: ASSIGN chan nick
+
+ Weist einem Channel einen Bot zu. Nick muss in diesem
+ Fall ein existierender Bot sein. Nach dieser Zuweisung
+ können die Channel-spezifischen Einstellungen des
+ Bots angepasst werden.
+
+BOT_HELP_UNASSIGN
+ Syntax: UNASSIGN chan
+
+ Löscht die Zuweisung eines Bots zu einem Channel.
+ Dieses Kommando bewirkt, dass der Bot den Channel
+ nicht mehr joined. Die Konfiguration des Bots für den
+ Channel bleibt jedoch erhalten, so dass der Bot dem
+ Channel wieder zugewiesen werden kann, ohne dass
+ alle Einstellungen verloren gehen.
+
+BOT_HELP_INFO
+ Syntax: INFO {chan | nick}
+
+ Zeigt %S Informationen über einen Bot oder einen Channel
+ an. Wenn der Parameter ein Channel ist, so werden
+ Informationen wie aktive Kicks etc. angezeigt, wenn
+ der Parameter ein Nick ist, so werden Infos wie
+ Erstellungsdatum oder Anzahl der Channel angezeigt.
+
+BOT_HELP_SET
+ Syntax: SET channel option parameters
+
+ Konfiguriert Optionen für einen Bot.
+ option kann folgende Werte annehmen:
+
+ DONTKICKOPS Chan-Ops werden (nicht) vom Bot
+ gekicked.
+ DONTKICKVOICES Gevoicete User werden (nicht)
+ vom Bot gekickt.
+ GREET Eintrittsmeldung
+ FANTASY Kommandos wie !op !deop usw.
+ aktivieren
+ SYMBIOSIS Bot übernimmt die Aufgaben vom
+ ChanServ
+
+ /msg %S HELP SET option für weitere Informationen
+ über ein spezifisches Kommando.
+
+ Achtung: Die Berechtigungsstufen für diese Kommandos
+ können variieren!
+
+BOT_HELP_SET_DONTKICKOPS
+ Syntax: SET channel DONTKICKOPS {ON|OFF}
+
+ Aktiviert / deaktiviert die Op Protection in einem
+ Channel. Wenn aktiviert, werden Ops nicht vom
+ Bot gekickt, auch wenn sie nicht das NOKICK-Level
+ haben.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Syntax: SET channel DONTKICKVOICES {ON|OFF}
+
+ Aktiviert / deaktiviert die Voice Protection in einem
+ Channel. Wenn aktiviert, werden Ops nicht vom
+ Bot gekickt, auch wenn sie nicht das NOKICK-Level
+ haben.
+
+BOT_HELP_SET_FANTASY
+ Syntax: SET channel FANTASY {ON|OFF}
+
+ Aktiviert oder deaktiviert den fantasy in einem
+ channel. Wenn dieser aktiviert ist, ist es Usern
+ möglich, die Kommandos !op, !deop, !voice, !devoice,
+ !kick, !kb, !unban, !seen und !halfop im channel zu
+ benutzen. Die Kommandos sind selbsterklärend,
+ probiert's halt mal aus, mit oder ohne Nick.
+
+ Hinweis: Auch hier benötigt der ausführende User
+ die Rechte, um die Kommandos zu benutzen, und zwar
+ sowohl das Level um Fantasy zu nutzen, als auch
+ ein Level bz Mode, mit dem er händisch das gegebene
+ Kommando ausführen könnte. (Beispiel: Jemand,
+ der kein Op ist, kann auch niemanden mit !op oppen.)
+
+BOT_HELP_SET_GREET
+ Syntax: SET channel GREET {ON|OFF}
+
+ Aktiviert oder deaktiviert den Greet Mode
+ in einem Channel. Wenn aktiviert, zeigt der Bot
+ eine Eintrittsmeldung bei joinenden Usern, die eine
+ Msg definiert haben und weiterhin auch die
+ Berechtigung haben, dass diese angezeigt wird.
+
+BOT_HELP_SET_SYMBIOSIS
+ Syntax: SET channel SYMBIOSIS {ON|OFF}
+
+ Aktiviert oder deaktiviert den symbiosis Mode.
+ Wenn aktiviert führt der Bot alle Aktionen aus,
+ die sonst %s übernimmt.
+ (Modechanges, Kicks, Eintrittsmeldungen usw.)
+
+BOT_HELP_KICK
+ Syntax: KICK channel option parameters
+
+ Konfiguriert die Kicks des Bots
+ option kann folgende Werte annehmen:
+
+ BOLDS Bot kickt bei fettem Schriftstil (Bold)
+ BADWORDS Bot kickt bei Bad words
+ CAPS Bot kickt bei CAPS (Grossschrift)
+ COLORS Bot kickt bei Farben
+ FLOOD Bot kickt Flooder
+ REPEAT Bot kickt User, die sich wiederholen.
+ REVERSES Bot kickt bei invertiertem Schriftstil
+ UNDERLINES Bot kickt bei Unterstreichungen
+
+ /msg %S HELP KICK option für weitere
+ Informationen über ein spezifisches Kommando
+
+ Achtung: Die Berechtigungsstufen für diese Kommandos
+ können variieren!
+
+BOT_HELP_KICK_BOLDS
+ Syntax: KICK channel BOLDS {ON|OFF} [ttb]
+
+ Kicken bei fettem Schriftstil an oder aus. Wenn
+ der Parameter ON gegeben ist, werden User, die fetten
+ Schriftstil verwenden, durch den Bot gekickt.
+
+ ttb beschreibt wie oft der User gekicked wird, bevor
+ er einen Ban bekommt. Wenn keine ttb angegeben
+ wird, wird er nie gebannt.
+
+BOT_HELP_KICK_COLORS
+ Syntax: KICK channel COLORS {ON|OFF} [ttb]
+
+ Kicken bei Farben an oder aus. Wenn der Parameter
+ ON gegeben ist, werden User, die Farben verwenden,
+ durch den Bot gekickt.
+
+ ttb beschreibt wie oft der User gekicked wird, bevor
+ er einen Ban bekommt. Wenn keine ttb angegeben
+ wird, wird er nie gebannt.
+
+BOT_HELP_KICK_REVERSES
+ Syntax: KICK channel REVERSES {ON|OFF} [ttb]
+
+ Kicken bei invertiertem Schriftstil an oder aus.
+ Wenn der Parameter ON gegeben ist, werden User, die
+ invertierten Schriftstil verwenden, durch den Bot
+ gekickt.
+
+ ttb beschreibt wie oft der User gekicked wird, bevor
+ er einen Ban bekommt. Wenn keine ttb angegeben
+ wird, wird er nie gebannt.
+
+BOT_HELP_KICK_UNDERLINES
+ Syntax: KICK channel UNDERLINES {ON|OFF} [ttb]
+
+ Kicken bei Unterstreichungen an oder aus. Wenn der
+ Parameter ON gegeben ist, werden User, die
+ Unterstreichungen verwenden, durch den Bot gekickt.
+
+ ttb beschreibt wie oft der User gekicked wird, bevor
+ er einen Ban bekommt. Wenn keine ttb angegeben
+ wird, wird er nie gebannt.
+
+BOT_HELP_KICK_CAPS
+ Syntax: KICK channel CAPS {ON|OFF} [ttb [min [percent]]]
+
+ Kicken bei CAPS an oder aus. Wenn der Parameter
+ ON gegeben ist, werden User, die CAPS verwenden,
+ durch den Bot gekickt.
+
+ Der Bot kickt nur, wenn mindestens min Grossbuchstaben
+ verwendet wurden und der Text mindestens percent%%
+ Grossbuchstaben enthält. (Standard ist hier zehn Zeichen und
+ 25 %% - dieser wird angewendet, wenn die Paramter nicht
+ angegeben werden.
+
+ ttb beschreibt wie oft der User gekicked wird, bevor
+ er einen Ban bekommt. Wenn keine ttb angegeben
+ wird, wird er nie gebannt.
+
+BOT_HELP_KICK_FLOOD
+ Syntax: KICK channel FLOOD {ON|OFF} [ttb [ln [secs]]]
+
+ Schaltet den Flood-Kicker an oder aus. Wenn er
+ aktiviert ist, kickt er User, die den Channel
+ mit mindestens ln Zeilen in secs flooden.
+ Sollte weder ln noch secs angegeben sein,
+ so werden defaultmässig 6 Zeilen / 10 Sekunden
+ gesetzt.
+
+ ttb beschreibt wie oft der User gekicked wird, bevor
+ er einen Ban bekommt. Wenn keine ttb angegeben
+ wird, wird er nie gebannt.
+
+BOT_HELP_KICK_REPEAT
+ Syntax: KICK #channel REPEAT {ON|OFF} [ttb [num]]
+
+ Schaltet den Wiederholungs-Kicker an oder aus.
+ Wenn aktiviert, wird ein User, der sich num mal
+ wiederholt, gekickt. Sollte kein num angegeben
+ sein, so wird 3 als Standardwert gesetzt
+
+ ttb beschreibt wie oft der User gekicked wird, bevor
+ er einen Ban bekommt. Wenn keine ttb angegeben
+ wird, wird er nie gebannt.
+
+BOT_HELP_KICK_BADWORDS
+ Syntax: KICK #channel BADWORDS {ON|OFF} [ttb]
+
+ Schaltet den Bad-Word-Kicker an oder aus. Wenn er
+ aktiviert ist, kickt der er den Bösewicht, der ein Wort
+ aus der Bad-Word-Liste sagt.
+
+ Die Bad-Words werden mit dem BADWORDS
+ Kommando festgelegt.
+ /msg %S HELP BADWORDS für weitere
+ Informationen.
+
+ ttb beschreibt wie oft der User gekicked wird, bevor
+ er einen Ban bekommt. Wenn keine ttb angegeben
+ wird, wird er nie gebannt.
+
+BOT_HELP_BADWORDS
+ Syntax: BADWORDS channel ADD word [SINGLE | START | END]
+ BADWORDS channel DEL {word | entry-num | list}
+ BADWORDS channel LIST [mask | list]
+ BADWORDS channel CLEAR
+
+ Verwaltet die Bad-Word-List eines Channels.
+
+ In dieser Liste sind Wörter gespeichert, bei denen der
+ entsprechende User aus dem Channel gekickt wird, wenn er
+ eines dieser Wörter erwähnt.
+
+ Für mehr Informationen: /msg %S HELP KICK BADWORDS.
+
+ Das Kommando BADWORDS ADD fügt Wörter zur
+ Bad-Word-Liste hinzu. Wenn das Wort mit dem Paramter
+ SINGLE angeben wird, so wird ein User nur dann gekickt,
+ wenn er das ganze Wort sagt. Mit dem Parametern
+ END / START wird der User gekickt, wenn er ein Wort sagt,
+ das mit dem angegebenen Wort anfängt / endet.
+
+ Wenn keine Parameter angegeben werden, wird der User,
+ sobald er das angegebene Wort in irgendeiner Kombination
+ sagt, gekickt.
+
+ BADWORDS DEL löscht Einträge von der Bad
+ Word Liste. Auch hier gibt es die Möglichkeit, mehrere
+ Einträge auf einmal zu löschen (siehe BADWORDS LIST)
+
+ BADWORDS LIST zeigt Einträge der Bad Word Liste.
+ Wildcards wie auch Bereiche werden interpretiert, z.B:
+
+ BADWORDS #channel LIST 2-5,7-9
+ Zeigt die Einträge 2-5 und 7-9 der Bad Word List an.
+
+ BADWORDS CLEAR löscht alle Einträge aus der
+ Bad Word List.
+
+BOT_HELP_SAY
+ Syntax: SAY channel text
+
+ Der Bot sagt den eingegebenen Text auf dem angegebenen Channel.
+
+BOT_HELP_ACT
+ Syntax: ACT channel text
+
+ Bringt den Bot dazu, /me text auf dem angegebenen Channel auszugeben.
+
+BOT_SERVADMIN_HELP
+
+ Das folgende Kommando ist nur für Services-Admins verfügbar:
+
+ BOT Verwaltung der Bots
+
+BOT_SERVADMIN_HELP_BOT
+ Syntax: BOT ADD nick user host real
+ BOT CHANGE oldnick newnick [user [host [real]]]
+ BOT DEL nick
+ BOT LIST
+
+ Erlaubt Services-Admins Bots zu erstellen/verändern/löschen,
+ die die User in Ihren Channeln benutzen können.
+
+ BOT ADD fügt einen Bot mit dem angegebenen Nick, User-,
+ Host und Realnamen hinzu.
+ BOT CHANGE ändert Attribute eines Bots wie Host, Nick usw.
+ BOT DEL löscht den angegebenen Bot von der Botliste.
+ BOT LIST ist ein Alias für BOTLIST und zeigt alle
+ im Netz verfügbaren Bots an.
+
+ Achtung: Wenn ein Bot erstellt wird, dessen Nick
+ registriert ist, wird dieser Nick gedropped.
+ Weiterhin wird, falls ein User mit diesem Nick
+ momentan online ist, dieser gekilled.
+
+BOT_SERVADMIN_HELP_SET
+
+ Diese Optionen sind nur durch Services Admins nutzbar:
+
+ NOBOT Mit dieser Option kann man
+ einen Channel keinen Bot
+ zuweisen und alle aktuellen
+ Zuweisungen aufheben.
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Syntax: SET channel NOBOT {ON|OFF}
+
+ Durch diese Option kann einem Channel explizit kein Bot
+ zugewiesen werden. Sollte dem Channel, für den diese
+ Option gewählt wird, bereits ein Bot zugewiesen
+ sein, so verfällt die Zuweisung.
+
+ Beschränkt auf Services Admins.
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Syntax: SET bot-nick PRIVATE {ON|OFF}
+
+ Verhindert, dass der Bot durch Nicht-IRC Operatoren
+ assigned werden kann.
+
+ Beschränkt auf Services admins.
+
+###########################################################################
+#
+# HostServ messages
+#
+###########################################################################
+HOST_EMPTY
+ Die vhost Liste ist leer.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ vhost für %s wurde gesetzt: %s.
+HOST_IDENT_SET
+ vhost für %s wurde gesetzt: %s@%s.
+HOST_SETALL
+ vhost für die group %s wurde gesetzt: %s.
+HOST_DELALL
+ vhosts for group %s have been removed.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost für die group %s wurde gesetzt: %s@%s.
+HOST_SET_ERROR
+ Fehler! Ein vhost darf nur die Zeichen A-Z, a-z, 0-9, '.' und '-' enthalten.
+HOST_SET_IDENT_ERROR
+ A vhost ident must be in the format of a valid ident
+HOST_SET_TOOLONG
+ Fehler! Der vhost ist zu lang, bitte nutze einen vhost mit weniger als
+ %d Buchstaben.
+HOST_SET_IDENTTOOLONG
+ Fehler! Die Ident ist zu lang, bitte nutze eine Ident mit weniger als
+ %d Buchstaben.
+HOST_NOREG
+ User %s wurde nicht in der nickserv db gefunden.
+HOST_SET_SYNTAX
+ Syntax /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Zugriff verweigert.
+HOST_NOT_ASSIGNED
+ Bitte kontaktiere einen IRC Operator, um diesem Nick einen vhost zuzuweisen.
+HOST_ACTIVATED
+ Dein vhost (%s) ist nun aktiviert.
+HOST_IDENT_ACTIVATED
+ Dein vhost (%s@%s) ist nun aktiviert.
+HOST_ID
+ Bitte identifiziere dich zuerst.
+HOST_NOT_REGED
+ Du musst erst deinen Nick registrieren, um einen vhost zu erhalten.
+HOST_DEL
+ vhost für %s wurde gelöscht.
+HOST_DEL_SYNTAX
+ Syntax: /msg %s del <nick>.
+HOST_OFF_UNREAL
+ Dein vhost wurde gelöscht. Um die normale Host-Verschlüsselung zu reaktivieren, tippe /mode %s +x
+HOST_NO_VIDENT
+ Dein IRCd unterstützt keine vIdent's, falls das inkorrekt sein sollte, melde das bitte als einen Bug.
+HOST_GROUP
+ Alle Vhost's in der Gruppe %s wurden auf %s gesetzt.
+HOST_IDENT_GROUP
+ Alle Vhost's in der Gruppe %s wurden auf %s@%s gesetzt.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_LIST_FOOTER
+ Zeigt alle Einträge (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Zeigt alle Einträge von %d bis %d
+HOST_LIST_KEY_FOOTER
+ Zeigt die auf den Key passenden einträge %s (Count: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ %S Commands:
+ ON Aktiviert deinen vhost
+ OFF Deaktiviert deinen vhost
+ GROUP Gleicht den vhost für alle Nicks in einer
+ Gruppe an
+
+HOST_OPER_HELP
+ Commands für Services Operatoren:
+ SET Setzt einem User einen vhost
+ SETALL Setzt einer Gruppe einen vhost
+ DEL Löscht den vhost eines Users
+ LIST Zeigt einen oder mehrere vhost Einträge an.
+
+HOST_ADMIN_HELP
+ Commands für Services Admins:
+
+HOST_HELP_ON
+ Syntax: ON
+
+ Aktiviert den vhost der deinem Nick zugewiesen wurde. Wenn
+ du dieses Command nutzt, wird jeder User, der ein /whois
+ auf dich anwendet, diesen vhost anstatt deines Hosts sehen.
+
+HOST_HELP_SET
+ Syntax: SET <nick> <hostmask>.
+
+ Setzt einem User einen vhost anstelle des normalen
+ Hosts. Falls dein IRCd vIdents unterstützt, kannst
+ du mit SET <nick> <ident>@<hostmask> auch eine Ident
+ wie einen vhost setzen.
+
+ Beschränkt auf Services Operatoren.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Löscht den Vhost aller Nick's aus der gleichen gruppe des
+ angegeben Nick's.
+
+ Beschränkt auf Host Removers.
+
+
+HOST_HELP_SETALL
+ Syntax: SETALL <nick> <hostmask>.
+
+ Setzt allen Usern einer Group einen vhost. Falls dein
+ IRCd vIdents unterstützt, kannst du mit
+ SETALL <nick> <ident>@<hostmask> eine Ident wie einen
+ vhosts setzen.
+
+ * Anmerkung, dieses Command betrifft keine Nicks, die
+ nachträglich zur Group hinzugefügt wurden.
+
+ Beschränkt auf Services Operatoren.
+
+HOST_HELP_OFF
+ Syntax: OFF
+
+ Deaktiviert den gerade genutzten vhost eines Nicks.
+ Nach der Nutzung dieses Commands wird jeder User, der
+ ein /whois auf dich anwendet, deine echte IP Adresse
+ sehen.
+
+HOST_HELP_DEL
+ Syntax: DEL <nick>
+
+ Löscht den vhost des angegebenen Nicks.
+
+ Beschränkt auf Services Operatoren.
+
+HOST_HELP_LIST
+ Syntax: LIST [<key>|<#X-Y>]
+
+ Dieser Befehl listet dem Operator die registrierten Vhost's.
+ Wenn ein Key angegeben ist, nur die einträge des nicks oder
+ Vhost's, die dem gegeben pattern <Key> entsprechen, z.B.
+ Rob* für alle Einträge, die mit "Rob" beginnen.
+
+ Wenn ein #X-Y style benutzt wird, werden nur die Einträge
+ zwischen den angegeben Faktoren angezeigt, z.B. #1-3 wird
+ die ersten drei Nick/Vhost-Einträge anzeigen.
+
+ Die litste benutzt jedes mal den Wert von NSListMax als ein
+ festes Limit für die Anzahl der dem Operator anzuzeigenden
+ Einträge.
+
+ Beschränkt auf Services operators.
+
+HOST_HELP_GROUP
+ Syntax:GROUP
+
+ Dieses Command erlaubt es Usern, den vhost ihres aktuellen
+ Nicks, zum vhost der gessamten Group zu setzen.
+
diff --git a/lang/en_us.l b/lang/en_us.l
new file mode 100644
index 000000000..7260ad383
--- /dev/null
+++ b/lang/en_us.l
@@ -0,0 +1,5946 @@
+# United States English language file.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ English
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %b %d %H:%M:%S %Y %Z
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %b %d %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %b %d %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Sun
+ Mon
+ Tue
+ Wed
+ Thu
+ Fri
+ Sat
+# %A
+STRFTIME_DAYS_LONG
+ Sunday
+ Monday
+ Tuesday
+ Wednesday
+ Thursday
+ Friday
+ Saturday
+# %b
+STRFTIME_MONTHS_SHORT
+ Jan
+ Feb
+ Mar
+ Apr
+ May
+ Jun
+ Jul
+ Aug
+ Sep
+ Oct
+ Nov
+ Dec
+# %B
+STRFTIME_MONTHS_LONG
+ January
+ February
+ March
+ April
+ May
+ June
+ July
+ August
+ September
+ October
+ November
+ December
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Internal error - unable to process request.
+UNKNOWN_COMMAND
+ Unknown command %s.
+UNKNOWN_COMMAND_HELP
+ Unknown command %s. "/msg %s HELP" for help.
+SYNTAX_ERROR
+ Syntax: %s
+MORE_INFO
+ /msg %s HELP %s for more information.
+NO_HELP_AVAILABLE
+ No help available for %s.
+OBSOLETE_COMMAND
+ This command is obsolete; use %s instead.
+
+BAD_USERHOST_MASK
+ Mask must be in the form user@host.
+BAD_EXPIRY_TIME
+ Invalid expiry time.
+USERHOST_MASK_TOO_WIDE
+ %s coverage is too wide; Please use a more specific mask.
+
+SERVICE_OFFLINE
+ %s is currently offline.
+READ_ONLY_MODE
+ Notice: Services is in read-only mode; changes will not be saved!
+PASSWORD_INCORRECT
+ Password incorrect.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Access denied.
+PERMISSION_DENIED
+ Permission denied.
+RAW_DISABLED
+ The RAW option has been disabled. If you must use it, configure the DisableRaw directive in Services configuration.
+
+MORE_OBSCURE_PASSWORD
+ Please try again with a more obscure password. Passwords should be at least five characters long, should not be something easily guessed (e.g. your real name or your nick), and cannot contain the space or tab characters.
+PASSWORD_TRUNCATED
+ Notice: Your password has been truncated to %d characters.
+
+NICK_NOT_REGISTERED
+ Your nick isn't registered.
+NICK_NOT_REGISTERED_HELP
+ Your nick isn't registered. Type /msg %s HELP for information on registering your nickname.
+NICK_X_NOT_REGISTERED
+ Nick %s isn't registered.
+NICK_X_IN_USE
+ Nick %s is currently in use.
+NICK_X_NOT_IN_USE
+ Nick %s isn't currently in use.
+NICK_X_NOT_ON_CHAN
+ %s is not currently on channel %s.
+NICK_X_FORBIDDEN
+ Nick %s may not be registered or used.
+NICK_X_FORBIDDEN_OPER
+ Nick %s has been forbidden by %s:
+ %s
+NICK_X_ILLEGAL
+ Nick %s is an illegal nickname and cannot be used.
+NICK_X_TRUNCATED
+ Nick %s was truncated to %d characters.
+CHAN_X_NOT_REGISTERED
+ Channel %s isn't registered.
+CHAN_X_NOT_IN_USE
+ Channel %s doesn't exist.
+CHAN_X_FORBIDDEN
+ Channel %s may not be registered or used.
+CHAN_X_FORBIDDEN_OPER
+ Channel %s has been forbidden by %s:
+ %s
+CHAN_X_SUSPENDED
+ Suspended: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Password authentication required for that command.
+ Retry after typing /msg %s IDENTIFY password.
+CHAN_IDENTIFY_REQUIRED
+ Password authentication required for that command.
+ Retry after typing /msg %s IDENTIFY %s password.
+
+MAIL_DISABLED
+ Services have been configured to not send mail.
+MAIL_INVALID
+ E-mail for %s is invalid.
+MAIL_X_INVALID
+ %s is not a valid e-mail address.
+MAIL_LATER
+ Cannot send mail now; please retry a little later.
+MAIL_DELAYED
+ Please wait %d seconds and retry.
+
+NO_REASON
+ No reason
+UNKNOWN
+ <unknown>
+
+# Duration system
+DURATION_DAY
+ 1 day
+DURATION_DAYS
+ %d days
+DURATION_HOUR
+ 1 hour
+DURATION_HOURS
+ %d hours
+DURATION_MINUTE
+ 1 minute
+DURATION_MINUTES
+ %d minutes
+DURATION_SECOND
+ 1 second
+DURATION_SECONDS
+ %d seconds
+
+# Human readable expiration
+NO_EXPIRE
+ does not expire
+EXPIRES_SOON
+ expires at next database update
+EXPIRES_M
+ expires in %d minutes
+EXPIRES_1M
+ expires in %d minute
+EXPIRES_HM
+ expires in %d hours, %d minutes
+EXPIRES_H1M
+ expires in %d hours, %d minute
+EXPIRES_1HM
+ expires in %d hour, %d minutes
+EXPIRES_1H1M
+ expires in %d hour, %d minute
+EXPIRES_D
+ expires in %d days
+EXPIRES_1D
+ expires in %d day
+
+# Generic Footer message
+END_OF_ANY_LIST
+ End of %s list.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ This nick is owned by someone else. Please choose another.
+ (If this is your nick, type /msg %s IDENTIFY password.)
+NICK_IS_SECURE
+ This nickname is registered and protected. If it is your
+ nick, type /msg %s IDENTIFY password. Otherwise,
+ please choose a different nick.
+NICK_MAY_NOT_BE_USED
+ This nickname may not be used. Please choose another one.
+FORCENICKCHANGE_IN_1_MINUTE
+ If you do not change within one minute, I will change your nick.
+FORCENICKCHANGE_IN_20_SECONDS
+ If you do not change within 20 seconds, I will change your nick.
+FORCENICKCHANGE_NOW
+ This nickname has been registered; you may not use it.
+FORCENICKCHANGE_CHANGING
+ Your nickname is now being changed to %s
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER password [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER password email
+NICK_REGISTRATION_DISABLED
+ Sorry, nickname registration is temporarily disabled.
+NICK_REGISTRATION_FAILED
+ Sorry, registration failed.
+NICK_REG_PLEASE_WAIT
+ Please wait %d seconds before using the REGISTER command again.
+NICK_CANNOT_BE_REGISTERED
+ Nickname %s may not be registered.
+NICK_ALREADY_REGISTERED
+ Nickname %s is already registered!
+NICK_REGISTERED
+ Nickname %s registered under your account: %s
+NICK_PASSWORD_IS
+ Your password is %s - remember this for later use.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP target password
+NICK_GROUP_DISABLED
+ Sorry, nickname grouping is temporarily disabled.
+NICK_GROUP_FAILED
+ Sorry, grouping failed.
+NICK_GROUP_PLEASE_WAIT
+ Please wait %d seconds before using the GROUP command again.
+NICK_GROUP_CHANGE_DISABLED
+ Your nick is already registered; type /msg %s DROP first.
+NICK_GROUP_SAME
+ You are already a member of the group of %s.
+NICK_GROUP_TOO_MANY
+ There are too many nicks in %s's group; list them and drop some.
+ Type /msg %s HELP GLIST and /msg %s HELP DROP
+ for more information.
+NICK_GROUP_JOINED
+ You are now in the group of %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY password
+NICK_IDENTIFY_FAILED
+ Sorry, identification failed.
+NICK_IDENTIFY_SUCCEEDED
+ Password accepted - you are now recognized.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ You must now supply an e-mail for your nick.
+ This e-mail will allow you to retrieve your password in
+ case you forget it.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Type /msg %S SET EMAIL e-mail in order to set your e-mail.
+ Your privacy is respected; this e-mail won't be given to
+ any third-party person.
+NICK_ALREADY_IDENTIFIED
+ You are already identified.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status updated (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Your nick has been logged out.
+NICK_LOGOUT_X_SUCCEEDED
+ Nick %s has been logged out.
+NICK_LOGOUT_SERVICESADMIN
+ Can't logout %s because he's a services administrator.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Sorry, nickname de-registration is temporarily disabled.
+NICK_DROPPED
+ Your nickname has been dropped.
+NICK_X_DROPPED
+ Nickname %s has been dropped.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET option parameters
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] option parameters
+NICK_SET_DISABLED
+ Sorry, nickname option setting is temporarily disabled.
+NICK_SET_UNKNOWN_OPTION
+ Unknown SET option %s.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ Unknown SET option %s, or nickname not registered.
+NICK_SET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ The new display MUST be a nickname of your nickname group!
+NICK_SET_DISPLAY_CHANGED
+ The new display is now %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Sorry, couldn't change password.
+NICK_SET_PASSWORD_CHANGED
+ Password changed.
+NICK_SET_PASSWORD_CHANGED_TO
+ Password changed to %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE number
+NICK_SET_LANGUAGE_UNKNOWN
+ Unknown language number %d. Type /msg %s HELP SET LANGUAGE for a list of languages.
+NICK_SET_LANGUAGE_CHANGED
+ Language changed to English.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL changed to %s.
+NICK_SET_URL_UNSET
+ URL unset.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ E-mail address changed to %s.
+NICK_SET_EMAIL_UNSET
+ E-mail address unset.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ You cannot unset the e-mail on this network.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ ICQ number set to %s.
+NICK_SET_ICQ_UNSET
+ ICQ number unset.
+NICK_SET_ICQ_INVALID
+ %s is not a valid number.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Greet message changed to %s.
+NICK_SET_GREET_UNSET
+ Greet message unset.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ Protection is now ON.
+NICK_SET_KILL_QUICK
+ Protection is now ON, with a reduced delay.
+NICK_SET_KILL_IMMED
+ Protection is now ON, with no delay.
+NICK_SET_KILL_IMMED_DISABLED
+ The IMMED option is not available on this network.
+NICK_SET_KILL_OFF
+ Protection is now OFF.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ Secure option is now ON.
+NICK_SET_SECURE_OFF
+ Secure option is now OFF.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ Private option is now ON.
+NICK_SET_PRIVATE_OFF
+ Private option is now OFF.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Your E-mail address will now be hidden from %s INFO displays.
+NICK_SET_HIDE_EMAIL_OFF
+ Your E-mail address will now be shown in %s INFO displays.
+NICK_SET_HIDE_MASK_ON
+ Your last seen user@host mask will now be hidden from %s INFO displays.
+NICK_SET_HIDE_MASK_OFF
+ Your last seen user@host mask will now be shown in %s INFO displays.
+NICK_SET_HIDE_QUIT_ON
+ Your last quit message will now be hidden from %s INFO displays.
+NICK_SET_HIDE_QUIT_OFF
+ Your last quit message will now be shown in %s INFO displays.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Services will now reply to you with messages.
+NICK_SET_MSG_OFF
+ Services will now reply to you with notices.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nickname] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ Nick %s will not expire.
+NICK_SET_NOEXPIRE_OFF
+ Nick %s will expire.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mask]
+NICK_ACCESS_ALREADY_PRESENT
+ Mask %s already present on your access list.
+NICK_ACCESS_REACHED_LIMIT
+ Sorry, you can only have %d access entries for a nickname.
+NICK_ACCESS_ADDED
+ %s added to your access list.
+NICK_ACCESS_NOT_FOUND
+ %s not found on your access list.
+NICK_ACCESS_DELETED
+ %s deleted from your access list.
+NICK_ACCESS_LIST
+ Access list:
+NICK_ACCESS_LIST_X
+ Access list for %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s is %s
+NICK_INFO_SERVICES_OPER
+ %s is a services operator.
+NICK_INFO_SERVICES_ADMIN
+ %s is a services admin.
+NICK_INFO_ADDRESS
+ Last seen address: %s
+NICK_INFO_ADDRESS_ONLINE
+ Is online from: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s is currently online.
+NICK_INFO_TIME_REGGED
+ Time registered: %s
+NICK_INFO_LAST_SEEN
+ Last seen time: %s
+NICK_INFO_LAST_QUIT
+ Last quit message: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ E-mail address: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Greet message: %s
+NICK_INFO_OPTIONS
+ Options: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Protection
+NICK_INFO_OPT_SECURE
+ Security
+NICK_INFO_OPT_PRIVATE
+ Private
+NICK_INFO_OPT_MSG
+ Message mode
+NICK_INFO_OPT_NONE
+ None
+NICK_INFO_NO_EXPIRE
+ This nickname will not expire.
+NICK_INFO_FOR_MORE
+ For more verbose information, type /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST pattern
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [NOEXPIRE] [UNCONFIRMED]
+NICK_LIST_HEADER
+ List of entries matching %s:
+NICK_LIST_RESULTS
+ End of list - %d/%d matches shown.
+
+# ALIST responses
+NICK_ALIST_SYNTAX
+ ALIST nickname
+NICK_ALIST_HEADER
+ Channels that you have access on:
+ Num Channel Level Description
+NICK_ALIST_HEADER_X
+ Channels that %s has access on:
+ Num Channel Level Description
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ End of list - %d/%d channels shown.
+
+# GLIST responses
+NICK_GLIST_HEADER
+ List of nicknames in your group:
+NICK_GLIST_HEADER_X
+ List of nicknames in the group of %s:
+NICK_GLIST_FOOTER
+ %d nicknames in the group.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nickname [password]
+NICK_NO_RECOVER_SELF
+ You can't recover yourself!
+NICK_RECOVERED
+ User claiming your nick has been killed.
+ /msg %s RELEASE %s to get it back before the one-minute timeout.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nickname [password]
+NICK_RELEASE_NOT_HELD
+ Nick %s isn't being held.
+NICK_RELEASED
+ Services' hold on your nick has been released.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nickname [password]
+NICK_NO_GHOST_SELF
+ You can't ghost yourself!
+NICK_GHOST_KILLED
+ Ghost with your nick has been killed.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nickname
+NICK_GETPASS_UNAVAILABLE
+ GETPASS command unavailable because encryption is in use.
+NICK_GETPASS_PASSWORD_IS
+ Password for %s is %s.
+
+# GETEMAIL responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host No WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails Match %s to %s.
+NICK_GETEMAIL_NOT_USED
+ No Emails listed for %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nickname
+NICK_SENDPASS_UNAVAILABLE
+ SENDPASS command unavailable because encryption is in use.
+NICK_SENDPASS_SUBJECT
+ Nickname password (%s)
+NICK_SENDPASS_HEAD
+ Hi,
+NICK_SENDPASS_LINE_1
+ You have requested to receive the password of nickname %s by e-mail.
+NICK_SENDPASS_LINE_2
+ The password is %s. For security purposes, you should change it as soon as you receive this mail.
+NICK_SENDPASS_LINE_3
+ If you don't know why this mail is sent to you, please ignore it silently.
+NICK_SENDPASS_LINE_4
+ PLEASE DON'T ANSWER TO THIS MAIL!
+NICK_SENDPASS_LINE_5
+ %s administrators.
+NICK_SENDPASS_OK
+ Password of %s has been sent.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nickname [reason]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nickname reason
+NICK_FORBID_SUCCEEDED
+ Nick %s is now forbidden.
+NICK_FORBID_FAILED
+ Couldn't forbid nick %s!
+
+# Nick Registraion responses
+NICK_REQUESTED
+ This nick has already been requested, please check your e-mail address for the pass code
+NICK_REG_RESENT
+ Your passcode has been re-sent to %s.
+NICK_REG_UNABLE
+ Nick NOT registered, please try again later.
+NICK_IS_PREREG
+ This nick is awaiting an e-mail verification code before completing registration.
+NICK_ENTER_REG_CODE
+ A passcode has been sent to %s, please type /msg %s confirm <passcode> to complete registration
+NICK_CONFIRM_NOT_FOUND
+ Registration step 1 may have expired, please use "/msg %s register <password> <email>" first.
+NICK_CONFIRM_INVALID
+ Invalid passcode has been entered, please check the e-mail again, and retry
+NICK_REG_MAIL_SUBJECT
+ Nickname Registration (%s)
+NICK_REG_MAIL_HEAD
+ Hi,
+NICK_REG_MAIL_LINE_1
+ You have requested to register the following nickname %s.
+NICK_REG_MAIL_LINE_2
+ Please type " /msg %s confirm %s " to complete registration.
+NICK_REG_MAIL_LINE_3
+ If you don't know why this mail is sent to you, please ignore it silently.
+NICK_REG_MAIL_LINE_4
+ PLEASE DON'T ANSWER TO THIS MAIL!
+NICK_REG_MAIL_LINE_5
+ %s administrators.
+NICK_GETPASS_PASSCODE_IS
+ Passcode for %s is %s.
+NICK_FORCE_REG
+ Nickname %s confirmed
+
+
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Automatic channel operator status
+CHAN_LEVEL_AUTOVOICE
+ Automatic mode +v
+CHAN_LEVEL_AUTOHALFOP
+ Automatic mode +h
+CHAN_LEVEL_AUTOPROTECT
+ Automatic mode +a
+CHAN_LEVEL_AUTODEOP
+ Channel operator status disallowed
+CHAN_LEVEL_NOJOIN
+ Not allowed to join channel if RESTRICTED
+CHAN_LEVEL_INVITE
+ Allowed to use INVITE command
+CHAN_LEVEL_AKICK
+ Allowed to use AKICK command
+CHAN_LEVEL_SET
+ Allowed to use SET command (not FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ Allowed to use CLEAR command
+CHAN_LEVEL_UNBAN
+ Allowed to use UNBAN command
+CHAN_LEVEL_OPDEOP
+ Allowed to use OP/DEOP commands
+CHAN_LEVEL_ACCESS_LIST
+ Allowed to view the access list
+CHAN_LEVEL_ACCESS_CHANGE
+ Allowed to modify the access list
+CHAN_LEVEL_MEMO
+ Allowed to list/read channel memos
+CHAN_LEVEL_ASSIGN
+ Allowed to assign/unassign a bot
+CHAN_LEVEL_BADWORDS
+ Allowed to use BADWORDS command
+CHAN_LEVEL_NOKICK
+ Never kicked by the bot's kickers
+CHAN_LEVEL_FANTASIA
+ Allowed to use fantaisist commands
+CHAN_LEVEL_SAY
+ Allowed to use SAY and ACT commands
+CHAN_LEVEL_GREET
+ Greet message displayed
+CHAN_LEVEL_VOICEME
+ Allowed to (de)voice him/herself
+CHAN_LEVEL_VOICE
+ Allowed to use VOICE/DEVOICE commands
+CHAN_LEVEL_GETKEY
+ Allowed to use GETKEY command
+CHAN_LEVEL_OPDEOPME
+ Allowed to (de)op him/herself
+CHAN_LEVEL_HALFOPME
+ Allowed to (de)halfop him/herself
+CHAN_LEVEL_HALFOP
+ Allowed to use HALFOP/DEHALFOP commands
+CHAN_LEVEL_PROTECTME
+ Allowed to (de)protect him/herself
+CHAN_LEVEL_PROTECT
+ Allowed to use PROTECT/DEPROTECT commands
+CHAN_LEVEL_KICKME
+ Allowed to kick him/herself
+CHAN_LEVEL_KICK
+ Allowed to use KICK command
+CHAN_LEVEL_SIGNKICK
+ No signed kick when SIGNKICK LEVEL is used
+CHAN_LEVEL_BANME
+ Allowed to ban him/herself
+CHAN_LEVEL_BAN
+ Allowed to use BAN command
+CHAN_LEVEL_TOPIC
+ Allowed to use TOPIC command
+CHAN_LEVEL_INFO
+ Allowed to use INFO command with ALL option
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ This channel has been registered with %s.
+CHAN_NOT_ALLOWED_OP
+ You are not allowed chanop status on channel %s.
+CHAN_MAY_NOT_BE_USED
+ This channel may not be used.
+CHAN_NOT_ALLOWED_TO_JOIN
+ You are not permitted to be on this channel.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER channel password description
+CHAN_REGISTER_DISABLED
+ Sorry, channel registration is temporarily disabled.
+CHAN_REGISTER_NOT_LOCAL
+ Local channels cannot be registered.
+CHAN_MUST_REGISTER_NICK
+ You must register your nickname first. Type /msg %s HELP for information on registering nicknames.
+CHAN_MUST_IDENTIFY_NICK
+ Please identify with %s first, using the command:
+ /msg %s IDENTIFY password
+CHAN_MAY_NOT_BE_REGISTERED
+ Channel %s may not be registered.
+CHAN_ALREADY_REGISTERED
+ Channel %s is already registered!
+CHAN_MUST_BE_CHANOP
+ You must be a channel operator to register the channel.
+CHAN_REACHED_CHANNEL_LIMIT
+ Sorry, you have already reached your limit of %d channels.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Sorry, you have already exceeded your limit of %d channels.
+CHAN_REGISTRATION_FAILED
+ Sorry, registration failed.
+CHAN_REGISTERED
+ Channel %s registered under your nickname: %s
+CHAN_PASSWORD_IS
+ Your channel password is %s - remember it for later use.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY channel password
+CHAN_IDENTIFY_FAILED
+ Sorry, identification failed.
+CHAN_IDENTIFY_SUCCEEDED
+ Password accepted - you now have founder-level access to %s.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT channel nickname
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT channel [nickname]
+CHAN_LOGOUT_SUCCEEDED
+ User %s has been logged out of channel %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ All users identified have been logged out of channel %s.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP channel
+CHAN_DROP_DISABLED
+ Sorry, channel de-registration is temporarily disabled.
+CHAN_DROPPED
+ Channel %s has been dropped.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET channel option parameters
+CHAN_SET_DISABLED
+ Sorry, channel option setting is temporarily disabled.
+CHAN_SET_UNKNOWN_OPTION
+ Unknown SET option %s.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s has too many channels registered.
+CHAN_FOUNDER_CHANGED
+ Founder of %s changed to %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Successor for %s changed to %s.
+CHAN_SUCCESSOR_UNSET
+ Successor for %s unset.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s cannot be the successor on channel %s because he is its founder.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Sorry, couldn't set password.
+CHAN_PASSWORD_CHANGED
+ %s password changed.
+CHAN_PASSWORD_CHANGED_TO
+ %s password changed to %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ Description of %s changed to %s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ URL for %s changed to %s.
+CHAN_URL_UNSET
+ URL for %s unset.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ E-mail address for %s changed to %s.
+CHAN_EMAIL_UNSET
+ E-mail address for %s unset.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Entry message for %s changed.
+CHAN_ENTRY_MSG_UNSET
+ Entry message for %s unset.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s is not a valid ban type.
+CHAN_SET_BANTYPE_CHANGED
+ Ban type for channel %s is now #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Unknown mode character %c ignored.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Mode %c ignored because you can't lock it.
+CHAN_SET_MLOCK_L_REQUIRED
+ You must lock mode +l as well to lock mode +L.
+CHAN_SET_MLOCK_K_REQUIRED
+ You must lock mode +i as well to lock mode +K.
+CHAN_MLOCK_CHANGED
+ Mode lock on channel %s changed to %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET channel KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Topic retention option is now ON.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic retention option is now OFF.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET channel TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic lock option is now ON.
+CHAN_SET_TOPICLOCK_OFF
+ Topic lock option is now OFF.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET channel PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace option is now ON.
+CHAN_SET_PEACE_OFF
+ Peace option is now OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET channel PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Private option is now ON.
+CHAN_SET_PRIVATE_OFF
+ Private option is now OFF.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET channel SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Secure ops option is now ON.
+CHAN_SET_SECUREOPS_OFF
+ Secure ops option is now OFF.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET channel SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure founder option is now ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure founder option is now OFF.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET channel RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Restricted access option is now ON.
+CHAN_SET_RESTRICTED_OFF
+ Restricted access option is now OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET channel SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Secure option is now ON.
+CHAN_SET_SECURE_OFF
+ Secure option is now OFF.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET channel SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Signed kick option is now ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Signed kick option is now ON, but depends of the level of the
+ user that is using the command.
+CHAN_SET_SIGNKICK_OFF
+ Signed kick option is now OFF.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET channel OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-notice option is now ON.
+CHAN_SET_OPNOTICE_OFF
+ Op-notice option is now OFF.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET channel XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP lists system is now ON.
+CHAN_SET_XOP_OFF
+ xOP lists system is now OFF.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET channel NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ Channel %s will not expire.
+CHAN_SET_NOEXPIRE_OFF
+ Channel %s will expire.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Sorry, you can only have %d AOP/SOP/VOP entries on a channel.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ You can't use this command. Use the ACCESS command instead.
+ Type /msg %s HELP ACCESS for more information.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_AOP_DISABLED
+ Sorry, channel AOP list modification is temporarily disabled.
+CHAN_AOP_NICKS_ONLY
+ Channel AOP lists may only contain registered nicknames.
+CHAN_AOP_ADDED
+ %s added to %s AOP list.
+CHAN_AOP_MOVED
+ %s moved to %s AOP list.
+CHAN_AOP_NO_SUCH_ENTRY
+ No such entry (#%d) on %s AOP list.
+CHAN_AOP_NOT_FOUND
+ %s not found on %s AOP list.
+CHAN_AOP_NO_MATCH
+ No matching entries on %s AOP list.
+CHAN_AOP_DELETED
+ %s deleted from %s AOP list.
+CHAN_AOP_DELETED_ONE
+ Deleted 1 entry from %s AOP list.
+CHAN_AOP_DELETED_SEVERAL
+ Deleted %d entries from %s AOP list.
+CHAN_AOP_LIST_EMPTY
+ %s AOP list is empty.
+CHAN_AOP_LIST_HEADER
+ AOP list for %s:
+ Num Nick
+CHAN_AOP_CLEAR
+ Channel AOP list has been cleared.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_HOP_DISABLED
+ Sorry, channel HOP list modification is temporarily disabled.
+CHAN_HOP_NICKS_ONLY
+ Channel HOP lists may only contain registered nicknames.
+CHAN_HOP_ADDED
+ %s added to %s HOP list.
+CHAN_HOP_MOVED
+ %s moved to %s HOP list.
+CHAN_HOP_NO_SUCH_ENTRY
+ No such entry (#%d) on %s HOP list.
+CHAN_HOP_NOT_FOUND
+ %s not found on %s HOP list.
+CHAN_HOP_NO_MATCH
+ No matching entries on %s HOP list.
+CHAN_HOP_DELETED
+ %s deleted from %s HOP list.
+CHAN_HOP_DELETED_ONE
+ Deleted 1 entry from %s HOP list.
+CHAN_HOP_DELETED_SEVERAL
+ Deleted %d entries from %s HOP list.
+CHAN_HOP_LIST_EMPTY
+ %s HOP list is empty.
+CHAN_HOP_LIST_HEADER
+ HOP list for %s:
+ Num Nick
+CHAN_HOP_CLEAR
+ Channel HOP list has been cleared.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_SOP_DISABLED
+ Sorry, channel SOP list modification is temporarily disabled.
+CHAN_SOP_NICKS_ONLY
+ Channel SOP lists may only contain registered nicknames.
+CHAN_SOP_ADDED
+ %s added to %s SOP list.
+CHAN_SOP_MOVED
+ %s moved to %s SOP list.
+CHAN_SOP_NO_SUCH_ENTRY
+ No such entry (#%d) on %s SOP list.
+CHAN_SOP_NOT_FOUND
+ %s not found on %s SOP list.
+CHAN_SOP_NO_MATCH
+ No matching entries on %s SOP list.
+CHAN_SOP_DELETED
+ %s deleted from %s SOP list.
+CHAN_SOP_DELETED_ONE
+ Deleted 1 entry from %s SOP list.
+CHAN_SOP_DELETED_SEVERAL
+ Deleted %d entries from %s SOP list.
+CHAN_SOP_LIST_EMPTY
+ %s SOP list is empty.
+CHAN_SOP_LIST_HEADER
+ SOP list for %s:
+ Num Nick
+CHAN_SOP_CLEAR
+ Channel SOP list has been cleared.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_VOP_DISABLED
+ Sorry, channel VOP list modification is temporarily disabled.
+CHAN_VOP_NICKS_ONLY
+ Channel VOP lists may only contain registered nicknames.
+CHAN_VOP_ADDED
+ %s added to %s VOP list.
+CHAN_VOP_MOVED
+ %s moved to %s VOP list.
+CHAN_VOP_NO_SUCH_ENTRY
+ No such entry (#%d) on %s VOP list.
+CHAN_VOP_NOT_FOUND
+ %s not found on %s VOP list.
+CHAN_VOP_NO_MATCH
+ No matching entries on %s VOP list.
+CHAN_VOP_DELETED
+ %s deleted from %s VOP list.
+CHAN_VOP_DELETED_ONE
+ Deleted 1 entry from %s VOP list.
+CHAN_VOP_DELETED_SEVERAL
+ Deleted %d entries from %s VOP list.
+CHAN_VOP_LIST_EMPTY
+ %s VOP list is empty.
+CHAN_VOP_LIST_HEADER
+ VOP list for %s:
+ Num Nick
+CHAN_VOP_CLEAR
+ Channel VOP list has been cleared.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS channel {ADD|DEL|LIST|CLEAR} [nick [level] | entry-list]
+CHAN_ACCESS_XOP
+ You can't use this command.
+ Use the AOP, SOP and VOP commands instead.
+ Type /msg %s HELP command for more information.
+CHAN_ACCESS_DISABLED
+ Sorry, channel access list modification is temporarily disabled.
+CHAN_ACCESS_LEVEL_NONZERO
+ Access level must be non-zero.
+CHAN_ACCESS_LEVEL_RANGE
+ Access level must be between %d and %d inclusive.
+CHAN_ACCESS_NICKS_ONLY
+ Channel access lists may only contain registered nicknames.
+CHAN_ACCESS_REACHED_LIMIT
+ Sorry, you can only have %d access entries on a channel.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Access level for %s on %s unchanged from %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Access level for %s on %s changed to %d.
+CHAN_ACCESS_ADDED
+ %s added to %s access list at level %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ No such entry (#%d) on %s access list.
+CHAN_ACCESS_NOT_FOUND
+ %s not found on %s access list.
+CHAN_ACCESS_NO_MATCH
+ No matching entries on %s access list.
+CHAN_ACCESS_DELETED
+ %s deleted from %s access list.
+CHAN_ACCESS_DELETED_ONE
+ Deleted 1 entry from %s access list.
+CHAN_ACCESS_DELETED_SEVERAL
+ Deleted %d entries from %s access list.
+CHAN_ACCESS_LIST_EMPTY
+ %s access list is empty.
+CHAN_ACCESS_LIST_HEADER
+ Access list for %s:
+ Num Lev Nick
+CHAN_ACCESS_LIST_FOOTER
+ End of access list.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ Channel access list has been cleared.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK channel {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-or-usermask] [reason]
+CHAN_AKICK_DISABLED
+ Sorry, channel autokick list modification is temporarily disabled.
+CHAN_AKICK_ALREADY_EXISTS
+ %s already exists on %s autokick list.
+CHAN_AKICK_REACHED_LIMIT
+ Sorry, you can only have %d autokick masks on a channel.
+CHAN_AKICK_ADDED
+ %s added to %s autokick list.
+CHAN_AKICK_NO_SUCH_ENTRY
+ No such entry (#%d) on %s autokick list.
+CHAN_AKICK_NOT_FOUND
+ %s not found on %s autokick list.
+CHAN_AKICK_NO_MATCH
+ No matching entries on %s autokick list.
+CHAN_AKICK_STUCK
+ %s is now always active on channel %s.
+CHAN_AKICK_UNSTUCK
+ %s is not always active anymore on channel %s.
+CHAN_AKICK_DELETED
+ %s deleted from %s autokick list.
+CHAN_AKICK_DELETED_ONE
+ Deleted 1 entry from %s autokick list.
+CHAN_AKICK_DELETED_SEVERAL
+ Deleted %d entries from %s autokick list.
+CHAN_AKICK_LIST_EMPTY
+ %s autokick list is empty.
+CHAN_AKICK_LIST_HEADER
+ Autokick list for %s:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (by %s on %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (stuck) (by %s on %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE for %s complete; %d users were affected.
+CHAN_AKICK_CLEAR
+ Channel akick list has been cleared.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS channel {SET | DIS[ABLE] | LIST | RESET} [item [level]]
+CHAN_LEVELS_XOP
+ This command is useless in this mode.
+CHAN_LEVELS_RANGE
+ Level must be between %d and %d inclusive.
+CHAN_LEVELS_CHANGED
+ Level for %s on channel %s changed to %d.
+CHAN_LEVELS_UNKNOWN
+ Setting %s not known. Type /msg %s HELP LEVELS DESC for a list of valid settings.
+CHAN_LEVELS_DISABLED
+ %s disabled on channel %s.
+CHAN_LEVELS_LIST_HEADER
+ Access level settings for channel %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (disabled)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (founder only)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ Access levels for %s reset to defaults.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO channel [ALL]
+CHAN_INFO_HEADER
+ Information for channel %s:
+CHAN_INFO_FOUNDER
+ Founder: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Founder: %s
+CHAN_INFO_SUCCESSOR
+ Successor: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Successor: %s
+CHAN_INFO_DESCRIPTION
+ Description: %s
+CHAN_INFO_ENTRYMSG
+ Entry message: %s
+CHAN_INFO_TIME_REGGED
+ Registered: %s
+CHAN_INFO_LAST_USED
+ Last used: %s
+CHAN_INFO_LAST_TOPIC
+ Last topic: %s
+CHAN_INFO_TOPIC_SET_BY
+ Topic set by: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ E-mail address: %s
+CHAN_INFO_BANTYPE
+ Ban type: %d
+CHAN_INFO_OPTIONS
+ Options: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Topic Retention
+CHAN_INFO_OPT_OPNOTICE
+ OP Notice
+CHAN_INFO_OPT_PEACE
+ Peace
+CHAN_INFO_OPT_PRIVATE
+ Private
+CHAN_INFO_OPT_RESTRICTED
+ Restricted Access
+CHAN_INFO_OPT_SECURE
+ Secure
+CHAN_INFO_OPT_SECUREOPS
+ Secure Ops
+CHAN_INFO_OPT_SECUREFOUNDER
+ Secure Founder
+CHAN_INFO_OPT_SIGNKICK
+ Signed kicks
+CHAN_INFO_OPT_TOPICLOCK
+ Topic Lock
+CHAN_INFO_OPT_XOP
+ xOP lists system
+CHAN_INFO_OPT_NONE
+ None
+CHAN_INFO_MODE_LOCK
+ Mode lock: %s
+CHAN_INFO_NO_EXPIRE
+ This channel will not expire.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST pattern
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+CHAN_LIST_HEADER
+ List of entries matching %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ End of list - %d/%d matches shown.
+
+# INVITE responses
+CHAN_INVITE_SYNTAX
+ INVITE channel
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN channel
+CHAN_UNBANNED
+ You have been unbanned from %s.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC channel [topic]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR channel what
+CHAN_CLEARED_BANS
+ All bans on channel %s have been removed.
+CHAN_CLEARED_EXCEPTS
+ All excepts on channel %s have been removed.
+CHAN_CLEARED_MODES
+ All modes on channel %s have been reset.
+CHAN_CLEARED_OPS
+ Mode +o has been cleared from channel %s.
+CHAN_CLEARED_VOICES
+ Mode +v has been cleared from channel %s.
+CHAN_CLEARED_USERS
+ All users have been kicked from channel %s.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS channel
+CHAN_GETPASS_UNAVAILABLE
+ GETPASS command unavailable because encryption is in use.
+CHAN_GETPASS_PASSWORD_IS
+ Password for channel %s is %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS channel
+CHAN_SENDPASS_UNAVAILABLE
+ SENDPASS command unavailable because encryption is in use.
+CHAN_SENDPASS_SUBJECT
+ Channel password (%s)
+CHAN_SENDPASS_HEAD
+ Hi,
+CHAN_SENDPASS_LINE_1
+ You have requested to receive the password of channel %s by e-mail.
+CHAN_SENDPASS_LINE_2
+ The password is %s. For security reasons, you should change it as soon as you receive this mail.
+CHAN_SENDPASS_LINE_3
+ If you don't know why this mail is sent to you, please ignore it silently.
+CHAN_SENDPASS_LINE_4
+ PLEASE DON'T ANSWER TO THIS MAIL!
+CHAN_SENDPASS_LINE_5
+ %s administrators.
+CHAN_SENDPASS_OK
+ Password of %s has been sent.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID channel [reason]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID channel reason
+CHAN_FORBID_SUCCEEDED
+ Channel %s is now forbidden.
+CHAN_FORBID_FAILED
+ Couldn't forbid channel %s!
+CHAN_FORBID_REASON
+ This channel has been forbidden.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND channel [reason]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND channel reason
+CHAN_SUSPEND_SUCCEEDED
+ Channel %s is now suspended.
+CHAN_SUSPEND_FAILED
+ Couldn't suspended channel %s!
+CHAN_SUSPEND_REASON
+ This channel has been suspended.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND channel
+CHAN_UNSUSPEND_ERROR
+ No # found in front of channel name.
+CHAN_UNSUSPEND_SUCCEEDED
+ Channel %s is now released.
+CHAN_UNSUSPEND_FAILED
+ Couldn't release channel %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s matches an except on %s and cannot be banned until the except have been removed.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ You have 1 new memo.
+MEMO_HAVE_NEW_MEMOS
+ You have %d new memos.
+MEMO_TYPE_READ_LAST
+ Type /msg %s READ LAST to read it.
+MEMO_TYPE_READ_NUM
+ Type /msg %s READ %d to read it.
+MEMO_TYPE_LIST_NEW
+ Type /msg %s LIST NEW to list them.
+MEMO_AT_LIMIT
+ Warning: You have reached your maximum number of memos (%d). You will be unable to receive any new memos until you delete some of your current ones.
+MEMO_OVER_LIMIT
+ Warning: You are over your maximum number of memos (%d). You will be unable to receive any new memos until you delete some of your current ones.
+MEMO_X_MANY_NOTICE
+ There are %d memos on channel %s.
+MEMO_X_ONE_NOTICE
+ There is %d memo on channel %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ There is a new memo on channel %s.
+ Type /msg %s READ %s %d to read it.
+MEMO_NEW_MEMO_ARRIVED
+ You have a new memo from %s.
+ Type /msg %s READ %d to read it.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ You have no memos.
+MEMO_X_HAS_NO_MEMOS
+ %s has no memos.
+MEMO_DOES_NOT_EXIST
+ Memo %d does not exist!
+MEMO_LIST_NOT_FOUND
+ No matching memos found.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | channel} memo-text
+MEMO_SEND_DISABLED
+ Sorry, memo sending is temporarily disabled.
+MEMO_SEND_PLEASE_WAIT
+ Please wait %d seconds before using the SEND command again.
+MEMO_X_GETS_NO_MEMOS
+ %s cannot receive memos.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s currently has too many memos and cannot receive more.
+MEMO_SENT
+ Memo sent to %s.
+MEMO_MASS_SENT
+ A massmemo has been sent to all registered users.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | channel}
+MEMO_CANCEL_DISABLED
+ Sorry, memo cancelling is temporarily disabled.
+MEMO_CANCEL_NONE
+ No memo was cancellable.
+MEMO_CANCELLED
+ Last memo to %s has been cancelled.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [channel] [list | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ You have no new memos.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s has no new memos.
+MEMO_LIST_MEMOS
+ Memos for %s. To read, type: /msg %s READ num
+MEMO_LIST_NEW_MEMOS
+ New memos for %s. To read, type: /msg %s READ num
+MEMO_LIST_CHAN_MEMOS
+ Memos for %s. To read, type: /msg %s READ %s num
+MEMO_LIST_CHAN_NEW_MEMOS
+ New memos for %s. To read, type: /msg %s READ %s num
+MEMO_LIST_HEADER
+ Num Sender Date/Time
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [channel] {list | LAST | NEW}
+MEMO_HEADER
+ Memo %d from %s (%s). To delete, type: /msg %s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d from %s (%s). To delete, type: /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [channel] {num | list | ALL}
+MEMO_DELETED_NONE
+ No memos were deleted.
+MEMO_DELETED_ONE
+ Memo %d has been deleted.
+MEMO_DELETED_SEVERAL
+ Memos %s have been deleted.
+MEMO_DELETED_ALL
+ All of your memos have been deleted.
+MEMO_CHAN_DELETED_ALL
+ All memos for channel %s have been deleted.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET option parameters
+MEMO_SET_DISABLED
+ Sorry, memo option setting is temporarily disabled.
+MEMO_SET_UNKNOWN_OPTION
+ Unknown SET option %s.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s will now notify you of memos when you log on and when they are sent to you.
+MEMO_SET_NOTIFY_LOGON
+ %s will now notify you of memos when you log on or unset /AWAY.
+MEMO_SET_NOTIFY_NEW
+ %s will now notify you of memos when they are sent to you.
+MEMO_SET_NOTIFY_OFF
+ %s will not send you any notification of memos.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [channel] limit
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [user | channel] {limit | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ You are not permitted to change your memo limit.
+MEMO_SET_LIMIT_FORBIDDEN
+ The memo limit for %s may not be changed.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ You cannot set your memo limit higher than %d.
+MEMO_SET_LIMIT_TOO_HIGH
+ You cannot set the memo limit for %s higher than %d.
+MEMO_SET_LIMIT_OVERFLOW
+ Memo limit too large; limiting to %d instead.
+MEMO_SET_YOUR_LIMIT
+ Your memo limit has been set to %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ You will no longer be able to receive memos.
+MEMO_UNSET_YOUR_LIMIT
+ Your memo limit has been disabled.
+MEMO_SET_LIMIT
+ Memo limit for %s set to %d.
+MEMO_SET_LIMIT_ZERO
+ Memo limit for %s set to 0.
+MEMO_UNSET_LIMIT
+ Memo limit disabled for %s.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [channel]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | channel]
+MEMO_INFO_NO_MEMOS
+ You currently have no memos.
+MEMO_INFO_MEMO
+ You currently have 1 memo.
+MEMO_INFO_MEMO_UNREAD
+ You currently have 1 memo, and it has not yet been read.
+MEMO_INFO_MEMOS
+ You currently have %d memos.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ You currently have %d memos, of which 1 is unread.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ You currently have %d memos, of which %d are unread.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ You currently have %d memos; all of them are unread.
+MEMO_INFO_LIMIT
+ Your memo limit is %d.
+MEMO_INFO_HARD_LIMIT
+ Your memo limit is %d, and may not be changed.
+MEMO_INFO_LIMIT_ZERO
+ Your memo limit is 0; you will not receive any new memos.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Your memo limit is 0; you will not receive any new memos. You cannot change this limit.
+MEMO_INFO_NO_LIMIT
+ You have no limit on the number of memos you may keep.
+MEMO_INFO_NOTIFY_OFF
+ You will not be notified of new memos.
+MEMO_INFO_NOTIFY_ON
+ You will be notified of new memos at logon and when they arrive.
+MEMO_INFO_NOTIFY_RECEIVE
+ You will be notified when new memos arrive.
+MEMO_INFO_NOTIFY_SIGNON
+ You will be notified of new memos at logon.
+MEMO_INFO_X_NO_MEMOS
+ %s currently has no memos.
+MEMO_INFO_X_MEMO
+ %s currently has 1 memo.
+MEMO_INFO_X_MEMO_UNREAD
+ %s currently has 1 memo, and it has not yet been read.
+MEMO_INFO_X_MEMOS
+ %s currently has %d memos.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s currently has %d memos, of which 1 is unread.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s currently has %d memos, of which %d are unread.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s currently has %d memos; all of them are unread.
+MEMO_INFO_X_LIMIT
+ %s's memo limit is %d.
+MEMO_INFO_X_HARD_LIMIT
+ %s's memo limit is %d, and may not be changed.
+MEMO_INFO_X_NO_LIMIT
+ %s has no memo limit.
+MEMO_INFO_X_NOTIFY_OFF
+ %s is not notified of new memos.
+MEMO_INFO_X_NOTIFY_ON
+ %s is notified of new memos at logon and when they arrive.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s is notified when new memos arrive.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s is notified of news memos at logon.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Bot %s does not exist.
+BOT_NOT_ASSIGNED
+ You must assign a bot to the channel before using this command.
+ Type /msg %S HELP ASSIGN for more information.
+BOT_NOT_ON_CHANNEL
+ Bot is not on channel %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ Don't use word %s on this channel!
+BOT_REASON_BADWORD_GENTLE
+ Watch your language!
+BOT_REASON_BOLD
+ Don't use bolds on this channel!
+BOT_REASON_CAPS
+ Turn caps lock OFF!
+BOT_REASON_COLOR
+ Don't use colors on this channel!
+BOT_REASON_FLOOD
+ Stop flooding!
+BOT_REASON_REPEAT
+ Stop repeating yourself!
+BOT_REASON_REVERSE
+ Don't use reverses on this channel!
+BOT_REASON_UNDERLINE
+ Don't use underlines on this channel!
+
+# !seen replies
+BOT_SEEN_BOT
+ You found me, %s!
+BOT_SEEN_YOU
+ Looking for yourself, eh %s?
+BOT_SEEN_ON_CHANNEL
+ %s is on the channel right now!
+BOT_SEEN_ON_CHANNEL_AS
+ %s is on the channel right now (as %s) !
+BOT_SEEN_ON
+ %s was last seen here %s ago.
+BOT_SEEN_NEVER
+ I've never seen %s on this channel.
+BOT_SEEN_UNKNOWN
+ I don't know who %s is.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick user host real
+ BOT CHANGE oldnick newnick [user [host [real]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ Bot %s already exists.
+BOT_BOT_CREATION_FAILED
+ Sorry, bot creation failed.
+BOT_BOT_READONLY
+ Sorry, bot modification is temporarily disabled.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) added to the bot list.
+BOT_BOT_ANY_CHANGES
+ Old info is equal to the new one.
+BOT_BOT_CHANGED
+ Bot %s has been changed to %s!%s@%s (%s)
+BOT_BOT_DELETED
+ Bot %s has been deleted.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Bot list:
+BOT_BOTLIST_PRIVATE_HEADER
+ Bots reserved to IRC operators:
+BOT_BOTLIST_FOOTER
+ %d bots available.
+BOT_BOTLIST_EMPTY
+ There are no bots available at this time.
+ Ask a Services admin to create one!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN chan nick
+BOT_ASSIGN_READONLY
+ Sorry, bot assignment is temporarily disabled.
+BOT_ASSIGN_ALREADY
+ Bot %s is already assigned to channel %s.
+BOT_ASSIGN_ASSIGNED
+ Bot %s has been assigned to %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN chan
+BOT_UNASSIGN_UNASSIGNED
+ There is no bot assigned to %s anymore.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {chan | nick}
+BOT_INFO_NOT_FOUND
+ %s is not a valid bot or registered channel.
+BOT_INFO_BOT_HEADER
+ Information for bot %s:
+BOT_INFO_BOT_MASK
+ Mask : %s@%s
+BOT_INFO_BOT_REALNAME
+ Real name : %s
+BOT_INFO_BOT_CREATED
+ Created : %s
+BOT_INFO_BOT_USAGE
+ Used on : %d channel(s)
+BOT_INFO_BOT_OPTIONS
+ Options : %s
+BOT_INFO_OPT_PRIVATE
+ Private
+BOT_INFO_CHAN_HEADER
+ Information for channel %s:
+BOT_INFO_CHAN_BOT
+ Bot nick : %s
+BOT_INFO_CHAN_BOT_NONE
+ Bot nick : not assigned yet.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Bad words kicker : %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Bad words kicker : %s (%d kick(s) to ban)
+BOT_INFO_CHAN_KICK_BOLDS
+ Bolds kicker : %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Bolds kicker : %s (%d kick(s) to ban)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Caps kicker : %s (minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Caps kicker : %s (%d kick(s) to ban; minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Caps kicker : %s
+BOT_INFO_CHAN_KICK_COLORS
+ Colors kicker : %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Colors kicker : %s (%d kick(s) to ban)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Flood kicker : %s (%d lines in %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Flood kicker : %s (%d kick(s) to ban; %d lines in %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Flood kicker : %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Repeat kicker : %s (%d times)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Repeat kicker : %s (%d kick(s) to ban; %d times)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Repeat kicker : %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Reverses kicker : %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Reverses kicker : %s (%d kick(s) to ban)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Underlines kicker : %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Underlines kicker : %s (%d kick(s) to ban)
+BOT_INFO_ACTIVE
+ enabled
+BOT_INFO_INACTIVE
+ disabled
+BOT_INFO_CHAN_OPTIONS
+ Options : %s
+BOT_INFO_OPT_DONTKICKOPS
+ Ops protection
+BOT_INFO_OPT_DONTKICKVOICES
+ Voices protection
+BOT_INFO_OPT_FANTASY
+ Fantasy
+BOT_INFO_OPT_GREET
+ Greet
+BOT_INFO_OPT_NOBOT
+ No bot
+BOT_INFO_OPT_SYMBIOSIS
+ Symbiosis
+BOT_INFO_OPT_NONE
+ None
+
+# SET responses
+BOT_SET_SYNTAX
+ SET channel option settings
+BOT_SET_DISABLED
+ Sorry, bot option setting is temporarily disabled.
+BOT_SET_UNKNOWN
+ Unknown option %s.
+ Type /msg %S HELP SET for more information.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET channel DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Bot won't kick ops on channel %s.
+BOT_SET_DONTKICKOPS_OFF
+ Bot will kick ops on channel %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET channel DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Bot won't kick voices on channel %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Bot will kick voices on channel %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET channel FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Fantasy mode is now ON on channel %s.
+BOT_SET_FANTASY_OFF
+ Fantasy mode is now OFF on channel %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET channel GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Greet mode is now ON on channel %s.
+BOT_SET_GREET_OFF
+ Greet mode is now OFF on channel %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET botname NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ No Bot mode is now ON on channel %s.
+BOT_SET_NOBOT_OFF
+ No Bot mode is now OFF on channel %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET botname PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Private mode of bot %s is now ON.
+BOT_SET_PRIVATE_OFF
+ Private mode of bot %s is now OFF.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET channel SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ Symbiosis mode is now ON on channel %s.
+BOT_SET_SYMBIOSIS_OFF
+ Symbiosis mode is now OFF on channel %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK channel option {ON|OFF} [settings]
+BOT_KICK_DISABLED
+ Sorry, kicker configuration is temporarily disabled.
+BOT_KICK_UNKNOWN
+ Unknown option %s.
+ Type /msg %S HELP KICK for more information.
+BOT_KICK_BAD_TTB
+ %s cannot be taken as times to ban.
+
+BOT_KICK_BADWORDS_ON
+ Bot will now kick bad words. Use the BADWORDS command
+ to add or remove a bad word.
+BOT_KICK_BADWORDS_ON_BAN
+ Bot will now kick bad words, and will place a ban after
+ %d kicks for the same user. Use the BADWORDS command
+ to add or remove a bad word.
+BOT_KICK_BADWORDS_OFF
+ Bot won't kick bad words anymore.
+BOT_KICK_BOLDS_ON
+ Bot will now kick bolds.
+BOT_KICK_BOLDS_ON_BAN
+ Bot will now kick bolds, and will place a ban after
+ %d kicks for the same user.
+BOT_KICK_BOLDS_OFF
+ Bot won't kick bolds anymore.
+BOT_KICK_CAPS_ON
+ Bot will now kick caps (they must constitute at least
+ %d characters and %d%% of the entire message).
+BOT_KICK_CAPS_ON_BAN
+ Bot will now kick caps (they must constitute at least
+ %d characters and %d%% of the entire message), and will
+ place a ban after %d kicks for the same user.
+BOT_KICK_CAPS_OFF
+ Bot won't kick caps anymore.
+BOT_KICK_COLORS_ON
+ Bot will now kick colors.
+BOT_KICK_COLORS_ON_BAN
+ Bot will now kick colors, and will place a ban after %d
+ kicks for the same user.
+BOT_KICK_COLORS_OFF
+ Bot won't kick colors anymore.
+BOT_KICK_FLOOD_ON
+ Bot will now kick flood (%d lines in %d seconds).
+BOT_KICK_FLOOD_ON_BAN
+ Bot will now kick flood (%d lines in %d seconds), and
+ will place a ban after %d kicks for the same user.
+BOT_KICK_FLOOD_OFF
+ Bot won't kick flood anymore.
+BOT_KICK_REPEAT_ON
+ Bot will now kick repeats (users that say %d times
+ the same thing).
+BOT_KICK_REPEAT_ON_BAN
+ Bot will now kick repeats (users that say %d times
+ the same thing), and will place a ban after %d
+ kicks for the same user.
+BOT_KICK_REPEAT_OFF
+ Bot won't kick repeats anymore.
+BOT_KICK_REVERSES_ON
+ Bot will now kick reverses.
+BOT_KICK_REVERSES_ON_BAN
+ Bot will now kick reverses, and will place a ban after %d
+ kicks for the same user.
+BOT_KICK_REVERSES_OFF
+ Bot won't kick reverses anymore.
+BOT_KICK_UNDERLINES_ON
+ Bot will now kick underlines.
+BOT_KICK_UNDERLINES_ON_BAN
+ Bot will now kick underlines, and will place a ban after %d
+ kicks for the same user.
+BOT_KICK_UNDERLINES_OFF
+ Bot won't kick underlines anymore.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS channel {ADD|DEL|LIST|CLEAR} [word | entry-list] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Sorry, channel bad words list modification is temporarily disabled.
+BOT_BADWORDS_REACHED_LIMIT
+ Sorry, you can only have %d bad words entries on a channel.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s already exists in %s bad words list.
+BOT_BADWORDS_ADDED
+ %s added to %s bad words list.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ No such entry (#%d) on %s bad words list.
+BOT_BADWORDS_NOT_FOUND
+ %s not found on %s bad words list.
+BOT_BADWORDS_NO_MATCH
+ No matching entries on %s bad words list.
+BOT_BADWORDS_DELETED
+ %s deleted from %s bad words list.
+BOT_BADWORDS_DELETED_ONE
+ Deleted 1 entry from %s bad words list.
+BOT_BADWORDS_DELETED_SEVERAL
+ Deleted %d entries from %s bad words list.
+BOT_BADWORDS_LIST_EMPTY
+ %s bad words list is empty.
+BOT_BADWORDS_LIST_HEADER
+ Bad words list for %s:
+ Num Word Type
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ Bad words list is now empty.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY channel text
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT channel text
+
+# Errors
+BOT_EXCEPT
+ User matches channel except.
+BOT_BAD_NICK
+ Bot Nicks may only contain valid nick characters.
+BOT_BAD_HOST
+ Bot Hosts may only contain valid host characters.
+BOT_BAD_IDENT
+ Bot Idents may only contain valid characters.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Services is unable to change modes. Are your servers configured correctly?
+OPER_BOUNCY_MODES_U_LINE
+ Services is unable to change modes. Are your servers' U:lines configured correctly?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL message
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Unknown STATS option %s.
+OPER_STATS_CURRENT_USERS
+ Current users: %d (%d ops)
+OPER_STATS_MAX_USERS
+ Maximum users: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Services up %d days, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Services up %d day, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Services up %d hours, %d minutes
+OPER_STATS_UPTIME_HM1S
+ Services up %d hours, %d minutes
+OPER_STATS_UPTIME_H1MS
+ Services up %d hours, %d minute
+OPER_STATS_UPTIME_H1M1S
+ Services up %d hours, %d minute
+OPER_STATS_UPTIME_1HMS
+ Services up %d hour, %d minutes
+OPER_STATS_UPTIME_1HM1S
+ Services up %d hour, %d minutes
+OPER_STATS_UPTIME_1H1MS
+ Services up %d hour, %d minute
+OPER_STATS_UPTIME_1H1M1S
+ Services up %d hour, %d minute
+OPER_STATS_UPTIME_MS
+ Services up %d minutes, %d seconds
+OPER_STATS_UPTIME_M1S
+ Services up %d minutes, %d second
+OPER_STATS_UPTIME_1MS
+ Services up %d minute, %d seconds
+OPER_STATS_UPTIME_1M1S
+ Services up %d minute, %d second
+OPER_STATS_BYTES_READ
+ Bytes read : %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Bytes written : %5d kB
+OPER_STATS_USER_MEM
+ User : %6d records, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Channel : %6d records, %5d kB
+OPER_STATS_GROUPS_MEM
+ NS Groups : %6d records, %5d kB
+OPER_STATS_ALIASES_MEM
+ NS Aliases : %6d records, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d records, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d records, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessions : %6d records, %5d kB
+OPER_STATS_PROXY_MEM
+ Proxies : %6d records, %5d kB
+OPER_STATS_AKILL_COUNT
+ Current number of AKILLs: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Default AKILL expiry time: %d days
+OPER_STATS_AKILL_EXPIRE_DAY
+ Default AKILL expiry time: 1 day
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Default AKILL expiry time: %d hours
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Default AKILL expiry time: 1 hour
+OPER_STATS_AKILL_EXPIRE_MINS
+ Default AKILL expiry time: %d minutes
+OPER_STATS_AKILL_EXPIRE_MIN
+ Default AKILL expiry time: 1 minute
+OPER_STATS_AKILL_EXPIRE_NONE
+ Default AKILL expiry time: No expiration
+OPER_STATS_SGLINE_COUNT
+ Current number of SGLINEs: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Default SGLINE expiry time: %d days
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Default SGLINE expiry time: 1 day
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Default SGLINE expiry time: %d hours
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Default SGLINE expiry time: 1 hour
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Default SGLINE expiry time: %d minutes
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Default SGLINE expiry time: 1 minute
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Default SGLINE expiry time: No expiration
+OPER_STATS_SQLINE_COUNT
+ Current number of SQLINEs: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Default SQLINE expiry time: %d days
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Default SQLINE expiry time: 1 day
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Default SQLINE expiry time: %d hours
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Default SQLINE expiry time: 1 hour
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Default SQLINE expiry time: %d minutes
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Default SQLINE expiry time: 1 minute
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Default SQLINE expiry time: No expiration
+OPER_STATS_SZLINE_COUNT
+ Current number of SZLINEs: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Default SZLINE expiry time: %d days
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Default SZLINE expiry time: 1 day
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Default SZLINE expiry time: %d hours
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Default SZLINE expiry time: 1 hour
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Default SZLINE expiry time: %d minutes
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Default SZLINE expiry time: 1 minute
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Default SZLINE expiry time: No expiration
+OPER_STATS_RESET
+ Statistics reset.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE channel modes
+
+# UMODE respondes
+OPER_UMODE_SYNTAX
+ UMODE nick modes
+OPER_UMODE_SUCCESS
+ Changed usermodes of %s.
+OPER_UMODE_CHANGED
+ %s changed your usermodes.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flags
+OPER_OLINE_SUCCESS
+ Operflags %s have been added for %s.
+OPER_OLINE_IRCOP
+ You are now an IRC Operator.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES channel [ALL]
+OPER_CLEARMODES_DONE
+ Binary modes and bans cleared from channel %s.
+OPER_CLEARMODES_ALL_DONE
+ All modes cleared from channel %s.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK channel user reason
+
+# SVSNICK responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick newnick
+OPER_SVSNICK_NEWNICK
+ The nick %s is now being changed to %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+OPER_ADMIN_SKELETON
+ Services is in skeleton mode; the ADMIN command is unavailable.
+OPER_ADMIN_EXISTS
+ %s already exists on Services admin list.
+OPER_ADMIN_REACHED_LIMIT
+ Sorry, you can only have %d Services admins.
+OPER_ADMIN_ADDED
+ %s added to Services admin list.
+OPER_ADMIN_NOT_FOUND
+ %s not found on Services admin list.
+OPER_ADMIN_NO_MATCH
+ No matching entries on Services admin list.
+OPER_ADMIN_DELETED
+ %s deleted from Services admin list.
+OPER_ADMIN_DELETED_ONE
+ Deleted 1 entry from Services admin list.
+OPER_ADMIN_DELETED_SEVERAL
+ Deleted %d entries from Services admin list.
+OPER_ADMIN_LIST_EMPTY
+ Services admin list is empty.
+OPER_ADMIN_LIST_HEADER
+ Services admin list:
+ Num Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Services admin list has been cleared.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+OPER_OPER_SKELETON
+ Services is in skeleton mode; the OPER command is unavailable.
+OPER_OPER_EXISTS
+ %s already exists on Services operator list.
+OPER_OPER_REACHED_LIMIT
+ Sorry, you can only have %d Services operators.
+OPER_OPER_ADDED
+ %s added to Services operator list.
+OPER_OPER_NOT_FOUND
+ %s not found on Services operator list.
+OPER_OPER_NO_MATCH
+ No matching entries on Services operator list.
+OPER_OPER_DELETED
+ %s deleted from Services operator list.
+OPER_OPER_DELETED_ONE
+ Deleted 1 entry from Services operator list.
+OPER_OPER_DELETED_SEVERAL
+ Deleted %d entries from Services operator list.
+OPER_OPER_LIST_EMPTY
+ Services operator list is empty.
+OPER_OPER_LIST_HEADER
+ Services operator list:
+ Num Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ Services operator list has been cleared.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_AKILL_EXISTS
+ %s already exists on the AKILL list.
+OPER_AKILL_ALREADY_COVERED
+ %s is already covered by %s.
+OPER_AKILL_REACHED_LIMIT
+ Sorry, you can only have %d AKILLs.
+OPER_AKILL_NO_NICK
+ Reminder: AKILL masks cannot contain nicknames; make sure you have not included a nick portion in your mask.
+OPER_AKILL_ADDED
+ %s added to the AKILL list.
+OPER_AKILL_CHANGED
+ Expiry time of %s changed.
+OPER_AKILL_NOT_FOUND
+ %s not found on the AKILL list.
+OPER_AKILL_NO_MATCH
+ No matching entries on the AKILL list.
+OPER_AKILL_DELETED
+ %s deleted from the AKILL list.
+OPER_AKILL_DELETED_ONE
+ Deleted 1 entry from the AKILL list.
+OPER_AKILL_DELETED_SEVERAL
+ Deleted %d entries from the AKILL list.
+OPER_AKILL_LIST_EMPTY
+ AKILL list is empty.
+OPER_AKILL_LIST_HEADER
+ Current AKILL list:
+ Num Mask Reason
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Current AKILL list:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ The AKILL list has been cleared.
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list}[:reason]]
+OPER_SGLINE_UNSUPPORTED
+ Sorry, SGLINE is not available on this network.
+OPER_SGLINE_EXISTS
+ %s already exists on the SGLINE list.
+OPER_SGLINE_ALREADY_COVERED
+ %s is already covered by %s.
+OPER_SGLINE_REACHED_LIMIT
+ Sorry, you can only have %d SGLINEs.
+OPER_SGLINE_ADDED
+ %s added to the SGLINE list.
+OPER_SGLINE_CHANGED
+ Expiry time of %s changed.
+OPER_SGLINE_NOT_FOUND
+ %s not found on the SGLINE list.
+OPER_SGLINE_NO_MATCH
+ No matching entries on the SGLINE list.
+OPER_SGLINE_DELETED
+ %s deleted from the SGLINE list.
+OPER_SGLINE_DELETED_ONE
+ Deleted 1 entry from the SGLINE list.
+OPER_SGLINE_DELETED_SEVERAL
+ Deleted %d entries from the SGLINE list.
+OPER_SGLINE_LIST_EMPTY
+ SGLINE list is empty.
+OPER_SGLINE_LIST_HEADER
+ Current SGLINE list:
+ Num Mask Reason
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Current SGLINE list:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ The SGLINE list has been cleared.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Channel SQLINEs are not supported by your IRCd, so you can't use them.
+OPER_SQLINE_EXISTS
+ %s already exists on the SQLINE list.
+OPER_SQLINE_ALREADY_COVERED
+ %s is already covered by %s.
+OPER_SQLINE_REACHED_LIMIT
+ Sorry, you can only have %d SQLINEs.
+OPER_SQLINE_ADDED
+ %s added to the SQLINE list.
+OPER_SQLINE_CHANGED
+ Expiry time of %s changed.
+OPER_SQLINE_NOT_FOUND
+ %s not found on the SQLINE list.
+OPER_SQLINE_NO_MATCH
+ No matching entries on the SQLINE list.
+OPER_SQLINE_DELETED
+ %s deleted from the SQLINE list.
+OPER_SQLINE_DELETED_ONE
+ Deleted 1 entry from the SQLINE list.
+OPER_SQLINE_DELETED_SEVERAL
+ Deleted %d entries from the SQLINE list.
+OPER_SQLINE_LIST_EMPTY
+ SQLINE list is empty.
+OPER_SQLINE_LIST_HEADER
+ Current SQLINE list:
+ Num Mask Reason
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Current SQLINE list:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ The SQLINE list has been cleared.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_SZLINE_UNSUPPORTED
+ Sorry, SZLINE is not available on this network.
+OPER_SZLINE_EXISTS
+ %s already exists on the SZLINE list.
+OPER_SZLINE_ALREADY_COVERED
+ %s is already covered by %s.
+OPER_SZLINE_REACHED_LIMIT
+ Sorry, you can only have %d SZLINEs.
+OPER_SZLINE_ONLY_IPS
+ Reminder: you can only add IP masks to the SZLINE list.
+OPER_SZLINE_ADDED
+ %s added to the SZLINE list.
+OPER_SZLINE_CHANGED
+ Expiry time of %s changed.
+OPER_SZLINE_NOT_FOUND
+ %s not found on the SZLINE list.
+OPER_SZLINE_NO_MATCH
+ No matching entries on the SZLINE list.
+OPER_SZLINE_DELETED
+ %s deleted from the SZLINE list.
+OPER_SZLINE_DELETED_ONE
+ Deleted 1 entry from the SZLINE list.
+OPER_SZLINE_DELETED_SEVERAL
+ Deleted %d entries from the SZLINE list.
+OPER_SZLINE_LIST_EMPTY
+ SZLINE list is empty.
+OPER_SZLINE_LIST_HEADER
+ Current SZLINE list:
+ Num Mask Reason
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Current SZLINE list:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ The SZLINE list has been cleared.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET option setting
+OPER_SET_IGNORE_ON
+ Ignore code will be used.
+OPER_SET_IGNORE_OFF
+ Ignore code will not be used.
+OPER_SET_IGNORE_ERROR
+ Setting for IGNORE must be ON or OFF.
+OPER_SET_READONLY_ON
+ Services is now in read-only mode.
+OPER_SET_READONLY_OFF
+ Services is now in read-write mode.
+OPER_SET_READONLY_ERROR
+ Setting for READONLY must be ON or OFF.
+OPER_SET_LOGCHAN_ON
+ Services is now reporting log messages to %s.
+OPER_SET_LOGCHAN_OFF
+ Services is no longer reporting log messages to a channel.
+OPER_SET_LOGCHAN_ERROR
+ Setting for LOGCHAN must be ON or OFF and LogChannel must be defined.
+OPER_SET_DEBUG_ON
+ Services is now in debug mode.
+OPER_SET_DEBUG_OFF
+ Services is now in non-debug mode.
+OPER_SET_DEBUG_LEVEL
+ Services is now in debug mode (level %d).
+OPER_SET_DEBUG_ERROR
+ Setting for DEBUG must be ON, OFF, or a positive number.
+OPER_SET_NOEXPIRE_ON
+ Services is now in no expire mode.
+OPER_SET_NOEXPIRE_OFF
+ Services is now in expire mode.
+OPER_SET_NOEXPIRE_ERROR
+ Setting for NOEXPIRE must be ON or OFF.
+OPER_SET_UNKNOWN_OPTION
+ Unknown option %s.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} server
+OPER_NOOP_SET
+ All O:lines of %s have been removed.
+OPER_NOOP_REVOKE
+ All O:lines of %s have been reset.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE servername [reason]
+OPER_JUPE_HOST_ERROR
+ Please use a valid server name when juping
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW text
+
+# UPDATE responses
+OPER_UPDATING
+ Updating databases.
+
+# RELOAD responses
+OPER_RELOAD
+ Services' configuration file has been reloaded.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN not defined; cannot restart. Rerun the \2configure\2 script and recompile Services to enable the RESTART command.
+
+# IGNORE respondes
+OPER_IGNORE_SYNTAX
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick]
+OPER_IGNORE_VALID_TIME
+ You have to enter a valid number as time.
+OPER_IGNORE_TIME_DONE
+ Nick %s will now be ignored for %s.
+OPER_IGNORE_PERM_DONE
+ Nick %s will now permanently be ignored.
+OPER_IGNORE_DEL_DONE
+ Nick %s will no longer be ignored.
+OPER_IGNORE_LIST
+ Services ignore list:
+OPER_IGNORE_LIST_NOMATCH
+ Nick %s not found on ignore list.
+OPER_IGNORE_LIST_EMPTY
+ Ignore list is empty.
+OPER_IGNORE_LIST_CLEARED
+ Ignore list has been cleared.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Could not find user %s.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Channel list:
+ Name Users Modes Topic
+OPER_CHANLIST_HEADER_USER
+ %s channel list:
+ Name Users Modes Topic
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ End of channel list.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Users list:
+ Nick Mask
+OPER_USERLIST_HEADER_CHAN
+ %s users list:
+ Nick Mask
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ End of users list.
+
+# CACHE responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {hostname | pattern} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Proxy detection is disabled.
+OPER_CACHE_NOT_FOUND
+ %s was not found in the cache.
+OPER_CACHE_REMOVED
+ %s has been removed from the cache.
+OPER_CACHE_HEADER
+ Hostname Status
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ End of list - %d/%d matches shown.
+OPER_CACHE_QUEUED
+ Queued
+OPER_CACHE_PROGRESS
+ In progress
+OPER_CACHE_NORMAL
+ Normal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ HTTP proxy
+OPER_SUPER_ADMIN_ON
+ You are now a SuperAdmin
+OPER_SUPER_ADMIN_OFF
+ You are no longer a SuperAdmin
+OPER_SUPER_ADMIN_SYNTAX
+ Setting for SuperAdmin must be ON or OFF (must be enabled in services.conf)
+OPER_SUPER_ADMIN_WALL_ON
+ %s is now a Super-Admin
+OPER_SUPER_ADMIN_WALL_OFF
+ %s is no longer a Super-Admin
+OPER_SUPER_ADMIN_ONLY
+ Only Super-Admins can use this command.
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ Services are in Defcon mode, Please try again later.
+OPER_DEFCON_NO_CONF
+ The Defcon system must be enabled in the services.conf file
+OPER_DEFCON_CHANGED
+ Services are now at DEFCON %d
+OPER_DEFCON_WALL
+ %s Changed the DEFCON level to %d
+DEFCON_GLOBAL
+ The Defcon Level is now at Level: %d
+
+# Module strings
+
+OPER_MODULE_LOADED
+ Module %s loaded
+OPER_MODULE_UNLOADED
+ Module %s unloaded
+OPER_MODULE_LOAD_FAIL
+ Unable to load module %s
+OPER_MODULE_REMOVE_FAIL
+ Unable to remove module %s
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST
+ Module: %s
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Providing IRCD handler for: %s
+OPER_MODULE_NO_LIST
+ No modules currently loaded
+OPER_MODULE_NO_INFO
+ No information about module %s is available
+OPER_MODULE_INFO_SYNTAX
+ MODINFO FileName
+MODULE_HELP_HEADER
+ The following commands have been loaded by a module:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [params]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+expiry] mask limit reason
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {mask | list}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE num position
+OPER_EXCEPTION_DISABLED
+ Session limiting is disabled.
+OPER_EXCEPTION_ALREADY_PRESENT
+ Mask %s already present on exception list.
+OPER_EXCEPTION_TOO_MANY
+ Session-limit exception list is full!
+OPER_EXCEPTION_ADDED
+ Session limit for %s set to %d.
+OPER_EXCEPTION_MOVED
+ Exception for %s (#%d) moved to position %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ No such entry (#%d) session-limit exception list.
+OPER_EXCEPTION_NOT_FOUND
+ %s not found on session-limit exception list.
+OPER_EXCEPTION_NO_MATCH
+ No matching entries on session-limit exception list.
+OPER_EXCEPTION_DELETED
+ %s deleted from session-limit exception list.
+OPER_EXCEPTION_DELETED_ONE
+ Deleted 1 entry from session-limit exception list.
+OPER_EXCEPTION_DELETED_SEVERAL
+ Deleted %d entries from session-limit exception list.
+OPER_EXCEPTION_LIST_HEADER
+ Current Session Limit Exception list:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Num Limit Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (by %s on %s; %s)
+ Limit: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Invalid session limit. It must be a valid integer greater than or equal to zero and less than %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Invalid hostmask. Only real hostmasks are valid as exceptions are not matched against nicks or usernames.
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST limit | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST limit
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ Session limiting is disabled.
+OPER_SESSION_INVALID_THRESHOLD
+ Invalid threshold value. It must be a valid integer greater than 1.
+OPER_SESSION_NOT_FOUND
+ %s not found on session list.
+OPER_SESSION_LIST_HEADER
+ Hosts with atleast %d sessions:
+OPER_SESSION_LIST_COLHEAD
+ Sessions Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ The host %s currently has %d sessions with a limit of %d.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Syntax: EXCEPTION ADD [+expiry] mask limit reason
+ EXCEPTION DEL {mask | list}
+ EXCEPTION MOVE num position
+ EXCEPTION LIST [mask | list]
+ EXCEPTION VIEW [mask | list]
+
+ Allows Services admins to manipulate the list of hosts that
+ have specific session limits - allowing certain machines,
+ such as shell servers, to carry more than the default number
+ of clients at a time. Once a host reaches it's session limit,
+ all clients attempting to connect from that host will be
+ killed. Before the user is killed, they are notified, via a
+ /NOTICE from %S, of a source of help regarding session
+ limiting. The content of this notice is a config setting.
+
+ EXCEPTION ADD adds the given host mask to the exception list.
+ Note that nick!user@host and user@host masks are invalid!
+ Only real host masks, such as box.host.dom and *.host.dom,
+ are allowed because sessions limiting does not take nick or
+ user names into account. limit must be a number greater than
+ or equal to zero. This determines how many sessions this host
+ may carry at a time. A value of zero means the host has an
+ unlimited session limit. See the AKILL help for details about
+ the format of the optional expiry parameter.
+ EXCEPTION DEL removes the given mask from the exception list.
+ EXCEPTION MOVE moves exception num to position. The
+ exceptions inbetween will be shifted up or down to fill the gap.
+ EXCEPTION LIST and EXCEPTION VIEW show all current
+ exceptions; if the optional mask is given, the list is limited
+ to those exceptions matching the mask. The difference is that
+ EXCEPTION VIEW is more verbose, displaying the name of the
+ person who added the exception, it's session limit, reason,
+ host mask and the expiry date and time.
+
+ Note that a connecting client will "use" the first exception
+ their host matches. Large exception lists and widely matching
+ exception masks are likely to degrade services' performance.
+
+ Limited to Services admins.
+
+OPER_HELP_SESSION
+ Syntax: SESSION LIST threshold
+ SESSION VIEW host
+
+ Allows Services admins to view the session list.
+
+ SESSION LIST lists hosts with atleast threshold sessions.
+ The threshold must be a number greater than 1. This is to
+ prevent accidental listing of the large number of single
+ session hosts.
+ SESSION VIEW displays detailed information about a specific
+ host - including the current session count and session limit.
+ The host value may not include wildcards.
+
+ See the EXCEPTION help for more information about session
+ limiting and how to set session limits specific to certain
+ hosts and groups thereof.
+
+ Limited to Services admins.
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Displays all Services Staff nicks along with level
+ and on-line status.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ The defcon system can be used to implement a pre-defined
+ set of restrictions to services useful during an attemtped
+ attack on the network.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * No new channel registrations
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * No new nick registrations
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * No MLOCK changes
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Force Chan Modes (%s) to be set on all channels
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Use the reduced session limit of %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill any NEW clients connecting
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignore any non-opers with message
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Silently ignore non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL any new clients connecting
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * No new memos sent
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+expiry] channel reason
+
+ Puts an AKILL for every nick on the specified channel. It
+ uses the entire and complete real ident@host for every nick,
+ then enforces the AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Logon News - %s] %s
+NEWS_OPER_TEXT
+ [Oper News - %s] %s
+NEWS_RANDOM_TEXT
+ [Random News - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Syntax: LOGONNEWS {ADD|DEL|LIST} [text|num]
+NEWS_LOGON_LIST_HEADER
+ Logon news items:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ There is no logon news.
+NEWS_LOGON_ADD_SYNTAX
+ Syntax: LOGONNEWS ADD text
+NEWS_LOGON_ADD_FULL
+ News list is full!
+NEWS_LOGON_ADDED
+ Added new logon news item (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Syntax: LOGONNEWS DEL {num | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Logon news item #%d not found!
+NEWS_LOGON_DELETED
+ Logon news item #%d deleted.
+NEWS_LOGON_DEL_NONE
+ No logon news items to delete!
+NEWS_LOGON_DELETED_ALL
+ All logon news items deleted.
+
+NEWS_OPER_SYNTAX
+ Syntax: OPERNEWS {ADD|DEL|LIST} [text|num]
+NEWS_OPER_LIST_HEADER
+ Oper news items:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_OPER_LIST_NONE
+ There is no oper news.
+NEWS_OPER_ADD_SYNTAX
+ Syntax: OPERNEWS ADD text
+NEWS_OPER_ADD_FULL
+ News list is full!
+NEWS_OPER_ADDED
+ Added new oper news item (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Syntax: OPERNEWS DEL {num | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Oper news item #%d not found!
+NEWS_OPER_DELETED
+ Oper news item #%d deleted.
+NEWS_OPER_DEL_NONE
+ No oper news items to delete!
+NEWS_OPER_DELETED_ALL
+ All oper news items deleted.
+
+NEWS_RANDOM_SYNTAX
+ Syntax: RANDOMNEWS {ADD|DEL|LIST} [text|num]
+NEWS_RANDOM_LIST_HEADER
+ Random news items:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ There is no random news.
+NEWS_RANDOM_ADD_SYNTAX
+ Syntax: RANDOMNEWS ADD text
+NEWS_RANDOM_ADD_FULL
+ News list is full!
+NEWS_RANDOM_ADDED
+ Added new random news item (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Syntax: RANDOMNEWS DEL {num | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Random news item #%d not found!
+NEWS_RANDOM_DELETED
+ Random news item #%d deleted.
+NEWS_RANDOM_DEL_NONE
+ No random news items to delete!
+NEWS_RANDOM_DELETED_ALL
+ All random news items deleted.
+
+NEWS_HELP_LOGON
+ Syntax: LOGONNEWS ADD text
+ LOGONNEWS DEL {num | ALL}
+ LOGONNEWS LIST
+
+ Edits or displays the list of logon news messages. When a
+ user connects to the network, these messages will be sent
+ to them. (However, no more than three messages will be
+ sent in order to avoid flooding the user. If there are
+ more than three news messages, only the three most recent
+ will be sent.)
+
+ LOGONNEWS LIST may be used by any IRC operator to list the
+ current news messages. ADD and DEL may only be used by
+ Services admins.
+
+NEWS_HELP_OPER
+ Syntax: OPERNEWS ADD text
+ OPERNEWS DEL {num | ALL}
+ OPERNEWS LIST
+
+ Edits or displays the list of oper news messages. When a
+ user opers up (with the /OPER command), these messages will
+ be sent to them. (However, no more than three messages will
+ be sent in order to avoid flooding the user. If there are
+ more than three news messages, only the three most recent
+ will be sent.)
+
+ OPERNEWS LIST may be used by any IRC operator to list the
+ current oper news messages. ADD and DEL may only be used by
+ Services admins.
+
+NEWS_HELP_RANDOM
+ Syntax: RANDOMNEWS ADD text
+ RANDOMNEWS DEL {num | ALL}
+ RANDOMNEWS LIST
+
+ Edits or displays the list of random news messages. When a
+ user connects to the network, one (and only one) of the
+ random news will be randomly chosen and sent to them.
+
+ RANDOMNEWS LIST may be used by any IRC operator to list the
+ current news messages. ADD and DEL may only be used by
+ Services admins.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S is a service designed to give out information on
+ Services. Help topics are accessible via
+ the HELP commands of the other Services clients:
+
+ /msg %s HELP
+ for information on registering nicknames
+
+ /msg %s HELP
+ for information on registering and controlling
+ channels
+
+ /msg %s HELP
+ for information on sending messages to off-line users
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ for information on setting up a bot on your channel
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ %S allows you to "register" a nickname and
+ prevent others from using it. The following
+ commands allow for registration and maintenance of
+ nicknames; to use them, type /msg %S command.
+ For more information on a specific command, type
+ /msg %S HELP command.
+
+ REGISTER Register a nickname
+ GROUP Join a group
+ IDENTIFY Identify yourself with your password
+ ACCESS Modify the list of authorized addresses
+ SET Set options, including kill protection
+ DROP Cancel the registration of a nickname
+ RECOVER Kill another user who has taken your nick
+ RELEASE Regain custody of your nick after RECOVER
+ SENDPASS Forgot your password? Try this
+
+ Other commands: GHOST, ALIST, GLIST, INFO, LIST, LOGOUT,
+ STATUS
+
+ NOTICE: This service is intended to provide a way for
+ IRC users to ensure their identity is not compromised.
+ It is NOT intended to facilitate "stealing" of
+ nicknames or other malicious actions. Abuse of %S
+ will result in, at minimum, loss of the abused
+ nickname(s).
+
+NICK_HELP_EXPIRES
+
+ Nicknames that are not used anymore are subject to
+ the automatic expiration, i.e. they will be deleted
+ after %d days if not used.
+
+NICK_HELP_REGISTER
+ Syntax: REGISTER password [email]
+
+ Registers your nickname in the %S database. Once
+ your nick is registered, you can use the SET and ACCESS
+ commands to configure your nick's settings as you like
+ them. Make sure you remember the password you use when
+ registering - you'll need it to make changes to your nick
+ later. (Note that case matters! ANOPE, Anope, and
+ anope are all different passwords!)
+
+ Guidelines on choosing passwords:
+
+ Passwords should not be easily guessable. For example,
+ using your real name as a password is a bad idea. Using
+ your nickname as a password is a much worse idea ;) and,
+ in fact, %S will not allow it. Also, short
+ passwords are vulnerable to trial-and-error searches, so
+ you should choose a password at least 5 characters long.
+ Finally, the space character cannot be used in passwords.
+
+ The parameter email is optional and will set the email
+ for your nick immediately. However, it may be required
+ on certain networks.
+ Your privacy is respected; this e-mail won't be given to
+ any third-party person.
+
+ This command also creates a new group for your nickname,
+ that will allow you to register other nicks later sharing
+ the same configuration, the same set of memos and the
+ same channel privileges. For more information on this
+ feature, type /msg %S HELP GROUP.
+
+NICK_HELP_GROUP
+ Syntax: GROUP target password
+
+ This command makes your nickname join the target nickname's
+ group. password is the password of the target nickname.
+
+ Joining a group will allow you to share your configuration,
+ memos, and channel priviledges with all the nicknames in the
+ group, and much more!
+
+ A group exists as long as it is useful. This means that even
+ if a nick of the group is dropped, you won't lose the
+ shared things described above, as long as there is at
+ least one nick remaining in the group.
+
+ You can use this command even if you have not registered
+ your nick yet. If your nick is already registered, you'll
+ need to identify yourself before using this command. Type
+ /msg %S HELP IDENTIFY for more information. This
+ last may be not possible on your IRC network.
+
+ It is recommended to use this command with a non-registered
+ nick because it will be registered automatically when
+ using this command. You may use it with a registered nick (to
+ change your group) only if your network administrators allowed
+ it.
+
+ You can only be in one group at a time. Group merging is
+ not possible.
+
+ Note: all the nicknames of a group have the same password.
+
+NICK_HELP_IDENTIFY
+ Syntax: IDENTIFY password
+
+ Tells %S that you are really the owner of this
+ nick. Many commands require you to authenticate yourself
+ with this command before you use them. The password
+ should be the same one you sent with the REGISTER
+ command.
+
+NICK_HELP_UPDATE
+ Syntax: UPDATE
+
+ Updates your current status, i.e. it checks for new memos,
+ sets needed chanmodes (ModeonID) and updates your vhost and
+ your userflags (lastseentime, etc).
+
+NICK_HELP_LOGOUT
+ Syntax: LOGOUT
+
+ This reverses the effect of the IDENTIFY command, i.e.
+ make you not recognized as the real owner of the nick
+ anymore. Note, however, that you won't be asked to reidentify
+ yourself.
+
+NICK_HELP_DROP
+ Syntax: DROP [nickname]
+
+ Drops your nickname from the %S database. A nick
+ that has been dropped is free for anyone to re-register.
+
+ You may drop a nick within your group by passing it
+ as the nick parameter.
+
+ In order to use this command, you must first identify
+ with your password (/msg %S HELP IDENTIFY for more
+ information).
+
+NICK_HELP_ACCESS
+ Syntax: ACCESS ADD mask
+ ACCESS DEL mask
+ ACCESS LIST
+
+ Modifies or displays the access list for your nick. This
+ is the list of addresses which will be automatically
+ recognized by %S as allowed to use the nick. If
+ you want to use the nick from a different address, you
+ need to send an IDENTIFY command to make %S
+ recognize you.
+
+ Examples:
+
+ ACCESS ADD anyone@*.bepeg.com
+ Allows access to user anyone from any machine in
+ the bepeg.com domain.
+
+ ACCESS DEL anyone@*.bepeg.com
+ Reverses the previous command.
+
+ ACCESS LIST
+ Displays the current access list.
+
+NICK_HELP_SET
+ Syntax: SET option parameters
+
+ Sets various nickname options. option can be one of:
+
+ DISPLAY Set the display of your group in Services
+ PASSWORD Set your nickname password
+ LANGUAGE Set the language Services will use when
+ sending messages to you
+ URL Associate a URL with your nickname
+ EMAIL Associate an E-mail address with your nickname
+ ICQ Associate an ICQ number with your nickname
+ GREET Associate a greet message with your nickname
+ KILL Turn protection on or off
+ SECURE Turn nickname security on or off
+ PRIVATE Prevent your nickname from appearing in a
+ /msg %S LIST
+ HIDE Hide certain pieces of nickname information
+ MSG Change the communication method of Services
+
+ In order to use this command, you must first identify
+ with your password (/msg %S HELP IDENTIFY for more
+ information).
+
+ Type /msg %S HELP SET option for more information
+ on a specific option.
+
+NICK_HELP_SET_DISPLAY
+ Syntax: SET DISPLAY new-display
+
+ Changes the display used to refer to your nickname group in
+ Services. The new display MUST be a nick of your group.
+
+NICK_HELP_SET_PASSWORD
+ Syntax: SET PASSWORD new-password
+
+ Changes the password used to identify you as the nick's
+ owner.
+
+NICK_HELP_SET_LANGUAGE
+ Syntax: SET LANGUAGE number
+
+ Changes the language Services uses when sending messages to
+ you (for example, when responding to a command you send).
+ number should be chosen from the following list of
+ supported languages:
+
+
+NICK_HELP_SET_URL
+ Syntax: SET URL url
+
+ Associates the given URL with your nickname. This URL
+ will be displayed whenever someone requests information
+ on your nick with the INFO command.
+
+NICK_HELP_SET_EMAIL
+ Syntax: SET EMAIL address
+
+ Associates the given E-mail address with your nickname.
+ This address will be displayed whenever someone requests
+ information on the channel with the INFO command.
+
+NICK_HELP_SET_ICQ
+ Syntax: SET ICQ number
+
+ Associates the given ICQ number with your nickname. This
+ number will be displayed whenever someone requests
+ information on your nick with the INFO command.
+
+NICK_HELP_SET_GREET
+ Syntax: SET GREET message
+
+ Makes the given message the greet of your nickname, that
+ will be displayed when joining a channel that has GREET
+ option enabled, provided that you have the necessary
+ access on it.
+
+NICK_HELP_SET_KILL
+ Syntax: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Turns the automatic protection option for your nick
+ on or off. With protection on, if another user
+ tries to take your nick, they will be given one minute to
+ change to another nick, after which %S will forcibly change
+ their nick.
+
+ If you select QUICK, the user will be given only 20 seconds
+ to change nicks instead of the usual 60. If you select
+ IMMED, user's nick will be changed immediately without being
+ warned first or given a chance to change their nick; please
+ do not use this option unless necessary. Also, your
+ network's administrators may have disabled this option.
+
+NICK_HELP_SET_SECURE
+ Syntax: SET SECURE {ON | OFF}
+
+ Turns %S's security features on or off for your
+ nick. With SECURE set, you must enter your password
+ before you will be recognized as the owner of the nick,
+ regardless of whether your address is on the access
+ list. However, if you are on the access list, %S
+ will not auto-kill you regardless of the setting of the
+ KILL option.
+
+NICK_HELP_SET_PRIVATE
+ Syntax: SET PRIVATE {ON | OFF}
+
+ Turns %S's privacy option on or off for your nick.
+ With PRIVATE set, your nickname will not appear in
+ nickname lists generated with %S's LIST command.
+ (However, anyone who knows your nickname can still get
+ information on it using the INFO command.)
+
+NICK_HELP_SET_HIDE
+ Syntax: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Allows you to prevent certain pieces of information from
+ being displayed when someone does a %S INFO on your
+ nick. You can hide your E-mail address (EMAIL), last seen
+ user@host mask (USERMASK), and last quit message (QUIT).
+ The second parameter specifies whether the information should
+ be displayed (OFF) or hidden (ON).
+
+NICK_HELP_SET_MSG
+ Syntax: SET MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ you. With MSG set, Services will use messages, else they'll
+ use notices.
+
+NICK_HELP_RECOVER
+ Syntax: RECOVER nickname [password]
+
+ Allows you to recover your nickname if someone else has
+ taken it; this does the same thing that %S does
+ automatically if someone tries to use a kill-protected
+ nick.
+
+ When you give this command, %S will bring a fake
+ user online with the same nickname as the user you're
+ trying to recover your nick from. This causes the IRC
+ servers to disconnect the other user. This fake user will
+ will remain online for one minute to ensure that the other
+ user does not immediately reconnect; after that minute, you
+ can reclaim your nick. Alternatively, use the RELEASE
+ command (/msg %S HELP RELEASE) to get the nick
+ back sooner.
+
+ In order to use the RECOVER command for a nick, your
+ current address as shown in /WHOIS must be on that nick's
+ access list, you must be identified and in the group of
+ that nick, or you must supply the correct password for
+ the nickname.
+
+NICK_HELP_RELEASE
+ Syntax: RELEASE nickname [password]
+
+ Instructs %S to remove any hold on your nickname
+ caused by automatic kill protection or use of the RECOVER
+ command. By default, such holds last for one minute;
+ this command gets rid of them sooner.
+
+ In order to use the RELEASE command for a nick, your
+ current address as shown in /WHOIS must be on that nick's
+ access list, you must be identified and in the group of
+ that nick, or you must supply the correct password for
+ the nickname.
+
+NICK_HELP_GHOST
+ Syntax: GHOST nickname [password]
+
+ Terminates a "ghost" IRC session using your nick. A
+ "ghost" session is one which is not actually connected,
+ but which the IRC server believes is still online for one
+ reason or another. Typically, this happens if your
+ computer crashes or your Internet or modem connection
+ goes down while you're on IRC.
+
+ In order to use the GHOST command for a nick, your
+ current address as shown in /WHOIS must be on that nick's
+ access list, you must be identified and in the group of
+ that nick, or you must supply the correct password for
+ the nickname.
+
+NICK_HELP_INFO
+ Syntax: INFO nickname [ALL]
+
+ Displays information about the given nickname, such as
+ the nick's owner, last seen address and time, and nick
+ options. If you are identified for the nick you're
+ getting information for and ALL is specified, you will
+ be shown all the information; regardless of whether
+ it's hidden or not.
+
+NICK_HELP_LIST
+ Syntax: LIST pattern
+
+ Lists all registered nicknames which match the given
+ pattern, in nick!user@host format. Nicks with the
+ PRIVATE option set will not be displayed.
+
+ Examples:
+
+ LIST *!joeuser@foo.com
+ Lists all nicks owned by joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Lists all registered nicks with Bot in their
+ names (case insensitive).
+
+ LIST *!*@*.bar.org
+ Lists all nicks owned by users in the bar.org
+ domain.
+
+NICK_HELP_ALIST
+ Syntax: ALIST [level]
+
+ Lists all channels you have access on. Optionally, you can specify
+ a level in XOP or ACCESS format. The resulting list will only
+ include channels where you have the given level of access.
+
+ Examples:
+ ALIST Founder
+ Lists all channels where you have Founder
+ access.
+
+ ALIST AOP
+ Lists all channels where you have AOP
+ access or greater.
+
+ ALIST 10
+ Lists all channels where you have level 10
+ access or greater.
+
+ Channels that have the NOEXPIRE option set will be
+ prefixed by an exclamation mark.
+
+NICK_HELP_GLIST
+ Syntax: GLIST
+
+ Lists all nicks in your group.
+
+NICK_HELP_STATUS
+ Syntax: STATUS nickname...
+
+ Returns whether the user using the given nickname is
+ recognized as the owner of the nickname. The response has
+ this format:
+
+ nickname status-code
+
+ where nickname is the nickname sent with the command, and
+ status-code is one of the following:
+
+ 0 - no such user online or nickname not registered
+ 1 - user not recognized as nickname's owner
+ 2 - user recognized as owner via access list only
+ 3 - user recognized as owner via password identification
+
+ Up to sixteen nicknames may be sent with each command; the
+ rest will be ignored. No error message is generated if no
+ nickname is given.
+
+NICK_HELP_SENDPASS
+ Syntax: SENDPASS nickname
+
+ Send the password of the given nickname to the e-mail address
+ set in the nickname record. This command is really useful
+ to deal with lost passwords.
+
+ May be limited to IRC operators on certain networks.
+
+ This command is unavailable when encryption is enabled.
+
+NICK_SERVADMIN_HELP
+
+ The following commands are available to Services admins:
+
+ GETPASS Retrieve the password for a nickname
+ (only if encryption is disabled)
+ GETEMAIL Matches and returns all users that
+ registered using given email
+ FORBID Prevents a nickname from being registered
+
+ Services admins can also drop any nickname without needing
+ to identify for the nick, and may view the access list for
+ any nickname (/msg %S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Syntax: LOGOUT [nickname [REVALIDATE]]
+
+ Without a parameter, reverses the effect of the IDENTIFY
+ command, i.e. make you not recognized as the real owner of the nick
+ anymore. Note, however, that you won't be asked to reidentify
+ yourself.
+
+ With a parameter, does the same for the given nick. If you
+ specify REVALIDATE as well, Services will ask the given nick
+ to re-identify. This use limited to Services admins.
+
+NICK_SERVADMIN_HELP_DROP
+ Syntax: DROP [nickname]
+
+ Without a parameter, drops your nickname from the
+ %S database.
+
+ With a parameter, drops the named nick from the database.
+ You may drop any nick within your group without any
+ special privileges. Dropping any nick is limited to
+ Services admins.
+
+NICK_SERVADMIN_HELP_SET
+
+ Services admins can also set the option NOEXPIRE, with
+ which nicknames can be prevented from expiring.
+ Additionally, Services admins can set options for any
+ nickname without entering a password, using the format
+ SET nickname option parameters.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Syntax: SET [nickname] NOEXPIRE {ON | OFF}
+
+ Sets whether the given nickname will expire. Setting this
+ to ON prevents the nickname from expiring. If no
+ nickname is given, sets the no-expire flag for your nick.
+
+ Limited to Services admins.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Services admins may use the ALL parameter with any nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Syntax: LIST pattern [FORBIDDEN] [NOEXPIRE]
+
+ Lists all registered nicknames which match the given
+ pattern, in nick!user@host format. Nicks with the PRIVATE
+ option set will only be displayed to Services admins. Nicks
+ with the NOEXPIRE option set will have a ! prepended to the
+ nickname for Services admins.
+
+ If the FORBIDDEN or NOEXPIRE options are given, only nicks
+ which, respectively, are FORBIDden or have the NOEXPIRE flag
+ set will be displayed. If both options are given, both
+ types of nicks will be displayed. These options are limited
+ to Services admins.
+
+ Examples:
+
+ LIST *!joeuser@foo.com
+ Lists all registered nicks owned by joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Lists all registered nicks with Bot in their
+ names (case insensitive).
+
+ LIST * NOEXPIRE
+ Lists all registered nicks which have been set to
+ not expire.
+
+NICK_SERVADMIN_HELP_ALIST
+ Syntax: ALIST [nickname] [level]
+
+ With no parameters, lists channels you have access on. With
+ one parameter, lists channels that nickname has access
+ on. With two parameters lists channels that nickname has
+ level access or greater on.
+
+ This use limited to Services admins.
+
+NICK_SERVADMIN_HELP_GLIST
+ Syntax: GLIST [nickname]
+
+ Without a parameter, lists all nicknames that are in
+ your group.
+
+ With a parameter, lists all nicknames that are in the
+ group of the given nick.
+ This use limited to Services admins.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Syntax: GETPASS nickname
+
+ Returns the password for the given nickname. Note that
+ whenever this command is used, a message including the
+ person who issued the command and the nickname it was used
+ on will be logged and sent out as a WALLOPS/GLOBOPS.
+
+ Limited to Services admins.
+
+ This command is unavailable when encryption is enabled.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Returns the matching nicks that used given email. Note that
+ you can not use wildcards for either user or emailhost. Whenever
+ this command is used, a message including the person who issued
+ the command and the email it was used on will be logged.
+
+ Limited to Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Syntax: FORBID nickname [reason]
+
+ Disallows a nickname from being registered or used by
+ anyone. May be cancelled by dropping the nick.
+
+ On certain networks, reason is required.
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ %S allows you to register and control various
+ aspects of channels. %S can often prevent
+ malicious users from "taking over" channels by limiting
+ who is allowed channel operator priviliges. Available
+ commands are listed below; to use them, type
+ /msg %S command. For more information on a
+ specific command, type /msg %S HELP command.
+
+ REGISTER Register a channel
+ IDENTIFY Identify yourself with your password
+ SET Set channel options and information
+ AOP Modify the list of AOP users
+ SOP Modify the list of SOP users
+ ACCESS Modify the list of privileged users
+ LEVELS Redefine the meanings of access levels
+ AKICK Maintain the AutoKick list
+ DROP Cancel the registration of a channel
+ SENDPASS Help retrive lost passwords
+
+ Other commands: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO,
+ INVITE, KICK, LIST, LOGOUT, OP, TOPIC,
+ UNBAN, VOICE, VOP
+
+CHAN_HELP_UNREAL
+
+ These commands are also available on this network:
+ DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER,
+ PROTECT
+
+CHAN_HELP_ULTIMATE
+
+ These commands are also available on this network:
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ These commands are also available on this network:
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Note that any channel which is not used for %d days
+ (i.e. which no user on the channel's access list enters
+ for that period of time) will be automatically dropped.
+
+CHAN_HELP_REGISTER
+ Syntax: REGISTER channel password description
+
+ Registers a channel in the %S database. In order
+ to use this command, you must first be a channel operator
+ on the channel you're trying to register. The password
+ is used with the IDENTIFY command to allow others to
+ make changes to the channel settings at a later time.
+ The last parameter, which must be included, is a
+ general description of the channel's purpose.
+
+ When you register a channel, you are recorded as the
+ "founder" of the channel. The channel founder is allowed
+ to change all of the channel settings for the channel;
+ %S will also automatically give the founder
+ channel-operator privileges when s/he enters the channel.
+ See the ACCESS command (/msg %S HELP ACCESS) for
+ information on giving a subset of these privileges to
+ other channel users.
+
+ NOTICE: In order to register a channel, you must have
+ first registered your nickname. If you haven't,
+ /msg %s HELP for information on how to do so.
+
+CHAN_HELP_IDENTIFY
+ Syntax: IDENTIFY channel password
+
+ Authenticates you to %S as the founder of the given
+ channel. Many commands require you to use this command
+ before using them. The password should be the same one
+ you sent with the REGISTER command.
+
+CHAN_HELP_LOGOUT
+ Syntax: LOGOUT channel nickname
+
+ This command will log the selected nickname out meaning they
+ would have to reidentify themselves to regain their access.
+
+ If you are the founder of the channel, you can log out anybody,
+ else you can only log out yourself.
+
+CHAN_HELP_DROP
+ Syntax: DROP channel
+
+ Unregisters the named channel. Can only be used by
+ channel founder, who must use the IDENTIFY command first.
+
+CHAN_HELP_SET
+ Syntax: SET channel option parameters
+
+ Allows the channel founder to set various channel options
+ and other information.
+
+ Available options:
+
+ FOUNDER Set the founder of a channel
+ SUCCESSOR Set the successor for a channel
+ PASSWORD Set the founder password
+ DESC Set the channel description
+ URL Associate a URL with the channel
+ EMAIL Associate an E-mail address with the channel
+ ENTRYMSG Set a message to be sent to users when they
+ enter the channel
+ BANTYPE Set how Services make bans on the channel
+ MLOCK Lock channel modes on or off
+ KEEPTOPIC Retain topic when channel is not in use
+ OPNOTICE Send a notice when OP/DEOP commands are used
+ PEACE Regulate the use of critical commands
+ PRIVATE Hide channel from LIST command
+ RESTRICTED Restrict access to the channel
+ SECURE Activate %S security features
+ SECUREOPS Stricter control of chanop status
+ SECUREFOUNDER Stricter control of channel founder status
+ SIGNKICK Sign kicks that are done with KICK command
+ TOPICLOCK Topic can only be changed with TOPIC
+ XOP Toggle the user privilege system
+
+ Type /msg %S HELP SET option for more information on a
+ particular option.
+
+CHAN_HELP_SET_FOUNDER
+ Syntax: SET channel FOUNDER nick
+
+ Changes the founder of a channel. The new nickname must
+ be a registered one.
+
+CHAN_HELP_SET_SUCCESSOR
+ Syntax: SET channel SUCCESSOR nick
+
+ Changes the successor of a channel. If the founder's
+ nickname expires or is dropped while the channel is still
+ registered, the successor will become the new founder of the
+ channel. However, if the successor already has too many
+ channels registered (%d), the channel will be dropped
+ instead, just as if no successor had been set. The new
+ nickname must be a registered one.
+
+CHAN_HELP_SET_PASSWORD
+ Syntax: SET channel PASSWORD password
+
+ Sets the password used to identify as the founder of the
+ channel.
+
+CHAN_HELP_SET_DESC
+ Syntax: SET channel DESC description
+
+ Sets the description for the channel, which shows up with
+ the LIST and INFO commands.
+
+CHAN_HELP_SET_URL
+ Syntax: SET channel URL [url]
+
+ Associates the given URL with the channel. This URL will
+ be displayed whenever someone requests information on the
+ channel with the INFO command. If no parameter is given,
+ deletes any current URL for the channel.
+
+CHAN_HELP_SET_EMAIL
+ Syntax: SET channel EMAIL [address]
+
+ Associates the given E-mail address with the channel.
+ This address will be displayed whenever someone requests
+ information on the channel with the INFO command. If no
+ parameter is given, deletes any current E-mail address for
+ the channel.
+
+CHAN_HELP_SET_ENTRYMSG
+ Syntax: SET channel ENTRYMSG [message]
+
+ Sets the message which will be sent via /notice to users
+ when they enter the channel. If no parameter is given,
+ causes no message to be sent upon entering the channel.
+
+CHAN_HELP_SET_BANTYPE
+ Syntax: SET channel BANTYPE bantype
+
+ Sets the ban type that will be used by services whenever
+ they need to ban someone from your channel.
+
+ bantype is a number between 0 and 3 that means:
+
+ 0: ban in the form *!user@host
+ 1: ban in the form *!*user@host
+ 2: ban in the form *!*@host
+ 3: ban in the form *!*user@*.domain
+
+CHAN_HELP_SET_KEEPTOPIC
+ Syntax: SET channel KEEPTOPIC {ON | OFF}
+
+ Enables or disables the topic retention option for a
+ channel. When topic retention is set, the topic for the
+ channel will be remembered by %S even after the
+ last user leaves the channel, and will be restored the
+ next time the channel is created.
+
+CHAN_HELP_SET_TOPICLOCK
+ Syntax: SET channel TOPICLOCK {ON | OFF}
+
+ Enables or disables the topic lock option for a channel.
+ When topic lock is set, %S will not allow the
+ channel topic to be changed except via the TOPIC
+ command.
+
+CHAN_HELP_SET_MLOCK
+ Syntax: SET channel MLOCK modes
+
+ Sets the mode-lock parameter for the channel. %S
+ allows you to define certain channel modes to be always
+ on, off or free to be either on or off.
+
+ The modes parameter is constructed exactly the same way
+ as a /MODE command; that is, modes followed by a + are
+ locked on, and modes followed by a - are locked off. Note,
+ however, that unlike the /MODE command, each use of
+ SET MLOCK will remove all modes previously locked before
+ setting the new!
+
+ Warning: If you set a mode-locked key, as in the second
+ example below, you should also set the RESTRICTED option for
+ the channel (see HELP SET RESTRICTED), or anyone entering
+ the channel when it is empty will be able to see the key!
+
+ Examples:
+
+ SET #channel MLOCK +nt-iklps
+ Forces modes n and t on, and modes i, k, l, p, and
+ s off. Mode m is left free to be either on or off.
+
+ SET #channel MLOCK +knst-ilmp my-key
+ Forces modes k, n, s, and t on, and modes i, l, m,
+ and p off. Also forces the channel key to be
+ "my-key".
+
+ SET #channel MLOCK +
+ Removes the mode lock; all channel modes are free
+ to be either on or off.
+
+CHAN_HELP_SET_PEACE
+ Syntax: SET channel PEACE {ON | OFF}
+
+ Enables or disables the peace option for a channel.
+ When peace is set, an user won't be able to kick,
+ ban or remove a channel status of an user that has
+ a level superior or equal to his via %S commands.
+
+CHAN_HELP_SET_PRIVATE
+ Syntax: SET channel PRIVATE {ON | OFF}
+
+ Enables or disables the private option for a channel.
+ When private is set, a /msg %S LIST will not
+ include the channel in any lists.
+
+CHAN_HELP_SET_RESTRICTED
+ Syntax: SET channel RESTRICTED {ON | OFF}
+
+ Enables or disables the restricted access option for a
+ channel. When restricted access is set, users who would
+ normally be disallowed from having channel operator
+ privileges (users with negative access levels and, if
+ secure ops is set, users not on the access list) will
+ instead be kicked and banned from the channel.
+
+CHAN_HELP_SET_SECURE
+ Syntax: SET channel SECURE {ON | OFF}
+
+ Enables or disables %S's security features for a
+ channel. When SECURE is set, only users who have
+ registered their nicknames with %s and IDENTIFY'd
+ with their password will be given access to the channel
+ as controlled by the access list.
+
+CHAN_HELP_SET_SECUREOPS
+ Syntax: SET channel SECUREOPS {ON | OFF}
+
+ Enables or disables the secure ops option for a channel.
+ When secure ops is set, users who are not on the userlist
+ will not be allowed chanop status.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Syntax: SET channel SECUREFOUNDER {ON | OFF}
+
+ Enables or disables the secure founder option for a channel.
+ When secure founder is set, only the real founder will be
+ able to drop the channel, change its password, its founder and its
+ successor, and not those who are IDENTIFY'd with %S.
+
+CHAN_HELP_SET_SIGNKICK
+ Syntax: SET channel SIGNKICK {ON | LEVEL | OFF}
+
+ Enables or disables signed kicks for a
+ channel. When SIGNKICK is set, kicks issued with
+ %S KICK command will have the nick that used the
+ command in their reason.
+
+ If you use LEVEL, those who have a level that is superior
+ or equal to the SIGNKICK level on the channel won't have their
+ kicks signed. See /msg %S HELP LEVELS for more information.
+
+CHAN_HELP_SET_XOP
+ Syntax: SET channel XOP {ON | OFF}
+
+ Enables or disables the xOP lists system for a channel.
+ When XOP is set, you have to use the AOP/SOP/VOP
+ commands in order to give channel privileges to
+ users, else you have to use the ACCESS command.
+
+ Technical Note: when you switch from access list to xOP
+ lists system, your level definitions and user levels will be
+ changed, so you won't find the same values if you
+ switch back to access system!
+
+ You should also check that your users are in the good xOP
+ list after the switch from access to xOP lists, because the
+ guess is not always perfect... in fact, it is not recommended
+ to use the xOP lists if you changed level definitions with
+ the LEVELS command.
+
+ Switching from xOP lists system to access list system
+ causes no problem though.
+
+CHAN_HELP_SET_OPNOTICE
+ Syntax: SET channel OPNOTICE {ON | OFF}
+
+ Enables or disables the op-notice option for a channel.
+ When op-notice is set, %S will send a notice to the
+ channel whenever the OP or DEOP commands are used for a user
+ in the channel.
+
+CHAN_HELP_AOP
+ Syntax: AOP channel ADD nick
+ AOP channel DEL {nick | entry-num | list}
+ AOP channel LIST [mask | list]
+ AOP channel CLEAR
+
+ Maintains the AOP (AutoOP) list for a channel. The AOP
+ list gives users the right to be auto-opped on your channel,
+ to unban or invite themselves if needed, to have their
+ greet message showed on join, and so on.
+
+ The AOP ADD command adds the given nickname to the
+ AOP list.
+
+ The AOP DEL command removes the given nick from the
+ AOP list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The AOP LIST command displays the AOP list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ AOP #channel LIST 2-5,7-9
+ Lists AOP entries numbered 2 through 5 and
+ 7 through 9.
+
+ The AOP CLEAR command clears all entries of the
+ AOP list.
+
+ The AOP ADD and AOP DEL commands are limited to
+ SOPs or above, while the AOP CLEAR command can only
+ be used by the channel founder. However, any user on the
+ AOP list may use the AOP LIST command.
+
+ This command may have been disabled for your channel, and
+ in that case you need to use the access list. See
+ /msg %S HELP ACCESS for information about the access list,
+ and /msg %S HELP SET XOP to know how to toggle between
+ the access list and xOP list systems.
+
+CHAN_HELP_HOP
+ Syntax: HOP channel ADD nick
+ HOP channel DEL {nick | entry-num | list}
+ HOP channel LIST [mask | list]
+ HOP channel CLEAR
+
+ Maintains the HOP (HalfOP) list for a channel. The HOP
+ list gives users the right to be auto-halfopped on your
+ channel.
+
+ The HOP ADD command adds the given nickname to the
+ HOP list.
+
+ The HOP DEL command removes the given nick from the
+ HOP list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The HOP LIST command displays the HOP list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ HOP #channel LIST 2-5,7-9
+ Lists HOP entries numbered 2 through 5 and
+ 7 through 9.
+
+ The HOP CLEAR command clears all entries of the
+ HOP list.
+
+ The HOP ADD, HOP DEL and HOP LIST commands are
+ limited to AOPs or above, while the HOP CLEAR command
+ can only be used by the channel founder.
+
+ This command may have been disabled for your channel, and
+ in that case you need to use the access list. See
+ /msg %S HELP ACCESS for information about the access list,
+ and /msg %S HELP SET XOP to know how to toggle between
+ the access list and xOP list systems.
+
+CHAN_HELP_SOP
+ Syntax: SOP channel ADD nick
+ SOP channel DEL {nick | entry-num | list}
+ SOP channel LIST [mask | list]
+ SOP channel CLEAR
+
+ Maintains the SOP (SuperOP) list for a channel. The SOP
+ list gives users all rights given by the AOP list, and adds
+ those needed to use the AutoKick and the BadWords lists,
+ to send and read channel memos, and so on.
+
+ The SOP ADD command adds the given nickname to the
+ SOP list.
+
+ The SOP DEL command removes the given nick from the
+ SOP list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The SOP LIST command displays the SOP list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ SOP #channel LIST 2-5,7-9
+ Lists AOP entries numbered 2 through 5 and
+ 7 through 9.
+
+ The SOP CLEAR command clears all entries of the
+ SOP list.
+
+ The SOP ADD, SOP DEL and SOP CLEAR commands are
+ limited to the channel founder. However, any user on the
+ AOP list may use the SOP LIST command.
+
+ This command may have been disabled for your channel, and
+ in that case you need to use the access list. See
+ /msg %S HELP ACCESS for information about the access list,
+ and /msg %S HELP SET XOP to know how to toggle between
+ the access list and xOP list systems.
+
+CHAN_HELP_VOP
+ Syntax: VOP channel ADD nick
+ VOP channel DEL {nick | entry-num | list}
+ VOP channel LIST [mask | list]
+ VOP channel CLEAR
+
+ Maintains the VOP (VOicePeople) list for a channel.
+ The VOP list allows users to be auto-voiced and to voice
+ themselves if they aren't.
+
+ The VOP ADD command adds the given nickname to the
+ VOP list.
+
+ The VOP DEL command removes the given nick from the
+ VOP list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The VOP LIST command displays the VOP list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ VOP #channel LIST 2-5,7-9
+ Lists VOP entries numbered 2 through 5 and
+ 7 through 9.
+
+ The VOP CLEAR command clears all entries of the
+ VOP list.
+
+ The VOP ADD, VOP DEL and VOP LIST commands are
+ limited to AOPs or above, while the VOP CLEAR command
+ can only be used by the channel founder.
+
+ This command may have been disabled for your channel, and
+ in that case you need to use the access list. See
+ /msg %S HELP ACCESS for information about the access list,
+ and /msg %S HELP SET XOP to know how to toggle between
+ the access list and xOP list systems.
+
+CHAN_HELP_ACCESS
+ Syntax: ACCESS channel ADD nick level
+ ACCESS channel DEL {nick | entry-num | list}
+ ACCESS channel LIST [mask | list]
+ ACCESS channel CLEAR
+
+ Maintains the access list for a channel. The access
+ list specifies which users are allowed chanop status or
+ access to %S commands on the channel. Different
+ user levels allow for access to different subsets of
+ privileges; /msg %S HELP ACCESS LEVELS for more
+ specific information. Any nick not on the access list has
+ a user level of 0.
+
+ The ACCESS ADD command adds the given nickname to the
+ access list with the given user level; if the nick is
+ already present on the list, its access level is changed to
+ the level specified in the command. The level specified
+ must be less than that of the user giving the command, and
+ if the nick is already on the access list, the current
+ access level of that nick must be less than the access level
+ of the user giving the command.
+
+ The ACCESS DEL command removes the given nick from the
+ access list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The ACCESS LIST command displays the access list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ ACCESS #channel LIST 2-5,7-9
+ Lists access entries numbered 2 through 5 and
+ 7 through 9.
+
+ The ACCESS CLEAR command clears all entries of the
+ access list.
+
+CHAN_HELP_ACCESS_LEVELS
+ User access levels
+
+ By default, the following access levels are defined:
+
+ Founder Full access to %S functions; automatic
+ opping upon entering channel. Note
+ that only one person may have founder
+ status (it cannot be given using the
+ ACCESS command).
+  10 Access to AKICK command; automatic opping.
+  5 Automatic opping.
+  3 Automatic voicing.
+  0 No special privileges; can be opped by other
+ ops (unless secure-ops is set).
+  <0 May not be opped.
+
+ These levels may be changed, or new ones added, using the
+ LEVELS command; type /msg %S HELP LEVELS for
+ information.
+
+CHAN_HELP_AKICK
+ Syntax: AKICK channel ADD mask [reason]
+ AKICK channel STICK mask
+ AKICK channel UNSTICK mask
+ AKICK channel DEL mask
+ AKICK channel LIST [mask]
+ AKICK channel VIEW [mask]
+ AKICK channel ENFORCE
+ AKICK channel CLEAR
+
+ Maintains the AutoKick list for a channel. If a user
+ on the AutoKick list attempts to join the channel,
+ %S will ban that user from the channel, then kick
+ the user.
+
+ The AKICK ADD command adds the given nick or usermask
+ to the AutoKick list. If a reason is given with
+ the command, that reason will be used when the user is
+ kicked; if not, the default reason is "You have been
+ banned from the channel".
+
+ The AKICK STICK command permanently bans the given mask
+ on the channel. If someone tries to remove the ban, %S
+ will automatically set it again. You can't use it for
+ registered nicks.
+
+ The AKICK UNSTICK command cancels the effect of the
+ AKICK STICK command, so you'll be able to unset the
+ ban again on the channel.
+
+ The AKICK DEL command removes the given nick or mask
+ from the AutoKick list. It does not, however, remove any
+ bans placed by an AutoKick; those must be removed
+ manually.
+
+ The AKICK LIST command displays the AutoKick list, or
+ optionally only those AutoKick entries which match the
+ given mask.
+
+ The AKICK VIEW command is a more verbose version of
+ AKICK LIST command.
+
+ The AKICK ENFORCE command causes %S to enforce the
+ current AKICK list by removing those users who match an
+ AKICK mask.
+
+ The AKICK CLEAR command clears all entries of the
+ akick list.
+
+CHAN_HELP_LEVELS
+ Syntax: LEVELS channel SET type level
+ LEVELS channel {DIS | DISABLE} type
+ LEVELS channel LIST
+ LEVELS channel RESET
+
+ The LEVELS command allows fine control over the meaning of
+ the numeric access levels used for channels. With this
+ command, you can define the access level required for most
+ of %S's functions. (The SET FOUNDER and SET PASSWORD
+ commands, as well as this command, are always restricted to
+ the channel founder.)
+
+ LEVELS SET allows the access level for a function or group of
+ functions to be changed. LEVELS DISABLE (or DIS for short)
+ disables an automatic feature or disallows access to a
+ function by anyone other than the channel founder.
+ LEVELS LIST shows the current levels for each function or
+ group of functions. LEVELS RESET resets the levels to the
+ default levels of a newly-created channel (see
+ HELP ACCESS LEVELS).
+
+ For a list of the features and functions whose levels can be
+ set, see HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ The following feature/function names are understood. Note
+ that the levels for AUTODEOP and NOJOIN are maximum levels,
+ while all others are minimum levels.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Syntax: INFO channel [ALL]
+
+ Lists information about the named registered channel,
+ including its founder, time of registration, last time
+ used, description, and mode lock, if any. If ALL is
+ specified, the entry message and successor will also
+ be displayed.
+
+ By default, the ALL option is limited to those with
+ founder access on the channel.
+
+CHAN_HELP_LIST
+ Syntax: LIST pattern
+
+ Lists all registered channels matching the given pattern.
+ (Channels with the PRIVATE option set are not listed.)
+
+CHAN_HELP_OP
+ Syntax: OP [#channel [nick]]
+
+ Ops a selected nick on a channel. If nick is not given,
+ it will op you. If channel and nick are not given,
+ it will op you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to AOPs or those with level 5 access
+ and above on the channel.
+
+CHAN_HELP_DEOP
+ Syntax: DEOP [#channel [nick]]
+
+ Deops a selected nick on a channel. If nick is not given,
+ it will deop you. If channel and nick are not given,
+ it will deop you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to AOPs or those with level 5 access
+ and above on the channel.
+
+CHAN_HELP_VOICE
+ Syntax: VOICE [#channel [nick]]
+
+ Voices a selected nick on a channel. If nick is not given,
+ it will voice you. If channel and nick are not given,
+ it will voice you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to AOPs or those with level 5 access
+ and above on the channel, or to VOPs or those with level 3
+ and above for self voicing.
+
+CHAN_HELP_DEVOICE
+ Syntax: DEVOICE [#channel [nick]]
+
+ Devoices a selected nick on a channel. If nick is not given,
+ it will devoice you. If channel and nick are not given,
+ it will devoice you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to AOPs or those with level 5 access
+ and above on the channel, or to VOPs or those with level 3
+ and above for self devoicing.
+
+CHAN_HELP_HALFOP
+ Syntax: HALFOP [#channel [nick]]
+
+ Halfops a selected nick on a channel. If nick is not given,
+ it will halfop you. If channel and nick are not given,
+ it will halfop you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to AOPs and those with level 5 access
+ and above on the channel, or to HOPs or those with level 4
+ and above for self halfopping.
+
+CHAN_HELP_DEHALFOP
+ Syntax: DEHALFOP [#channel [nick]]
+
+ Dehalfops a selected nick on a channel. If nick is not given,
+ it will dehalfop you. If channel and nick are not given,
+ it will dehalfop you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to AOPs and those with level 5 access
+ and above on the channel, or to HOPs or those with level 4
+ and above for self dehalfopping.
+
+CHAN_HELP_PROTECT
+ Syntax: PROTECT [#channel [nick]]
+
+ Protects a selected nick on a channel. If nick is not given,
+ it will protect you. If channel and nick are not given,
+ it will protect you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to the founder, or to SOPs or those with
+ level 10 and above on the channel for self protecting.
+
+CHAN_HELP_DEPROTECT
+ Syntax: DEPROTECT [#channel [nick]]
+
+ Deprotects a selected nick on a channel. If nick is not given,
+ it will deprotect you. If channel and nick are not given,
+ it will deprotect you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to the founder, or to SOPs or those with
+ level 10 and above on the channel for self deprotecting.
+
+CHAN_HELP_OWNER
+ Syntax: OWNER [#channel]
+
+ Gives you owner status on channel. If channel is not
+ given, it will give you owner status on all channels you're
+ on, provided you have the rights to.
+
+ Limited to those with founder access on the channel.
+
+CHAN_HELP_DEOWNER
+ Syntax: DEOWNER [#channel]
+
+ Removes your owner status on channel. If channel is
+ not given, it will remove your owner status on all channels
+ you're on, provided you have the rights to.
+
+ Limited to those with founder access on the channel.
+
+CHAN_HELP_INVITE
+ Syntax: INVITE channel
+
+ Tells %S to invite you into the given channel.
+
+ By default, limited to AOPs or those with level 5 and above
+ on the channel.
+
+CHAN_HELP_UNBAN
+ Syntax: UNBAN channel
+
+ Tells %S to remove all bans preventing you from
+ entering the given channel.
+
+ By default, limited to AOPs or those with level 5 and above
+ on the channel.
+
+CHAN_HELP_KICK
+ Syntax: KICK [#channel [nick [reason]]]
+
+ Kicks a selected nick on a channel. If nick is not given,
+ it will kick you. If channel and nick are not given,
+ it will kick you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to AOPs or those with level 5 access
+ and above on the channel.
+
+CHAN_HELP_BAN
+ Syntax: BAN [#channel [nick [reason]]]
+
+ Bans a selected nick on a channel. If nick is not given,
+ it will ban you. If channel and nick are not given,
+ it will ban you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to AOPs or those with level 5 access
+ and above on the channel.
+
+CHAN_HELP_TOPIC
+ Syntax: TOPIC channel [topic]
+
+ Causes %S to set the channel topic to the one
+ specified. If topic is not given, then an empty topic
+ is set. This command is most useful in conjunction
+ with SET TOPICLOCK. See /msg %S HELP SET TOPICLOCK
+ for more information.
+
+ By default, limited to those with founder access on the
+ channel.
+
+CHAN_HELP_CLEAR
+ Syntax: CLEAR channel what
+
+ Tells %S to clear certain settings on a channel. what
+ can be any of the following:
+
+ MODES Resets all modes on the channel (i.e. clears
+ modes i,k,l,m,n,p,s,t).
+ BANS Clears all bans on the channel.
+ EXCEPTS Clears all excepts on the channel.
+ OPS Removes channel-operator status (mode +o) from
+ all channel operators.
+ VOICES Removes "voice" status (mode +v) from anyone
+ with that mode set.
+ USERS Removes (kicks) all users from the channel.
+
+ By default, limited to those with founder access on the
+ channel.
+
+CHAN_HELP_GETKEY
+ Syntax: GETKEY channel
+
+ Returns the key of the given channel. This is a command
+ mainly intended to be used by bots and/or scripts, so
+ the output is in the following way:
+
+ KEY <channel> <key>
+
+ key is "NO KEY" if no key is set.
+
+CHAN_HELP_SENDPASS
+ Syntax: SENDPASS channel
+
+ Send the password of the given channel to the e-mail address
+ set in the founder's nickname record. This command is really
+ useful to deal with lost passwords.
+
+ May be limited to IRC operators on certain networks.
+
+ This command is unavailable when encryption is enabled.
+
+CHAN_SERVADMIN_HELP
+
+ The following commands are available to Services admins:
+
+ GETPASS Retrieve the founder password for a channel
+ (only if encryption is disabled)
+ FORBID Prevent a channel from being used
+ SUSPEND Prevent a channel from being used preserving
+ channel data and settings.
+ UNSUSPEND Releases a suspended channel.
+ STATUS Returns the current access level of a user
+ on a channel
+
+ Services admins can also drop any channel without needing
+ to identify via password, and may view the access, AKICK,
+ and level setting lists for any channel.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Syntax: LOGOUT channel [nickname]
+
+ This command will log the selected nickname out meaning they
+ would have to reidentify themselves to regain their access.
+
+ If you are the founder of the channel, you can log out anybody,
+ else you can only log out yourself.
+
+ If you are a Services admin, you can log out
+ anybody of any channel without having to be the founder
+ of the channel. Also, you can omit the nickname parameter;
+ this will log out all identified users from the channel.
+
+CHAN_SERVADMIN_HELP_DROP
+ Syntax: DROP channel
+
+ Unregisters the named channel. Only Services admins
+ can drop a channel for which they have not identified.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Services admins can also set the option NOEXPIRE, with
+ which channels can be prevented from expiring.
+ Additionally, Services admins can set options for any
+ channel without identifying by password for the channel.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Syntax: SET channel NOEXPIRE {ON | OFF}
+
+ Sets whether the given channel will expire. Setting this
+ to ON prevents the channel from expiring.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Services admins can use the ALL parameter with any channel.
+
+CHAN_SERVADMIN_HELP_LIST
+ Syntax: LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+ Lists all registered channels matching the given pattern.
+ Channels with the PRIVATE option set will only be displayed
+ to Services admins. Channels with the NOEXPIRE option set
+ will have a ! prepended to the channel name for Services admins.
+
+ If the FORBIDDEN, SUSPENDED or NOEXPIRE options are given, only
+ channels which, respectively, are FORBIDden, SUSPENDed or have
+ the NOEXPIRE flag set will be displayed. If both options are
+ given, both types of channels will be displayed. These options are
+ limited to Services admins.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Syntax: GETPASS channel
+
+ Returns the password for the given channel. Note that
+ whenever this command is used, a message including the
+ person who issued the command and the channel it was used
+ on will be logged and sent out as a WALLOPS/GLOBOPS.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Syntax: FORBID channel [reason]
+
+ Disallows anyone from registering or using the given
+ channel. May be cancelled by dropping the channel.
+
+ Reason may be required on certain networks.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND channel [reason]
+
+ Disallows anyone from registering or using the given
+ channel. May be cancelled by using the UNSUSPEND
+ command to preserve all previous channel data/settings.
+
+ Reason may be required on certain networks.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Releases a suspended channel. All data and settings
+ are preserved from before the suspension.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Syntax: STATUS channel nickname
+
+ Returns the current access level of the given nick on the
+ given channel. The reply is of the form:
+
+ STATUS channel nickname access-level
+
+ If an error occurs, the reply will be in the form:
+
+ STATUS ERROR error-message
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S is a utility allowing IRC users to send short
+ messages to other IRC users, whether they are online at
+ the time or not, or to channels(*). Both the sender's
+ nickname and the target nickname or channel must be
+ registered in order to send a memo.
+
+ %S's commands include:
+
+ SEND Send a memo to a nick or channel
+ CANCEL Cancel last memo you sent
+ LIST List your memos
+ READ Read a memo or memos
+ DEL Delete a memo or memos
+ SET Set options related to memos
+ INFO Displays information about your memos
+
+MEMO_HELP_ADMIN
+ SENDALL Send a memo to all registered users
+
+MEMO_HELP_OPER
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_FOOTER
+
+ Type /msg %S HELP command for help on any of the
+ above commands.
+
+ (*) By default, any user with at least level 10 access on a
+ channel can read that channel's memos. This can be
+ changed with the %s LEVELS command.
+
+MEMO_HELP_SEND
+ Syntax: SEND {nick | channel} memo-text
+
+ Sends the named nick or channel a memo containing
+ memo-text. When sending to a nickname, the recipient will
+ receive a notice that he/she has a new memo. The target
+ nickname/channel must be registered.
+
+MEMO_HELP_CANCEL
+ Syntax: CANCEL {nick | channel}
+
+ Cancels the last memo you sent to the given nick or channel,
+ provided it has not been read at the time you use the command.
+
+MEMO_HELP_LIST
+ Syntax: LIST [channel] [list | NEW]
+
+ Lists any memos you currently have. With NEW, lists only
+ new (unread) memos. Unread memos are marked with a "*"
+ to the left of the memo number. You can also specify a list
+ of numbers, as in the example below:
+
+ LIST 2-5,7-9
+ Lists memos numbered 2 through 5 and 7 through 9.
+
+MEMO_HELP_READ
+ Syntax: READ [channel] {num | list | LAST | NEW}
+
+ Sends you the text of the memos specified. If LAST is
+ given, sends you the memo you most recently received. If
+ NEW is given, sends you all of your new memos. Otherwise,
+ sends you memo number num. You can also give a list of
+ numbers, as in this example:
+
+ READ 2-5,7-9
+ Displays memos numbered 2 through 5 and 7 through 9.
+
+MEMO_HELP_DEL
+ Syntax: DEL [channel] {num | list | LAST | ALL}
+
+ Deletes the specified memo or memos. You can supply
+ multiple memo numbers or ranges of numbers instead of a
+ single number, as in the second example below.
+
+ If LAST is given, the last memo will be deleted.
+ If ALL is given, deletes all of your memos.
+
+ Examples:
+
+ DEL 1
+ Deletes your first memo.
+
+ DEL 2-5,7-9
+ Deletes memos numbered 2 through 5 and 7 through 9.
+
+MEMO_HELP_SET
+ Syntax: SET option parameters
+
+ Sets various memo options. option can be one of:
+
+ NOTIFY Changes when you will be notified about
+ new memos (only for nicknames)
+ LIMIT Sets the maximum number of memos you can
+ receive
+
+ Type /msg %S HELP SET option for more information
+ on a specific option.
+
+MEMO_HELP_SET_NOTIFY
+ Syntax: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Changes when you will be notified about new memos:
+
+ ON You will be notified of memos when you log on,
+ when you unset /AWAY, and when they are sent
+ to you.
+ LOGON You will only be notified of memos when you log
+ on or when you unset /AWAY.
+ NEW You will only be notified of memos when they
+ are sent to you.
+ OFF You will not receive any notification of memos.
+
+ ON is essentially LOGON and NEW combined.
+
+MEMO_HELP_SET_LIMIT
+ Syntax: SET LIMIT [channel] limit
+
+ Sets the maximum number of memos you (or the given channel)
+ are allowed to have. If you set this to 0, no one will be
+ able to send any memos to you. However, you cannot set
+ this any higher than %d.
+
+MEMO_HELP_INFO
+ Syntax: INFO [channel]
+
+ Displays information on the number of memos you have, how
+ many of them are unread, and how many total memos you can
+ receive. With a parameter, displays the same information
+ for the given channel.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Syntax: SET LIMIT [user | channel] {limit | NONE} [HARD]
+
+ Sets the maximum number of memos a user or channel is
+ allowed to have. Setting the limit to 0 prevents the user
+ from receiving any memos; setting it to NONE allows the
+ user to receive and keep as many memos as they want. If
+ you do not give a nickname or channel, your own limit is
+ set.
+
+ Adding HARD prevents the user from changing the limit. Not
+ adding HARD has the opposite effect, allowing the user to
+ change the limit (even if a previous limit was set with
+ HARD).
+
+ This use of the SET LIMIT command is limited to Services
+ admins. Other users may only enter a limit for themselves
+ or a channel on which they have such privileges, may not
+ remove their limit, may not set a limit above %d, and may
+ not set a hard limit.
+
+MEMO_SERVADMIN_HELP_INFO
+ Syntax: INFO [nick | channel]
+
+ Without a parameter, displays information on the number of
+ memos you have, how many of them are unread, and how many
+ total memos you can receive.
+
+ With a channel parameter, displays the same information for
+ the given channel.
+
+ With a nickname parameter, displays the same information
+ for the given nickname. This use limited to Services
+ admins.
+
+MEMO_HELP_STAFF
+ Syntax: STAFF memo-text
+
+ Sends all services staff a memo containing memo-text.
+ Note: If you have opers on both the oper list and the
+ admin list they will recive the memo twice. The same
+ applies for oper's on the Root list as well as other
+ lists.
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL memo-text
+
+ Sends all registered users a memo containing memo-text.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ %S commands:
+ GLOBAL Send a message to all users
+ STATS Show status of Services and network
+ OPER LIST List all Services operators
+ ADMIN LIST List all Services admins
+ STAFF Display Services staff and online status
+
+OPER_HELP_OPER_CMD
+ Commands available to Services operators and admins only:
+ MODE Change a channel's modes
+ KICK Kick a user from a channel
+ CLEARMODES Clear modes of a channel
+ KILLCLONES Kill all users that have a certain host
+ AKILL Manipulate the AKILL list
+ SGLINE Manipulate the SGLINE list
+ SQLINE Manipulate the SQLINE list
+ SZLINE Manipulate the SZLINE list
+
+OPER_HELP_ADMIN_CMD
+ Commands available to Services admins only:
+ OPER Modify the Services operator list
+ SVSNICK Forcefully change a user's nickname
+ CHANLIST Lists all channel records
+ USERLIST Lists all user records
+ LOGONNEWS Define messages to be shown to users at logon
+ RANDOMNEWS Define messages to be randomly shown to users
+ at logon
+ OPERNEWS Define messages to be shown to users who oper
+ SESSION View the list of host sessions
+ EXCEPTION Modify the session-limit exception list
+ CACHE Lists hostname cache used by the proxy detector
+ NOOP Temporarily remove all O:lines of a server
+ remotely
+ JUPE "Jupiter" a server
+ IGNORE Modify the Services ignore list
+ UMODE Change a user's modes
+ OLINE Give Operflags to a certain user (UnrealIRCd
+ only)
+ SET Set various global Services options
+ RELOAD Reload services' configuration file
+ UPDATE Force the Services databases to be
+ updated on disk immediately
+ RESTART Save databases and restart Services
+ QUIT Terminate the Services program with no save
+ SHUTDOWN Terminate the Services program with save
+ DEFCON Manipulate the DefCon system
+ CHANKILL Kill all users on a specific channel
+
+ Commands available to the Services super-user only:
+ ADMIN Modify the Services admin list
+
+OPER_HELP_ROOT_CMD
+ Commands available to Service Roots only:
+ MODLOAD Load a module
+ MODUNLOAD Un-Load a module
+ MODLIST List loaded modules
+ MODINFO Info about a loaded module
+
+OPER_HELP_LOGGED
+ Notice: All commands sent to %S are logged!
+
+OPER_HELP_GLOBAL
+ Syntax: GLOBAL message
+
+ Allows IRCops to send messages to all users on the network.
+ The message will be sent from the nick %s.
+
+OPER_HELP_STATS
+ Syntax: STATS [AKILL | ALL | RESET]
+
+ Without any option, shows the current number of users and
+ IRCops online (excluding Services), the highest number of
+ users online since Services was started, and the length of
+ time Services has been running.
+
+ With the AKILL option, displays the current size of the
+ AKILL list and the current default expiry time.
+
+ The ALL option is available only to Services admins, and
+ displays information on Services' memory usage. Using this
+ option can freeze Services for a short period of time on
+ large networks, so don't overuse it!
+
+ The RESET option currently resets the maximum user count
+ to the number of users currently present on the network.
+
+ UPTIME may be used as a synonym for STATS.
+
+OPER_HELP_OPER
+ Syntax: OPER ADD nick
+ OPER DEL {nick | entry-num | list}
+ OPER LIST [mask | list]
+ OPER CLEAR
+
+ Allows the Services admins to add or remove nicknames
+ to or from the Services operator list. A user whose nickname
+ is on the Services operator list and who has identified to
+ %s will be able to access Services operator commands.
+
+ The OPER ADD command adds the given nickname to the
+ Services operator list.
+
+ The OPER DEL command removes the given nick from the
+ Services operator list. If a list of entry numbers is given,
+ those entries are deleted. (See the example for LIST below.)
+
+ The OPER LIST command displays the Services operator list.
+ If a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ OPER LIST 2-5,7-9
+ Lists Services operator entries numbered 2 through
+ 5 and 7 through 9.
+
+ The OPER CLEAR command clears all entries of the
+ Services operator list.
+
+ Any IRC operator may use the OPER LIST form of the command.
+ All other use limited to Services admins.
+
+OPER_HELP_ADMIN
+ Syntax: ADMIN ADD nick
+ ADMIN DEL {nick | entry-num | list}
+ ADMIN LIST [mask | list]
+ ADMIN CLEAR
+
+ Allows the Services root to add or remove nicknames
+ to or from the Services admin list. A user whose nickname
+ is on the Services admin list and who has identified to
+ %s will be able to access Services admin commands.
+
+ The ADMIN ADD command adds the given nickname to the
+ Services admin list.
+
+ The ADMIN DEL command removes the given nick from the
+ Services admin list. If a list of entry numbers is given,
+ those entries are deleted. (See the example for LIST below.)
+
+ The ADMIN LIST command displays the Services admin list.
+ If a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ ADMIN LIST 2-5,7-9
+ Lists Services admin entries numbered 2 through
+ 5 and 7 through 9.
+
+ The ADMIN CLEAR command clears all entries of the
+ Services admin list.
+
+ Any IRC operator may use the ADMIN LIST form of the command.
+ All other use limited to Services root.
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick]
+
+ Allows Services Admins to make Services ignore a nick for a
+ certain time or until the next restart. The default time
+ format is seconds. You can specify it by using units. Valid
+ units are: s for seconds, m for minutes, h for hours and
+ d for days. Combinations of these units are not permitted. To
+ make Services permanently ignore the user type 0 as time.
+
+OPER_HELP_MODE
+ Syntax: MODE channel modes
+
+ Allows Services operators to set channel modes for any
+ channel. Parameters are the same as for the standard /MODE
+ command.
+
+ Limited to Services operators.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user modes
+
+ Allows Services admins to set user modes for any user.
+ Parameters are the same as for the standard /MODE
+ command.
+
+ Limited to Super admins.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Allows Services admins to give Operflags to any user.
+ Flags have to be prefixed with a "+" or a "-". To
+ remove all flags simply type a "-" instead of any flags.
+
+ Limited to Super admins.
+
+OPER_HELP_CLEARMODES
+ Syntax: CLEARMODES channel [ALL]
+
+ Clears all binary modes (i,k,l,m,n,p,s,t) and bans from a
+ channel. If ALL is given, also clears all ops and
+ voices (+o and +v modes) from the channel.
+
+ Limited to Services operators.
+
+OPER_HELP_KICK
+ Syntax: KICK channel user reason
+
+ Allows IRCops to kick a user from any channel.
+ Parameters are the same as for the standard /KICK
+ command. The kick message will have the nickname of the
+ IRCop sending the KICK command prepended; for example:
+
+ *** SpamMan has been kicked off channel #my_channel by %S (Alcan (Flood))
+
+ Limited to Services operators.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick newnick
+
+ Forcefully changes a user's nickname from nick to newnick.
+
+ Limited to Super admins
+
+OPER_HELP_AKILL
+ Syntax: AKILL ADD [+expiry] mask reason
+ AKILL DEL {mask | entry-num | list}
+ AKILL LIST [mask | list]
+ AKILL VIEW [mask | list]
+ AKILL CLEAR
+
+ Allows Services operators to manipulate the AKILL list. If
+ a user matching an AKILL mask attempts to connect, Services
+ will issue a KILL for that user and, on supported server
+ types, will instruct all servers to add a ban (K-line) for
+ the mask which the user matched.
+
+ AKILL ADD adds the given user@host/ip mask to the AKILL
+ list for the given reason (which must be given).
+ expiry is specified as an integer followed by one of d
+ (days), h (hours), or m (minutes). Combinations (such as
+ 1h30m) are not permitted. If a unit specifier is not
+ included, the default is days (so +30 by itself means 30
+ days). To add an AKILL which does not expire, use +0. If the
+ usermask to be added starts with a +, an expiry time must
+ be given, even if it is the same as the default. The
+ current AKILL default expiry time can be found with the
+ STATS AKILL command.
+
+ The AKILL DEL command removes the given mask from the
+ AKILL list if it is present. If a list of entry numbers is
+ given, those entries are deleted. (See the example for LIST
+ below.)
+
+ The AKILL LIST command displays the AKILL list.
+ If a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ AKILL LIST 2-5,7-9
+ Lists AKILL entries numbered 2 through 5 and 7
+ through 9.
+
+ AKILL VIEW is a more verbose version of AKILL LIST, and
+ will show who added an AKILL, the date it was added, and when
+ it expires, as well as the user@host/ip mask and reason.
+
+ AKILL CLEAR clears all entries of the AKILL list.
+
+ Limited to Services operators.
+
+OPER_HELP_SGLINE
+ Syntax: SGLINE ADD [+expiry] mask:reason
+ SGLINE DEL {mask | entry-num | list}
+ SGLINE LIST [mask | list]
+ SGLINE VIEW [mask | list]
+ SGLINE CLEAR
+
+ Allows Services operators to manipulate the SGLINE list. If
+ a user with a realname matching an SGLINE mask attempts to
+ connect, Services will not allow it to pursue his IRC
+ session.
+
+ SGLINE ADD adds the given realname mask to the SGLINE
+ list for the given reason (which must be given).
+ expiry is specified as an integer followed by one of d
+ (days), h (hours), or m (minutes). Combinations (such as
+ 1h30m) are not permitted. If a unit specifier is not
+ included, the default is days (so +30 by itself means 30
+ days). To add an SGLINE which does not expire, use +0. If the
+ realname mask to be added starts with a +, an expiry time must
+ be given, even if it is the same as the default. The
+ current SGLINE default expiry time can be found with the
+ STATS AKILL command.
+ Note: because the realname mask may contain spaces, the
+ separator between it and the reason is a colon.
+
+ The SGLINE DEL command removes the given mask from the
+ SGLINE list if it is present. If a list of entry numbers is
+ given, those entries are deleted. (See the example for LIST
+ below.)
+
+ The SGLINE LIST command displays the SGLINE list.
+ If a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ SGLINE LIST 2-5,7-9
+ Lists SGLINE entries numbered 2 through 5 and 7
+ through 9.
+
+ SGLINE VIEW is a more verbose version of SGLINE LIST, and
+ will show who added an SGLINE, the date it was added, and when
+ it expires, as well as the realname mask and reason.
+
+ SGLINE CLEAR clears all entries of the SGLINE list.
+
+ Limited to Services operators.
+
+OPER_HELP_SQLINE
+ Syntax: SQLINE ADD [+expiry] mask reason
+ SQLINE DEL {mask | entry-num | list}
+ SQLINE LIST [mask | list]
+ SQLINE VIEW [mask | list]
+ SQLINE CLEAR
+
+ Allows Services operators to manipulate the SQLINE list. If
+ a user with a nick matching an SQLINE mask attempts to
+ connect, Services will not allow it to pursue his IRC
+ session.
+
+ If the first character of the mask is #, services will
+ prevent the use of matching channels (on IRCds that
+ support it).
+
+ SQLINE ADD adds the given mask to the SQLINE
+ list for the given reason (which must be given).
+ expiry is specified as an integer followed by one of d
+ (days), h (hours), or m (minutes). Combinations (such as
+ 1h30m) are not permitted. If a unit specifier is not
+ included, the default is days (so +30 by itself means 30
+ days). To add an SQLINE which does not expire, use +0.
+ If the mask to be added starts with a +, an expiry time
+ must be given, even if it is the same as the default. The
+ current SQLINE default expiry time can be found with the
+ STATS AKILL command.
+
+ The SQLINE DEL command removes the given mask from the
+ SQLINE list if it is present. If a list of entry numbers is
+ given, those entries are deleted. (See the example for LIST
+ below.)
+
+ The SQLINE LIST command displays the SQLINE list.
+ If a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ SQLINE LIST 2-5,7-9
+ Lists SQLINE entries numbered 2 through 5 and 7
+ through 9.
+
+ SQLINE VIEW is a more verbose version of SQLINE LIST, and
+ will show who added an SQLINE, the date it was added, and when
+ it expires, as well as the mask and reason.
+
+ SQLINE CLEAR clears all entries of the SQLINE list.
+
+ Limited to Services operators.
+
+OPER_HELP_SZLINE
+ Syntax: SZLINE ADD [+expiry] mask reason
+ SZLINE DEL {mask | entry-num | list}
+ SZLINE LIST [mask | list]
+ SZLINE VIEW [mask | list]
+ SZLINE CLEAR
+
+ Allows Services operators to manipulate the SZLINE list. If
+ a user with an IP matching an SZLINE mask attempts to
+ connect, Services will not allow it to pursue his IRC
+ session (and this, whether the IP has a PTR RR or not).
+
+ SZLINE ADD adds the given IP mask to the SZLINE
+ list for the given reason (which must be given).
+ expiry is specified as an integer followed by one of d
+ (days), h (hours), or m (minutes). Combinations (such as
+ 1h30m) are not permitted. If a unit specifier is not
+ included, the default is days (so +30 by itself means 30
+ days). To add an SZLINE which does not expire, use +0. If the
+ realname mask to be added starts with a +, an expiry time must
+ be given, even if it is the same as the default. The
+ current SZLINE default expiry time can be found with the
+ STATS AKILL command.
+
+ The SZLINE DEL command removes the given mask from the
+ SZLINE list if it is present. If a list of entry numbers is
+ given, those entries are deleted. (See the example for LIST
+ below.)
+
+ The SZLINE LIST command displays the SZLINE list.
+ If a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ SZLINE LIST 2-5,7-9
+ Lists SZLINE entries numbered 2 through 5 and 7
+ through 9.
+
+ SZLINE VIEW is a more verbose version of SZLINE LIST, and
+ will show who added an SZLINE, the date it was added, and when
+ it expires, as well as the IP mask and reason.
+
+ SZLINE CLEAR clears all entries of the SZLINE list.
+
+ Limited to Services operators.
+
+OPER_HELP_SET
+ Syntax: SET option setting
+
+ Sets various global Services options. Option names
+ currently defined are:
+ READONLY Set read-only or read-write mode
+ LOGCHAN Report log messages to a channel
+ DEBUG Activate or deactivate debug mode
+ NOEXPIRE Activate or deactivate no expire mode
+ SUPERADMIN Activate or deactivate super-admin mode
+
+ Limited to Services admins.
+
+OPER_HELP_SET_READONLY
+ Syntax: SET READONLY {ON | OFF}
+
+ Sets read-only mode on or off. In read-only mode, normal
+ users will not be allowed to modify any Services data,
+ including channel and nickname access lists, etc. IRCops
+ with sufficient Services privileges will be able to modify
+ Services' AKILL list and drop or forbid nicknames and
+ channels, but any such changes will not be saved unless
+ read-only mode is deactivated before Services is terminated
+ or restarted.
+
+ This option is equivalent to the command-line option
+ -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Syntax: SET LOGCHAN {ON | OFF}
+
+ With this setting on, Services will send its logs to a specified
+ channel as well as the log file. LogChannel must also be defined
+ in the Services configuration file for this setting to be of any
+ use.
+
+ Note: This can have strong security implications if your log
+ channel is not properly secured.
+
+OPER_HELP_SET_DEBUG
+ Syntax: SET DEBUG {ON | OFF | num}
+
+ Sets debug mode on or off. In debug mode, all data sent to
+ and from Services as well as a number of other debugging
+ messages are written to the log file. If num is
+ given, debug mode is activated, with the debugging level set
+ to num.
+
+ This option is equivalent to the command-line option
+ -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Syntax: SET NOEXPIRE {ON | OFF}
+
+ Sets no expire mode on or off. In no expire mode, nicks,
+ channels, akills and exceptions won't expire until the
+ option is unset.
+
+ This option is equivalent to the command-line option
+ -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Syntax: SET SUPERADMIN {ON | OFF}
+
+ Setting this will grant you extra privlages such as the
+ ability to be "founder" on all channel's etc...
+
+ This option is not persistant, and should only be used when
+ needed, and set back to OFF when no longer needed.
+
+
+OPER_HELP_NOOP
+ Syntax: NOOP SET server
+ NOOP REVOKE server
+
+ NOOP SET remove all O:lines of the given
+ server and kill all IRCops currently on it to
+ prevent them from rehashing the server (because this
+ would just cancel the effect).
+
+ NOOP REVOKE makes all removed O:lines available again
+ on the given server.
+
+ Note: The server is not checked at all by the
+ Services.
+
+ Limited to Services admins.
+
+OPER_HELP_JUPE
+ Syntax: JUPE server [reason]
+
+ Tells Services to jupiter a server -- that is, to create
+ a fake "server" connected to Services which prevents
+ the real server of that name from connecting. The jupe
+ may be removed using a standard SQUIT. If a reason is
+ given, it is placed in the server information field;
+ otherwise, the server information field will contain the
+ text "Juped by <nick>", showing the nickname of the
+ person who jupitered the server.
+
+ Limited to Services admins.
+
+OPER_HELP_RAW
+ Syntax: RAW text
+
+ Sends a string of text directly to the server to which
+ Services is connected. This command has a very limited
+ range of uses, and can wreak havoc on a network if used
+ improperly. DO NOT USE THIS COMMAND unless you are
+ absolutely certain you know what you are doing!
+
+ Limited to Services admins.
+
+OPER_HELP_UPDATE
+ Syntax: UPDATE
+
+ Causes Services to update all database files as soon as you
+ send the command.
+
+ Limited to Services admins.
+
+OPER_HELP_RELOAD
+ Syntax: RELOAD
+
+ Causes Services to reload the configuration file. Note that
+ some directives still need the restart of the Services to
+ take effect (such as Services' nicknames, activation of the
+ session limitation, etc.)
+
+ Limited to Services admins.
+
+OPER_HELP_QUIT
+ Syntax: QUIT
+
+ Causes Services to do an immediate shutdown; databases are
+ not saved. This command should not be used unless
+ damage to the in-memory copies of the databases is feared
+ and they should not be saved. For normal shutdowns, use the
+ SHUTDOWN command.
+
+ Limited to Services admins.
+
+OPER_HELP_SHUTDOWN
+ Syntax: SHUTDOWN
+
+ Causes Services to save all databases and then shut down.
+
+ Limited to Services admins.
+
+OPER_HELP_RESTART
+ Syntax: RESTART
+
+ Causes Services to save all databases and then restart
+ (i.e. exit and immediately re-run the executable).
+
+ Limited to Services admins.
+
+OPER_HELP_KILLCLONES
+ Syntax: KILLCLONES nick
+
+ Kills all users who have the same hostname as nick. A
+ temporary AKILL, in the form *@host, is added to
+ prevent the offending clients from immediately
+ reconnecting. A wallops is also sent indicating who
+ used the command, which host was affected and how many
+ users were killed. It's usefull for removing numerous
+ clones from the network.
+
+ Limited to Services operators.
+
+OPER_HELP_CHANLIST
+ Syntax: CHANLIST [{pattern | nick} [SECRET]]
+
+ Lists all channels currently in use on the IRC network, whether they
+ are registered or not.
+
+ If pattern is given, lists only channels that match it. If a nickname
+ is given, lists only the channels the user using it is on. If SECRET is
+ specified, lists only channels matching pattern that have the +s or
+ +p mode.
+
+ Limited to Services admins.
+
+OPER_HELP_USERLIST
+ Syntax: USERLIST [{pattern | channel} [INVISIBLE]]
+
+ Lists all users currently online on the IRC network, whether their
+ nick is registered or not.
+
+ If pattern is given, lists only users that match it (it must be in
+ the format nick!user@host). If channel is given, lists only users
+ that are on the given channel. If INVISIBLE is specified, only users
+ with the +i flag will be listed.
+
+ Limited to Services admins.
+
+OPER_HELP_CACHE
+ Syntax: CACHE DEL hostname
+ CACHE LIST pattern [QUEUED | ALL]
+
+ The CACHE DEL command deletes the specified hostname from
+ the cache. This is meant for debug purpose only.
+
+ The CACHE LIST command lists all found proxies that match the
+ given pattern. If the QUEUED option is given, it will list
+ the queued or in progress scans instead, and if the ALL option
+ is given, it will list all cached hostnames.
+
+ Limited to Services admins.
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD FileName
+
+ This command loads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ This command unloads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO FileName
+
+ This command lists information about the specified loaded module
+
+ Limited to Services Roots.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S allows you to have a bot on your own channel.
+ It has been created for users that can't host or
+ configure a bot, or for use on networks that don't
+ allow users' bot. Available commands are listed
+ below; to use them, type /msg %S command. For
+ more information on a specific command, type /msg
+ %S HELP command.
+
+ BOTLIST Lists available bots
+ ASSIGN Assigns a bot to a channel
+ SET Configures bot options
+ KICK Configures kickers
+ BADWORDS Maintains bad words list
+
+ Other commands: ACT INFO SAY UNASSIGN
+
+ Bot will join a channel whenever there is at least
+ %d user(s) on it.
+
+BOT_HELP_BOTLIST
+ Syntax: BOTLIST
+
+ Lists all available bots on this network.
+
+BOT_HELP_ASSIGN
+ Syntax: ASSIGN chan nick
+
+ Assigns a bot pointed out by nick to the channel chan. You
+ can then configure the bot for the channel so it fits
+ your needs.
+
+BOT_HELP_UNASSIGN
+ Syntax: UNASSIGN chan
+
+ Unassigns a bot from a channel. When you use this command,
+ the bot won't join the channel anymore. However, bot
+ configuration for the channel is kept, so you will always
+ be able to reassign a bot later without have to reconfigure
+ it entirely.
+
+BOT_HELP_INFO
+ Syntax: INFO {chan | nick}
+
+ Allows you to see %S information about a channel or a bot.
+ If the parameter is a channel, then you'll get information
+ such as enabled kickers. If the parameter is a nick,
+ you'll get information about a bot, such as creation
+ time or number of channels it is on.
+
+BOT_HELP_SET
+ Syntax: SET channel option parameters
+
+ Configures bot options. option can be one of:
+
+ DONTKICKOPS To protect ops against bot kicks
+ DONTKICKVOICES To protect voices against bot kicks
+ GREET Enable greet messages
+ FANTASY Enable fantaisist commands
+ SYMBIOSIS Allow the bot to act as a real bot
+
+ Type /msg %S HELP SET option for more information
+ on a specific option.
+
+ Note: access to this command is controlled by the
+ level SET.
+
+BOT_HELP_SET_DONTKICKOPS
+ Syntax: SET channel DONTKICKOPS {ON|OFF}
+
+ Enables or disables ops protection mode on a channel.
+ When it is enabled, ops won't be kicked by the bot
+ even if they don't match the NOKICK level.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Syntax: SET channel DONTKICKVOICES {ON|OFF}
+
+ Enables or disables voices protection mode on a channel.
+ When it is enabled, voices won't be kicked by the bot
+ even if they don't match the NOKICK level.
+
+BOT_HELP_SET_FANTASY
+ Syntax: SET channel FANTASY {ON|OFF}
+
+ Enables or disables fantasy mode on a channel.
+ When it is enabled, users will be able to use
+ commands !op, !deop, !voice, !devoice,
+ !kick, !kb, !unban, !seen on a channel (find how
+ to use them; try with or without nick for each,
+ and with a reason for some?).
+
+ Note that users wanting to use fantaisist
+ commands MUST have enough level for both
+ the FANTASIA and another level depending
+ of the command if required (for example, to use
+ !op, user must have enough access for the OPDEOP
+ level).
+
+BOT_HELP_SET_GREET
+ Syntax: SET channel GREET {ON|OFF}
+
+ Enables or disables greet mode on a channel.
+ When it is enabled, the bot will display greet
+ messages of users joining the channel, provided
+ they have enough access to the channel.
+
+BOT_HELP_SET_SYMBIOSIS
+ Syntax: SET channel SYMBIOSIS {ON|OFF}
+
+ Enables or disables symbiosis mode on a channel.
+ When it is enabled, the bot will do everything
+ normally done by %s on channels, such as MODEs,
+ KICKs, and even the entry message.
+
+BOT_HELP_KICK
+ Syntax: KICK channel option parameters
+
+ Configures bot kickers. option can be one of:
+
+ BOLDS Sets if the bot kicks bolds
+ BADWORDS Sets if the bot kicks bad words
+ CAPS Sets if the bot kicks caps
+ COLORS Sets if the bot kicks colors
+ FLOOD Sets if the bot kicks flooding users
+ REPEAT Sets if the bot kicks users who repeat
+ themselves
+ REVERSES Sets if the bot kicks reverses
+ UNDERLINES Sets if the bot kicks underlines
+
+ Type /msg %S HELP KICK option for more information
+ on a specific option.
+
+ Note: access to this command is controlled by the
+ level SET.
+
+BOT_HELP_KICK_BOLDS
+ Syntax: KICK channel BOLDS {ON|OFF} [ttb]
+
+ Sets the bolds kicker on or off. When enabled, this
+ option tells the bot to kick users who use bolds.
+
+ ttb is the number of times an user can be kicked
+ before it get banned. Don't give ttb to disable
+ the ban system once activated.
+
+BOT_HELP_KICK_COLORS
+ Syntax: KICK channel COLORS {ON|OFF} [ttb]
+
+ Sets the colors kicker on or off. When enabled, this
+ option tells the bot to kick users who use colors.
+
+ ttb is the number of times an user can be kicked
+ before it get banned. Don't give ttb to disable
+ the ban system once activated.
+
+BOT_HELP_KICK_REVERSES
+ Syntax: KICK channel REVERSES {ON|OFF} [ttb]
+
+ Sets the reverses kicker on or off. When enabled, this
+ option tells the bot to kick users who use reverses.
+
+ ttb is the number of times an user can be kicked
+ before it get banned. Don't give ttb to disable
+ the ban system once activated.
+
+BOT_HELP_KICK_UNDERLINES
+ Syntax: KICK channel UNDERLINES {ON|OFF} [ttb]
+
+ Sets the underlines kicker on or off. When enabled, this
+ option tells the bot to kick users who use underlines.
+
+ ttb is the number of times an user can be kicked
+ before it get banned. Don't give ttb to disable
+ the ban system once activated.
+
+BOT_HELP_KICK_CAPS
+ Syntax: KICK channel CAPS {ON|OFF} [ttb [min [percent]]]
+
+ Sets the caps kicker on or off. When enabled, this
+ option tells the bot to kick users who are talking in
+ CAPS.
+
+ The bot kicks only if there are at least min caps
+ and they constitute at least percent%% of the total
+ text line (if not given, it defaults to 10 characters
+ and 25%%).
+
+ ttb is the number of times an user can be kicked
+ before it get banned. Don't give ttb to disable
+ the ban system once activated.
+
+BOT_HELP_KICK_FLOOD
+ Syntax: KICK channel FLOOD {ON|OFF} [ttb [ln [secs]]]
+
+ Sets the flood kicker on or off. When enabled, this
+ option tells the bot to kick users who are flooding
+ the channel using at least ln lines in secs seconds
+ (if not given, it defaults to 6 lines in 10 seconds).
+
+ ttb is the number of times an user can be kicked
+ before it get banned. Don't give ttb to disable
+ the ban system once activated.
+
+BOT_HELP_KICK_REPEAT
+ Syntax: KICK #channel REPEAT {ON|OFF} [ttb [num]]
+
+ Sets the repeat kicker on or off. When enabled, this
+ option tells the bot to kick users who are repeating
+ themselves num times (if num is not given, it
+ defaults to 3).
+
+ ttb is the number of times an user can be kicked
+ before it get banned. Don't give ttb to disable
+ the ban system once activated.
+
+BOT_HELP_KICK_BADWORDS
+ Syntax: KICK #channel BADWORDS {ON|OFF} [ttb]
+
+ Sets the bad words kicker on or off. When enabled, this
+ option tells the bot to kick users who say certain words
+ on the channels.
+
+ You can define bad words for your channel using the
+ BADWORDS command. Type /msg %S HELP BADWORDS for
+ more information.
+
+ ttb is the number of times an user can be kicked
+ before it get banned. Don't give ttb to disable
+ the ban system once activated.
+
+BOT_HELP_BADWORDS
+ Syntax: BADWORDS channel ADD word [SINGLE | START | END]
+ BADWORDS channel DEL {word | entry-num | list}
+ BADWORDS channel LIST [mask | list]
+ BADWORDS channel CLEAR
+
+ Maintains the bad words list for a channel. The bad
+ words list determines which words are to be kicked
+ when the bad words kicker is enabled. For more information,
+ type /msg %S HELP KICK BADWORDS.
+
+ The BADWORDS ADD command adds the given word to the
+ badword list. If SINGLE is specified, a kick will be
+ done only if an user says the entire word. If START is
+ specified, a kick will be done if an user says a word
+ that starts with word. If END is specified, a kick
+ will be done if an user says a word that ends with
+ word. If you don't specify anything, a kick will
+ be issued every time word is said by an user.
+
+ The BADWORDS DEL command removes the given word from the
+ bad words list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The BADWORDS LIST command displays the bad words list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ BADWORDS #channel LIST 2-5,7-9
+ Lists bad words entries numbered 2 through 5 and
+ 7 through 9.
+
+ The BADWORDS CLEAR command clears all entries of the
+ bad words list.
+
+BOT_HELP_SAY
+ Syntax: SAY channel text
+
+ Makes the bot say the given text on the given channel.
+
+BOT_HELP_ACT
+ Syntax: ACT channel text
+
+ Makes the bot do the equivalent of a "/me" command
+ on the given channel using the given text.
+
+BOT_SERVADMIN_HELP
+
+ The following command is available to Services admins:
+
+ BOT Maintains network bot list
+
+BOT_SERVADMIN_HELP_BOT
+ Syntax: BOT ADD nick user host real
+ BOT CHANGE oldnick newnick [user [host [real]]]
+ BOT DEL nick
+ BOT LIST
+
+ Allows Services admins to create, modify, and delete
+ bots that users will be able to use on their own
+ channels.
+
+ BOT ADD adds a bot with the given nickname, username,
+ hostname and realname. Since no integrity checks are done
+ for these settings, be really careful.
+ BOT CHANGE allows to change nickname, username, hostname
+ or realname of a bot without actually delete it (and all
+ the data associated with it).
+ BOT DEL removes the given bot from the bot list.
+ BOT LIST is an alias of BOTLIST and just lists all
+ bots available on the network.
+
+ Note: if you create a bot that has a nick that is
+ registered, it will be dropped. Also, if an user is
+ currently using the nick, it will be killed.
+
+BOT_SERVADMIN_HELP_SET
+
+ These options are reserved to Services admins:
+
+ NOBOT Prevent a bot from being assigned to
+ a channel
+ PRIVATE Prevent a bot from being assigned by
+ non IRC operators
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Syntax: SET channel NOBOT {ON|OFF}
+
+ This option makes a channel be unassignable. If a bot
+ is already assigned to the channel, it is unassigned
+ automatically when you enable the option.
+
+ Limited to Services admins.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Syntax: SET bot-nick PRIVATE {ON|OFF}
+
+ This option prevents a bot from being assigned to a
+ channel by users that aren't IRC operators.
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# HostServ messages
+#
+###########################################################################
+HOST_EMPTY
+ The vhost list is empty.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ vhost for %s set to %s.
+HOST_IDENT_SET
+ vhost for %s set to %s@%s.
+HOST_SETALL
+ vhost for group %s set to %s.
+HOST_DELALL
+ vhosts for group %s have been removed.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost for group %s set to %s@%s.
+HOST_SET_ERROR
+ A vhost must be in the format of a valid hostmask.
+HOST_SET_IDENT_ERROR
+ A vhost ident must be in the format of a valid ident
+HOST_SET_TOOLONG
+ Error! The vhost is too long, please use a host shorter than %d characters.
+HOST_SET_IDENTTOOLONG
+ Error! The Ident is too long, please use an ident shorter than %d characters.
+HOST_NOREG
+ User %s not found in the nickserv db.
+HOST_SET_SYNTAX
+ Syntax /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Access Denied.
+HOST_NOT_ASSIGNED
+ Please contact an Operator to get a vhost assigned to this nick.
+HOST_ACTIVATED
+ Your vhost of %s is now activated.
+HOST_IDENT_ACTIVATED
+ Your vhost of %s@%s is now activated.
+HOST_ID
+ Please identify to services first.
+HOST_NOT_REGED
+ You need to register before a vhost can be assigned to you.
+HOST_DEL
+ vhost for %s removed.
+HOST_DEL_SYNTAX
+ Syntax: /msg %s del <nick>.
+HOST_OFF_UNREAL
+ Your vhost was removed. To re-enable the standard host cloaking, type /mode %s +x
+HOST_NO_VIDENT
+ Your IRCD does not support vIdent's, if this is incorrect, please report this as a possible bug
+HOST_GROUP
+ All vhost's in the group %s have been set to %s
+HOST_IDENT_GROUP
+ All vhost's in the group %s have been set to %s@%s
+HOST_LIST_FOOTER
+ Displayed all records (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Displayed records from %d to %d
+HOST_LIST_KEY_FOOTER
+ Displayed records matching key %s (Count: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ %S commands:
+ ON Activates your assigned vhost
+ OFF Deactivates your assigned vhost
+ GROUP Syncs the vhost for all nicks in a group
+
+HOST_OPER_HELP
+ Commands available to HostSetters/Removes only:
+ SET Set the vhost of another user
+ SETALL Set the vhost for all nicks in a group
+ DEL Delete the vhost of another user
+ DELALL Delete the vhost for all nicks in a group
+ LIST Displays one or more vhost entries.
+
+HOST_ADMIN_HELP
+ Commands available to services admins only:
+
+HOST_HELP_ON
+ Syntax: ON
+
+ Activates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see the vhost instead of your real IP address.
+
+HOST_HELP_SET
+ Syntax: SET <nick> <hostmask>.
+
+ Sets the vhost for the given nick to that of the given
+ hostmask. If your IRCD supports vIdents, then using
+ SET <nick> <ident>@<hostmask> set idents for users as
+ well as vhosts.
+
+ Limited to Host Setters.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Deletes the vhost for all nick's in the same group as
+ that of the given nick.
+
+ Limited to Host Removers.
+
+
+HOST_HELP_SETALL
+ Syntax: SETALL <nick> <hostmask>.
+
+ Sets the vhost for all nicks in the same group as that
+ of the given nick. If your IRCD supports vIdents, then
+ using SETALL <nick> <ident>@<hostmask> will set idents
+ for users as well as vhosts.
+
+ * NOTE, this will not update the vhost for any nick's
+ added to the group after this command was used.
+
+ Limited to Host Setters.
+
+HOST_HELP_OFF
+ Syntax: OFF
+
+ Deactivates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see your real IP address.
+
+HOST_HELP_DEL
+ Syntax: DEL <nick>
+
+ Deletes the vhost assigned to the given nick from the
+ database.
+
+ Limited to HostRemovers.
+
+HOST_HELP_LIST
+ Syntax: LIST [<key>|<#X-Y>]
+
+ This command lists registered vhosts to the operator
+ if a Key is specified, only entries whos nick or vhost match
+ the pattern given in <key> are displayed e.g. Rob* for all
+ entries beginning with "Rob"
+
+ If a #X-Y style is used, only entries between the range of X
+ and Y will be displayed, e.g. #1-3 will display the first 3
+ nick/vhost entries.
+
+ The list uses the value of NSListMax as a hard limit for the
+ number of items to display to a operator at any 1 time.
+
+ Limited to Services operators.
+
+HOST_HELP_GROUP
+ Syntax: GROUP
+
+ This command allows users to set the vhost of thier
+ CURRENT nick to be the vhost for all nicks in the same
+ group.
+
diff --git a/lang/es.l b/lang/es.l
new file mode 100644
index 000000000..7f90aefb0
--- /dev/null
+++ b/lang/es.l
@@ -0,0 +1,6182 @@
+# Spanish Language File.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ Español (Spanish)
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %d %b %H:%M:%S %Y %Z
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %d %b %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %d %b %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Dom
+ Lun
+ Mar
+ Mie
+ Jue
+ Vie
+ Sab
+# %A
+STRFTIME_DAYS_LONG
+ Domingo
+ Lunes
+ Martes
+ Miercoles
+ Jueves
+ Viernes
+ Sabado
+# %b
+STRFTIME_MONTHS_SHORT
+ Ene
+ Feb
+ Mar
+ Abr
+ May
+ Jun
+ Jul
+ Ago
+ Sep
+ Oct
+ Nov
+ Dic
+# %B
+STRFTIME_MONTHS_LONG
+ Enero
+ Febrero
+ Marzo
+ Abril
+ Mayo
+ Junio
+ Julio
+ Agosto
+ Septiembre
+ Octubre
+ Noviembre
+ Diciembre
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Error Interno - Imposible procesar peticion.
+UNKNOWN_COMMAND
+ Comando no conocido %s.
+UNKNOWN_COMMAND_HELP
+ Comando no conocido %s. "/msg %s HELP" para ayuda.
+SYNTAX_ERROR
+ Sintaxis: %s
+MORE_INFO
+ /msg %s HELP %s para mayor informacion.
+NO_HELP_AVAILABLE
+ No existe ayuda para %s.
+OBSOLETE_COMMAND
+ Este comando esta obsoleto; usa %s en su lugar.
+
+BAD_USERHOST_MASK
+ La mascara debe ser en la forma usuario@host.
+BAD_EXPIRY_TIME
+ Tiempo de expiracion invalido.
+USERHOST_MASK_TOO_WIDE
+ %s La covertura es muy amplia; Por favor usa una mascara mas especifica.
+
+SERVICE_OFFLINE
+ %s esta momentaneamente offline.
+READ_ONLY_MODE
+ Noticia: Los Servicios estan en modo read-only; Los cambios no seran salvados!
+PASSWORD_INCORRECT
+ Clave incorrecta.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Acceso denegado.
+PERMISSION_DENIED
+ Permiso denegado.
+RAW_DISABLED
+ La opcion RAW ha sido deshabilitada. Si necesitas usarla
+ debes habilitar la directiva DisableRaw en la configuracion
+ de los Servicios.
+
+MORE_OBSCURE_PASSWORD
+ Por favor intente nuevamente con una clave mas oscura.
+ Las claves deben tener al menos 5 caracteres, no deben
+ ser algo facil de adivinar (ej. Nombre real o Nick),
+ y no pueden contener el caracter de espacio o tabulacion.
+PASSWORD_TRUNCATED
+ Noticia: Tu clave ha sido reducida a %d caracteres.
+
+NICK_NOT_REGISTERED
+ Tu nick no esta registrado.
+NICK_NOT_REGISTERED_HELP
+ Tu nick no esta registrado. Tipea /msg %s HELP para mayor
+ informacion sobre el registro de nicknames.
+NICK_X_NOT_REGISTERED
+ El nick %s no esta registrado.
+NICK_X_IN_USE
+ El nick %s esta actualmente en uso.
+NICK_X_NOT_IN_USE
+ El nick %s no esta en uso.
+NICK_X_NOT_ON_CHAN
+ El nick %s no esta en el canal %s actualmente.
+NICK_X_FORBIDDEN
+ El nick %s no puede ser registrado o usado.
+NICK_X_FORBIDDEN_OPER
+ El nick %s ha sido prohibido por %s:
+ %s
+NICK_X_ILLEGAL
+ El nick %ses un nickname ilegal, y no puede ser usado.
+NICK_X_TRUNCATED
+ El nick %s fue reducido a %d caracteres.
+CHAN_X_NOT_REGISTERED
+ El Canal %s no esta registrado.
+CHAN_X_NOT_IN_USE
+ El Canal %s no existe.
+CHAN_X_FORBIDDEN
+ El Canal %s no puede ser registrado o usado.
+CHAN_X_FORBIDDEN_OPER
+ El Canal %s ha sido prohibido por %s:
+ %s
+CHAN_X_SUSPENDED
+ Suspendido: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Autentificacion por clave requerida para ese comando.
+ Intenta nuevamente despues de tipear /msg %s IDENTIFY clave.
+CHAN_IDENTIFY_REQUIRED
+ Autentificacion por clave requerida para ese comando.
+ Intenta nuevamente despues de tipear /msg %s IDENTIFY %s clave.
+
+MAIL_DISABLED
+ Los servicios han sido configurados para no enviar e-mail
+MAIL_INVALID
+ El e-mail para %s es invalido.
+MAIL_X_INVALID
+ %s no es un e-mail valido.
+MAIL_LATER
+ Imposible enviar el e-mail ahora; por favor intenta mas tarde.
+MAIL_DELAYED
+ Por favor espera %d segundos e intente nuevamente.
+
+NO_REASON
+ Sin razon.
+UNKNOWN
+ <desconocido>
+
+# Duration system
+DURATION_DAY
+ 1 dia
+DURATION_DAYS
+ %d dias
+DURATION_HOUR
+ 1 hora
+DURATION_HOURS
+ %d horas
+DURATION_MINUTE
+ 1 minuto
+DURATION_MINUTES
+ %d minutos
+DURATION_SECOND
+ 1 segundo
+DURATION_SECONDS
+ %d segundos
+
+# Human readable expiration
+NO_EXPIRE
+ no expira
+EXPIRES_SOON
+ expira con el proximo update de la base de datos
+EXPIRES_M
+ expira en %d minutos
+EXPIRES_1M
+ expira en %d minutos
+EXPIRES_HM
+ expira en %d horas, %d minutos
+EXPIRES_H1M
+ expira en %d horas, %d minuto
+EXPIRES_1HM
+ expira en %d hora, %d minutos
+EXPIRES_1H1M
+ expira en %d hora, %d minuto
+EXPIRES_D
+ expira en %d dias
+EXPIRES_1D
+ expira en %d dia
+
+# Generic Footer message
+END_OF_ANY_LIST
+ Fin de la lista de %s.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Este nick pertenece a otra persona. Por favor elige otro nick.
+ (Si este es tu nick, tipea /msg %s IDENTIFY clave.)
+NICK_IS_SECURE
+ Este nick esta registrado y protegido. Si es tu
+ nick, tipea /msg %s IDENTIFY clave. Si no,
+ por favor elige un nick diferente.
+NICK_MAY_NOT_BE_USED
+ Este nickname no puede ser usado. Por favor elige otro.
+FORCENICKCHANGE_IN_1_MINUTE
+ Si no cambias tu nick en un minuto, Lo cambiare yo.
+FORCENICKCHANGE_IN_20_SECONDS
+ Si no cambias tu nick en 20 segundos, Lo cambiare yo.
+FORCENICKCHANGE_NOW
+ Este nick ha sido registrado; No puedes usarlo.
+FORCENICKCHANGE_CHANGING
+ Tu nickname esta siendo cambiado a %s
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER clave [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER clave email
+NICK_REGISTRATION_DISABLED
+ Lo siento, el registro de nicknames esta temporalmente deshabilitado.
+NICK_REGISTRATION_FAILED
+ Lo siento, fallo en el registro.
+NICK_REG_PLEASE_WAIT
+ Por favor espera %d segundos antes de usar el comando REGISTER nuevamente.
+NICK_CANNOT_BE_REGISTERED
+ El nickname %s no puede ser registrado.
+NICK_ALREADY_REGISTERED
+ El nickname %s ya esta registrado!
+NICK_REGISTERED
+ El nickname %s esta registrado bajo tu cuenta: %s
+NICK_PASSWORD_IS
+ Tu clave es %s - Recuerdala para uso futuro.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP grupo clave
+NICK_GROUP_DISABLED
+ Lo siento, La agrupacion de nicks esta temporalmente deshabilitada.
+NICK_GROUP_FAILED
+ Lo siento, La agrupacion de nicks ha fallado.
+NICK_GROUP_PLEASE_WAIT
+ Por favor espera %d segundos antes de usar el comando GROUP nuevamente.
+NICK_GROUP_CHANGE_DISABLED
+ Tu nick ya esta registrado; tipea /msg %s DROP primero.
+NICK_GROUP_SAME
+ Ya eres miembro del grupo de %s.
+NICK_GROUP_TOO_MANY
+ Hay muchos nicks en el grupo de %s; listalos y bota algunos.
+ Tipea /msg %s HELP GLIST y /msg %s HELP DROP
+ para mayor informacion.
+NICK_GROUP_JOINED
+ Ahora eres miembro en el grupo de %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY clave
+NICK_IDENTIFY_FAILED
+ Lo siento, la identificacion ha fallado.
+NICK_IDENTIFY_SUCCEEDED
+ Clave aceptada - Haz sido reconocido.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Ahora debes proveer un e-mail para tu nick.
+ Este e-mail te permitira recuperar tu clave en
+ caso que la olvides.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Tipea /msg %S SET EMAIL e-mail para setear tu e-mail.
+ Respetamos tu privacidad; este e-mail no sera entregado
+ a ninguna persona.
+
+# LOGOUT responses
+NICK_ALREADY_IDENTIFIED
+ Ya estas identificado.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Estado actualizado (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Tu nick ha sido desconectado.
+NICK_LOGOUT_X_SUCCEEDED
+ El nick %s ha sido desconectado.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ No puedo desconectar a %s porque es un administrador de servicios.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Lo siento, la de-registracion de nicknames esta temporalmente inabilitada.
+NICK_DROPPED
+ Tu nickname ha sido botado.
+NICK_X_DROPPED
+ El nickname %s ha sido botado.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET opcion parametros
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] opcion parametros
+NICK_SET_DISABLED
+ Lo siento, el seteo de opciones para nicknames esta temporalmente deshabilitado.
+NICK_SET_UNKNOWN_OPTION
+ Opcion SET desconocida %s.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ Opcion SET desconocida %s, o nickname no registrado.
+NICK_SET_OPTION_DISABLED
+ Opcion %s no puede ser seteada en esta red.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ El nuevo display DEBE ser un nickname de tu grupo de nicknames!
+NICK_SET_DISPLAY_CHANGED
+ El nuevo display es ahora %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Lo siento, el cambio de clave no pudo ser completado.
+NICK_SET_PASSWORD_CHANGED
+ Clave cambiada.
+NICK_SET_PASSWORD_CHANGED_TO
+ Clave cambiada a %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE numero
+NICK_SET_LANGUAGE_UNKNOWN
+ Numero de lenguage %d desconocido. Tipea /msg %s HELP SET LANGUAGE para una lista de lenguages.
+NICK_SET_LANGUAGE_CHANGED
+ Lenguage cambiado a Español.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL cambiada a %s.
+NICK_SET_URL_UNSET
+ URL no seteada.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ Direccion E-mail cambiada a %s.
+NICK_SET_EMAIL_UNSET
+ Direccion E-mail no seteada.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ No puedes no setear tu direccion e-mail en esta red.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ Numero ICQ seteado a %s.
+NICK_SET_ICQ_UNSET
+ Numero ICQ no seteado.
+NICK_SET_ICQ_INVALID
+ %s no es un numero valido.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Mensaje de bienvenida cambiado a %s.
+NICK_SET_GREET_UNSET
+ Mensaje de bienvenida no seteado.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ Proteccion Activada.
+NICK_SET_KILL_QUICK
+ La protection esta Activada, con demora reducida.
+NICK_SET_KILL_IMMED
+ La protection esta Activada, sin demora.
+NICK_SET_KILL_IMMED_DISABLED
+ La opcion IMMED no esta disponible en esta red.
+NICK_SET_KILL_OFF
+ La protection esta Desactivada.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ La opcion de seguridad esta ahora Activada.
+NICK_SET_SECURE_OFF
+ la opcion de seguridad esta ahora Desactivada.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ La opcion de privacidad esta ahora Activada.
+NICK_SET_PRIVATE_OFF
+ La opcion de privacidad esta ahora Desactivada.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Tu direccion e-mail no sera mostrada en %s INFO displays.
+NICK_SET_HIDE_EMAIL_OFF
+ Tu direccion e-mail sera ahora mostrada en %s INFO displays.
+NICK_SET_HIDE_MASK_ON
+ Tu ultima mascara usuario@host no sera mostrada en %s INFO displays.
+NICK_SET_HIDE_MASK_OFF
+ Tu ultima mascara usuario@host sera ahora mostrada en %s INFO displays.
+NICK_SET_HIDE_QUIT_ON
+ Tu ultimo mensaje quit no sera mostrado en %s INFO displays.
+NICK_SET_HIDE_QUIT_OFF
+ Tu ultimo mensaje quit sera ahora mostrado en %s INFO displays.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Los servicios te responderan ahora con mensajes.
+NICK_SET_MSG_OFF
+ Los servicios te responderan ahora con noticias.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nickname] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ El Nick %s No expirara.
+NICK_SET_NOEXPIRE_OFF
+ El Nick %s expirara.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mascara]
+NICK_ACCESS_ALREADY_PRESENT
+ La mascara %s ya esta presente en tu lista de acceso.
+NICK_ACCESS_REACHED_LIMIT
+ Lo siento, solo puedes tener %d instancias en tu lista de acceso por nickname.
+NICK_ACCESS_ADDED
+ %s añadido a tu lista de acceso.
+NICK_ACCESS_NOT_FOUND
+ %s no encontrado en tu lista de acceso.
+NICK_ACCESS_DELETED
+ %s borrado de tu lista de acceso.
+NICK_ACCESS_LIST
+ Lista de acceso:
+NICK_ACCESS_LIST_X
+ Lista de acceso para %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s es %s
+NICK_INFO_SERVICES_OPER
+ %s es un operador de servicios.
+NICK_INFO_SERVICES_ADMIN
+ %s es un administrador de servicios.
+NICK_INFO_ADDRESS
+ Ultima direccion vista: %s
+NICK_INFO_ADDRESS_ONLINE
+ Esta en linea desde: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s Esta actualmente en linea.
+NICK_INFO_TIME_REGGED
+ Tiempo registrado: %s
+NICK_INFO_LAST_SEEN
+ Ultima vez visto: %s
+NICK_INFO_LAST_QUIT
+ Ultimo mensaje quit: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ Direccion E-mail: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Mensaje de bienvenida: %s
+NICK_INFO_OPTIONS
+ Opciones: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Proteccion
+NICK_INFO_OPT_SECURE
+ Seguro
+NICK_INFO_OPT_PRIVATE
+ Privado
+NICK_INFO_OPT_MSG
+ Modo de mensaje
+NICK_INFO_OPT_NONE
+ Ninguno
+NICK_INFO_NO_EXPIRE
+ Este nickname no expirara.
+NICK_INFO_FOR_MORE
+ Para mayor informacion, tipea /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST patron
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST patron [FORBIDDEN] [NOEXPIRE] [UNCONFIRMED]
+NICK_LIST_HEADER
+ Lista de resultados concordando %s:
+NICK_LIST_RESULTS
+ Fin de la lista - %d/%d resultado(s) mostrado(s).
+
+# GLIST responses
+NICK_ALIST_SYNTAX
+ ALIST nick
+NICK_ALIST_HEADER
+ Canales en los que tienes acceso:
+ Num Canal Nivel Descripcion
+NICK_ALIST_HEADER_X
+ Canales en los que %s tiene acceso:
+ Num Canal Nivel Descripcion
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ Fin de la lista - %d/%d resultado(s) mostrado(s).
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Lista de nicknames en tu grupo:
+NICK_GLIST_HEADER_X
+ Lista de nicknames en el grupo de %s:
+NICK_GLIST_FOOTER
+ %d nicknames en el grupo.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nickname [clave]
+NICK_NO_RECOVER_SELF
+ No puedes recuperarte a ti mismo!
+NICK_RECOVERED
+ El usuario clamando tu nick ha sido killeado.
+ /msg %s RELEASE %s para recuperarlo antes del minuto de time-out.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nickname [clave]
+NICK_RELEASE_NOT_HELD
+ El nick %s no esta siendo ocupado.
+NICK_RELEASED
+ Tu nick ha sido liberado por los Servicios.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nickname [clave]
+NICK_NO_GHOST_SELF
+ No puedes ghostearte a ti mismo!
+NICK_GHOST_KILLED
+ El ghost con tu nick ha sido killeado.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nickname
+NICK_GETPASS_UNAVAILABLE
+ El comando GETPASS no esta disponible por el uso de encriptacion.
+NICK_GETPASS_PASSWORD_IS
+ La clave para %s es %s.
+
+# SENDPASS responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host Sin comodines (WildCards)!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails Coinciden %s a %s.
+NICK_GETEMAIL_NOT_USED
+ No hay e-mails listados para %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nickname
+NICK_SENDPASS_UNAVAILABLE
+ El comando SENDPASS no esta disponible por el uso de encriptacion.
+NICK_SENDPASS_SUBJECT
+ Clave para el Nickname (%s)
+NICK_SENDPASS_HEAD
+ Hola,
+NICK_SENDPASS_LINE_1
+ Tu has pedido recibir la clave para el nickname %s por e-mail.
+NICK_SENDPASS_LINE_2
+ La clave es %s. Por razones de seguridad deberas cambiarla en cuanto recibas este mail.
+NICK_SENDPASS_LINE_3
+ Si no sabes porque este mail ha sido enviado a ti, por favor ignoralo.
+NICK_SENDPASS_LINE_4
+ POR FAVOR NO RESPONDER A ESTE EMAIL!
+NICK_SENDPASS_LINE_5
+ Administradores de %s.
+NICK_SENDPASS_OK
+ La clave de %s ha sido enviada.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nickname [razon]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nickname razon
+NICK_FORBID_SUCCEEDED
+ El nick %s es ahora prohibido.
+NICK_FORBID_FAILED
+ La prohibicion de %s no fue posible!
+
+# Access level descriptions
+NICK_REQUESTED
+ Este nick ya ha sido pedido, chequea tu e-mail para el password.
+NICK_REG_RESENT
+ Tu password ha sido enviado nuevamente a %s.
+NICK_REG_UNABLE
+ Nick NO registrado. Intentalo nuevamente.
+NICK_IS_PREREG
+ Este nick esta esperando una verificacion por e-mail antes de poder completar el registro.
+NICK_ENTER_REG_CODE
+ El password ha sido enviado a %s, tipea /msg %s confirm <password> para completar el registro.
+NICK_CONFIRM_NOT_FOUND
+ El paso de registro 1 puede haber expirado. Usa "/msg %s register <password> <email>" primero.
+NICK_CONFIRM_INVALID
+ Password invalido. Chequea el e-mail e intenta nuevamente.
+NICK_REG_MAIL_SUBJECT
+ Registro de Nick (%s)
+NICK_REG_MAIL_HEAD
+ Hola,
+NICK_REG_MAIL_LINE_1
+ Tu has pedido registrar el nickname %s.
+NICK_REG_MAIL_LINE_2
+ Tipea " /msg %s confirm %s " para completar el registro.
+NICK_REG_MAIL_LINE_3
+ Si no sabes por que has recibido este email, por favor ignorarlo.
+NICK_REG_MAIL_LINE_4
+ NO RESPONDAS A ESTE MAIL!
+NICK_REG_MAIL_LINE_5
+ Administradores de %s.
+NICK_GETPASS_PASSCODE_IS
+ El password para %s es %s.
+NICK_FORCE_REG
+ Nick %s confirmado.
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Status automatico de operador de canal
+CHAN_LEVEL_AUTOVOICE
+ Modo automatico +v
+CHAN_LEVEL_AUTOHALFOP
+ Modo automatico +h
+CHAN_LEVEL_AUTOPROTECT
+ Modo automatico +a
+CHAN_LEVEL_AUTODEOP
+ Status de operador de canal deshabilitado.
+CHAN_LEVEL_NOJOIN
+ No es posible entrar a un canal si esta RESTRINGIDO
+CHAN_LEVEL_INVITE
+ Habilitado para usar el comando INVITE
+CHAN_LEVEL_AKICK
+ Habilitado para usar el comando AKICK
+CHAN_LEVEL_SET
+ Habilitado para usar el comando SET (no FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ Habilitado para usar el comando CLEAR
+CHAN_LEVEL_UNBAN
+ Habilitado para usar el comando UNBAN
+CHAN_LEVEL_OPDEOP
+ Habilitado para usar el comando OP/DEOP
+CHAN_LEVEL_ACCESS_LIST
+ Habilitado para ver la lista de acceso
+CHAN_LEVEL_ACCESS_CHANGE
+ Habilitado para modificar la lista de acceso
+CHAN_LEVEL_MEMO
+ Habilitado para listar/leer memos del canal
+CHAN_LEVEL_ASSIGN
+ Habilitado para asignar/deasignar un bot
+CHAN_LEVEL_BADWORDS
+ Habilitado para usar el comando BADWORDS
+CHAN_LEVEL_NOKICK
+ Jamas expulsado por los kicks del bot
+CHAN_LEVEL_FANTASIA
+ Habilitado para utilizar comandos de fantasia
+CHAN_LEVEL_SAY
+ Habilitado para usar el comando SAY y ACT
+CHAN_LEVEL_GREET
+ Mensaje de bienvenida mostrado
+CHAN_LEVEL_VOICEME
+ Autorizado para voice/devoice a si mismo
+CHAN_LEVEL_VOICE
+ Habilitado para usar el comando VOICE/DEVOICE
+CHAN_LEVEL_GETKEY
+ Habilitado para usar el comando GETKEY
+CHAN_LEVEL_OPDEOPME
+ Autorizado para op/deop a si mismo
+CHAN_LEVEL_HALFOPME
+ Autorizado para halfop/dehalfop a si mismo
+CHAN_LEVEL_HALFOP
+ Habilitado para usar el comando HALFOP/DEHALFOP
+CHAN_LEVEL_PROTECTME
+ Autorizado para protect/deprotect a si mismo
+CHAN_LEVEL_PROTECT
+ Habilitado para usar el comando PROTECT/DEPROTECT
+CHAN_LEVEL_KICKME
+ Autorizado para kickearse a si mismo
+CHAN_LEVEL_KICK
+ Habilitado para usar el comando KICK
+CHAN_LEVEL_SIGNKICK
+ Sin firma de kick cuando SIGNKICK LEVEL es usado
+CHAN_LEVEL_BANME
+ Permitido banearse a si mismo
+CHAN_LEVEL_BAN
+ Permitido usar el comando BAN
+CHAN_LEVEL_TOPIC
+ Permitido usar el comando TOPIC
+CHAN_LEVEL_INFO
+ Permitido usar el comando INFO con
+ la opcion ALL
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Este canal ha sido registrado con %s.
+CHAN_NOT_ALLOWED_OP
+ No estas autorizado al status de operador de canal en %s.
+CHAN_MAY_NOT_BE_USED
+ Este canal esta prohibido.
+CHAN_NOT_ALLOWED_TO_JOIN
+ No estas autorizado a estar en este canal.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER canal clave descripcion
+CHAN_REGISTER_DISABLED
+ Lo siento, el registro de canales esta temporalmente deshabilitado.
+CHAN_REGISTER_NOT_LOCAL
+ Canales locales no pueden ser registrados.
+CHAN_MUST_REGISTER_NICK
+ Debes registrar tu nickname primero. Tipea /msg %s HELP para informacion en como registrar nicknames.
+CHAN_MUST_IDENTIFY_NICK
+ Por favor primero identificate con %s, usando el comando:
+ /msg %s IDENTIFY clave
+CHAN_MAY_NOT_BE_REGISTERED
+ El canal %s no puede ser registrado.
+CHAN_ALREADY_REGISTERED
+ El canal %s ya esta registrado!
+CHAN_MUST_BE_CHANOP
+ Debes ser un operador de canal para registrar el canal.
+CHAN_REACHED_CHANNEL_LIMIT
+ Lo siento, has alcanzado tu limite de %d canales.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Lo siento, has sobrepasado tu limite de %d canales.
+CHAN_REGISTRATION_FAILED
+ Lo siento, el registro ha fallado.
+CHAN_REGISTERED
+ El canal %s esta registrado bajo tu nickname: %s
+CHAN_PASSWORD_IS
+ Tu clave para el canal es %s - Recuerdala para uso futuro.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY canal clave
+CHAN_IDENTIFY_FAILED
+ Lo siento, la identificacion ha fallado.
+CHAN_IDENTIFY_SUCCEEDED
+ Clave aceptada - ahora tienes nivel de fundador en %s.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT canal nickname
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT canal [nickname]
+CHAN_LOGOUT_SUCCEEDED
+ El usuario %s ha sido desconectado del canal %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Todos los usuarios identificados han sido desconectados del canal %s.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP canal
+CHAN_DROP_DISABLED
+ Lo siento, la de-registracion de canales esta temporalmente desabilitada.
+CHAN_DROPPED
+ El canal %s ha sido botado.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET canal opcion parametros
+CHAN_SET_DISABLED
+ Lo siento, el seteo de opciones de canales esta temporalmente deshabilitado.
+CHAN_SET_UNKNOWN_OPTION
+ Opcion SET %s desconocida.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s tiene demasiados canales registrados.
+CHAN_FOUNDER_CHANGED
+ El Fundador de %s cambiado a %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Sucesor de %s cambiado a %s.
+CHAN_SUCCESSOR_UNSET
+ Sucesor de %s eliminado.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s no puede ser el sucesor en el canal %s ya que el es el fundador.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Lo siento, el seteo de la clave no fue posible.
+CHAN_PASSWORD_CHANGED
+ Clave para %s cambiada.
+CHAN_PASSWORD_CHANGED_TO
+ La clave para %s cambiado a %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ La descripcion de %s cambiada a%s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ URL para %s cambiada a %s.
+CHAN_URL_UNSET
+ URL para %s no seteada.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ Direccion e-mail para %s cambiada a %s.
+CHAN_EMAIL_UNSET
+ Direccion e-mail para %s no seteada.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Mensage de entrada para %s cambiado.
+CHAN_ENTRY_MSG_UNSET
+ Mensaje de entrada para %s no seteado.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s no es un tipo de ban valido.
+CHAN_SET_BANTYPE_CHANGED
+ Tipo de ban para el canal %s es ahora #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Caracter de modo %c desconocido e ignorado.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Modo %c ignorado porque no puedes lockearlo.
+CHAN_SET_MLOCK_L_REQUIRED
+ Debes usar modo de lock +l tambien para el modo
+ de lock +L.
+CHAN_SET_MLOCK_K_REQUIRED
+ Debes usar modo de lock +i tambien para el modo
+ de lock +K.
+CHAN_MLOCK_CHANGED
+ Modo de lock en el canal %s cambiado a %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET canal KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Retencion de topic Activada.
+CHAN_SET_KEEPTOPIC_OFF
+ Retencion de topic Desactivada.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET canal TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Lock de topic Activado.
+CHAN_SET_TOPICLOCK_OFF
+ Lock de topic Desactivado.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET canal PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Opcion de paz Activada.
+CHAN_SET_PEACE_OFF
+ Opcion de paz Desactivada.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET canal PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Opcion de privacidad Activada.
+CHAN_SET_PRIVATE_OFF
+ Opcion de privacidad Desactivada.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET canal SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Seguridad de OPs Activada.
+CHAN_SET_SECUREOPS_OFF
+ Seguridad de OPs Desactivada.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET canal SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Seguridad de fundador Activada.
+CHAN_SET_SECUREFOUNDER_OFF
+ Seguridad de fundador Desactivada.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET canal RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Acceso restringido Activado.
+CHAN_SET_RESTRICTED_OFF
+ Acceso restringido Desactivado.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET canal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Opcion de seguridad Activada.
+CHAN_SET_SECURE_OFF
+ Opcion de seguridad Desactivada.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET canal SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Opcion de kick firmado Activada.
+CHAN_SET_SIGNKICK_LEVEL
+ Opcion de kick firmado Activada, pero depende del nivel del
+ usuario que use el comando.
+CHAN_SET_SIGNKICK_OFF
+ Opcion de kick firmado Desactivada.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET canal OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Opcion OP-notice Activada.
+CHAN_SET_OPNOTICE_OFF
+ Opcion OP-notice Desactivada.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET canal XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ El sistema de listas xOP ahora Encendido.
+CHAN_SET_XOP_OFF
+ El sistema de listas xOP ahora Apagado.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET canal NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ El canal %s no expirara.
+CHAN_SET_NOEXPIRE_OFF
+ El canal %s expirara.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Lo siento, solo puedes tener %d instancias de AOP/SOP/VOP
+ en un canal.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ No puedes usar este comando. Usa el comando ACCESS en su lugar.
+ Tipea /msg %s HELP ACCESS para mayor informacion.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP canal {ADD|DEL|LIST|CLEAR} [nick | instancia]
+CHAN_AOP_DISABLED
+ Lo siento, la modificacion de la lista AOP de canales esta
+ temporalmente deshabilitada.
+CHAN_AOP_NICKS_ONLY
+ La lista de AOP de canales solo puede contener nicks
+ registrados.
+CHAN_AOP_ADDED
+ %s añadido a la lista AOP de %s.
+CHAN_AOP_MOVED
+ %s movido a %s en la lista AOP.
+CHAN_AOP_NO_SUCH_ENTRY
+ No existe la instancia (#%d) en la lista AOP de %s.
+CHAN_AOP_NOT_FOUND
+ %s no encontrado en la lista AOP de %s.
+CHAN_AOP_NO_MATCH
+ No existen instancias concordantes en la lista AOP de %s.
+CHAN_AOP_DELETED
+ %s borrado de la lista AOP de %s.
+CHAN_AOP_DELETED_ONE
+ 1 instancia borrada de la lista AOP de %s.
+CHAN_AOP_DELETED_SEVERAL
+ %d instancias borradas de la lista AOP de %s.
+CHAN_AOP_LIST_EMPTY
+ La lista AOP de %s esta vacia.
+CHAN_AOP_LIST_HEADER
+ Lista AOP para %s:
+ Num Nick
+CHAN_AOP_CLEAR
+ La lista AOP de canales ha sido limpiada.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP canal {ADD|DEL|LIST|CLEAR} [nick | lista]
+CHAN_HOP_DISABLED
+ Lo siento, la modificacion de listas HOP de canales esta
+ temporalmente deshabilitada.
+CHAN_HOP_NICKS_ONLY
+ Listas HOP de canales solo pueden tener nicks registrados.
+CHAN_HOP_ADDED
+ %s añadido a la lista HOP de %s.
+CHAN_HOP_MOVED
+ %s movido a %s en la lista HOP.
+CHAN_HOP_NO_SUCH_ENTRY
+ No existe la instancia (#%d) en la lista HOP de %s.
+CHAN_HOP_NOT_FOUND
+ %s no encontrado en la lista HOP de %s.
+CHAN_HOP_NO_MATCH
+ No existen instancias concordantes en la lista HOP de %s.
+CHAN_HOP_DELETED
+ %s borrado de la lista HOP de %s.
+CHAN_HOP_DELETED_ONE
+ 1 instancia borrada de la lista HOP de %s.
+CHAN_HOP_DELETED_SEVERAL
+ %d instancias borradas de la lista HOP de %s.
+CHAN_HOP_LIST_EMPTY
+ La lista HOP de %s esta vacia.
+CHAN_HOP_LIST_HEADER
+ Lista HOP para %s:
+ Num Nick
+CHAN_HOP_CLEAR
+ La lista HOP de canales ha sido limpiada.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP canal {ADD|DEL|LIST|CLEAR} [nick | lista]
+CHAN_SOP_DISABLED
+ Lo siento, la modificacion de la lista SOP de canales esta
+ temporalmente deshabilitada.
+CHAN_SOP_NICKS_ONLY
+ Listas SOP de canales solo pueden tener nicks registrados.
+CHAN_SOP_ADDED
+ %s añadido a la lista SOP de %s.
+CHAN_SOP_MOVED
+ %s movido a %s en la lista SOP.
+CHAN_SOP_NO_SUCH_ENTRY
+ No existe la instancia (#%d) en la lista SOP de %s.
+CHAN_SOP_NOT_FOUND
+ %s no encontrado en la lista SOP de %s.
+CHAN_SOP_NO_MATCH
+ No existen instancias concordantes en la lista SOP de %s.
+CHAN_SOP_DELETED
+ %s borrado de la lista SOP de %s.
+CHAN_SOP_DELETED_ONE
+ 1 instancia borrada de la lista SOP de %s.
+CHAN_SOP_DELETED_SEVERAL
+ %d instancias borradas de la lista SOP de %s.
+CHAN_SOP_LIST_EMPTY
+ La lista SOP de %s esta vacia.
+CHAN_SOP_LIST_HEADER
+ Lista SOP para %s:
+ Num Nick
+CHAN_SOP_CLEAR
+ La lista HOP de canales ha sido limpiada.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP canal {ADD|DEL|LIST|CLEAR} [nick | lista]
+CHAN_VOP_DISABLED
+ Lo siento, la modificacion de la lista VOP de canales esta
+ temporalmente deshabilitada.
+CHAN_VOP_NICKS_ONLY
+ Listas VOP de canales solo pueden tener nicks registrados.
+CHAN_VOP_ADDED
+ %s añadido a la lista VOP de %s.
+CHAN_VOP_MOVED
+ %s movido a %s en la lista VOP.
+CHAN_VOP_NO_SUCH_ENTRY
+ No existe la instancia (#%d) en la lista VOP de %s.
+CHAN_VOP_NOT_FOUND
+ %s no encontrado en la lista VOP de %s.
+CHAN_VOP_NO_MATCH
+ No existen instancias concordantes en la lista VOP de %s.
+CHAN_VOP_DELETED
+ %s borrado de la lista VOP de %s.
+CHAN_VOP_DELETED_ONE
+ 1 instancia borrada de la lista VOP de %s.
+CHAN_VOP_DELETED_SEVERAL
+ %d instancias borradas de la lista VOP de %s.
+CHAN_VOP_LIST_EMPTY
+ La lista VOP de %s esta vacia.
+CHAN_VOP_LIST_HEADER
+ Lista VOP para %s:
+ Num Nick
+CHAN_VOP_CLEAR
+ La lista HOP de canales ha sido limpiada.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS canal {ADD|DEL|LIST|CLEAR} [nick [nivel] | lista]
+CHAN_ACCESS_XOP
+ No puedes usar este comando.
+ Usa los comandos AOP, SOP y VOP en vez.
+ Tipea /msg %s HELP comando para mayor informacion.
+CHAN_ACCESS_DISABLED
+ Lo siento, la modificacion de acceso a canales esta temporalmete deshabilitada.
+CHAN_ACCESS_LEVEL_NONZERO
+ El nivel de acceso no puede ser cero.
+CHAN_ACCESS_LEVEL_RANGE
+ El nivel de acceso debe ser entre %d y %d inclusive.
+CHAN_ACCESS_NICKS_ONLY
+ Las listas de acceso a canales solo pueden contener nicks registrados.
+CHAN_ACCESS_REACHED_LIMIT
+ Lo siento, solo puedes tener %d instancias de acceso en un determinado canal.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Nivel de acceso para %s en %s no cambiada de %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Nivel de acceso para %s en %s cambiada a %d.
+CHAN_ACCESS_ADDED
+ %s añadido a la lista de acceso de %s con nivel %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ No existe (#%d) en la lista de acceso de %s.
+CHAN_ACCESS_NOT_FOUND
+ %s no encontrado en la lista de acceso de %s.
+CHAN_ACCESS_NO_MATCH
+ No hay instancias que concuerden en la lista de acceso de %s .
+CHAN_ACCESS_DELETED
+ %s borrado de la lista de acceso de %s.
+CHAN_ACCESS_DELETED_ONE
+ 1 instancia borrada de la lista de acceso de %s.
+CHAN_ACCESS_DELETED_SEVERAL
+ %d instancias borradas de la lista de acceso de %s.
+CHAN_ACCESS_LIST_EMPTY
+ La lista de acceso de %s esta vacia.
+CHAN_ACCESS_LIST_HEADER
+ Lista de acceso para %s:
+ Num Niv Nick
+CHAN_ACCESS_LIST_FOOTER
+ Fin de la lista de acceso.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ La lista de acceso para el canal ha sido limpiada.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK canal {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-o-mascara] [razon]
+CHAN_AKICK_DISABLED
+ Lo siento, la modificacion de kicks automaticos en canales esta temporalmente deshabilitada.
+CHAN_AKICK_ALREADY_EXISTS
+ %s ya esta presente en la lista de kick automatico en el canal %s.
+CHAN_AKICK_REACHED_LIMIT
+ Lo siento, solo puedes tener %d mascaras para kicks automaticos en un canal.
+CHAN_AKICK_ADDED
+ %s añadido a la lista de kicks automaticos en el canal %s.
+CHAN_AKICK_NO_SUCH_ENTRY
+ La instancia (#%d) no existe en la lista de kicks automaticos en el canal %s.
+CHAN_AKICK_NOT_FOUND
+ %s no encontrado en la lista de kicks automaticos en el canal %s.
+CHAN_AKICK_NO_MATCH
+ No existen instancias que concuerden en la lista de kicks automaticos en el canal %s.
+CHAN_AKICK_STUCK
+ %s esta ahora siempre activo en el canal %s.
+CHAN_AKICK_UNSTUCK
+ %s ya no esta siempre activo en el canal %s.
+CHAN_AKICK_DELETED
+ %s borrado de la lista de kicks automaticos del canal %s.
+CHAN_AKICK_DELETED_ONE
+ 1 instancia borrada de la lista de kicks automaticos del canal %s.
+CHAN_AKICK_DELETED_SEVERAL
+ %d instancias borradas de la lista de kicks automaticos del canal %s.
+CHAN_AKICK_LIST_EMPTY
+ La lista de kicks automaticos del canal %s esta vacia.
+CHAN_AKICK_LIST_HEADER
+ Lista de kicks automaticos para el canal %s:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (por %s en %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (pegado) (por %s en %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE en %s completa; %d usuarios afectados.
+CHAN_AKICK_CLEAR
+ La lista de kicks automaticos ha sido limpiada.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS canal {SET | DIS[ABLE] | LIST | RESET} [item [nivel]]
+CHAN_LEVELS_XOP
+ Este comando es inservible en este modo.
+CHAN_LEVELS_RANGE
+ El nivel debe ser entre %d a %d inclusive.
+CHAN_LEVELS_CHANGED
+ Nivel para %s en el canal %s cambiado a %d.
+CHAN_LEVELS_UNKNOWN
+ Opcion %s no conocida. Tipea /msg %s HELP LEVELS DESC para una lista de opciones validas.
+CHAN_LEVELS_DISABLED
+ %s inhabilitado(s) en el canal %s.
+CHAN_LEVELS_LIST_HEADER
+ Opciones del nivel de acceso para el canal %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (inhabilitado)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (solo el fundador)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ Niveles de acceso para %s resetados a los valores originales.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO canal [ALL]
+CHAN_INFO_HEADER
+ Informacion para el canal %s:
+CHAN_INFO_FOUNDER
+ Fundador: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Fundador: %s
+CHAN_INFO_SUCCESSOR
+ Sucesor: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Sucesor: %s
+CHAN_INFO_DESCRIPTION
+ Descripcion: %s
+CHAN_INFO_ENTRYMSG
+ Mensaje de entrada: %s
+CHAN_INFO_TIME_REGGED
+ Registrado: %s
+CHAN_INFO_LAST_USED
+ Ultima vez usado: %s
+CHAN_INFO_LAST_TOPIC
+ Ultimo topic: %s
+CHAN_INFO_TOPIC_SET_BY
+ Topic seteado por: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ Direccion e-mail: %s
+CHAN_INFO_BANTYPE
+ Tipo de ban: %d
+CHAN_INFO_OPTIONS
+ Opciones: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Retencion de Topic
+CHAN_INFO_OPT_OPNOTICE
+ Noticia de OP
+CHAN_INFO_OPT_PEACE
+ Paz
+CHAN_INFO_OPT_PRIVATE
+ Privado
+CHAN_INFO_OPT_RESTRICTED
+ Acceso Restringido
+CHAN_INFO_OPT_SECURE
+ Seguro
+CHAN_INFO_OPT_SECUREOPS
+ Ops Seguros
+CHAN_INFO_OPT_SECUREFOUNDER
+ Fundador Seguro
+CHAN_INFO_OPT_SIGNKICK
+ Kicks Firmados
+CHAN_INFO_OPT_TOPICLOCK
+ Lock de topic
+CHAN_INFO_OPT_XOP
+ Sistema de listas xOP
+CHAN_INFO_OPT_NONE
+ Ninguno
+CHAN_INFO_MODE_LOCK
+ Modo de lock: %s
+CHAN_INFO_NO_EXPIRE
+ Este canal no expirara.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST patron
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST patron [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Lista de instancias concordando a %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Fin de la lista - %d/%d concordancia(s) mostrada(s).
+
+# INVITE responses
+CHAN_INVITE_SYNTAX
+ INVITE canal
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN canal
+CHAN_UNBANNED
+ Haz sido desbaneado de %s.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC canal [topico]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR canal modos-a-limpiar
+CHAN_CLEARED_BANS
+ Todos los bans en el canal %s han sido removidos.
+CHAN_CLEARED_EXCEPTS
+ Todas las excepciones en el canal %s han sido removidas.
+CHAN_CLEARED_MODES
+ Todos los modos en el canal %s han sido reseteados.
+CHAN_CLEARED_OPS
+ Modo +o ha sido removido del canal %s.
+CHAN_CLEARED_VOICES
+ Modo +v ha sido removido del canal %s.
+CHAN_CLEARED_USERS
+ Todos los usuarios han sido kickeados del canal %s.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS canal
+CHAN_GETPASS_UNAVAILABLE
+ Comando GETPASS no permitido porque encriptacion esta en uso.
+CHAN_GETPASS_PASSWORD_IS
+ La clave para el canal %s es %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS canal
+CHAN_SENDPASS_UNAVAILABLE
+ Comando SENDPASS no permitido porque encriptacion esta en uso.
+CHAN_SENDPASS_SUBJECT
+ Clave del canal (%s)
+CHAN_SENDPASS_HEAD
+ Hola,
+CHAN_SENDPASS_LINE_1
+ Haz solicitado recibir la clave del canal %s por e-mail.
+CHAN_SENDPASS_LINE_2
+ La clave es %s. Por razones de seguridad deberas cambiarla en cuanto recibas este mail.
+CHAN_SENDPASS_LINE_3
+ Si no sabes porque recibiste este mail, por favor ignoralo.
+CHAN_SENDPASS_LINE_4
+ POR FAVOR NO RESPONDER A ESTE EMAIL!
+CHAN_SENDPASS_LINE_5
+ Administradores de %s.
+CHAN_SENDPASS_OK
+ La clave de %s ha sido enviada.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID canal [razon]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID canal razon
+CHAN_FORBID_SUCCEEDED
+ Canal %s ahora prohibido.
+CHAN_FORBID_FAILED
+ Imposible prohibir el canal %s!
+
+# Misc responses
+CHAN_FORBID_REASON
+ Este canal ha sido prohibido.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND canal [razon]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND canal razon
+CHAN_SUSPEND_SUCCEEDED
+ Canal %s ahora prohibido.
+CHAN_SUSPEND_FAILED
+ Imposible suspender el canal %s!
+CHAN_SUSPEND_REASON
+ Este canal ha sido suspendido.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND canal
+CHAN_UNSUSPEND_ERROR
+ No se ha encontrado # en frente del nombre del canal.
+CHAN_UNSUSPEND_SUCCEEDED
+ Canal %s ahora liberado.
+CHAN_UNSUSPEND_FAILED
+ Imposible liberar el canal %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s coincide con una excepcion en %s y no puede ser baneado hasta que la excepcion haya sido removida.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Tienes 1 memo nuevo.
+MEMO_HAVE_NEW_MEMOS
+ Tienes %d memos nuevos.
+MEMO_TYPE_READ_LAST
+ Tipea /msg %s READ LAST para leer tu ultimo memo.
+MEMO_TYPE_READ_NUM
+ Tipea /msg %s READ %d para leerlo.
+MEMO_TYPE_LIST_NEW
+ Tipea /msg %s LIST NEW para listar tus memos.
+MEMO_AT_LIMIT
+ Advertencia: haz alcanzado el maximo numero de memos (%d). No podras recibir mas memos hasta que borres algunos de los existentes.
+MEMO_OVER_LIMIT
+ Advertencia: haz sobrepasado el maximo numero de memos (%d). Te sera imposible recibir mas memos hasta que borres algunos de los existentes.
+MEMO_X_MANY_NOTICE
+ Hay %d memos en el canal %s.
+MEMO_X_ONE_NOTICE
+ Hay %d memo en el canal %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ Hay un memo nuevo en el canal %s.
+ Tipea /msg %s READ %s %d para leerlo.
+MEMO_NEW_MEMO_ARRIVED
+ Tienes un nuevo memo de %s.
+ Tipea /msg %s READ %d para leerlo.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ No tienes memos.
+MEMO_X_HAS_NO_MEMOS
+ %s no tiene memos.
+MEMO_DOES_NOT_EXIST
+ El memo %d no existe!
+MEMO_LIST_NOT_FOUND
+ No existen memos que concuerden.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | canal} texto
+MEMO_SEND_DISABLED
+ Lo siento, el envio de memos esta temporalmente inhabilitado.
+MEMO_SEND_PLEASE_WAIT
+ Por favor espera %d segundos antes de utilizar el comando SEND nuevamente.
+MEMO_X_GETS_NO_MEMOS
+ %s no puede recibir memos.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s actualmente tiene muchos memos y no puede recibir mas.
+MEMO_SENT
+ Memo enviado a %s.
+
+# CANCEL responses
+MEMO_MASS_SENT
+ Un massmemo ha sido enviado a todos los usuarios registrados.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | canal}
+MEMO_CANCEL_DISABLED
+ Lo siento, la cancelacion de memos esta temporalmente inabilitada.
+MEMO_CANCEL_NONE
+ Ningun memo pudo ser cancelado.
+MEMO_CANCELLED
+ Ultimo memo enviado a %s fue cancelado.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [canal] [lista | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ No tienes memos nuevos.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s no tiene memos nuevos.
+MEMO_LIST_MEMOS
+ Memos para %s. Para leerlos tipea: /msg %s READ numero
+MEMO_LIST_NEW_MEMOS
+ Nuevos memos para %s. Para leerlos tipea: /msg %s READ numero
+MEMO_LIST_CHAN_MEMOS
+ Memos para %s. Para leerlos tipea: /msg %s READ %s numero
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nuevos memos para %s. Para leerlos tipea: /msg %s READ %s numero
+MEMO_LIST_HEADER
+ Num De Fecha/Hora
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [canal] {lista | LAST | NEW}
+MEMO_HEADER
+ Memo %d de %s (%s). Para borrarlo tipea: /msg %s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d de %s (%s). Para borrarlo tipea: /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [canal] {numero | lista | ALL}
+MEMO_DELETED_NONE
+ Ningun memo fue borrado.
+MEMO_DELETED_ONE
+ Memo %d ha sido borrado.
+MEMO_DELETED_SEVERAL
+ Los memos %s han sido borrados.
+MEMO_DELETED_ALL
+ Todos tus memos han sido borrados.
+
+# SET responses
+MEMO_CHAN_DELETED_ALL
+ Todos los memos para el canal %s han sido borrados.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET opcion parametros
+MEMO_SET_DISABLED
+ Lo siento, el seteo de opciones para memos esta temporalmente inhabilitado.
+MEMO_SET_UNKNOWN_OPTION
+ Opcion SET %s desconocida.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s ahora te notificara de tus memos cuando te conectes y cuando te sean enviados.
+MEMO_SET_NOTIFY_LOGON
+ %s ahora te notificara de tus memos cuando te conectes o saques tu /AWAY.
+MEMO_SET_NOTIFY_NEW
+ %s ahora te notificara de tus memos cuando te sean enviados.
+MEMO_SET_NOTIFY_OFF
+ %s no te enviara ninguna notificacion acerca de tus memos.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [canal] limite
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [usuario | canal] {limite | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ No estas autorizado a cambiar tu limite de memos.
+MEMO_SET_LIMIT_FORBIDDEN
+ El limite de memos para %s no puede ser cambiado.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ No puedes setear tu limite de memos mayor a %d.
+MEMO_SET_LIMIT_TOO_HIGH
+ No puedes setear el limite de memos para %s mayor a %d.
+MEMO_SET_LIMIT_OVERFLOW
+ Limite de memos muy alto; limitandolo a %d en vez.
+MEMO_SET_YOUR_LIMIT
+ Tu limite de memos ha sido seteado a %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ No te sera posible recibir mas memos.
+MEMO_UNSET_YOUR_LIMIT
+ Tu limite de memos ha sido deshabilitado.
+MEMO_SET_LIMIT
+ Limite de memos para %s seteado a %d.
+MEMO_SET_LIMIT_ZERO
+ Limite de memos para %s seteado a 0.
+MEMO_UNSET_LIMIT
+ Limite de memos para %s deshabilitado.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [canal]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | canal]
+MEMO_INFO_NO_MEMOS
+ No tienes memos.
+MEMO_INFO_MEMO
+ Tienes 1 memo.
+MEMO_INFO_MEMO_UNREAD
+ Tienes 1 memo y aun no ha sido leido.
+MEMO_INFO_MEMOS
+ Tienes %d memos.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Tienes %d memos, de los cuales 1 aun no ha sido leido.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Tienes %d memos, de los cuales %d aun no han sido leidos.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Tienes %d memos, ninguno de ellos leido.
+MEMO_INFO_LIMIT
+ Tu limite de memos es %d.
+MEMO_INFO_HARD_LIMIT
+ Tu limite de memos es %d y no puede ser cambiado.
+MEMO_INFO_LIMIT_ZERO
+ Tu limite de memos es 0; No recibiras nuevos memos.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Tu limite de memos es 0; No recibiras nuevos memos. No puedes cambiar este limite.
+MEMO_INFO_NO_LIMIT
+ No tienes limite en el numero de memos que puedes mantener.
+MEMO_INFO_NOTIFY_OFF
+ No seras notificado por memos nuevos.
+MEMO_INFO_NOTIFY_ON
+ Seras notificado por nuevos memos cuando te conectes y en cuanto te sean enviados.
+MEMO_INFO_NOTIFY_RECEIVE
+ Seras notificado cuando los memos nuevos te sean enviados.
+MEMO_INFO_NOTIFY_SIGNON
+ Seras notificado por memos nuevos en cuanto te conectes.
+MEMO_INFO_X_NO_MEMOS
+ %s no tiene memos.
+MEMO_INFO_X_MEMO
+ %s tiene 1 memo.
+MEMO_INFO_X_MEMO_UNREAD
+ %s actualmente tiene 1 memo y aun no ha sido leido.
+MEMO_INFO_X_MEMOS
+ %s actualmente tiene %d memos.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s actualmente tiene %d memos, de los cuales 1 aun no ha sido leido.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s actualmente tienes %d memos, de los cuales %d aun no han sido leidos.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s actualmente tienes %d memos, de los cuales ninguno ha sido leido .
+MEMO_INFO_X_LIMIT
+ El limite de memos para %s es %d.
+MEMO_INFO_X_HARD_LIMIT
+ El limite de memos para %s es %d, y no puede ser cambiado.
+MEMO_INFO_X_NO_LIMIT
+ %s no tiene limite para memos.
+MEMO_INFO_X_NOTIFY_OFF
+ %s no es notificado por memos nuevos.
+MEMO_INFO_X_NOTIFY_ON
+ %s es notificado por memos nuevos cuando se conecta y cuando le son enviados.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s es notificado cuando nuevos memos le son enviados.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s es notificado de nuevos memos cuando se conecta.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ El bot %s no existe.
+BOT_NOT_ASSIGNED
+ Debes asignar un bot al canal antes de poder usar este comando.
+ Tipea /msg %S HELP ASSIGN para mayor informacion.
+BOT_NOT_ON_CHANNEL
+ El bot no esta en el canal %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ No uses la palabra %s en este canal!
+BOT_REASON_BADWORD_GENTLE
+ Cuida tu lenguaje!
+BOT_REASON_BOLD
+ No uses negritas en este canal!
+BOT_REASON_CAPS
+ Apaga las mayusculas!
+BOT_REASON_COLOR
+ No uses colores en este canal!
+BOT_REASON_FLOOD
+ Para de floodear!
+BOT_REASON_REPEAT
+ Para de repetir!
+BOT_REASON_REVERSE
+ No uses reversos en este canal!
+BOT_REASON_UNDERLINE
+ No uses subrayados en este canal!
+
+# !seen replies
+BOT_SEEN_BOT
+ Me encontraste %s!
+BOT_SEEN_YOU
+ Buscandote a ti mismo, eh %s?
+BOT_SEEN_ON_CHANNEL
+ %s esta en el canal en estos instantes!
+BOT_SEEN_ON_CHANNEL_AS
+ %s esta en el canal en estos instantes (como %s) !
+BOT_SEEN_ON
+ %s fue visto aqui hace %s.
+BOT_SEEN_NEVER
+ Jamas he visto a %s en este canal.
+BOT_SEEN_UNKNOWN
+ Jamas he visto a %s.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick usuario host nombre-real
+ BOT CHANGE nick-antiguo nick-nuevo [usuario [host [nombre-real]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ El bot %s ya existe.
+BOT_BOT_CREATION_FAILED
+ Lo siento, la creacion de bot ha fallado
+BOT_BOT_READONLY
+ Lo siento, la modificacion de bots esta temporalmente inabilitada.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) añadido a la lista de bots.
+BOT_BOT_ANY_CHANGES
+ La informacion antigua es igual a la nueva.
+BOT_BOT_CHANGED
+ El bot %s ha sido cambiado a %s!%s@%s (%s)
+BOT_BOT_DELETED
+ El bot %s ha sido borrado.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Lista de bots:
+BOT_BOTLIST_PRIVATE_HEADER
+ Bots reservados a operadores de IRC:
+BOT_BOTLIST_FOOTER
+ %d bots disponibles.
+BOT_BOTLIST_EMPTY
+ No hay bots disponibles en este momento.
+ Pidele a un administrador de servicios que cree uno!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN canal nick
+BOT_ASSIGN_READONLY
+ Lo siento, el asignamiento de bots esta temporalmente inhabilitado.
+BOT_ASSIGN_ALREADY
+ Bot %s ya esta asignado al canal %s.
+BOT_ASSIGN_ASSIGNED
+ El bot %s ha sido asignado al canal %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN canal
+BOT_UNASSIGN_UNASSIGNED
+ Ya no hay un bot asignado a %s.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {canal | nick}
+BOT_INFO_NOT_FOUND
+ %s no es un bot valido o el canal no esta registrado.
+BOT_INFO_BOT_HEADER
+ Informacion para el bot %s:
+BOT_INFO_BOT_MASK
+ Mascara : %s@%s
+BOT_INFO_BOT_REALNAME
+ Nombre real : %s
+BOT_INFO_BOT_CREATED
+ Creado : %s
+BOT_INFO_BOT_USAGE
+ Usado en : %d canal(es)
+BOT_INFO_BOT_OPTIONS
+ Opciones : %s
+BOT_INFO_OPT_PRIVATE
+ Privado
+BOT_INFO_CHAN_HEADER
+ Informacion para el canal %s:
+BOT_INFO_CHAN_BOT
+ Nick del bot : %s
+BOT_INFO_CHAN_BOT_NONE
+ Nick del bot : Aun no asignado.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Kicker por Bad words : %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Kicker por Bad words : %s (%d kick(s) para ban)
+BOT_INFO_CHAN_KICK_BOLDS
+ Kicker por negritas : %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Kicker por negritas : %s (%d kick(s) para ban)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Caps kicker : %s (minimo %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Kicker por mayusculas : %s (%d kick(s) para ban; minimo %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Kicker por mayusculas : %s
+BOT_INFO_CHAN_KICK_COLORS
+ Kicker por colores : %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Kicker por colores : %s (%d kick(s) para ban)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Kicker por flood : %s (%d lineas en %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Kicker por flood : %s (%d kick(s) para ban; %d lineas en %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Kicker por flood : %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Kicker por repeticion : %s (%d veces)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Kicker por repeticion : %s (%d kick(s) para ban; %d veces)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Kicker por repeticion : %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Kicker por inversos : %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Kicker por inversos : %s (%d kick(s) para ban)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Kicker por subrayados : %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Kicker por subrayados : %s (%d kick(s) para ban)
+BOT_INFO_ACTIVE
+ Activada
+BOT_INFO_INACTIVE
+ Desactivada
+BOT_INFO_CHAN_OPTIONS
+ Opciones : %s
+BOT_INFO_OPT_DONTKICKOPS
+ Proteccion de Ops
+BOT_INFO_OPT_DONTKICKVOICES
+ Proteccion de Voices
+BOT_INFO_OPT_FANTASY
+ Fantasia
+BOT_INFO_OPT_GREET
+ Saludo
+BOT_INFO_OPT_NOBOT
+ Sin bot
+BOT_INFO_OPT_SYMBIOSIS
+ Simbiosis
+BOT_INFO_OPT_NONE
+ Ninguna
+
+# SET responses
+BOT_SET_SYNTAX
+ SET canal opcion seteos
+BOT_SET_DISABLED
+ Lo siento, el seteo de opciones para bot esta temporalmente inhabilitado
+BOT_SET_UNKNOWN
+ Opcion %s desconocida.
+ Tipea /msg %S HELP SET para mayor informacion.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET canal DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Bot no kickeara ops en el canal %s.
+BOT_SET_DONTKICKOPS_OFF
+ Bot kickeara ops en el canal %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET canal DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Bot no kickeara voices en el canal %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Bot kickeara voices en el canal %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET canal FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Modo fantasia ahora Activado en el canal %s.
+BOT_SET_FANTASY_OFF
+ Modo fantasia ahora Desactivado en el canal %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET canal GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Modo saludo ahora Activado en el canal %s.
+BOT_SET_GREET_OFF
+ Modo saludo ahora Desactivado en el canal %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET canal NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ Modo no bot ahora Activado en el canal %s.
+BOT_SET_NOBOT_OFF
+ Modo no bot ahora Desactivado en el canal %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET canal PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Modo privado del bot %s esta ahora Activado.
+BOT_SET_PRIVATE_OFF
+ Modo privado del bot %s esta ahora Desactivado.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET canal SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ Modo Simbiosis ahora Activado en el canal %s.
+BOT_SET_SYMBIOSIS_OFF
+ Modo Simbiosis ahora Desactivado en el canal %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK canal opcion {ON|OFF} [seteos]
+BOT_KICK_DISABLED
+ Lo siento, la configuracion de kicker esta temporalmente inabilitada.
+BOT_KICK_UNKNOWN
+ Opcion %s desconocida.
+ Tipea /msg %S HELP KICK para mayor informacion
+BOT_KICK_BAD_TTB
+ %s no puede ser tomado como veces a banear
+
+BOT_KICK_BADWORDS_ON
+ El bot ahora kickeara bad words. Usa el comando BADWORDS
+ para añadir o remover palabras.
+BOT_KICK_BADWORDS_ON_BAN
+ El bot ahora kickeara bad words, y baneara despues de
+ %d kicks al mismo usuario. Usa el comando BADWORDS
+ para añadir o remover palabras.
+BOT_KICK_BADWORDS_OFF
+ El bot ya no kickeara bad words.
+BOT_KICK_BOLDS_ON
+ El bot ahora kickeara negritas.
+BOT_KICK_BOLDS_ON_BAN
+ El bot ahora kickeara negritas, y baneara despues de
+ %d kicks al mismo usuario.
+BOT_KICK_BOLDS_OFF
+ El bot ya no kickeara negritas.
+BOT_KICK_CAPS_ON
+ El bot ahora kickeara mayusculas (deben ser al menos
+ %d caracteres y %d%% del mensaje entero).
+BOT_KICK_CAPS_ON_BAN
+ El bot ahora kickeara mayusculas (deben ser al menos
+ %d caracteres y %d%% del mensaje entero), y baneara
+ despues de %d kicks al mismo usuario.
+BOT_KICK_CAPS_OFF
+ El bot ya no kickeara mayusculas.
+BOT_KICK_COLORS_ON
+ El bot ahora kickeara colores.
+BOT_KICK_COLORS_ON_BAN
+ El bot ahora kickeara colores, y baneara despues de %d
+ kicks al mismo usuario.
+BOT_KICK_COLORS_OFF
+ El bot ya no kickeara colores.
+BOT_KICK_FLOOD_ON
+ El bot ahora kickeara flood (%d lineas en %d segundos).
+BOT_KICK_FLOOD_ON_BAN
+ El bot ahora kickeara flood (%d lineas in %d segundos), y
+ baneara despues de %d kicks al mismo usuario.
+BOT_KICK_FLOOD_OFF
+ El bot ya no kickeara flood.
+BOT_KICK_REPEAT_ON
+ El bot ahora kickeara repeats (usuarios que repitan %d veces
+ lo mismo).
+BOT_KICK_REPEAT_ON_BAN
+ El bot ahora kickeara repeats (usuarios que repitan %d veces
+ lo mismo), y baneara despues de %d
+ kicks al mismo usuario.
+BOT_KICK_REPEAT_OFF
+ El bot ya no kickeara repeats.
+BOT_KICK_REVERSES_ON
+ El bot ahora kickeara reversos.
+BOT_KICK_REVERSES_ON_BAN
+ El bot ahora kickeara reversos, y baneara despues de %d
+ kicks al mismo usuario.
+BOT_KICK_REVERSES_OFF
+ El bot ya no kickeara reversos.
+BOT_KICK_UNDERLINES_ON
+ El bot ahora kickeara subrayados.
+BOT_KICK_UNDERLINES_ON_BAN
+ El bot ahora kickeara subrayados, y baneara despues de %d
+ kicks al mismo usuario.
+BOT_KICK_UNDERLINES_OFF
+ El bot ya no kickeara subrayados.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS canal {ADD|DEL|LIST|CLEAR} [palabra | lista] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Lo siento, la lista de bad words para canales esta temporalmente inabilitada.
+BOT_BADWORDS_REACHED_LIMIT
+ Lo siento, solo puedes tener %d bad words en un canal.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s ya existe en la lista de bad words de %s.
+BOT_BADWORDS_ADDED
+ %s añadida a la lista de bad words de %s.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ No existe la instancia (#%d) en la lista de bad words de %s.
+BOT_BADWORDS_NOT_FOUND
+ %s no encontrada en la lista de bad words de %s.
+BOT_BADWORDS_NO_MATCH
+ No existen palabras que concuerden en la lista de bad words de %s.
+BOT_BADWORDS_DELETED
+ %s borrada de la lista de bad words de %s.
+BOT_BADWORDS_DELETED_ONE
+ 1 palabra borrada de la lista de bad words de %s.
+BOT_BADWORDS_DELETED_SEVERAL
+ %d palabras borradas de la lista de bad words de %s.
+BOT_BADWORDS_LIST_EMPTY
+ La lista de bad words de %s esta vacia.
+BOT_BADWORDS_LIST_HEADER
+ Lista de Bad words para %s:
+ Num Palabra Tipo
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ La lista de bad words esta ahora vacia.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY canal texto
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT canal texto
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_EXCEPT
+ Usuario coincide con el except del canal.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_BAD_NICK
+ Los nicks de bots pueden solo contener caracteres de nicks validos.
+BOT_BAD_HOST
+ Los hosts de bots pueden contener solo caracteres de hosts validos.
+BOT_BAD_IDENT
+ Los idents de bots pueden contener solo caracteres validos.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Los Servicios no han podido cambiar modos. Estan bien configurados tus servidores?
+OPER_BOUNCY_MODES_U_LINE
+ Los Servicios no han podido cambiar modos. Estan las lineas U: de tus servidores configuradas correctamente?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL mensaje
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Opcion STATS %s desconocida.
+OPER_STATS_CURRENT_USERS
+ Actuales usuarios: %d (%d ops)
+OPER_STATS_MAX_USERS
+ Maximo numero de usuarios: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Servicios arriba %d dias, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Servicios arriba %d dias, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Servicios arriba %d horas, %d minutos
+OPER_STATS_UPTIME_HM1S
+ Servicios arriba %d horas, %d minutos
+OPER_STATS_UPTIME_H1MS
+ Servicios arriba %d horas, %d minuto
+OPER_STATS_UPTIME_H1M1S
+ Servicios arriba %d horas, %d minuto
+OPER_STATS_UPTIME_1HMS
+ Servicios arriba %d hora, %d minutos
+OPER_STATS_UPTIME_1HM1S
+ Servicios arriba %d hora, %d minutos
+OPER_STATS_UPTIME_1H1MS
+ Servicios arriba %d hora, %d minuto
+OPER_STATS_UPTIME_1H1M1S
+ Servicios arriba %d hora, %d minuto
+OPER_STATS_UPTIME_MS
+ Servicios arriba %d minutos, %d segundos
+OPER_STATS_UPTIME_M1S
+ Servicios arriba %d minutos, %d segundo
+OPER_STATS_UPTIME_1MS
+ Servicios arriba %d minuto, %d segundos
+OPER_STATS_UPTIME_1M1S
+ Servicios arriba %d minuto, %d segundo
+OPER_STATS_BYTES_READ
+ Bytes leidos : %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Bytes escritos : %5d kB
+OPER_STATS_USER_MEM
+ Usuario : %6d records, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Canal : %6d records, %5d kB
+OPER_STATS_GROUPS_MEM
+ Grupos NS : %6d records, %5d kB
+OPER_STATS_ALIASES_MEM
+ Aliases NS : %6d records, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d records, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d records, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sesiones : %6d records, %5d kB
+OPER_STATS_PROXY_MEM
+ Proxies : ^B%6d^B records, ^B%5d^B kB
+OPER_STATS_AKILL_COUNT
+ Numero actual de AKILLs: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Tiempo de expiracion por defecto de AKILL: %d dias
+OPER_STATS_AKILL_EXPIRE_DAY
+ Tiempo de expiracion por defecto de AKILL: 1 dia
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Tiempo de expiracion por defecto de AKILL: %d horas
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Tiempo de expiracion por defecto de AKILL: 1 hora
+OPER_STATS_AKILL_EXPIRE_MINS
+ Tiempo de expiracion por defecto de AKILL: %d minutos
+OPER_STATS_AKILL_EXPIRE_MIN
+ Tiempo de expiracion por defecto de AKILL: 1 minuto
+OPER_STATS_AKILL_EXPIRE_NONE
+ Tiempo de expiracion por defecto de AKILL: Sin expiracion
+OPER_STATS_SGLINE_COUNT
+ Numero actual de SGLINEs: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Tiempo de expiracion por defecto de SGLINE: %d dias
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Tiempo de expiracion por defecto de SGLINE: 1 dia
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Tiempo de expiracion por defecto de SGLINE: %d horas
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Tiempo de expiracion por defecto de SGLINE: 1 hora
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Tiempo de expiracion por defecto de SGLINE: %d minutos
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Tiempo de expiracion por defecto de SGLINE: 1 minuto
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Tiempo de expiracion por defecto de SGLINE: Sin expiracion
+OPER_STATS_SQLINE_COUNT
+ Numero actual de SQLINEs: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Tiempo de expiracion por defecto de SQLINE: %d dias
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Tiempo de expiracion por defecto de SQLINE: 1 dia
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Tiempo de expiracion por defecto de SQLINE: %d horas
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Tiempo de expiracion por defecto de SQLINE: 1 hora
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Tiempo de expiracion por defecto de SQLINE: %d minutos
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Tiempo de expiracion por defecto de SQLINE: 1 minuto
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Tiempo de expiracion por defecto de SQLINE: Sin expiracion
+OPER_STATS_SZLINE_COUNT
+ Numero actual de SZLINEs: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Tiempo de expiracion por defecto de SZLINE: %d dias
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Tiempo de expiracion por defecto de SZLINE: 1 dia
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Tiempo de expiracion por defecto de SZLINE: %d horas
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Tiempo de expiracion por defecto de SZLINE: 1 hora
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Tiempo de expiracion por defecto de SZLINE: %d minutos
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Tiempo de expiracion por defecto de SZLINE: 1 minuto
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Tiempo de expiracion por defecto de SZLINE: Sin expiracion
+OPER_STATS_RESET
+ Estadisticas reseteadas.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE canal modos
+
+# CLEARMODES responses
+OPER_UMODE_SYNTAX
+ UMODE nick modos
+
+# OLINE responses
+OPER_UMODE_SUCCESS
+ Cambiados los modos de usuario de %s.
+OPER_UMODE_CHANGED
+ %s cambio tus modos de usuario.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick opciones
+OPER_OLINE_SUCCESS
+ Una linea O: con las opciones %s ha sido agregada para %s.
+
+# CLEARMODES responses
+OPER_OLINE_IRCOP
+ Eres ahora un operador de IRC.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES canal [ALL]
+OPER_CLEARMODES_DONE
+ Modos binarios y bans limpiados del canal %s.
+OPER_CLEARMODES_ALL_DONE
+ Todos los modos limpiados del canal %s.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK canal usuario razon
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick nuevonick
+OPER_SVSNICK_NEWNICK
+ El nick %s esta siendo cambiado a %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | lista]
+OPER_ADMIN_SKELETON
+ Los Servicios estan en modo skeleton; El comando ADMIN no esta disponible.
+OPER_ADMIN_EXISTS
+ %s ya esta presente en la lista de administradores de Servicios.
+OPER_ADMIN_REACHED_LIMIT
+ Lo siento, solo puedes tener %d administradores de Servicios.
+OPER_ADMIN_ADDED
+ %s añadido a la lista de administradores de Servicios.
+OPER_ADMIN_NOT_FOUND
+ %s no encontrado en la lista de administradores de Servicios.
+OPER_ADMIN_NO_MATCH
+ No existen instancias similares en la lista de administradores de Servicios.
+OPER_ADMIN_DELETED
+ %s borrado de la lista de administradores de Servicios.
+OPER_ADMIN_DELETED_ONE
+ 1 Instancia borrada de la lista de administradores de Servicios.
+OPER_ADMIN_DELETED_SEVERAL
+ %d instancias borradas de la lista de administradores de Servicios.
+OPER_ADMIN_LIST_EMPTY
+ La lista de administradores de Servicios esta vacia.
+OPER_ADMIN_LIST_HEADER
+ Lista de administradores de Servicios:
+ Num Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ La lista de administradores de Servicios ha sido limpiada.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | lista]
+OPER_OPER_SKELETON
+ Los Servicios estan en modo skeleton; El comando OPER no esta disponible.
+OPER_OPER_EXISTS
+ %s ya existe en la lista de operadores de Servicios.
+OPER_OPER_REACHED_LIMIT
+ Lo siento, solo puedes tener %d operadores de Servicios.
+OPER_OPER_ADDED
+ %s añadido a la lista de operadores de Servicios.
+OPER_OPER_NOT_FOUND
+ %s no encontrado en la lista de operadores de Servicios.
+OPER_OPER_NO_MATCH
+ No existen instancias similares en la lista de operadores de Servicios.
+OPER_OPER_DELETED
+ %s borrado de la lista de operadores de Servicios.
+OPER_OPER_DELETED_ONE
+ 1 Instancia borrada de la lista de operadores de Servicios.
+OPER_OPER_DELETED_SEVERAL
+ %d instancias borradas de la lista de operadores de Servicios.
+OPER_OPER_LIST_EMPTY
+ La lista de administradores de Servicios esta vacia.
+OPER_OPER_LIST_HEADER
+ Lista de operadores de Servicios:
+ Num Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ La lista de operadores de Servicios ha sido limpiada.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+expiracion] {mascara | lista} [razon]]
+OPER_AKILL_EXISTS
+ %s ya esta presente en la lista de AKILLs.
+OPER_AKILL_ALREADY_COVERED
+ %s ya esta cubierto por %s.
+OPER_AKILL_REACHED_LIMIT
+ Lo siento, solo puedes tener %d AKILLs.
+OPER_AKILL_NO_NICK
+ Recordatorio: Las mascaras AKILL no pueden contener nicks; asegurate de no haber incluido el nick en tu mascara.
+OPER_AKILL_ADDED
+ %s añadido a la lista de AKILLs.
+OPER_AKILL_CHANGED
+ Tiempo de expiracion para %s cambiado.
+OPER_AKILL_NOT_FOUND
+ %s no encontrado en la lista de AKILLs.
+OPER_AKILL_NO_MATCH
+ No existen instancias similares en la lista de AKILLs.
+OPER_AKILL_DELETED
+ %s borrado de la lista de AKILLs.
+OPER_AKILL_DELETED_ONE
+ 1 instancia borrada de la lista de AKILLs.
+OPER_AKILL_DELETED_SEVERAL
+ %d instancias borradas de la lista de AKILLs.
+OPER_AKILL_LIST_EMPTY
+ La lista de AKILLS esta vacia.
+OPER_AKILL_LIST_HEADER
+ Lista actual de AKILLs:
+ Num Mascara Razon
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Lista actual de AKILLs:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (por %s en %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ La lista de AKILLs ha sido limpiada.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiracion] {mascara | lista}[:razon]]
+OPER_SGLINE_UNSUPPORTED
+ Lo siento, SGLINE no esta disponible en esta red.
+OPER_SGLINE_EXISTS
+ %s ya existe en la lista de SGLINEs.
+OPER_SGLINE_ALREADY_COVERED
+ %s ya esta cubierto por %s.
+OPER_SGLINE_REACHED_LIMIT
+ Lo siento, solo puedes tener %d SGLINEs.
+OPER_SGLINE_ADDED
+ %s añadido a la lista de SGLINEs.
+OPER_SGLINE_CHANGED
+ Tiempo de expiracion para %s cambiado.
+OPER_SGLINE_NOT_FOUND
+ %s no encontrado en la lista de SGLINEs.
+OPER_SGLINE_NO_MATCH
+ No existen instancias similares en la lista de SGLINEs.
+OPER_SGLINE_DELETED
+ %s borrado de la lista de SGLINEs.
+OPER_SGLINE_DELETED_ONE
+ 1 instancia borrada de la lista de SGLINEs.
+OPER_SGLINE_DELETED_SEVERAL
+ %d instancias borradas de la lista de SGLINEs.
+OPER_SGLINE_LIST_EMPTY
+ La lista de SGLINEs esta vacia.
+OPER_SGLINE_LIST_HEADER
+ Lista actual de SGLINEs:
+ Num Mascara Razon
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Lista actual de SGLINEs:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (por %s en %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ La lista de SGLINEs ha sido limpiada.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiracion] {mascara | lista} [razon]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ SQLINEs de canal no estan soportadas por tu IRCd, asi que no las puedes usar.
+OPER_SQLINE_EXISTS
+ %s ya existe en la lista de SQLINEs.
+OPER_SQLINE_ALREADY_COVERED
+ %s ya esta cubierto por %s.
+OPER_SQLINE_REACHED_LIMIT
+ Lo siento, solo puedes tener %d SQLINEs.
+OPER_SQLINE_ADDED
+ %s añadido a la lista de SQLINEs.
+OPER_SQLINE_CHANGED
+ Tiempo de expiracion para %s cambiado.
+OPER_SQLINE_NOT_FOUND
+ %s no encontrado en la lista de SQLINEs
+OPER_SQLINE_NO_MATCH
+ No existen instancias similares en la lista de SQLINEs.
+OPER_SQLINE_DELETED
+ %s borrado de la lista de SQLINEs.
+OPER_SQLINE_DELETED_ONE
+ 1 instancia borrada de la lista de SQLINEs.
+OPER_SQLINE_DELETED_SEVERAL
+ %d instancias borradas de la lista de SQLINEs.
+OPER_SQLINE_LIST_EMPTY
+ La lista de SQLINEs esta vacia.
+OPER_SQLINE_LIST_HEADER
+ Lista actual de SQLINEs:
+ Num Mascara Razon
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Lista actual de SQLINEs:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (por %s en %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ La lista de SQLINEs ha sido limpiada.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiracion] {mascara | lista} [razon]]
+OPER_SZLINE_UNSUPPORTED
+ Lo siento, el comando SZLINE no esta disponible en esta red.
+OPER_SZLINE_EXISTS
+ %s ya existe en la lista de SZLINEs.
+OPER_SZLINE_ALREADY_COVERED
+ %s ya esta cubierto por %s.
+OPER_SZLINE_REACHED_LIMIT
+ Lo siento, solo puedes tener %d SZLINEs.
+OPER_SZLINE_ONLY_IPS
+ Recordatorio: Solo puedes añadir mascaras IP a la lista de SZLINEs.
+OPER_SZLINE_ADDED
+ %s añadido a la lista de SZLINEs.
+OPER_SZLINE_CHANGED
+ Tiempo de expiracion de %s cambiado.
+OPER_SZLINE_NOT_FOUND
+ %s no encontrado en la lista de SZLINEs.
+OPER_SZLINE_NO_MATCH
+ No existen instancias similares en la lista de SZLINEs.
+OPER_SZLINE_DELETED
+ %s borrado de la lista de SZLINEs.
+OPER_SZLINE_DELETED_ONE
+ 1 instancia borrada de la lista de SZLINEs.
+OPER_SZLINE_DELETED_SEVERAL
+ %d instancias borradas de la lista de SZLINEs.
+OPER_SZLINE_LIST_EMPTY
+ La lista de SZLINEs esta vacia.
+OPER_SZLINE_LIST_HEADER
+ Lista actual de SZLINEs:
+ Num Mask Reason
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Lista actual de SZLINEs:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (por %s en %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ La lista de SZLINEs ha sido limpiada.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET opcion seteo
+OPER_SET_IGNORE_ON
+ Codigo ignore sera usado.
+OPER_SET_IGNORE_OFF
+ Codigo ignore no sera usado.
+OPER_SET_IGNORE_ERROR
+ El seteo para IGNORE debe ser ON u OFF.
+OPER_SET_READONLY_ON
+ Servicios ahora en modo read-only.
+OPER_SET_READONLY_OFF
+ Servicios ahora en modo de read-write.
+OPER_SET_READONLY_ERROR
+ El seteo para READONLY debe ser ON u OFF.
+OPER_SET_LOGCHAN_ON
+ Servicios ahora reportando el log en %s.
+OPER_SET_LOGCHAN_OFF
+ Servicios ha dejado de reportal el log.
+OPER_SET_LOGCHAN_ERROR
+ Setting for LOGCHAN debe ser ON or OFF y LogChannel debe estar definido.
+OPER_SET_DEBUG_ON
+ Servicios ahora en modo debug.
+OPER_SET_DEBUG_OFF
+ Servicios ahora en modo no-debug.
+OPER_SET_DEBUG_LEVEL
+ Servicios ahora en modo debug (nivel %d).
+OPER_SET_DEBUG_ERROR
+ El seteo para DEBUG debe ser ON, OFF, o un numero positivo.
+OPER_SET_NOEXPIRE_ON
+ Servicios ahora en modo no expire.
+OPER_SET_NOEXPIRE_OFF
+ Servicios ahora en modo expire.
+OPER_SET_NOEXPIRE_ERROR
+ Seteo para NOEXPIRE debe ser ON u OFF.
+OPER_SET_UNKNOWN_OPTION
+ Opcion %s desconocida.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} servidor
+OPER_NOOP_SET
+ Todas las lineas O de %s han sido removidas.
+OPER_NOOP_REVOKE
+ Todas las lineas O de %s han sido reseteadas.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE nombre-del-servidor [razon]
+
+# RAW responses
+OPER_JUPE_HOST_ERROR
+ Por favor usa un nombre de servidor valido cuando use JUPE
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW texto
+
+# UPDATE responses
+OPER_UPDATING
+ Updateando las bases de datos.
+
+# RELOAD responses
+OPER_RELOAD
+ El archivo de configuracion de Servicios ha sido cargado nuevamente.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN no definido; imposible partir nuevamente. Corre nuevamente el script \2configure\2 y recompila Services para incluir el comando RESTART.
+
+# IGNORE responses
+OPER_IGNORE_SYNTAX
+ Sintaxis: IGNORE {ADD|DEL|LIST|CLEAR} [tiempo] [nick]
+OPER_IGNORE_VALID_TIME
+ Debes ingresar un numero valido como tiempo.
+OPER_IGNORE_TIME_DONE
+ %s sera ignorado por %s.
+OPER_IGNORE_PERM_DONE
+ %s sera ignorado permanentemente.
+OPER_IGNORE_DEL_DONE
+ %s ya no sera ignorado.
+OPER_IGNORE_LIST
+ Lista ignore de Servicios:
+OPER_IGNORE_LIST_NOMATCH
+ %s no encontrado en la lista ignore.
+OPER_IGNORE_LIST_EMPTY
+ La lista ignore esta vacia.
+
+# KILLCLONES responses
+OPER_IGNORE_LIST_CLEARED
+ La lista ignore ha sido vaciada.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Imposible encontrar al usuario %s.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Lista de canal:
+ Nombre Modos de Usr. Topico
+OPER_CHANLIST_HEADER_USER
+ Lista del canal %s:
+ Nombre Modos de Usr. Topico
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ Fin de la lista de canales.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Lista de usuarios:
+ Nick Mascara
+OPER_USERLIST_HEADER_CHAN
+ Lista de usuarios de %s:
+ Nick Mascara
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Fin de la lista de usuarios.
+
+# CACHE responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {hostname | patron} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Deteccion de Proxy deshabilitada.
+OPER_CACHE_NOT_FOUND
+ %s no encontrado en el cache.
+OPER_CACHE_REMOVED
+ %s ha sido removido del cache.
+OPER_CACHE_HEADER
+ Hostname Estatus
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ Fin de la lista - %d/%d instancias mostradas.
+OPER_CACHE_QUEUED
+ Encolado
+OPER_CACHE_PROGRESS
+ En progreso
+OPER_CACHE_NORMAL
+ Normal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ Proxy HTTP
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ON
+ Ahora eres un SuperAdmin.
+OPER_SUPER_ADMIN_OFF
+ Ya no eres un SuperAdmin.
+OPER_SUPER_ADMIN_SYNTAX
+ Opciones para SuperAdmin deben ser ON u OFF.
+OPER_SUPER_ADMIN_WALL_ON
+ %s es ahora un Super-Admin.
+OPER_SUPER_ADMIN_WALL_OFF
+ %s ya no es un Super-Admin.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ONLY
+ Solo Super-Admins pueden usar este comando.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Sintaxis: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ Los servicios estan deshabilitados temporalmente, por favor intenta mas tarde
+OPER_DEFCON_NO_CONF
+ El sistema Defcon debe ser habilitado en el archivo services.conf
+OPER_DEFCON_CHANGED
+ Servicios estan ahora en DEFCON %d
+OPER_DEFCON_WALL
+ %s Cambiado el nivel de DEFCON a %d
+DEFCON_GLOBAL
+ El Nivel de Defcon esta ahora a Nivel: %d
+
+# Module strings
+
+OPER_MODULE_LOADED
+ Modulo %s cargado
+OPER_MODULE_UNLOADED
+ Modulo %s descargado
+OPER_MODULE_LOAD_FAIL
+ Imposible cargar modulo %s
+OPER_MODULE_REMOVE_FAIL
+ Imposible quitar modulo %s
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD NombreArchivo
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD NombreArchivo
+OPER_MODULE_LIST
+ Modulo: %s
+OPER_MODULE_INFO_LIST
+ Modulo: %s Version: %s Autor: %s cargado: %s
+OPER_MODULE_CMD_LIST
+ Comandos entregados: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Entrega control al IRCD para: %s
+OPER_MODULE_NO_LIST
+ Actualmente no hay modulos cargados
+OPER_MODULE_NO_INFO
+ No hay informacion disponible para el modulo %s
+OPER_MODULE_INFO_SYNTAX
+ MODINFO NombreArchivo
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ Los siguientes comandos han sido cargados por un modulo:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [parametros]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+expiracion] mascara limite razon
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {mascara | lista}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE numero posicion
+OPER_EXCEPTION_DISABLED
+ Limites de sesion no disponibles.
+OPER_EXCEPTION_ALREADY_PRESENT
+ La mascara %s ya esta presente en la lista de excepciones.
+OPER_EXCEPTION_TOO_MANY
+ La lista de excepciones al limite de sesiones esta llena!
+OPER_EXCEPTION_ADDED
+ Limite de sesion para %s seteado a %d.
+OPER_EXCEPTION_MOVED
+ Excepcion para %s (#%d) movido a la posicion %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ La instancia no existe (#%d) en la lista de excepciones al limite de sesiones.
+OPER_EXCEPTION_NOT_FOUND
+ %s no encontrado en la lista de excepciones al limite de sesiones.
+OPER_EXCEPTION_NO_MATCH
+ No existen instancias similares en la lista de excepciones al limite de sesiones.
+OPER_EXCEPTION_DELETED
+ %s instancias borradas de la lista de excepciones al limite de sesiones.
+OPER_EXCEPTION_DELETED_ONE
+ 1 instancia borrada de la lista de excepciones al limite de sesiones.
+OPER_EXCEPTION_DELETED_SEVERAL
+ %d instancias borradas de la lista de excepciones al limite de sesiones.
+OPER_EXCEPTION_LIST_HEADER
+ Lista de excepciones al limite de sesiones actual:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Num Limite Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (by %s on %s; %s)
+ Limite: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Limite de sesion invalido. Debe ser un entero valido mayor o igual a cero y menor a %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Mascara invalida. Solo mascaras reales son validas ya que excepciones no son comparadas a nicks o usernames.
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST limite | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST limite
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ El limite de sesion esta inhabilitado.
+OPER_SESSION_INVALID_THRESHOLD
+ Valor de umbral invalido. debe ser un entero valido mayor a 1.
+OPER_SESSION_NOT_FOUND
+ %s no encontrado en la lista de sesion.
+OPER_SESSION_LIST_HEADER
+ Hosts con al menos %d sesiones:
+OPER_SESSION_LIST_COLHEAD
+ Sesiones Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ El host %s actualmente tiene %d sesiones con un limite de %d.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Sintaxis: EXCEPTION ADD [+expiracion] mascara limite razon
+ EXCEPTION DEL {mascara | lista}
+ EXCEPTION MOVE numero posicion
+ EXCEPTION LIST [mascara | lista]
+ EXCEPTION VIEW [mascara | lista]
+
+ Permite a los administradores de Servicios manipular la lista
+ de hosts que tienen un limite de sesion especifico - permitiendo
+ a ciertas maquinas, como servidores de shells, mantener mayor numero
+ de clientes al mismo tiempo. En cuanto un host alcance su limite
+ de sesiones, todos los clientes intentando conectarse desde ese
+ host seran killeados. Antes de killear usuarios, estos son
+ notificados a traves de un /NOTICE del %S con ayuda acerca
+ de el limite de sesion. El contenido de este notice es un seteo
+ de configuracion.
+
+ EXCEPTION ADD añade la mascara de host dada a la lista de
+ excepcion. Ten en cuenta que las mascaras nick!usuario@host
+ y usuario@host son invalidas. Solo mascaras reales como
+ box.host.dom and *.host.dom, son permitidas ya que el
+ limite de sesiones no toma en cuenta nicks o nombres de usuario.
+ limite debe ser un numero mayor o igual a cero. Esto determina
+ cuantas sesiones el host puede tener a un tiempo dado. El valor
+ cero significa que el host no tiene limites de sesion. Ver la ayuda
+ acerca de AKILL para detalles acerca del parametro opcional
+ expiracion.
+ EXCEPTION DEL remueve la mascara dada de la lista de excepcion.
+ EXCEPTION MOVE mueve la excepcion numero a posicion. Las
+ excepciones entre medio seran movidas arriba o abajo para llenar el
+ espacio.
+ EXCEPTION LIST y EXCEPTION VIEW muestran todas las
+ excepciones actuales; si la mascara opcional es dada, la lista es
+ limitada a las excepciones similares a la mascara. La diferencia
+ es que EXCEPTION VIEW es mas verbal, mostrando el nombre de la
+ persona que agrego la excepcion, el limite de excepcion, razon,
+ mascara de hosts y la fecha y hora de expiracion.
+
+ Toma en cuenta que un cliente conectandose "usara" la primera
+ excepcion a la que el host se asemeje. Largas listas de excepcion
+ y mascaras que se asemejen a muchas mascaras posiblemente degraden
+ el rendimiento de los Servicios.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_SESSION
+ Sintaxis: SESSION LIST umbral
+ SESSION VIEW host
+
+ Permite a los administradores de Servicios ver la lista de sesiones.
+
+ SESSION LIST lista hosts con al menos umbral sesiones.
+ El umbral debe ser un numero mayor a 1. Esto es para prevenir
+ listados accidentales del gran numero de hosts de sesion.
+ SESSION VIEW muestra informacion detallada acerca de un host
+ especifico - incluyendo la cuenta de sesion y el limite de sesion
+ actual.
+ El valor host no puede incluir comodines.
+
+ Mira la ayuda sobre EXCEPTION para mayor informacion acerca de
+ limites de sesion y como setearlos para hosts y grupos especificos
+ de ahi en adelante.
+
+ Limitado a administradores de Servicios.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Sintaxis: STAFF
+
+ Muestra todos los nicks de Services Staff, junto con su nivel
+ y estado on-line.
+
+OPER_HELP_DEFCON
+ Sintaxis: DEFCON [1|2|3|4|5]
+
+ El sistema defcon puede ser usado para implementar un conjunto
+ pre-definido de restricciones que son muy utiles en un eventual
+ ataque a la red.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * No nuevos registros de canales
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * No nuevos registros de nicks
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * No cambios en MLOCK
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Fuerza Modos de Canal (%s) para ser seteado en todos los canales
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Usa el reducido limite de sesion de %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill a cualquier NUEVO cliente que se conecte
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignora a cualquier no-operador notificando
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Ignora a los no-operadores sin notificar
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL cualquier nuevo cliente que se conecte
+
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * No hay nuevos memos enviados
+OPER_HELP_CHANKILL
+ Sintaxis: CHANKILL [+expira] canal razon
+
+ Pone un AKILL para cada nick en el canal especificado. Este
+ usa el entero, completo y real ident@host para cada nick,
+ entonces ejecuta el AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Noticias de Logon - %s] %s
+NEWS_OPER_TEXT
+ [Noticias de Oper - %s] %s
+NEWS_RANDOM_TEXT
+ [Noticias al Azar - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Sintaxis: LOGONNEWS {ADD|DEL|LIST} [texto|numero]
+NEWS_LOGON_LIST_HEADER
+ Noticias de entrada:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ No hay Noticias de entrada.
+NEWS_LOGON_ADD_SYNTAX
+ Sintaxis: LOGONNEWS ADD texto
+NEWS_LOGON_ADD_FULL
+ La lista de noticias esta llena!
+NEWS_LOGON_ADDED
+ Nueva noticia de entrada anadida (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Sintaxis: LOGONNEWS DEL {numero | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Noticia de entrada #%d no encontrada!
+NEWS_LOGON_DELETED
+ Noticia de entrada #%d borrada.
+NEWS_LOGON_DEL_NONE
+ No hay noticias de entrada para borrar!
+NEWS_LOGON_DELETED_ALL
+ Todas las noticias de entrada borradas.
+
+NEWS_OPER_SYNTAX
+ Sintaxis: OPERNEWS {ADD|DEL|LIST} [texto|numero]
+NEWS_OPER_LIST_HEADER
+ Noticias de oper:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_OPER_LIST_NONE
+ No hay noticias de oper.
+NEWS_OPER_ADD_SYNTAX
+ Sintaxis: OPERNEWS ADD texto
+NEWS_OPER_ADD_FULL
+ La lista de noticias esta llena!
+NEWS_OPER_ADDED
+ Nueva noticia de oper anadida (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Sintaxis: OPERNEWS DEL {numero | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Noticia de oper #%d no encontrada!
+NEWS_OPER_DELETED
+ Noticia de oper #%d borrada.
+NEWS_OPER_DEL_NONE
+ No hay noticias de oper para borrar!
+NEWS_OPER_DELETED_ALL
+ Todas las noticias de oper borradas.
+
+NEWS_RANDOM_SYNTAX
+ Sintaxis: RANDOMNEWS {ADD|DEL|LIST} [texto|numero]
+NEWS_RANDOM_LIST_HEADER
+ Noticias al Azar:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s por %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ No hay Noticias al azar.
+NEWS_RANDOM_ADD_SYNTAX
+ Sintaxis: RANDOMNEWS ADD texto
+NEWS_RANDOM_ADD_FULL
+ La lista de noticias esta llena!
+NEWS_RANDOM_ADDED
+ Nueva noticia al azar anadida (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Sintaxis: RANDOMNEWS DEL {numero | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Noticia al azar #%d no encontrada!
+NEWS_RANDOM_DELETED
+ Noticia al azar #%d borrada.
+NEWS_RANDOM_DEL_NONE
+ No hay noticias al azar para borrar!
+NEWS_RANDOM_DELETED_ALL
+ Todas las noticias al azar borradas.
+
+NEWS_HELP_LOGON
+ Sintaxis: LOGONNEWS ADD texto
+ LOGONNEWS DEL {numero | ALL}
+ LOGONNEWS LIST
+
+ Edita o muestra la lista de noticias de entrada. Cuando un
+ usuario se conecta a la red, estos mensajes les seran
+ enviados. (Como sea, no mas de 3 mensajes seran enviados
+ para evitar floodear al usuario. Si hay mas de 3 noticias,
+ los 3 ultimos les seran enviados.)
+
+ LOGONNEWS LIST puede ser usado por cualquier operador de
+ IRC para listar las noticias actuales. ADD o DEL solo
+ pueden ser usados por administradores de Servicios.
+
+NEWS_HELP_OPER
+ Sintaxis: OPERNEWS ADD texto
+ OPERNEWS DEL {numero | ALL}
+ OPERNEWS LIST
+
+ Edita o muestra la lista de noticias. Cuando un usuario se
+ transforma en operador (con el comando /oper), estos
+ mensajes les seran enviados. (Como sea, no mas de 3 mensajes
+ seran enviados para evitar floodear al usuario. Si hay mas
+ de 3 noticias, las ultimas 3 seran enviadas.)
+
+ OPERNEWS LIST puede ser usado por cualquier operador de IRC
+ para listar las noticias de operador actuales. ADD y DEL solo
+ pueden ser usadas por administradores de Servicios.
+
+NEWS_HELP_RANDOM
+ Sintaxis: RANDOMNEWS ADD texto
+ RANDOMNEWS DEL {numero | ALL}
+ RANDOMNEWS LIST
+
+ Edita o muestra la lista de mensajes de noticia al azar.
+ Cuando un usuario se conecta a la red, uno (y solo uno) de los
+ mensajes al azar sera elejido y enviado a ellos.
+
+ RANDOMNEWS LIST puede ser usado por cualquier operador de
+ IRC para listar la lista de noticias actual. ADD y DEL
+ solo pueden ser usados por administradores de Servicios.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S es un servicio designado a dar informacion sobre
+ Servicios. Topicos de ayuda estan disponibles via los
+ comandos HELP de los otros clientes de Servicios:
+
+ /msg %s HELP
+ para informacion acerca registrar nicknames
+
+ /msg %s HELP
+ para informacion acerca registrar y controlar
+ canales
+
+ /msg %s HELP
+ para informacion acerca enviar mensajes a usuarios no
+ en linea.
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ para informacion acerca setear un bot en tu canal
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ Para informacion sobre como setear vHosts para nicknames.
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ %S te permite "registrar" un nickname y
+ prevenir a otros usarlo. Los siguientes comandos
+ permiten el registro y mantenimiento de nicknames;
+ para usarlos, tipea /msg %S comando.
+ Para mayor informacion acerca de un comando especifico
+ tipea /msg %S HELP comando.
+
+ REGISTER Registra un nickname
+ GROUP Ingresa a un grupo
+ IDENTIFY Para identificarte con tu clave
+ ACCESS Modifica la lista de direcciones autorizadas
+ SET Setea protecciones, incluyendo kills
+ DROP Cancela la registracion de un nickname
+ RECOVER Killea otro usuario que este usando tu nickname
+ RELEASE Retoma custodia de tu nick luego de RECOVER
+ SENDPASS Olvidaste tu clave? Intenta esto
+
+ Otros comandos: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS
+
+ NOTESE: Este servicio intenta proveer una forma para
+ usuarios de IRC de asegurarse que su identidad no esta
+ comprometida, NO para facilitar el "robo" de nicknames
+ u otra accion maliciosa. El Abuso de %S resultara en, a lo
+ minimo, la perdida del nickname comprometido.
+
+NICK_HELP_EXPIRES
+ Nicknames en desuso estan sujetos a la expiracion
+ automatica, en otras palabras, seran borrados despues
+ de %d dias.
+
+NICK_HELP_REGISTER
+ Sintaxis: REGISTER clave [email]
+
+ Registra tu nickname en la base de datos de %S. Una
+ vez registrado, puedes usar los comandos SET y ACCESS
+ para configurar los seteos de tu nick a gusto.
+ Asegurate de recordar la clave que usaste para
+ registrarte - lo necesitaras para hacer cambios a tu nick
+ (Tomar en cuenta que mayusculas importan! ANOPE,
+ Anope, y anope son todas claves diferentes!)
+
+ Guias para elegir claves:
+
+ Las claves no deben ser faciles de adivinar. Por ejemplo,
+ usar tu nombre real como clave es una mala idea. Usar
+ tu nickname como clave es una idea mucho peor ;) y,
+ de hecho, %S no lo permitira. Ademas, claves cortas
+ son vulnerables a adivinanzas, asi que deberias elejir una
+ clave de al menos 5 caracteres.
+ Por ultimo, el caracter de espacio no puede ser usado.
+
+ The parametro email es opcional y seteara el email para
+ tu nick inmediatamente. Como sea, puede que sea requerido
+ en ciertas redes.
+ Tu privacidad es respetada; este e-mail no sera dado a
+ terceras personas.
+
+ Este comando ademas crea un nuevo grupo para tu nickname
+ que te permitira registrar otros nicks despues compartiendo
+ la misma configuracion, memos y privilegios. Para mayor
+ informacion acerca de esta caracteristica, tipea /msg %S
+ HELP GROUP.
+
+NICK_HELP_GROUP
+ Sintaxis: GROUP grupo clave
+
+ Este comando hace a tu nickname unirse al grupo de nicknames
+ grupo. clave es la de tu nickname.
+
+ La union a un grupo te permitira compartir configuraciones,
+ memos, y privilegios en canales con todos los nicknames en un
+ grupo, y mucho mas!
+
+ Un grupo existe siempre y cuando sea servible. Esto
+ significa que si un nick del grupo es botado, no perderas
+ los rasgos compartidos descritos anteriormente, siempre y
+ cuando al menos un nick permanezca en el grupo.
+
+ Puedes usar este comando inclusive si aun no registras tu
+ nick. Si tu nick ya esta registrado deberas identificarte
+ antes de usar este comando. Tipea /msg %S HELP
+ IDENTIFY para mayor informacion. Esto ultimo quizas no sea
+ posible en tu red.
+
+ Es recomendable usar este comando con un nick no registrado ya
+ que sera registrado automaticamente cuando uses el comando.
+ Puedes usarlo con un nick ya registrado (para cambiar tu grupo)
+ solo si los administradores de tu red lo permiten.
+
+ Puedes estar en un solo grupo a la vez. La union de
+ grupos no es posible.
+
+ Ten en cuenta: todos los nicks en un grupo comparten la
+ misma clave.
+
+NICK_HELP_IDENTIFY
+ Sintaxis: IDENTIFY clave
+
+ Informa a %S que tu eres realmente el dueño de tu nick.
+ Muchos comandos requieren que te autentifiques con este
+ comando antes de usarlos. La clave deberia ser la misma
+ que enviaste con el comando REGISTER.
+
+NICK_HELP_UPDATE
+ Sintaxis: UPDATE
+
+ Actualiza tu estado actual, ej. revisa los memos nuevos,
+ setea, si es necesario, los modos de canales (ModeonID)
+ y actualiza tu vhost y tus userflags (lastseentime, etc).
+
+NICK_HELP_LOGOUT
+ Sintaxis: LOGOUT
+
+ Este comando invierte el efecto de IDENTIFY, osea,
+ te hace ya no reconocible como el dueño de tu nick.
+ Ten en cuenta que no te sera requerido identificarte
+ nuevamente.
+
+NICK_HELP_DROP
+ Sintaxis: DROP [nickname]
+
+ Bota tu nickname de la base de datos de %S. Un nick
+ que ha sido botado esta libre para que cualquier persona
+ lo registre.
+
+ Puedes botar un nick en tu grupo pasandolo como el
+ parametro nick.
+
+ Antes de usar este comando debes identificarte con tu
+ clave (/msg %S HELP IDENTIFY para mayor informacion).
+
+NICK_HELP_ACCESS
+ Sintaxis: ACCESS ADD mascara
+ ACCESS DEL mascara
+ ACCESS LIST
+
+ Modifica o muestra la lista de acceso para tu nick. Esta
+ es la lista de direcciones que seran automaticamente
+ reconocidas por %S como autorizadas a usar el nick. Si
+ quieres usar el nick desde una direccion diferente,
+ debes enviar un comando IDENTIFY para hacer que %S te
+ reconozca.
+
+ Ejemplos:
+
+ ACCESS ADD anyone@*.bepeg.com
+ Permite acceso al usuario anyone desde
+ cualquier maquina en el dominio bepeg.com.
+
+ ACCESS DEL anyone@*.bepeg.com
+ Revierte el comando anterior.
+
+ ACCESS LIST
+ Muestra la lista de acceso actual.
+
+NICK_HELP_SET
+ Sintaxis: SET opcion parametros
+
+ Setea varias opciones para nicknames. opcion puede ser
+ una de:
+
+ DISPLAY Setea el display de tu grupo con Servicios
+ PASSWORD Setea la clave de tu nickname
+ LANGUAGE Setea el lenguaje con el que Servicios te
+ enviara mensajes
+ URL Asocia una URL con tu nickname
+ EMAIL Asocia un E-mail con tu nickname
+ ICQ Asocia un numero ICQ con tu nickname
+ GREET Asocia un saludo con tu nickname
+ KILL Enciende o apaga la proteccion
+ SECURE Enciende o apaga la seguridad de nickname
+ PRIVATE Previene tu nickname de aparecer en un
+ /msg %S LIST
+ HIDE Esconde algunas partes de tu informacion
+ MSG Cambia el metodo de comunicacion con
+ Servicios
+
+ Para usar este comando, debes primero identificarte con
+ Servicios usando tu clave (/msg %S HELP IDENTIFY
+ para mayor informacion).
+
+ Tipea /msg %S HELP SET opcion para mayor
+ informacion acerca de una opcion especifica.
+
+NICK_HELP_SET_DISPLAY
+ Sintaxis: SET DISPLAY nuevo-display
+
+ Cambia el display usado para referirte a tu grupo de
+ nicks en Servicios. El nuevo display DEBE ser un nick
+ de tu grupo.
+
+NICK_HELP_SET_PASSWORD
+ Sintaxis: SET PASSWORD nueva-clave
+
+ Cambia la clave usada para identificarte como el
+ dueño del nick.
+
+NICK_HELP_SET_LANGUAGE
+ Sintaxis: SET LANGUAGE numero
+
+ Cambia el lenguaje que Servicios usa para enviarte mensajes
+ (por ejemplo, al responder a un comando que enviaste).
+ numero debe ser elejido de la lista de lenguajes
+ soportados:
+
+
+NICK_HELP_SET_URL
+ Sintaxis: SET URL url
+
+ Asocia la URL dada con tu nickname. Esta URL
+ sera mostrada cuando alguien requiera informacion
+ sobre tu nick con el comando INFO.
+
+NICK_HELP_SET_EMAIL
+ Sintaxis: SET EMAIL direccion
+
+ Asocia el E-mail dado con tu nickname. La direccion
+ sera mostrada cuando alguien requiera informacion
+ sobre el canal con el comando INFO.
+
+NICK_HELP_SET_ICQ
+ Sintaxis: SET ICQ numero
+
+ Asocia el numero ICQ dado con tu nickname. Este
+ numero sera mostrado cuando alguien solicite
+ informacion acerca de tu nick con el comando INFO.
+
+NICK_HELP_SET_GREET
+ Sintaxis: SET GREET mensaje
+
+ Hace al mensaje ingresado el saludo para tu nickname, el
+ que sera mostrado cuando ingreses a un canal con la
+ opcion GREET abilitada, siempre y cuando tengas en el
+ el acceso necesario.
+
+NICK_HELP_SET_KILL
+ Sintaxis: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Cambia la proteccion automatica de tu nick a on u off.
+ Con proteccion on, si otro usuario intenta usar tu nick,
+ tendra un minuto para cambiar de nick, luego del cual
+ %S cambiara su nick automaticamente.
+
+ Si seteas QUICK, el usuario sera dado solo de 20 segundos
+ para cambiar el nick en vez de los normales 60. Si seleccionas
+ IMMED, el nick del usuario sera cambiado automaticamente
+ sin ser advertido o dado oportunidad de cambiarlo antes;
+ Por favor no uses esta opcion a menos que lo consideres
+ necesario. Ademas, los administradores de la red pueden haber
+ deshabilitado esta opcion.
+
+NICK_HELP_SET_SECURE
+ Sintaxis: SET SECURE {ON | OFF}
+
+ Cambia las caracteristicas de seguridad de %S para tu nick en on
+ u off. Con SECURE seteado, debes ingresar tu clave para ser
+ reconocido como propietario del nick, a pesar de que tu direccion
+ este en la lista de accesos. Sin embargo, si estas en la lista de
+ acceso, %S no te auto-killeara no importando el seteo de la opcion
+ KILL.
+
+NICK_HELP_SET_PRIVATE
+ Sintaxis: SET PRIVATE {ON | OFF}
+
+ Hace que %S active o desactive la opcion de privacidad de tu
+ nick. Con PRIVATE seteado,tu nickname no aparecera en las
+ listas de nicknames generadas con el comando LIST de %S.
+ (Sin embargo, cualquier persona que sepa tu nick podra chequear
+ tu informacion usando el comando INFO.)
+
+NICK_HELP_SET_HIDE
+ Sintaxis: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Permite prevenir que cierta informacion sobre tu nick cuando
+ es solicitada mediante el comando %S INFO a tu nick.
+ Puedes esconder tu direccion E-mail (EMAIL), la ultima
+ mascara usuario@host (USERMASK), y tu ultimo mensaje
+ quit (QUIT).
+ El segundo parametro especifica si la informacion debe ser
+ escondida (OFF) o mostrada (ON).
+
+NICK_HELP_SET_MSG
+ Sintaxis: SET MSG {ON | OFF}
+
+ Te permite elegir la forna en la que los Servicios se
+ comunicaran contigo. Con MSG seteado, los Servicios
+ usaran msgs, de otra forma usaran notices.
+
+NICK_HELP_RECOVER
+ Sintaxis: RECOVER nickname [clave]
+
+ Te permite recuperar tu nickname si alguien mas lo
+ ha tomado; Esto hace lo mismo que %S hace automaticamente
+ si alguien trata de usar un nick con proteccion de kill.
+
+ Cuando usas este comando, %S traera a un falso usuario en
+ linea con el mismo nickname del usuario que estas tratando
+ de recuperar. Esto causa que los servidores IRC desconecten
+ al otro usuario. El usuario falso permanecera en linea por
+ un minuto para asegurar que el otro usuario no se reconecte
+ inmediatamente; Despues del minuto, puedes reclamar tu
+ nick. Como alternatica, usa el comando RELEASE
+ (/msg %S HELP RELEASE) para recuperar el nick antes.
+
+ Para usar el comando RECOVER para un nick, tu
+ direccion actual mostrada en /WHOIS debe estar en la lista
+ de acceso de ese nick, debes estar identificado y en el
+ grupo de ese nick, o debes proveer la clave correcta
+ para ese nickname.
+
+NICK_HELP_RELEASE
+ Sintaxis: RELEASE nickname [clave]
+
+ Instruye a %S a remover cualquier suspencion que tenga tu nick
+ causada por proteccion automatica de kill o por uso del comando
+ RECOVER. Por defecto, la suspencion dura por un minuto;
+ este comando la termina antes.
+
+ Para usar el comando RELEASE para un nick, tu
+ direccion actual mostrada en /WHOIS debe estar en la lista
+ de acceso de ese nick, debes estar identificado y en el
+ grupo de ese nick, o debes proveer la clave correcta
+ para ese nickname.
+
+NICK_HELP_GHOST
+ Sintaxis: GHOST nickname [clave]
+
+ Termina una sesion IRC "fantasma" usando tu nick. Una
+ sesion fantasma es una conexion falsa, pero la cual los
+ servidores IRC creen esta en linea por una razon u otra.
+ Tipicamente, esto ocurre si tu computador se bloquea o tu
+ conexion a internet o por modem se cortan mientras estas
+ en IRC.
+
+ Para usar el comando GHOST para un nick, tu
+ direccion actual mostrada en /WHOIS debe estar en la lista
+ de acceso de ese nick, debes estar identificado y en el
+ grupo de ese nick, o debes proveer la clave correcta
+ para ese nickname.
+
+NICK_HELP_INFO
+ Sintaxis: INFO nickname [ALL]
+
+ Muestra informacion relativa al nick que especifiques,
+ tal como el propietario del nick, la ultima direccion usada
+ y tiempo, y opciones del nick. Si estas identificado con el
+ nick por el cual pides informacion y usas el parametro
+ ALL, podras ver toda la informacion; independiente de
+ si esta oculta o no.
+
+NICK_HELP_LIST
+ Sintaxis: LIST patron
+
+ Lista todos los nicknames que concuerden con el patron
+ dado, en el formato nick!usuario@host. Nicks con la
+ opcion PRIVATE seteada no seran mostrados.
+
+ Ejemplos:
+
+ LIST *!joeuser@foo.com
+ Lista todos los nicks registrados por joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Lista todos los nicks registrados con Bot en sus
+ nomvres (sensible a mayusculas y minisculas).
+
+ LIST *!*@*.bar.org
+ Lista todos los nicks registrados por usuarios en el
+ dominio bar.org.
+
+NICK_HELP_ALIST
+ Sintaxis: ALIST [nivel]
+
+ Lista todos los canales en los que tengas acceso. Opcionalmente, puedes especificar
+ un nivel en formato XOP o ACCESS. Los resultados incluiran solamente
+ canales en los que tengas el nivel de acceso dado.
+
+ Ejemplos:
+ ALIST Founder
+ Lista los canales en los que tienes acceso de
+ fundador.
+
+ ALIST AOP
+ Lista los canales en los que tienes acceso de
+ AOP o mayor.
+
+ ALIST 10
+ Lista los canales en los que tengas nivel de acceso 10
+ o mayor.
+
+ Canales que tengan la opcion NOEXPIRE seteada seran precedidos
+ por un signo de exclamacion.
+
+NICK_HELP_GLIST
+ Sintaxis: GLIST
+
+ Lista todos los nicks en tu grupo.
+
+NICK_HELP_STATUS
+ Sintaxis: STATUS nickname...
+
+ Devuelve informacion acerca de si el usuario usando el nick dado
+ ha sido reconocido como el propietario del nickname.
+ La respuesta tiene el siguiente formato:
+
+ nickname codigo-del-status
+
+ Donde nickname es el nickname enviado con el comando, y
+ codigo-del-status es uno de los siguientes:
+
+ 0 - Usuario no esta en linea o el nick no esta registrado.
+ 1 - Usuario no reconocido como el propietario del nick.
+ 2 - Usuario reconocido solo mediante la lista de acceso.
+ 3 - Usuario reconocido mediante autentificacion por clave.
+
+ hasta 16 nicknames pueden ser enviados con cada comando. El
+ resto seran ingnorados. Ningun mensaje de error es generado si
+ el nickname no es dado.
+
+NICK_HELP_SENDPASS
+ Sintaxis: SENDPASS nickname
+
+ Envia la clave del nickname dado a la direccion
+ e-mail seteada en el record del nickname. Este comando
+ es sumamente util para lidiar con claves perdidas.
+
+ Puede ser limitado a operadores de IRC en ciertas
+ redes.
+
+ Este comando no esta disponible cuando encripcion esta habilitada.
+
+NICK_SERVADMIN_HELP
+
+ Los siguientes comandos estan disponibles a administradores
+ de Servicios:
+
+ GETPASS Recupera la clave para un nickname
+ (solo si encripcion esta desabilitada)
+ FORBID Previene un nickname a ser usado
+
+ Administradores de Servicios pueden tambien botar cualquier
+ nickname sin tener que identificarse por el nick y pueden
+ ver la lista de acceso para cualquier nickname
+ (/msg %S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Sintaxis: LOGOUT [nickname [REVALIDATE]]
+
+ Sin un parametro, revierte el efecto del comando IDENTIFY,
+ osea te hace ya no reconocido como el verdadero dueño del nick
+ Ten en cuenta, que no seras requerido a reidentificarte.
+
+ Con un parametro, hace los mismo para el nick dado. Si
+ ademas especificas REVALIDATE, los Servicios requeriran al
+ dado nick a reidentificarse. Este uso esta limitado a
+ administradores de Servicios.
+
+NICK_SERVADMIN_HELP_DROP
+ Sintaxis: DROP [nickname]
+
+ Sin un parametro, bota tu nickname de la base de datos de
+ %S.
+
+ Con un parametro, bota el nick nombrado de la base des
+ datos. Puedes botar cualquier nick de tu grupo sin
+ privilegios especiales. Botar cualquier nick esta
+ limitado a administradores de Servicios.
+
+NICK_SERVADMIN_HELP_SET
+
+ Administradores de Servicios pueden tambien setear la
+ opcion NOEXPIRE, con la cual nicknames pueden ser
+ prevenidos a expirar. Ademas, administradores de
+ Servicios pueden setear opciones para cualquier nickname
+ sin ingresar una clave, usando el formato SET
+ nickname opcion parametros.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Sintaxis: SET [nickname] NOEXPIRE {ON | OFF}
+
+ Setea si el nick dado expirara. Setear esto a ON
+ previene que el nickname expire. Si ningun nickname es
+ dado, setea la opcion de no expiracion para tu nick.
+
+ Limitado a administradores de Servicios.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Administradores de Servicios pueden usar el parametro
+ ALL con cualquier nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Sintaxis: LIST patron [FORBIDDEN] [NOEXPIRE]
+
+ Lista todos los nicknames registrados que concuerden con el
+ patron dado, en el formato nick!usuario@host. Nicks con
+ la opcion PRIVATE solo seran mostrados a administradores
+ de Servicios. Nicks con la opcion NOEXPIRE seteada tendran
+ un ! antepuestos al nickname para administradores de
+ Servicios.
+
+ Si las opciones FORBIDDEN o NOEXPIRE son dadas, solo nicks
+ que, respectivamete, esran FORBIDden o esten seteados
+ NOEXPIRE seran mostrados. Si ambas opciones son dadas, ambos
+ tipos de nicks seran mostrados. Estas opciones estan
+ limitadas a administradores de Servicios.
+
+ Ejemplos:
+
+ LIST *!joeuser@foo.com
+ Lista todos los nicks registrados por joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Lista todos los nicks registrados con Bot en
+ sus nombres. (no sensible a mayusculas y minusculas).
+
+ LIST * NOEXPIRE
+ Lista todos los nicks registrados que hayan sido seteados
+ a no expiracion.
+
+NICK_SERVADMIN_HELP_ALIST
+ Sintaxis: ALIST [nick] [nivel]
+
+ Sin parametros, lista canales en los que tengas acceso. Con
+ un parametro, lista canales en los que nick tenga acceso.
+ Con dos parametros, lista canales en los que nick tenga
+ acceso igual o mayor a level.
+
+ Su uso esta limitado a administradores de Servicios.
+
+NICK_SERVADMIN_HELP_GLIST
+ Sintaxis: GLIST [nickname]
+
+ Sin un parametro, lista todos los nicknames en tu
+ grupo.
+
+ Con un parametro, lista todos los nicknames que hay
+ en el grupo del nick dado.
+ Su uso esta limitado a administradores de Servicios.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Sintaxis: GETPASS nickname
+
+ Devuelve la clave para el nickname dado. Ten en cuenta
+ que cuando este comando es usado, un mensaje incluyendo
+ la persona que ejecuto el comando y el nickname en el cual
+ fue usado sera monitoreado y enviado como WALLOPS/GLOBOPS.
+
+ Limitado a administradores de Servicios.
+
+ Este comando no esta disponible si encripcion esta habilitada.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Sintaxis: GETEMAIL user@emailhost
+
+ Muestra los nicks que usen el email dado. Notar que no puedes
+ usar comodines (wildcards) para ningun usuario o emailhost. Donde
+ sea que el comando se use, un mensaje incluyendo la persona que uso
+ el comando y el email sera logeado.
+
+ Limitado a Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Sintaxis: FORBID nickname [razon]
+
+ Impide a un nickname de ser registrado o usado por alguien.
+ Puede ser cancelado botando el nick.
+
+ En algunas redes, la razon es requerida.
+
+ Limitado a administradores de Servicios.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ %S te permite registrar y controlar varios
+ aspectos de los canales. A menudo, %S puede prevenir
+ a usuarios maliciosos "tomarse" canales limitando
+ quienes estan permitidos a tener privilegios de operador.
+ Los comandos disponibles estan listados a continuacion;
+ para usarlos, tipea /msg %S comando.
+ Para mayor informacion acerca de un comando especifico,
+ tipea /msg %S HELP comando.
+
+ REGISTER Registra un canal
+ IDENTIFY Te identifica con tu clave
+ SET Setea opciones e informacion de un canal
+ AOP Modifica la lista de usuarios AOP
+ SOP Modifica la lista de usuarios SOP
+ ACCESS Modifica la lista de usuarios privilegiados
+ LEVELS Redefine el significado de niveles de acceso
+ AKICK Mantiene la lista de AutoKick
+ DROP Cancela la registracion de un canal
+ SENDPASS Ayuda a recuperar claves perdidas
+
+ Otros comandos: ALIST, BAN, CLEAR, DEOP, DEVOICE, GETKEY,
+ INFO, INVITE, KICK, LIST, LOGOUT, OP,
+ UNBAN, VOICE, VOP
+
+CHAN_HELP_UNREAL
+
+ Estos comandos tambien estan disponibles en esta red:
+ DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER,
+ PROTECT
+
+CHAN_HELP_ULTIMATE
+
+ Estos comandos tambien estan disponibles en esta red:
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ Estos comandos tambien estan disponibles en esta red:
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Ten en cuenta que cualquier canal que no es usado por
+ %d dias (al cual ningun usuario en la lista de acceso
+ del canal entre en ese periodo de tiempo) sera
+ automaticamente botado.
+
+CHAN_HELP_REGISTER
+ Sintaxis: REGISTER canal clave descripcion
+
+ Registra un canal en la base de datos de %S. Para
+ usar este comando, debes primero ser un operador en el
+ canal que intentas registrar. La clave es usada con
+ el comando IDENTIFY para permitir a otros hacer
+ cambios al seteo del canal posteriormente.
+ El ultimo parametro, el cual debe ser incluido, es
+ una descripcion general del proposito del canal.
+
+ Cuando registras un canal, eres reconocido como el
+ "fundador" del canal. El fundador del canal puede
+ cambiar todos los seteos para el canal;
+ %S tambien dara al fundador prvilegios de operador
+ automaticamente cuando el usuario entre al canal.
+ Averigua sobre el comando ACCESS
+ (/msg %S HELP ACCESS) para informacion sobre
+ como dar estos privilegios a otros usuarios del canal.
+
+ NOTESE: Para registrar un canal debes haber registrado
+ tu nickname primero. Si aun no lo haz hecho, tipea
+ /msg %s HELP para mayor informacion en como hacerlo.
+
+CHAN_HELP_IDENTIFY
+ Sintaxis: IDENTIFY canal clave
+
+ Te identifica con %S como el fundador del canal dado.
+ Muchos comandos requieren que uses este comando antes
+ de usarlos. La clave deberia ser la misma que
+ enviaste con el comando REGISTER.
+
+CHAN_HELP_LOGOUT
+ Sintaxis: LOGOUT canal nickname
+
+ Este comando hace al nickname dado ya no identificado
+ en el canal dado.
+
+ Si eres el fundador del canal, puedes desconectar a
+ quien sea, de otra forma solo te puedes desconectar
+ a ti mismo.
+
+CHAN_HELP_DROP
+ Sintaxis: DROP canal
+
+ Desregistra el canal dado. Solo puede ser usado por el
+ fundador del canal, quien debe primero usar el comando
+ IDENTIFY.
+
+CHAN_HELP_SET
+ Sintaxis: SET canal opcion parametros
+
+ Le permite al fundador del canal setear varias opciones
+ de canal y otra informacion.
+
+ Opciones disponibles:
+
+ FOUNDER Setea el fundador de un canal
+ SUCCESSOR Setea el sucesor de un canal
+ PASSWORD Setea el pasword del fundador
+ DESC Setea la descripcion del canal
+ URL Asocia una URL con el canal
+ EMAIL Asocia un E-mail con el canal
+ ENTRYMSG Setea un mensaje a enviar a
+ los usuarios cuando entren al canal
+ BANTYPE Setea como los Servicios ponen bans
+ en el canal
+ MLOCK Fija los modos de canal on u off
+ KEEPTOPIC Retiene el topic cuando el canal no
+ esta en uso
+ OPNOTICE Envia una noticia cuando los comandos
+ OP/DEOP son usados
+ PEACE Regula el uso de comandos criticos
+ PRIVATE Esconde el canal del comando LIST
+ RESTRICTED Restrinje el acceso al canal
+ SECURE Activa las opciones de seguridad de %S
+ SECUREOPS Estricto control del estatus de chanop
+ SECUREFOUNDER Estricto control del estatus de fundador
+ de canal
+ SIGNKICK Firma kicks hechos con el comando KICK
+ TOPICLOCK El topic solo puede ser cambiado con
+ TOPIC
+ XOP Cambia el sistema de privilegios de
+ usuario
+
+ Tipea /msg %S HELP opcion para mayor informacion
+ acerca de una opcion en particular.
+
+CHAN_HELP_SET_FOUNDER
+ Sintaxis: SET canal FOUNDER nick
+
+ Cambia el fundador de un canal. El nuevo nickname debe
+ ser uno registrado.
+
+CHAN_HELP_SET_SUCCESSOR
+ Sintaxis: SET canal SUCCESSOR nick
+
+ Cambia el sucesor de un canal. Si el nickname fundador
+ expira o es botado mientras el canal esta aun registrado,
+ el sucesor se convertira en el nuevo fundador del canales.
+ Sin embargo, si el sucesor ya tiene muchos canales
+ registrados (%d), el canal sera botado en vez, tal y como
+ si no hubiese un sucesor. El nuevo nickname debe ser uno
+ registrado.
+
+CHAN_HELP_SET_PASSWORD
+ Sintaxis: SET canal PASSWORD clave
+
+ Setea la clave usado para identificarse como el
+ fundador del canal.
+
+CHAN_HELP_SET_DESC
+ Sintaxis: SET canal DESC descripcion
+
+ Setea la descripcion para el canal, la que es mostrada
+ con los comandos LIST y INFO.
+
+CHAN_HELP_SET_URL
+ Sintaxis: SET canal URL [url]
+
+ Asocia la URL dada con el canal. Esta URL sera mostrada
+ cuando alguien solicite informacion sobre el canal con
+ el comando INFO. Si ningun parametro es dado,
+ borra la URL actual para el canal.
+
+CHAN_HELP_SET_EMAIL
+ Sintaxis: SET canal EMAIL [direccion]
+
+ Asocia la direccion E-mail dada con el canal.
+ Esta direccion sera mostrada cuando alguien solicite
+ informacion sobre el canal con el comando INFO.
+ Si ningun parametro es dado, borra la direccion E-mail
+ actual para el canal.
+
+CHAN_HELP_SET_ENTRYMSG
+ Sintaxis: SET canal ENTRYMSG [mensaje]
+
+ Setea el mensaje que sera enviado via /notice a los
+ usuarios cuando ingresen al canal. Si ningun parametro
+ es dado, ningun mensaje sera enviado al entrar al canal.
+
+CHAN_HELP_SET_BANTYPE
+ Sintaxis: SET canal BANTYPE tipo_de_ban
+
+ Setea el tipo de ban que sera usado por los
+ Servicios cuando necesiten banear a alguien
+ de tu canal.
+
+ tipo de ban es un numero entre 0 y 3 que significa:
+
+ 0: ban en la forma *!usuario@host
+ 1: ban en la forma *!*usuario@host
+ 2: ban en la forma *!*@host
+ 3: ban en la forma *!*usuario@*.dominio
+
+CHAN_HELP_SET_KEEPTOPIC
+ Sintaxis: SET canal KEEPTOPIC {ON | OFF}
+
+ Habilita o deshabilita la opcion de retencion de topic
+ para un canal. Cuando la retencion de topic esta
+ seteada, el topic para el canal sera recordado por
+ %S incluso despues de que el ultimo usuario
+ salga del canal, y sera restorado la proxima vez que
+ el canal sea creado.
+
+CHAN_HELP_SET_TOPICLOCK
+ Sintaxis: SET canal TOPICLOCK {ON | OFF}
+
+ Abilita o desabilita la opcion de fijacion de topic
+ para un canal. Cuando la fijacion de topic esta
+ seteada, %S no permitira que el topico del canal
+ sea cambiado excepto con el comando TOPIC.
+
+CHAN_HELP_SET_MLOCK
+ Sintaxis: SET canal MLOCK modos
+
+ Setea el parametro de fijacion de modos para el canal.
+ %S te permite definir ciertos modos de canal para estar
+ siempre encendidos o apagados o libres de estar uno de los
+ anteriores.
+
+ El parametro modos es construido de la misma forma
+ que el comando /MODE; esto significa, modos seguidos
+ por un + estan fijados encendidos, y modos seguidos por
+ un - estan fijados apagados. Tener en cuenta que, a
+ diferencia del comando MODE, cada uso de SET MLOCK
+ removera todos los modos fijados previamente antes de
+ setear los nuevos!
+
+ Advertencia: Si seteas una key con fijacion de modo, como
+ en el segundo ejemplo mas abajo, deberas tambien setear la
+ opcion RESTRICTED para el canal (ver HELP SET RESTRICTED),
+ o quien quiera que entre al canal cuando este vacio podra ver la
+ key!
+
+ Ejemplos:
+
+ SET #canal MLOCK +nt-iklps
+ Fuerza los modos n y t encendidos, y los modos i, k,
+ l, p y s apagados. El modo m es dejado libre para
+ estar encendido o apagado.
+
+ SET #canal MLOCK +knst-ilmp mi-key
+ Fuerza los modos k, n, s, y t encendidos, y los modos
+ i, l, m, y p apagados. Tambien fuerza la key del canal
+ a ser "mi-key".
+
+ SET #canal MLOCK +
+ Remueve la fijacion de modos; todos los modos del canal
+ son libres de estar encendidos o apagados.
+
+CHAN_HELP_SET_PEACE
+ Sintaxis: SET canal PEACE {ON | OFF}
+
+ Habilita o deshabilita la opcion de paz para un
+ canal. Cuando paz esta seteada, un usuario no
+ podra patear, banear o remover un estatus de canal
+ de un usuario con nivel igual o superior a el via
+ comandos de %S.
+
+CHAN_HELP_SET_PRIVATE
+ Sintaxis: SET canal PRIVATE {ON | OFF}
+
+ Habilita o deshabilita la opcion de privacidad para un canal.
+ Cuando privacidad esta seteada, un /msg %S LIST no
+ incluira el canal en ninguna lista.
+
+CHAN_HELP_SET_RESTRICTED
+ Sintaxis: SET canal RESTRICTED {ON | OFF}
+
+ Habilita o deshabilita la opcion de acceso restringido
+ para un canal. Cuando el acceso restringido esta
+ seteado, Los usuarios seran inhabilitados de tener
+ privilegios de operador de canal. (usuarios con acceso
+ negativo y, si seguridad de ops esta seteada,
+ usuarios no en la lista de acceso) seran en vez
+ kickeados y baneados del canal.
+
+CHAN_HELP_SET_SECURE
+ Sintaxis: SET canal SECURE {ON | OFF}
+
+ Habilita o deshabilita las caracteristicas de seguridad
+ de %S para un canal. Cuando SECURE esta
+ seteado, solo usuarios que han registrado sus nicknames
+ con %s y han usado IDENTIFY con su clave seran
+ otorgados acceso al canal controlado por la lista de
+ acceso.
+
+CHAN_HELP_SET_SECUREOPS
+ Sintaxis: SET canal SECUREOPS {ON | OFF}
+
+ Habilita o deshabilita la opcion seguridad de ops para un
+ canal. Cuando seguridad de ops esta seteada, usuarios
+ que no estab en la lista de usuarios no seran permitidos a
+ obtener el status de operador de canal.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Sintaxis: SET canal SECUREFOUNDER {ON | OFF}
+
+ Habilita o deshabilita la opcion seguridad de fundador para
+ un canal. Cuando seguridad de fundador esta seteada, solo
+ el fundador real podra botar el canal, cambiar su clave,
+ su fundador y su sucesor, y no aquellos que esten identificados
+ con %S.
+
+CHAN_HELP_SET_SIGNKICK
+ Sintaxis: SET canal SIGNKICK {ON | LEVEL | OFF}
+
+ Habilita o deshabilita los kicks firmados para un
+ canal. Cuando SIGNKICK esta seteado, kicks
+ hechos con el comando %S KICK tendran el
+ nick que uso el comando en la razon.
+
+ Si usas LEVEL, aquellos que tienen nivel superior o
+ igual al nivel SIGNKICK en el canal no tendran sus kicks
+ firmados. Ver /msg %S HELP LEVELS para mayor informacion.
+
+CHAN_HELP_SET_XOP
+ Sintaxis: SET canal XOP {ON | OFF}
+
+ Habilita o deshabilita el sistema de listas xOP para un canal.
+ Cuando XOP esta seteado, debes usar los comandos AOP/SOP/VOP
+ para dar privilegios de canal a usuarios. De otra manera
+ debes usar el comando ACCESS.
+
+ Nota Tecnica: cuando cambias de lista de acceso a sistema
+ de listas xOP, tu definicion de niveles de usuario sera
+ cambiada, asi que no tendras los mismos valores si vuelves a
+ cambiar a lista de acceso!
+
+ Tambien deberias chequear si tus usuarios estan en la lista xOP
+ correspondiente despues del cambio, ya que la deduccion no es
+ siempre perfecta... de hecho, no es recomendado el usar listas
+ xOP si cambiaste la definicion de niveles con el comando
+ LEVELS.
+
+ Cambiar de listas xOP al sistema de listas de acceso no causa
+ problema alguno.
+
+CHAN_HELP_SET_OPNOTICE
+ Sintaxis: SET canal OPNOTICE {ON | OFF}
+
+ Habilita o deshabilita la opcion de op-notice para un canal.
+ Cuando op-notice esta seteado, %S enviara una noticia
+ al usuario del canal cuando los comandos OP o DEOP sean
+ usados para un usuario en el canal.
+
+CHAN_HELP_AOP
+ Sintaxis: AOP canal ADD nick
+ AOP canal DEL {nick | instancia | lista}
+ AOP canal LIST [mascara | lista]
+ AOP canal CLEAR
+
+ Mantiene la lista OP (AutoOP) para un canal. La lista
+ AOP le da al usuario el derecho de ser automaticamente
+ opeado en tu canal, desbaneado o invitarse a si mismos de
+ ser necesario, mostrar el mensaje de saludo al entrar, etc.
+
+ El comando AOP ADD agrega al nickname dado a la lista
+ AOP.
+
+ El comando AOP DEL remueve el nickname dado de la
+ lista AOP. Si una lista de instancias es dada, esas
+ instancias son borradas. (Ver el ejemplo para LIST mas
+ abajo.)
+
+ El comando AOP LIST muestra la lista AOP. Si una
+ mascara con comodin es dada, solo las instancias
+ concordando la mascara son mostradas. Si una lista de
+ instancias es dada, solo esas instancias son mostradas;
+ por ejemplo:
+
+ AOP #canal LIST 2-5,7-9
+ Muestra instancias de AOP enumeradas 2 a 5 y
+ 7 a 9.
+
+ El comando AOP CLEAR limpia todas las instancias de la
+ lista AOP.
+
+ Los comandos AOP ADD y AOP DEL estan limitados a
+ SOPs o superior, mientras que el comando AOP CLEAR
+ solo puede ser usado por el fundador del canal. Aun asi,
+ cualquier usuario en la lista AOP puede usar el comando
+ AOP LIST.
+
+ Este comando puede haber sido deshabilitado para tu canal.
+ Si este es el caso, debes usar la lista de acceso. Ver
+ /msg %S HELP ACCESS para incormacion acerca la lista
+ de acceso y /msg %S HELP SET XOP para saber como cambiar
+ entre la lista de acceso y el sistema de listas xOP.
+
+CHAN_HELP_HOP
+ Sintaxis: HOP canal ADD nick
+ HOP canal DEL {nick | instancia | lista}
+ HOP canal LIST [mascara | lista]
+ HOP canal CLEAR
+
+ Mantiene la lista HOP (HalfOP) para un canal. La lista
+ HOP le da al usuario el derecho de ser automaticamente
+ halfopeado en tu canal.
+
+ El comando HOP ADD agrega al nickname dado a la lista
+ HOP.
+
+ El comando HOP DEL remueve el nickname dado de la
+ lista HOP. Si una lista de instancias es dada, esas
+ instancias son borradas. (Ver el ejemplo para LIST mas
+ abajo.)
+
+ El comando HOP LIST muestra la lista HOP. Si una
+ mascara con comodin es dada, solo las instancias
+ concordando la mascara son mostradas. Si una lista de
+ instancias es dada, solo esas instancias son mostradas;
+ por ejemplo:
+
+ HOP #canal LIST 2-5,7-9
+ Muestra instancias de HOP enumeradas 2 a 5 y
+ 7 a 9.
+
+ El comando HOP CLEAR limpia todas las instancias de la
+ lista HOP.
+
+ Los comandos HOP ADD y HOP DEL estan limitados a
+ AOPs o superior, mientras que el comando HOP CLEAR
+ solo puede ser usado por el fundador del canal.
+
+ Este comando puede haber sido deshabilitado para tu canal.
+ Si este es el caso, debes usar la lista de acceso. Ver
+ /msg %S HELP ACCESS para incormacion acerca la lista
+ de acceso y /msg %S HELP SET XOP para saber como cambiar
+ entre la lista de acceso y el sistema de listas xOP.
+
+CHAN_HELP_SOP
+ Sintaxis: SOP canal ADD nick
+ SOP canal DEL {nick | instancia | lista}
+ SOP canal LIST [mascara | lista]
+ SOP canal CLEAR
+
+ Mantiene la lista SOP (SuperOP) para un canal. La lista
+ SOP le da al usuario los derechos dados por la lista AOP,
+ y agrega aquellos necesarios para usar las listas de
+ AutoKick y BadWords, mandar y leer memos de canal, etc.
+
+ El comando SOP ADD agrega al nickname dado a la lista
+ SOP.
+
+ El comando SOP DEL remueve el nickname dado de la
+ lista SOP. Si una lista de instancias es dada, esas
+ instancias son borradas. (Ver el ejemplo para LIST mas
+ abajo.)
+
+ El comando SOP LIST muestra la lista SOP. Si una
+ mascara con comodin es dada, solo las instancias
+ concordando la mascara son mostradas. Si una lista de
+ instancias es dada, solo esas instancias son mostradas;
+ por ejemplo:
+
+ SOP #canal LIST 2-5,7-9
+ Muestra instancias de SOP enumeradas 2 a 5 y
+ 7 a 9.
+
+ El comando SOP CLEAR limpia todas las instancias de la
+ lista SOP.
+
+ Los comandos SOP ADD, SOP DEL y SOP CLEAR estan
+ limitados al fundador del canal. Cualquier usuario en la
+ lista AOP puede usar el comando SOP LIST.
+
+ Este comando puede haber sido deshabilitado para tu canal.
+ Si este es el caso, debes usar la lista de acceso. Ver
+ /msg %S HELP ACCESS para incormacion acerca la lista
+ de acceso y /msg %S HELP SET XOP para saber como cambiar
+ entre la lista de acceso y el sistema de listas xOP.
+
+CHAN_HELP_VOP
+ Sintaxis: VOP canal ADD nick
+ VOP canal DEL {nick | instancia | lista}
+ VOP canal LIST [mascara | lista]
+ VOP canal CLEAR
+
+ Mantiene la lista VOP (VOicePeople) para un canal.
+ La lista VOP le da al usuario el derecho de ser
+ automaticamente dado voice o darse voice a si mismos.
+
+ El comando VOP ADD agrega al nickname dado a la lista
+ VOP.
+
+ El comando VOP DEL remueve el nickname dado de la
+ lista VOP. Si una lista de instancias es dada, esas
+ instancias son borradas. (Ver el ejemplo para LIST mas
+ abajo.)
+
+ El comando VOP LIST muestra la lista VOP. Si una
+ mascara con comodin es dada, solo las instancias
+ concordando la mascara son mostradas. Si una lista de
+ instancias es dada, solo esas instancias son mostradas;
+ por ejemplo:
+
+ VOP #canal LIST 2-5,7-9
+ Muestra instancias de VOP enumeradas 2 a 5 y
+ 7 a 9.
+
+ El comando VOP CLEAR limpia todas las instancias de la
+ lista VOP.
+
+ Los comandos VOP ADD, VOP DEL y VOP LIST estan
+ limitados a AOPs o superior, mientras que el comando
+ VOP CLEAR solo puede ser usado por el fundador del
+ canal.
+
+ Este comando puede haber sido deshabilitado para tu canal.
+ Si este es el caso, debes usar la lista de acceso. Ver
+ /msg %S HELP ACCESS para incormacion acerca la lista
+ de acceso y /msg %S HELP SET XOP para saber como cambiar
+ entre la lista de acceso y el sistema de listas xOP.
+
+CHAN_HELP_ACCESS
+ Sintaxis: ACCESS canal ADD nick nivel
+ ACCESS canal DEL {nick | indices | lista}
+ ACCESS canal LIST [mascara | lista]
+ ACCESS canal CLEAR
+
+ Mantiene la lista de acceso para un canal. La lista
+ de acceso especifica que usuarios estan permitidos atener
+ el estatus de operador de canal o acceso a comandos de
+ %S en el canal. Diferentes niveles de usuarios permiten
+ acceso a diferentes subniveles de privilegios;
+ /msg %S HELP ACCESS LEVELS para informacion mas
+ especifica. Cualquier nick no presente en la lista de
+ acceso tiene un nivel 0.
+
+ El comando ACCESS ADD añade el nickname dado a la lista
+ de acceso con el nivel de usuario dado; si el nick ya esta
+ presente en la lista, el nivel de acceso es cambiado al
+ especificado en el comando. El nivel especificado
+ debe ser menos que el del usuario dando el comando, y si
+ el nick ya esta en la lista de acceso, el acceso actual
+ del nick debe ser menor que el acceso del usuario dando el
+ comando.
+
+ El comando ACCESS DEL remueve el nick dado de la lista
+ de acceso. Si una lista de indices es dada, esas instancias
+ son borradas. (Ver el ejeplo para LIST mas abajo.)
+
+ El comando ACCESS LIST muestra la lista de acceso. Si
+ una mascara con comodin es dada, solo esas instancias
+ concordando a la mascara son mostradas. Si una lista de
+ indices es dada, solo esas instancias son mostrdas; por
+ ejemplo:
+
+ ACCESS #canal LIST 2-5,7-9
+ Lista instancias de acceso numeradas 2 hasta 5 y
+ 7 hasta 9.
+
+ El comando ACCESS CLEAR limpia todas las instancias
+ de la lista de acceso.
+
+CHAN_HELP_ACCESS_LEVELS
+ Niveles de acceso para usuarios
+
+ Por defecto, los siguientes niveles de acceso estan definidos:
+
+ Fundador Acceso completo a las funciones de %S;
+ Op automatico al entrar al canal. Notese
+ que solo una persona puede tener estatus
+ de fundador (no puede ser dado usando el
+ comando ACCESS).
+  10 Acceso al comando AKICK; Op automatico.
+  5 Op automatico.
+  3 Voice automatico.
+  0 Ningun privilegio especial; Puede ser opeado
+ por otros ops (a menos que seguridad de
+ ops este seteada).
+  <0 No puede ser opeado.
+
+ Esyos niveles pueden ser cambiado, o nuevos añadidos,
+ usando el comando LEVELS; tipea /msg %S HELP LEVELS
+ para mayor informacion.
+
+CHAN_HELP_AKICK
+ Sintaxis: AKICK canal ADD mascara [razon]
+ AKICK canal STICK mascara
+ AKICK canal UNSTICK mascara
+ AKICK canal DEL mascara
+ AKICK canal LIST [mascara]
+ AKICK canal VIEW [mascara]
+ AKICK canal ENFORCE
+ AKICK canal CLEAR
+
+ Mantiene la lista de AutoKicks para un canal. Si
+ un usuario en la lista de Autokicks intenta entrar
+ al canal, %S baneara al usuario del canal, luego lo
+ kickeara.
+
+ El comando AKICK ADD añade el nick o mascara de
+ usuario dado a la lista de Autokicks. Si una razon
+ es dada con el comando, esta razon sera usada cuando el
+ usuario es kickeado; si no, la razon por defecto es
+ "Haz sido baneado del canal".
+
+ El comando AKICK STICK banea permanente la mascara
+ dada en el canal. Si alguien intenta remover el ban,
+ %S la seteara nuevamente automaticamente. No puede ser
+ usado para nicks registrados.
+
+ El comando AKICK UNSTICK cancela el efecto del
+ comando AKICK STICK, asi que sera posible remover
+ el ban del canal nuevamente.
+
+ El comando AKICK DEL remueve el nick o mascara dados
+ de la lista de AutoKicks. Aun asi, no remueve ningun ban
+ puesto por un AutoKick; aquellos deben ser removidos
+ manualmente.
+
+ El comando AKICK LIST muestra la lista de AutoKicks,
+ u opcionalmente solo las instancias de AutoKick AutoKick
+ que concuerden con la mascara dada.
+
+ El comando AKICK VIEW es una version mas detallada
+ del comando AKICK LIST.
+
+ El comando AKICK ENFORCE hace a %S a enforzar la
+ lista AKICK actual removiendo a los usuarios que
+ concuerden la mascara AKICK.
+
+ El comando AKICK CLEAR limpia todas las instancias
+ de ka lista de akicks.
+
+CHAN_HELP_LEVELS
+ Sintaxis: LEVELS canal SET tipo nivel
+ LEVELS canal {DIS | DISABLE} tipo
+ LEVELS canal LIST
+ LEVELS canal RESET
+
+ El comando LEVELS permite un control fino sobre el
+ significado de los niveles de acceso numericos usados para
+ canales. Con este comando, puedes definir el nivel de acceso
+ requerido para la mayoria de las funciones de %S.
+ (Los comandos SET FOUNDER y SET PASSWORD, asi como
+ este comando estan siempre restringidos al fundador del
+ canal.)
+
+ LEVELS SET permite cambiar el nivel de acceso para una funcion
+ o un grupo de funciones. LEVELS DISABLE (o DIS para corto)
+ desabilita una caracteristica automatica o prohibe acceso a una
+ funcion para todos excepto el fundador del canal.
+ LEVELS LIST muestra los niveles actuales para cada funcion o
+ grupo de funciones. LEVELS RESET resetea los niveles a los
+ niveles por defecto de un canal recien creado (ver
+ HELP ACCESS LEVELS).
+
+ Para una lista de las caracteristicas y funciones a los que
+ se les puede cambiar los niveles, ver HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ Los siguientes nombres de decaracteristicas/funciones son
+ entendidos. Tener en cuenta que los niveles para AUTODEOP
+ y NOJOIN son niveles maximos, mientras todos los otros
+ son niveles minimos.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Sintaxis: INFO canal [ALL]
+
+ Lista informacion acerca del canal registrado dado,
+ incluyendo su fundador, tiempo de registracion, ultima
+ vez usado, descripcion y fijacion de modos, si existen.
+ Si ALL es especificado, el mensaje de entrada y
+ sucesor tambien seran mostrados.
+
+ Por defecto, la opcion ALL esta limitada a aquellos
+ con acceso de fundador en el canal.
+
+CHAN_HELP_LIST
+ Sintaxis: LIST patron
+
+ Lista todos los canales registrados concordando el patron
+ dado (Canales con la opcion PRIVATE seteada no son
+ listados.)
+
+CHAN_HELP_OP
+ Sintaxis: OP [#canal [nick]]
+
+ Opea al nick seleccionado en un canal. Si nick no es
+ dado, te opeara a ti. SI canal y nick no son dados,
+ te opeara en todos los canales en los que estes,
+ siempre y cuando tengas los permisos para hacerlo.
+
+ Por defecto, limitado a AOPs o aquellos con nivel de
+ acceso 5 y mayor en el canal.
+
+CHAN_HELP_DEOP
+ Sintaxis: DEOP [#canal [nick]]
+
+ Deopea al nick seleccionado en un canal. Si nick no es
+ dado, te deopeara a ti. Si canal y nick no son dados,
+ te deopeara a ti en todos los canales en los que estes,
+ siempre y cuando tengas los permisos para hacerlo.
+
+ Por defecto, limitado a AOPs o aquellos con nivel de
+ acceso 5 y mayor en el canal.
+
+CHAN_HELP_VOICE
+ Sintaxis: VOICE [#canal [nick]]
+
+ Da voice al nick seleccionado en un canal. Si nick no
+ es dado, te dara voice a ti. Si canal y nick no son
+ dados, te dara voice en todos los canales en los que
+ estes, siempre y cuando tengas los permisos para
+ hacerlo.
+
+ Por defecto, limitado AOPs o aquellos con nivel de
+ acceso 5 y mayor en el canal, o a VOPs o aquellos
+ con nivel 3 y mayor para darse voice a si mismos.
+
+CHAN_HELP_DEVOICE
+ Sintaxis: DEVOICE [#canal [nick]]
+
+ Quita voice al nick seleccionado en un canal. Si nick no
+ es dado, te quitara voice a ti. Si canal y nick no son
+ dados, te quitara voice en todos los canales en los que
+ estes, siempre y cuando tengas los permisos para hacerlo.
+
+ Por defecto, limitado a AOPs o aquellos con nivel de
+ acceso 5 y mayor en el canal, o a VOPs o aquellos con
+ nivel 3 y mayor para darse voice a si mismos.
+
+CHAN_HELP_HALFOP
+ Sintaxis: HALFOP [#canal [nick]]
+
+ Da Halfop al nick seleccionado en un canal. Si nick no
+ es dado, te dara halfop a ti. Si canal y nick no son
+ dados, te dara halfop en todos los canales en los que
+ estes, siempre y cuando tengas los permisos para hacerlo.
+
+ Por defecto, limitado a AOPs y aquellos con nivel de
+ acceso 5 y mayor en el canal, o a HOPs o aquellos con nivel
+ 4 y mayor para darse halfop a si mismos.
+
+CHAN_HELP_DEHALFOP
+ Sintaxis: DEHALFOP [#canal [nick]]
+
+ Quita Halfop al nick seleccionado en un canal. Si nick no
+ es dado, te quitara halfop a ti. Si canal y nick no son
+ dados, te quitara halfop en todos los canales en los que
+ estes, siempre y cuando tengas los permisos para hacerlo.
+
+ Por defecto, limitado a AOPs y aquellos con nivel de
+ acceso 5 y mayor en el canal, o a HOPs o aquellos con
+ nivel 4 y mayor para quitarse halfop a si mismos.
+
+CHAN_HELP_PROTECT
+ Sintaxis: PROTECT [#canal [nick]]
+
+ Proteje al nick seleccionado en un canal. Si nick no es
+ dado, te protejera a ti. Si canal y nick no son dados,
+ te protejera en todos los canales en los que estes,
+ siempre y cuando tengas los permisos para hacerlo.
+
+ Por defecto, limitado al fundador, o a SOPs o aquellos
+ con nivel 10 y mayor en el canal para protejerse a si
+ mismos.
+
+CHAN_HELP_DEPROTECT
+ Sintaxis: DEPROTECT [#canal [nick]]
+
+ Desproteje al nick seleccionado en un canal. Si nick no
+ es dado, te desprotejera a ti. Si canal y nick no son
+ dados, te desprotejera en todos los canales en los que
+ estes, siempre y cuando tengas los permisos para hacerlo.
+
+ Por defecto, limitado al fundador, o a SOPs o aquellos
+ con nivel 10 y mayor en el canal para desprotejerse a
+ si mismos.
+
+CHAN_HELP_OWNER
+ Sintaxis: OWNER [#canal]
+
+ Te da el estatus de dueño en canal. Si canal no
+ es dado, te dara estatus de dueño en todos los
+ canales en los que estes, siempre y cuando tengas
+ permiso para hacerlo.
+
+ Limitado a aquellos con nivel de fundador en el canal.
+
+CHAN_HELP_DEOWNER
+ Sintaxis: DEOWNER [#canal]
+
+ Remueve tu estatus de dueño en canal. Si canal no
+ es dado, remueve tu estatus de dueño en todos los
+ canales en los que estes, siempre y cuando tengas
+ permiso para hacerlo.
+
+ Limitado a aquellos con nivel de fundador en el canal.
+
+CHAN_HELP_INVITE
+ Sintaxis: INVITE canal
+
+ Le dice a %S que te invite al canal dado.
+
+ Por defecto, limitado a AOPs o aquellos con nivel 5
+ y mayor en el canal.
+
+CHAN_HELP_UNBAN
+ Sintaxis: UNBAN canal
+
+ Le dice a %S que remueva todos los bans previeniendo
+ que entres al canal dado.
+
+ Por defecto, limitado a AOPs o aquellos con nivel 5
+ y mayor en el canal.
+
+CHAN_HELP_KICK
+ Sintaxis: KICK [#canal [nick [razon]]]
+
+ Kickea al nick seleccionado en el canal. Si nick no es
+ dado, te kickeara a ti. Si canal y nick no son dados,
+ te kickeara en todos los canales, siempre y cuando tengas
+ permiso para hacerlo.
+
+ Por defecto, limitado a AOPs o aquellos con nivel de
+ acceso 5 y mayor en el canal.
+
+CHAN_HELP_BAN
+ Sintaxis: BAN [#canal [nick [razon]]]
+
+ Banea un nick seleccionado en un canal. Si el nick no
+ es dado, te baneara a ti. Si canal y nick no son dados,
+ te baneara de todos los canales, siempre y cuando tengas
+ permiso para hacerlo.
+
+ Por defecto, limitado a AOPs o aquellos con nivel de
+ acceso 5 y mayor en el canal.
+
+CHAN_HELP_TOPIC
+ Sintaxis: TOPIC canal [topico]
+
+ Hace a %S setear el topic del canal al especificado.
+ If topico no es dado, un topico vacio es seteado.
+ Este comando es mas util usado en conjunto a SET
+ TOPICLOCK. Ver /msg %S HELP SET TOPICLOCK
+ para mayor informacion.
+
+ Por defecto, limitado a aquellos con nivel de fundador
+ en el canal.
+
+CHAN_HELP_CLEAR
+ Sintaxis: CLEAR canal que
+
+ Le dice a %S que limpie ciertos seteos en el canal.
+ que puede ser uno de los siguientes:
+
+ MODES Resetea todos los modos en el canal (osea,
+ limpia los modos i,k,l,m,n,p,s,t).
+ BANS Limpia todos los bans en el canal.
+ EXCEPTS Limpia todos los excepts en el canal.
+ OPS Remueve estatus de operador de canal(modo +o)
+ de todos los operadores de canal.
+ VOICES Remueve el estatus "voice" (modo +v) de quien
+ tenga ese modo seteado.
+ USERS Remueve (kickea) todos los usuarios del canal.
+
+ Por defecto, tu nivel de acceso en el canal debe ser de
+ fundador.
+
+CHAN_HELP_GETKEY
+ Sintaxis: GETKEY canal
+
+ Retorna la key del canal dado. Este es un comando
+ principalmente para ser usado por bots y/o scripts,
+ asi que el resultado es de la siguiente manera:
+
+ KEY <canal> <key>
+
+ key es "NO KEY" si no hay key seteada.
+
+CHAN_HELP_SENDPASS
+ Sintaxis: SENDPASS canal
+
+ Envia la clave del canal dado a la direccion email seteada
+ en el archivo del nickname del fundador. Este comando
+ es sumamente util para lidiar con claves perdidas.
+
+ Puede ser limitado a Operadores de IRC en ciertas redes.
+
+ Este comando no es disponible cuando encripcion esta abilitada.
+
+CHAN_SERVADMIN_HELP
+
+ Los siguientes comandos estan disponibles para administradores
+ de Servicios:
+
+ GETPASS Retorna la clave de fundador para un canal
+ (solo si encripcion esta desabilitada)
+ FORBID Previene un canal a ser usado
+ SUSPEND Previene un canal a ser usado preservando
+ toda su informacion.
+ UNSUSPEND Libera la suspencion del canal.
+ STATUS Retorna el nivel de acceso actual de un
+ usuario en un canal
+
+ Administradores de Servicios tambien pueden botar un canal
+ sin tener que identificarse por medio de clave, y pueden
+ ver el acceso, AKICK, y seteos de las listas de niveles para
+ cualquier canal.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Sintaxis: LOGOUT canal [nickname]
+
+ Este comando hace al nick seleccionado ya no identificado
+ para el canal dado.
+
+ Si tu eres el fundador del canal, puedes desconectar a
+ quien sea, de otra manera solo te puedes desconectar a
+ ti mismo.
+
+ Si eres un administrador de Servicios, puedes
+ desconectar a quien sea de un canal sin ser el fundador
+ del canal. Ademas, puedes omitir el parametro nickname;
+ esto desconectara a todos los usuarios identificados
+ del canal.
+
+CHAN_SERVADMIN_HELP_DROP
+ Sintaxis: DROP canal
+
+ Desregistra el canal dado. Solo
+ administradores de Servicios pueden botar un
+ canal por el cual no se hayan identificado.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Administradores de Servicios pueden tambien setear la
+ opcion NOEXPIRE, con la cual canales pueden ser
+ prevenidos a expirar. Ademas, administradores de
+ Servicios pueden setear opciones para cualquier canal
+ sin tener que identificarse por clave en el canal.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Sintaxis: SET canal NOEXPIRE {ON | OFF}
+
+ Setea si el canal expirara. Seteando esto
+ a ON previene el canal a expirar.
+
+ Limitado a administradores de Servicios.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Administradores de Servicios pueden usar el parametro
+ ALL con cualquier canal.
+
+CHAN_SERVADMIN_HELP_LIST
+ Sintaxis: LIST patron [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+ Lista todos los canales registrados concordando el patron dado.
+ Canales con la opcion PRIVATE seteada solo seran mostrados
+ a administradores de Servicios. Canales con la opcion NOEXPIRE
+ tendran un ! antepuesto al nombre del canal para
+ administradores de Servicios.
+
+ Si las opciones FORBIDDEN o NOEXPIRE son dadas, solo canales
+ que, respectivamente, tienen FORBID o NOEXPIRE seteado seran
+ mostrados. Si ambas opciones son dadas, ambos tipos de canales
+ seran mostrados. Lo mismo aplica para canales SUSPENDED. Estas
+ opciones estan limitadas a administradores de Servicios.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Sintaxis: GETPASS canal
+
+ Devuelve la clave para el canal dado. Tener en cuenta
+ que cuando este comando es usado, un mensaje incluyendo la
+ persona que ejecuto el comando y el canal en el que fue usado
+ seran monitoreados y enviados como WALLOPS/GLOBOPS.
+
+ Limitado a administradores de Servicios.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Sintaxis: FORBID canal [razon]
+
+ Prohibe a cualquiera de registrar o usar el canal
+ dado. Puede ser cancelado botando el canal.
+
+ Razon puede ser requerida en ciertas redes.
+
+ Limitado a administradores de Servicios.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Sintaxis: SUSPEND canal [razon]
+
+ Impide a cualquier persona de registrar o usar el
+ canal dado. Puede ser cancelado usando el comando UNSUSPEND
+ para preservar los datos/seteos previos.
+
+ Razon puede ser mandatorio en ciertas redes.
+
+ Limitado a administradores de Servicios.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Sintaxis: UNSUSPEND canal
+
+ Libera un canal suspendido. Todos los datos y seteos
+ antes de la suspencion son preservados.
+
+ Limitado a administradores de Servicios.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Sintaxis: STATUS canal nickname
+
+ Devuelve el nivel de acceso actual del nick dado
+ en el canal dado. La respuesta es de la forma:
+
+ STATUS canal nickname nivel-de-acceso
+
+ Si un error ocurre, la respuesta sera de la forma:
+
+ STATUS ERROR mensaje-de-error
+
+ Limitado a administradores de Servicios.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S es una utilidad que permite a usuarios de IRC
+ enviar cortos mensajes a otros usuarios de IRC, esten
+ en linea o no, o a canales(*). Ambos el nickname que
+ envia y el nickname o canal destinatarios deben estar
+ registrados para enviar un memo.
+
+ Los comandos de %S incluyen:
+
+ SEND Envia un memo a un nick o canal
+ CANCEL Cancela el ultimo memo que enviaste
+ LIST Lista tus memos
+ READ Lee uno o mas memos
+ DEL Borra uno o mas memos
+ SET Setea opciones relacionadas a memos
+
+MEMO_HELP_ADMIN
+ SENDALL Envia un memo a todos los usuarios registrados
+
+MEMO_HELP_OPER
+ STAFF Envia un memo a todos los opers/admins
+
+MEMO_HELP_FOOTER
+
+ Tipea /msg %S HELP comando para ayuda de cualquiera
+ de los comandos mencionados.
+
+ (*) Por defecto, cualquier usuario con al menos nivel 10 de
+ de acceso en el canal puede leer los memos del canal. Esto
+ puede ser cambiado con el comando %s LEVELS.
+
+MEMO_HELP_SEND
+ Sintaxis: SEND {nick | canal} texto-del-memo
+
+ Envia un memo al nick o canal dado, conteniendo
+ texto-del-memo. Al enviar a un nickname, el recipiente
+ recibira noticia de que el/ella tiene un nuevo memo. El nick
+ o canal recipientes deben estar registrados.
+
+MEMO_HELP_CANCEL
+ Sintaxis: CANCEL {nick | canal}
+
+ Cancela el ultimo memo que enviaste al nick o canal dado,
+ siempre y cuando no haya sido leido al momento en el que
+ usaste el comando.
+
+MEMO_HELP_LIST
+ Sintaxis: LIST [canal] [lista | NEW]
+
+ Lista los memos que tienes actualmente. Con NEW, lista
+ solo los memos nuevos (no leidos). Memos nuevos estan
+ marcados con un "*" a la izquierda del numero del memo.
+ Tambien puedes especificar una lista de numeros, como en el
+ ejemplo mas abajo:
+
+ LIST 2-5,7-9
+ Lista memos enumerados 2 a 5 y 7 a 9.
+
+MEMO_HELP_READ
+ Sintaxis: READ [canal] {numero | lista | LAST | NEW}
+
+ Te envia el texto de los memos especificados. Si LAST es
+ dado, te envia el ultimo memo recibido. si NEW es dado, te
+ envia todos tus memos nuevos. De otra forma, te envia el
+ memo numero numero. Tambien puedes dar una lista de
+ numeros, como en el ejemplo:
+
+ READ 2-5,7-9
+ Muestra los memos enumerados 2 a 5 y 7 a 9.
+
+MEMO_HELP_DEL
+ Sintaxis: DEL [canal] {numero | lista | LAST | ALL}
+
+ Borra el o los memos especificados. Puedes proveer multiples
+ numeros o rangos de numeros en vez de uno solo, como en el
+ ejemplo mas abajo.
+
+ Si LAST es dado, el ultimo memo sera eliminado.
+ Si ALL es dado, borra todos tus memos.
+
+ Ejemplos:
+
+ DEL 1
+ Borra tu primer memo.
+
+ DEL 2-5,7-9
+ Borra los memos enumerados 2 a 5 y 7 a 9.
+
+MEMO_HELP_SET
+ Sintaxis: SET opcion parametros
+
+ Setea varias opciones de memos. opcion puede ser una de:
+
+ NOTIFY Cambia cuando seras notificado acerca de
+ nuevos memos (solo para nicknames)
+ LIMIT Setea el maximo numero de memos que
+ puedes recibir
+
+ Tipea /msg %S HELP SET opcion para mas informacion
+ acerca de una opcion especifica.
+
+MEMO_HELP_SET_NOTIFY
+ Sintaxis: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Cambia cuando seras notificado acerca de nuevos memos:
+
+ ON Seras notificado de memos cuando te conectes,
+ cuando saques tu /AWAY, y cuando te sean
+ enviados.
+ LOGON Solo seras notificado de memos cuando te conectes
+ o cuando saques tu /AWAY.
+ NEW Solo seras notificado de memos cuando te sean
+ enviados.
+ OFF No recibiras ninguna notificacion por memos.
+
+ ON es escencialmente LOGON y NEW combinados.
+
+MEMO_HELP_SET_LIMIT
+ Sintaxis: SET LIMIT [canal] limite
+
+ Setea el maximo numero de memos que tu (o el canal dado)
+ estas permitido a tener. Si seteas esto a 0, nadie podra
+ enviarte memos. Ademas, no puedes setear el limite mas
+ alto que %d.
+
+MEMO_HELP_INFO
+ Sintaxis: INFO [canal]
+
+ Muestra informacion acerca del numero de memos que tienes,
+ cuantos de ellos aun no han sido leidos, y cuantos memos
+ puedes recibir. Con un parametro, muestra la misma
+ informacion para el canal dado.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Sintaxis: SET LIMIT [usuario | canal] {limite | NONE} [HARD]
+
+ Setea el maximo numero de memos un usuario o canal esta
+ permitido a tener. Setear el limite a 0 previene al usuario
+ de recibir memos; setearlo a NONE permite al usuario
+ a recibir y guardar cuantos memos quiera. Si no das un
+ nickname o canal, tu propio limite es seteado.
+
+ Añadir HARD previene al usuario de cambiar el limite. No
+ añadir HARD tiene el efecto contrario, permitiendo al
+ usuario cambiar el limite (aun si un limite previo fue seteado
+ con HARD).
+
+ El uso del comando SET LIMIT esta limitado a
+ administradores de Servicios. Otros usuarios pueden
+ solo setear limite para ellos mismos o para un canal en
+ el que tengan ciertos privilegios, no pueden remover su
+ limite, no pueden setear el limite mas alla de %d, y no
+ pueden setear un limite hard.
+
+MEMO_SERVADMIN_HELP_INFO
+ Sintaxis: INFO [nick | canal]
+
+ Sin un parametro, muestra informacion acerca del numero
+ de memos que tienes, cuantos de ellos aun no han sido
+ leidos, y el numero total de memos que puedes recibir.
+
+ Con un canal de parametro, muestra la misma informacion
+ para el canal dado.
+
+ Con un nickname de parametro, muestra la misma
+ informacion para el nickname dado. Este uso esta
+ limitado a administradores de Servicios.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Sintaxis: STAFF texto-memo
+
+ Envia a todo el staff de services un memo conteniendo texto-memo.
+ Nota: Si tienes operadores en la lista de opers y en la lista de
+ admins, reciviran el memo dos veces. Lo mismo de aplica para
+ operadores en la lista de Root y en otras listas.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_SENDALL
+ Sintaxis: SENDALL texto-memo
+
+ Envia a todos los usuarios registrados un memo conteniendo texto-memo.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ Comandos para %S:
+ GLOBAL Envia un mensaje a todos los usuarios
+ STATS Muestra estatus de los Servicios y la red
+ OPER LIST Lista todos los operadores de Servicios
+ ADMIN LIST Lista todos los administradores de Servicios
+ STAFF Muestra la lista del staff y su status
+
+OPER_HELP_OPER_CMD
+ Comandos disponibles solo para operadores y administradores
+ de Servicios:
+ MODE Cambia los modos de un canal
+ KICK Kickea un usuario de un canal
+ CLEARMODES Limpia los modos de un canal
+ KILLCLONES Killea todos los usuarios en un host
+ AKILL Manipula la lista AKILL
+ SGLINE Manipula la lista SGLINE
+ SQLINE Manipula la lista SQLINE
+ SZLINE Manipula la lista SZLINE
+
+OPER_HELP_ADMIN_CMD
+ Comandos disponibles solo a administradores de Servicios:
+ OPER Modifica la lista de operadores de Servicios
+ CHANLIST Lista todos los records de canal
+ USERLIST Lista todos los records de usuarios
+ LOGONNEWS Define mensajes para ser mostrados a usuarios
+ al conectarse
+ RANDOMNEWS Define mensajes para ser mostrados al azar a
+ usuarios al conectarse
+ OPERNEWS Define mensajes a ser mostrados a usuarios al
+ transformarse en operadores
+ SESSION Muestra la lista de sesiones de host
+ EXCEPTION Modifica la lista de limite de sesion
+ CACHE Lista cache de hostnames usado por el detector
+ de proxys
+ NOOP Temporalmente remueve todas las lineas O: de
+ un servidor remotamente
+ JUPE "Jupiter" un servidor
+ IGNORE Ignora a un usuario
+ UMODE Otorga cambios de modos de usuario
+ OLINE Otorga privilegios IRCOP temporarios (Unreal ircd)
+ SET Setea varias opciones globales de los Servicios
+ RELOAD Recarga la configuracion de los Servicios
+ UPDATE Fuerza a la base de datos de los Servicios a
+ ser updateada a disco inmediatamente
+ QUIT Termina el programa de Servicios sin salvar
+ RESTART Guarda la base de datos de los Servicios y
+ recarga los Servicios
+ QUIT Termina el programa de servicios sin guardar
+ los cambios
+ SHUTDOWN Termina el programa de Servicios guardando los
+ cambios
+
+ Comandos disponibles al super-usuario de Servicios solamente:
+ ADMIN Modifica la lista de administradores de
+ Servicios
+
+OPER_HELP_ROOT_CMD
+ Commands available to Serivces Roots only:
+ MODLOAD Load a module
+ MODUNLOAD Un-Load a module
+ MODLIST List loaded modules
+ MODINFO Info about a loaded module
+
+OPER_HELP_LOGGED
+ Noticia: todos los comandos enviados a %S son monitoreados!
+
+OPER_HELP_GLOBAL
+ Sintaxis: GLOBAL mensaje
+
+ Permite a los IRCops a enviar mensajes a los usuarios en
+ la red. El mensaje sera enviado desde el nick %s.
+
+OPER_HELP_STATS
+ Sintaxis: STATS [AKILL | ALL | RESET]
+
+ Sin una opcion, muestra el numero actual de usuarios e
+ IRCops en linea (excluyendo a los Servicios), el maximo
+ numero de usuarios desde que los Servicios partieron, y
+ el tiempo que los Servicios han estado corriendo.
+
+ Con la opcion AKILL, muestra el tamaño actual de la
+ lista AKILL y el actual tiempo de expiracion por defecto.
+
+ La opcion ALL esta solo disponible a administradores de
+ Servicios, y muestra informacion en el uso de memoria de
+ los Servicios. Usar esta opcion puede congelar a los
+ Servicios por un corto periodo de tiempo en redes grandes,
+ asi que no lo uses demasiado!
+
+ La opcion RESET resetea la cuenta maxima de usuarios
+ al numero de usuarios actualmente presentes en la red.
+
+ UPTIME puede ser usado como sinonimo para STATS.
+
+OPER_HELP_OPER
+ Sintaxis: OPER ADD nick
+ OPER DEL {nick | numero | lista}
+ OPER LIST [mascara | lista]
+ OPER CLEAR
+
+ Permite a los administradores de Servicios añadir o
+ remover nicknames a la lista de operadores de
+ Servicios. Un usuario con su nickname en la lista de
+ operadores de Servicios y que ha sido identificado
+ con %s podra acceder comandos de operador de
+ Servicios.
+
+ El comando OPER ADD añade el nickname dado a la
+ lista de operadores de Servicios.
+
+ El comando OPER DEL remueve el nickname dado de
+ la lista de operadores de Servicios. Si una lista de
+ instancias es dada, esas instancias son borradas.
+ (Ver el ejemplo para LIST mas abajo.)
+
+ El comando OPER LIST muestra la lista de
+ operadores de Servicios. Si una mascara es dada, solo
+ las instancias que concuerden con la mascara son
+ mostradas. Si una lista de numeros es dada, solo esas
+ instancias son mostradas; por ejemplo:
+
+ OPER LIST 2-5,7-9
+ Lista instancias de operadores de Servicios
+ enumeradas 2 a 5 y 7 a 9.
+
+ El comando OPER CLEAR limpia todas las instancias
+ de la lista de operadores de Servicios.
+
+ Cualquier operador de IRC puede usar la forma
+ OPER LIST del comando. Todos los otros usos
+ limitados a los administradores de Servicios.
+
+OPER_HELP_ADMIN
+ Sintaxis: ADMIN ADD nick
+ ADMIN DEL {nick | numero | lista}
+ ADMIN LIST [mascara | lista]
+ ADMIN CLEAR
+
+ Permite al root de Servicios a añadir o remover nicknames
+ a la lista de administradores de Servicios. Un usuario
+ cuyo nickname esta en la lista de administradores de
+ Servicios y que ha sido identificado con %s podra
+ acceder comandos de administradores de Servicios.
+
+ El comando ADMIN ADD añade el nickname dado a la lista
+ de administradores de Servicios.
+
+ El comando ADMIN DEL remueve el nickname dado de la
+ lista de administradores de Servicios. Si una lista de
+ instancias es dada, esas instancias son borradas.
+ (Ver el ejemplo para LIST mas abajo.)
+
+ El comando ADMIN LIST muestra la lista de
+ administradores de Servicios. Si una mascara es dada, solo
+ las instancias que concuerden con la mascara son mostradas;
+ por ejemplo:
+
+ ADMIN LIST 2-5,7-9
+ Lista instancias en la lista de administradores de
+ Servicios enumeradas 2 a 5 y 7 a 9.
+
+ El comando ADMIN CLEAR limpia todas las instancias de
+ la lista de administradores de Servicios.
+
+ Cualquier operador de IRC puede usar la forma ADMIN LIST
+ del comando. Todos los otros usos estan limitados al
+ root de Servicios.
+
+OPER_HELP_IGNORE
+ Sintaxis: IGNORE {ADD|DEL|LIST} [tiempo] [nick]
+
+ Permite a los administradores de servicios a ignorar a un usuario por
+ cierto tiempo o hasta el proximo reinicio. El formato del tiempo es
+ en segundos y puede ser especificado en unidades. Unidades validas
+ son: s por segundos, m por minutos, h por horas y
+ d por dias. Combinaciones de estas unidades no estan permitidas.
+ Para hacer a los Servicios ignorar a un usuario permanente tipea 0
+ como tiempo.
+
+OPER_HELP_MODE
+ Sintaxis: MODE canal modos
+
+ Permite a los operadores de Servicios setear modos de canal
+ para cualquier canal. Parametros son los mismos que para el
+ comando estandart /MODE.
+
+ Limitado a operadores de Servicios.
+
+OPER_HELP_UMODE
+ Sintaxis: UMODE usuario modos
+
+ Permite a administradores de servicios a setear modos de
+ usuarios para cualquier usuario. Los parametros son los
+ mismos que para el comando /MODE.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_OLINE
+ Sintaxis: OLINE usuario opciones
+
+ Permite a administradores de servicios a dar permisos de
+ operador a cualquier usuario. Las opciones deben estar
+ antepuestas con un "+" o un "-". Para remover todas las
+ opciones simplemente tipear un "-" en vez de cualquier
+ opcion.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_CLEARMODES
+ Sintaxis: CLEARMODES canal [ALL]
+
+ Limpia todos los modos binarios (i,k,l,m,n,p,s,t) y
+ bans del canal. Si ALL es dado, tambien limpia
+ todos los ops y voices (modos +o y +v) del canal.
+
+ Limitado a operadores de Servicios.
+
+OPER_HELP_KICK
+ Sintaxis: KICK canal usuario razon
+
+ Permite a los IRCops a kickear un usuario de cualquier
+ canal. Parametros son los mismos que para el comando
+ /KICK. El mensaje de kick tendra el nickname del IRCop
+ enviando el comando KICK antepuesto; por ejemplo:
+
+ *** SpamMan ha sido kickeado del canal #mi_canal por %S (DrStein (Flood))
+
+ Limitado a operadores de Servicios.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick nuevonick
+
+ Cambia, a la fuerza, el nick del usuario from nick a nuevonick.
+
+ Limitado a Administradores de Servicios
+
+OPER_HELP_AKILL
+ Sintaxis: AKILL ADD [+expiracion] mascara razon
+ AKILL DEL {mascara | numero | lista}
+ AKILL LIST [mascara | lista]
+ AKILL VIEW [mascara | lista]
+ AKILL CLEAR
+
+ Permite a los operadores de Servicios manipular la lista de
+ AKILLS. Si un usuario concordando con una mascara en la
+ lista de AKILLS se intenta conectar, los Servicios enviaran
+ un KILL a ese usuario y, en tipos de servidores soportados,
+ instruira a todos los servidores a añadir un ban (linea K)
+ para la mascara que el usuario concordo con.
+
+ AKILL ADD añade la mascara usuario@host dada a la lista
+ de AKILLS por la razon dada (la que debe ser dada).
+ expiracion es especificada como un entero seguido por uno de
+ d (dias), h (horas), o m (minutos). Combinaciones (como
+ 1h30m) no estan permitidas. Si un especificador de unidades no
+ es incluido, por defecto seran dias (osea +30 por si solo
+ significa 30 dias). Para añadir un AKILL que no expire, usa +0.
+ Si la la mascara a ser añadida comienza con un +, un tiempo
+ de expiracion debe ser dado, aun si es el mismo que el por
+ defecto. El tiempo de expiracion por defecto actual de AKILLS
+ puede ser visto con el comando STATS AKILL.
+
+ El comando AKILL DEL remueve la mascara dada de la lista
+ de AKILLS si esta presente. Si una lista de numeros es dada,
+ esas instancias son borradas. (Ver el ejemplo para LIST
+ mas abajo.)
+
+ El comando AKILL LIST muestra la lista de AKILLS.
+ Si una mascara es dada, solo las instancias concordando
+ con la mascara son mostradas. Si una lista de numeros es
+ dada, solo esas instancias son mostradas; por ejemplo:
+
+ AKILL LIST 2-5,7-9
+ Lista las instancias de AKILL enumeradas 2 a 5 y 7
+ a 9.
+
+ AKILL VIEW es una version mas verbal de AKILL LIST, y
+ mostrara quien añadio un AKILL, la fecha en que fue añadido,
+ y cuando expirara, asi como tambien la mascara usuario@host
+ y la razon.
+
+ AKILL CLEAR limpia todas las instancias de la lista de
+ AKILLS.
+
+ Limitado a Operadores de Servicios.
+
+OPER_HELP_SGLINE
+ Sintaxis: SGLINE ADD [+expiracion] mascara:razon
+ SGLINE DEL {mascara | numero | lista}
+ SGLINE LIST [mascara | lista]
+ SGLINE VIEW [mascara | lista]
+ SGLINE CLEAR
+
+ Permite a los operadores de Servicios a manipular la lista
+ de SGLINES. Si un usuario con un nombre real concordando
+ una mascara SGLINE se intenta conectar, los Servicios le
+ impediran conseguir una sesion de IRC.
+
+ SGLINE ADD añade la mascara de nombre real dada a la
+ lista de SGLINES por la razon dada (la que debe ser
+ dada). expiracion es especificada como un entero
+ seguido de uno de d (dias), h (horas), o m
+ (minutos). Combinaciones (como 1h30m) no estan
+ permitidas. Si la especificacion de la unidad no es
+ incluida, por defecto son dias (osea +30 por si solo
+ significa 30 dias). Para añadir una SGLINE que no expire,
+ usa +0. Si la mascara de nombre real dada empieza con
+ +, el tiempo de expiracion debe ser dado, aun si es
+ el mismo que el por defecto. El tiempo actual de expiracion
+ por defecto para SGLINES puede ser visto con el comando
+ STATS AKILL.
+ Notese: Ya que la mascara de nombre real puede contener
+ espacios, el separador entre esta y la razon es un signo de
+ dos puntos.
+
+ El comando SGLINE DEL remueve la mascara dada de la
+ lista de SGLINES si esta presente. Si una lista de
+ instancias es dada, esas instancias son borradas. (Ver el
+ ejemplo para LIST mas abajo.)
+
+ El comando SGLINE LIST muestra la lista de SGLINES. Si
+ una mascara es dada, solo las instancias concordando con
+ la mascara son mostradas. Si una lista de instancias es
+ dada, solo esas instancias son mostradas; por ejemplo:
+
+ SGLINE LIST 2-5,7-9
+ Lista instancias de SGLINES enumeradas 2 a 5 y 7
+ a 9.
+
+ SGLINE VIEW es una version mas verbal que SGLINE LIST,
+ y mostrara quien añadio la SGLINE, la fecha en la que fue
+ añadida, y cuando expira, ademas de la mascara de nombre real
+ y la razon.
+
+ SGLINE CLEAR limpia todas las instancias de la lista de
+ SGLINES.
+
+ Limitado a operadores de Servicios.
+
+OPER_HELP_SQLINE
+ Sintaxis: SQLINE ADD [+expiracion] mascara razon
+ SQLINE DEL {mascara | numero | lista}
+ SQLINE LIST [mascara | lista]
+ SQLINE VIEW [mascara | lista]
+ SQLINE CLEAR
+
+ Permite a los operadores de Servicios a manipular la lista
+ de SQLINES. Si un usuario con un nick concordando una
+ mascara SQLINE se intenta conectar, los Servicios le
+ impediran conseguir una sesion de IRC.
+
+ Si el primer caracter de la mascara es #, los servicios
+ prevendran el uso de los canales concordantes (en IRCds
+ que lo soporten).
+
+ SQLINE ADD añade la mascara de nombre real dada a la
+ lista de SQLINES por la razon dada (la que debe ser
+ dada). expiracion es especificada como un entero
+ seguido de uno de d (dias), h (horas), o m
+ (minutos). Combinaciones (como 1h30m) no estan
+ permitidas. Si la especificacion de la unidad no es
+ incluida, por defecto son dias (osea +30 por si solo
+ significa 30 dias). Para añadir una SQLINE que no expire,
+ usa +0. Si la mascara de nombre real dada empieza con
+ +, el tiempo de expiracion debe ser dado, aun si es
+ el mismo que el por defecto. El tiempo actual de expiracion
+ por defecto para SQLINES puede ser visto con el comando
+ STATS AKILL.
+
+ El comando SQLINE DEL remueve la mascara dada de la
+ lista de SQLINES si esta presente. Si una lista de
+ instancias es dada, esas instancias son borradas. (Ver el
+ ejemplo para LIST mas abajo.)
+
+ El comando SQLINE LIST muestra la lista de SQLINES. Si
+ una mascara es dada, solo las instancias concordando con
+ la mascara son mostradas. Si una lista de instancias es
+ dada, solo esas instancias son mostradas; por ejemplo:
+
+ SQLINE LIST 2-5,7-9
+ Lista instancias de SQLINES enumeradas 2 a 5 y 7
+ a 9.
+
+ SQLINE VIEW es una version mas verbal que SQLINE LIST,
+ y mostrara quien añadio la SQLINE, la fecha en la que fue
+ añadida, y cuando expira, ademas de la mascara de nombre real
+ y la razon.
+
+ SQLINE CLEAR limpia todas las instancias de la lista de
+ SQLINES.
+
+ Limitado a operadores de Servicios.
+
+OPER_HELP_SZLINE
+ Sintaxis: SZLINE ADD [+expiracion] mascara razon
+ SZLINE DEL {mascara | numero | lista}
+ SZLINE LIST [mascara | lista]
+ SZLINE VIEW [mascara | lista]
+ SZLINE CLEAR
+
+ Permite a los operadores de Servicios manipular la
+ lista de SZLINES. Si un usuario con una IP concordando
+ una mascara en la lista de SZLINES intenta conectarse,
+ los Servicios le impediran obtener una sesion de IRC
+ (y esto es, si la IP tiene un PTR RR o no).
+
+ SZLINE ADD añade la mascara IP dada a la lista de
+ SZLINES por la razon dada (la que debe ser dada).
+ expiracion es especificada como un entero seguido
+ de uno de d (dias), h (horas), or m (minutos).
+ Combinaciones (como 1h30m) no estan permitidas. Si
+ una especificacion de unidad no es incluida, por
+ defecto es dias (osea +30 por si solo significa
+ 30 dias). Para añadir una SZLINE que no expire, usa
+ +0. Si la mascara a ser añadida empieza con un
+ +, el tiempo de expiracion debe ser dado, incluso
+ si es el mismo que el por defecto. El tiempo actual
+ de expiracion por defecto para SZLINES puede ser
+ visto con el comando STATS AKILL.
+
+ El comando SZLINE DEL remueve la mascara dada de la
+ lista de SZLINES si esta presente. Si una lista de
+ instancias es dada, esas instancias son borradas. (Ver
+ el ejemplo para LIST mas abajo.)
+
+ El comando SZLINE LIST muestra la lista de SZLINES.
+ Si una mascara es dada, solo aquellas instancias
+ concordando la mascara son mostradas. Si una lista de
+ instancias es dada, solo esas instancias son mostradas;
+ por ejemplo:
+
+ SZLINE LIST 2-5,7-9
+ Lista instancias SZLINE enumeradas 2 a 5 y 7
+ a 9.
+
+ SZLINE VIEW es una version mas verbal de SZLINE LIST,
+ y mostrara quien añadio una SZLINE, la fecha en la que
+ fue añadida, y cuando expira, ademas de la mascara IP y
+ la razon.
+
+ SZLINE CLEAR limpia todas las instancias de la lista
+ de SZLINES.
+
+ Limitado a operadores de Servicios.
+
+OPER_HELP_SET
+ Sintaxis: SET opcion seteo
+
+ Setea varias opciones globales de Servicios.
+ Nombres de opciones actualmente definidas son:
+ READONLY Setea modo read-only o read-write
+ LOGCHAN Reporta el log a un canal
+ DEBUG Activa o desactiva el modo debug
+ NOEXPIRE Activa o desactiva el modo no expire
+ SUPERADMIN Activa o desactiva el modo SuperAdmin
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_SET_READONLY
+ Sintaxis: SET READONLY {ON | OFF}
+
+ Setea el modo read-only a encencido o apagado. En modo
+ read-only, usuarios normales no podran modificar datos
+ de Servicios, incluyendo acceso a listas de canales y
+ nicknames, etc. IRCops con suficientes privilegios con
+ los Servicios podran modificar la lista AKILL de
+ Servicios y botar o prohibir nicknames y canales, pero
+ ninguno de estos cambios sera salvado a menos que el
+ modo read-only es desactivado antes de que los Servicios
+ sean terminados o recargados.
+
+ Esta opcion es equivalente a la opcion -readonly en
+ la linea de comando.
+
+OPER_HELP_SET_LOGCHAN
+ Sintaxis: SET LOGCHAN {ON | OFF}
+
+ En modo on, los Servicios envian sus logs a un canal especificado
+ y a sus debidos archivos. LogChannel debe estar definido en la
+ configuracion de los Servicios para poder usar esta opcion.
+
+ Nota: Es importante que el canal sea apropriadamente
+ seguro con ingreso a Administradores solamente.
+
+OPER_HELP_SET_DEBUG
+ Sintaxis: SET DEBUG {ON | OFF | numero}
+
+ Setea el modo debug a encendido o apagado. En modo debug,
+ toda la informacion enviada de y hacia los Servicios,
+ ademas de un numero de mensajes son escritos al archivo
+ de log. Si numero es dado, el modo debug es
+ activado, con el nivel de debug setead a numero.
+
+ Esta opcion es equivalente a la opcion -debug en
+ la linea de comando.
+
+OPER_HELP_SET_NOEXPIRE
+ Sintaxis: SET NOEXPIRE {ON | OFF}
+
+ Setea el modo no expire a encendido o apagado. En
+ modo no expire, nicks, canales, akills y excepciones
+ no expiraran hasta que la opcion sea sacada.
+
+ Esta opcion es equivalente a la opcion -noexpire
+ en la linea de comando.
+
+OPER_HELP_SET_SUPERADMIN
+ Sintaxis: SET SUPERADMIN {ON | OFF}
+
+ Este seteo de da privilegios extra como la abilidad de ser
+ "fundador" en todos los canales, etc.
+
+ Esta opcion no es persistente y debe ser usada solo de ser
+ necesario.
+
+
+OPER_HELP_NOOP
+ Sintaxis: NOOP SET servidor
+ NOOP REVOKE servidor
+
+ NOOP SET remueve todas las lineas O: del
+ servidor dado y killea a todos los IRCops actualmente
+ en el para prevenirlos a hacer rehash en el servidor
+ (ya que esto cancelaria el efecto).
+
+ NOOP REVOKE hace las lineas 0: disponibles nuevamente
+ en el servidor dado.
+
+ Notese: El servidor no es checkeado por los
+ Servicios.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_JUPE
+ Sintaxis: JUPE servidor [razon]
+
+ Le dice a los Servicios que hagan jupiter a un servidor
+ -- esto es, crear un "servidor" falso conectado a
+ los Servicios el cual previene al servidor real de
+ conectarse. El jupe puede ser removido usando el
+ estandart SQUIT. Si una razon es dada, es puesta
+ en el campo de informacion sobre el servidor; de otra
+ forma, el campo de informacion sobre el servidor tendra
+ el texto "Juped by <nick>", mostrando el nickname
+ de la persona que jupiterio el servidor.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_RAW
+ Sintaxis: RAW texto
+
+ Envia una linea de texto directamente al servidor al cual
+ los Servicios estan conectados. Este comando tiene un
+ uso muy limitado y puede trastornar a una red si es
+ usado de manera impropia. NO USES ESTE COMANDO a
+ menos que estes absolutamente seguro de lo que estas
+ haciendo!
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_UPDATE
+ Sintaxis: UPDATE
+
+ Causa a los Servicios a updatear todos los archivos de
+ la base de datos tan pronto como envies el comando.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_RELOAD
+ Sintaxis: RELOAD
+
+ Causa a los Servicios a recargar el archivo de
+ configuracion. Notese que algunas directivas aun asi
+ necesitan que los Servicios partan denuevo para tomar
+ efecto (tal como nicknames de los Servicios, activacion
+ de la limitacion de sesiones, etc.)
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_QUIT
+ Sintaxis: QUIT
+
+ Causa a los Servicios a parar inmediatamente; las bases de
+ datos no son salvadas. Este comando no debe ser usado a
+ menos que las copias en la memoria se crean dañadas y no
+ deban ser guardadas. Para parar normalmente, usa el comando
+ SHUTDOWN.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_SHUTDOWN
+ Sintaxis: SHUTDOWN
+
+ Causa a los Servicios a guardar todas las bases de
+ datos y parar.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_RESTART
+ Sintaxis: RESTART
+
+ Causa a los Servicios a guardar todas las bases de
+ datos y luego parar y partir nuevamente.
+ (esto es, terminar el programa e inmediatamente correr
+ el ejecutable nuevamente).
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_KILLCLONES
+ Sintaxis: KILLCLONES nick
+
+ Killea todos los usuarios con el mismo host a nick.
+ Un AKILL temporario, de la forma *@host, es añadido
+ para prevenir al cliente ofensor de reconectarse
+ inmediatamente. Un wallops es tambien enviado indicando
+ quien usi el comando, que host fue afectadi y cuantos
+ usuarios fueron killeados. Este comando es util para
+ remover multiples clones de la red.
+
+ Limitado a operadores de Servicios.
+
+OPER_HELP_CHANLIST
+ Sintaxis: CHANLIST [{patron | nick} [SECRET]]
+
+ Lista todos los canales actualmente en uso en la red IRC,
+ esten registrados o no.
+
+ Si patron es dado, lista solo canales que concuerden con el. Si
+ un nickname es dado, lista solo los canales en los que el usuario
+ este. Si SECRET es especificado, lista solo los canales que
+ concuerden con patron y que tengan modos +s o +p.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_USERLIST
+ Sintaxis: USERLIST [{patron | canal} [INVISIBLE]]
+
+ Lista todos los usuarios actualmente en linea en la red IRC,
+ esten registrados o no.
+
+ Si patron es dado, lista solo a los usuarios que concuerden
+ con el (debe ser en el formato nick!usuario@host). si canal
+ es dado, lista solo usuarios que esten en el canal dado. Si
+ INVISIBLE especificado, solo usuarios con la bandera +i seran
+ listados.
+
+ Limitado a administradores de Servicios.
+
+OPER_HELP_CACHE
+ Sintaxis: CACHE DEL hostname
+ CACHE LIST patron [QUEUED | ALL]
+
+ El comando CACHE DEL borra el host especificado del cache.
+ Esto esta dispuesto solo para propositos de debug.
+
+ El comando CACHE LIST lista todos los proxies encontrados que
+ concuerden con el patron dado. Si la opcion QUEUED es dada,
+ listara los procesos encolados o en progreso en vez, y si la
+ opcion ALL es dada, listara todos los hostnames en cache.
+
+ Limitado a administradores de Servicios.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_MODLOAD
+ Sintaxis: MODLOAD NombreArchivo
+
+ Este comando carga el modulo llamado NombreArchivo del directorio de
+ modulos.
+
+ Limitado a Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Sintaxis: MODUNLOAD NombreArchivo
+
+ Este comando descarga el modulo llamado NombreArchivo del directorio
+ de modulos.
+
+ Limitado a Services Roots.
+
+OPER_HELP_MODINFO
+ Sintaxis: MODINFO NombreArchivo
+
+ Este comando lista informacion sobre el modulo cargado pedido
+
+ Limitado a Services Roots.
+
+OPER_HELP_MODLIST
+ Sintaxis: MODLIST
+
+ Lista todos los modulos actualmente cargados.
+
+ Limitado a Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S te permite crear un bot en tu propio canal.
+ Esto ha sido creado para usuarios que no puedan
+ hostear o configurar un bot, o para uso en redes
+ que no permitan bots de usuarios. Comandos
+ disponibles estan listados mas abajo; para
+ usarlos, tipea /msg %S comando. Para mayor
+ informacion sobre un comando especifico, tipea
+ /msg %S HELP comando.
+
+ BOTLIST Lista bots disponibles
+ ASSIGN Asigna un bot a un canal
+ SET Configura opciones de bots
+ KICK Configura kickers
+ BADWORDS Mantiene lista de bad words
+
+ Otros comandos: ACT INFO SAY UNASSIGN
+
+ El bot entrara a un canal cuando quiera que hayan
+ %d usuario(s) en el.
+
+BOT_HELP_BOTLIST
+ Sintaxis: BOTLIST
+
+ Lista todos los bots disponibles en esta red.
+
+BOT_HELP_ASSIGN
+ Sintaxis: ASSIGN canal nick
+
+ Assigna un bot denominado por nick al canal canal.
+ Luego de esto puedes configurar al bot para acomodarlo
+ a tus necesidades.
+
+BOT_HELP_UNASSIGN
+ Sintaxis: UNASSIGN canal
+
+ Deasigna a un bot de un canal. Al usar este comando
+ el bot ya no entrara al canal. Aun asi, la configuracion
+ del bot para el canal es guardada, asi te sera posible
+ reasignar un bot luego sin tener que configurarlo
+ completamente.
+
+BOT_HELP_INFO
+ Sintaxis: INFO {canal | nick}
+
+ Permite ver la informacion de %S acerca de un canal o
+ bot. Si el parametro es un canal, recibiras informacion
+ tal como kickers activados. Si el parametro es un nick,
+ recibiras informacion acerca de un bot, tal como tiempo
+ de creacion o numero de canales en los que este.
+
+BOT_HELP_SET
+ Sintaxis: SET canal opcion parametros
+
+ Configura opciones de bot. opcion puede ser uno de:
+
+ DONTKICKOPS Para proteger ops contra kicks de bots
+ DONTKICKVOICES Para proteger voices contra kicks de bots
+ GREET Abilita mensajes de bienvenida
+ FANTASY Abilita comandos de fantasia
+ SYMBIOSIS Permite al bot a actuar como un bot real
+
+ Tipea /msg %S HELP SET opcion para mayor informacion
+ sobre una opcion especifica.
+
+ Notese: el acceso a este comando esta controlado por
+ el nivel SET.
+
+BOT_HELP_SET_DONTKICKOPS
+ Sintaxis: SET canal DONTKICKOPS {ON|OFF}
+
+ Habilita o deshabilita el modo de proteccion de ops
+ en un canal. Al abilitarlo, ops no seran
+ kickeados por el bot, incluso si no concuerdan con
+ el nivel NOKICK.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Sintaxis: SET canal DONTKICKVOICES {ON|OFF}
+
+ Habilita o deshabilita el modo de proteccion de voices
+ en un canal. Al abilitarlo, voices no seran
+ kickeados por el bot, incluso si no concuerdan con
+ el nivel NOKICK.
+
+BOT_HELP_SET_FANTASY
+ Sintaxis: SET canal FANTASY {ON|OFF}
+
+ Habilita o deshabilita el modo de fantasia
+ en un canal. Al abilitarlo, los usuarios podran
+ usar los comandos !op, !deop, !voice, !devoice,
+ !kick, !kb, !unban, !seen en un canal (averigua
+ como usarlos; intenta con o sin nick para cada
+ uno, y con razon para algunos?).
+
+ Notese que usuarios que quieran usar comandos
+ de fantasia DEBEN tener el nivel necesario
+ para ambos el nivel FANTASIA y otro dependiendo
+ del comando si es requerido (por ejemplo, para
+ usar !op, el usuario debe tener suficiente
+ acceso para el nivel OPDEOP).
+
+BOT_HELP_SET_GREET
+ Sintaxis: SET canal GREET {ON|OFF}
+
+ Habilita o deshabilita el modo de asludo en
+ un canal. Al abilitarlo, el bot mostrara los
+ mensajes de los usuarios entrando al canal,
+ siempre y cuando tengan el suficiente acceso
+ al canal.
+
+BOT_HELP_SET_SYMBIOSIS
+ Sintaxis: SET canal SYMBIOSIS {ON|OFF}
+
+ Habilita o deshabilita el modo simbiosis en
+ un canal. Al abilitarlo, el bot hara cualquier
+ cosa que normalmente habria hecho %s en los
+ canales, tal como MODOS, KICKS e incluso los
+ mensajes de entrada.
+
+BOT_HELP_KICK
+ Sintaxis: KICK canal opcion parametros
+
+ Configura los kickers de bot. opcion puede ser una de:
+
+ BOLDS Setea si el bot kickea negritas
+ BADWORDS Setea si el bot kickea bad words
+ CAPS Setea si el bot kickea mayusculas
+ COLORS Setea si el bot kickea colores
+ FLOOD Setea si el bot kickea usuarios
+ que floodean
+ REPEAT Setea si el bot kickea usuarios
+ que repiten
+ REVERSES Setea si el bot kickea reversos
+ UNDERLINES Setea si el bot kickea subrayados
+
+ Tipea /msg %S HELP KICK opcion para mayor
+ informacion sobre una opcion especifica.
+
+ Notese: acceso a este comando es controlado por el
+ nivel SET.
+
+BOT_HELP_KICK_BOLDS
+ Sintaxis: KICK canal BOLDS {ON|OFF} [ttb]
+
+ Setea el kick por negritas a encendido o apagado.
+ Al abilitarlo, esta opcion le dice al bot que kickee
+ usuarios que usen negritas.
+
+ ttb es el numero de veces que un usuario sera kickeado
+ antes de ser baneado. No des ttb para desabilitar
+ el sistema de ban una vez activado.
+
+BOT_HELP_KICK_COLORS
+ Sintaxis: KICK canal COLORS {ON|OFF} [ttb]
+
+ Setea el kick por colores a encendido o apagado.
+ Al habilitarlo, esta opcion le dice al bot que kickee
+ usuarios que usen colores.
+
+ ttb es el numero de veces que un usuario sera kickeado
+ antes de ser baneado. No des ttb para desabilitar
+ el sistema de ban una vez activado.
+
+BOT_HELP_KICK_REVERSES
+ Sintaxis: KICK canal REVERSES {ON|OFF} [ttb]
+
+ Setea el kick por reversos a encendido o apagado.
+ Al habilitarlo, esta opcion le dice al bot que kickee
+ usuarios que usen reversos.
+
+ ttb es el numero de veces que un usuario sera kickeado
+ antes de ser baneado. No des ttb para desabilitar
+ el sistema de ban una vez activado.
+
+BOT_HELP_KICK_UNDERLINES
+ Sintaxis: KICK canal UNDERLINES {ON|OFF} [ttb]
+
+ Setea el kick por subrayados a encendido o apagado.
+ Al habilitarlo, esta opcion le dice al bot que kickee
+ usuarios que usen subrayados.
+
+ ttb es el numero de veces que un usuario sera kickeado
+ antes de ser baneado. No des ttb para desabilitar
+ el sistema de ban una vez activado.
+
+BOT_HELP_KICK_CAPS
+ Sintaxis: KICK canal CAPS {ON|OFF} [ttb [min [porcentaje]]]
+
+ Setea el kick por mayusculas a encendido o apagado.
+ Al habilitarlo, esta opcion le dice al bot que kickee
+ usuarios que esten hablando en mayusculas.
+
+ El bot kickea solo si hay al menos min mayusculas
+ y que constituyan al menos porcentaje%% del total
+ del texto (si no es dado, por defecto es seteado a 10
+ caracteres y 25%%).
+
+ ttb es el numero de veces que un usuario sera kickeado
+ antes de ser baneado. No des ttb para desabilitar
+ el sistema de ban una vez activado.
+
+BOT_HELP_KICK_FLOOD
+ Sintaxis: KICK canal FLOOD {ON|OFF} [ttb [ln [segs]]]
+
+ Setea el kick por flood a encendido o apagado.
+ Al habilitarlo, esta opcion le dice al bot que kickee
+ usuarios que esten floodeando el canal usando al menos
+ ln lineas en segs segundos (si no es dado, por
+ defecto es seteado a 6 lineas en 10 segundos).
+
+ ttb es el numero de veces que un usuario sera kickeado
+ antes de ser baneado. No des ttb para desabilitar
+ el sistema de ban una vez activado.
+
+BOT_HELP_KICK_REPEAT
+ Sintaxis: KICK #canal REPEAT {ON|OFF} [ttb [num]]
+
+ Setea el the kick por repeticion a encendido o apagado.
+ Al habilitarlo, esta opcion le dice al bot que kickee
+ usuarios que esten repitiendo num veces (si num no
+ es dado, por defecto es seteado a 3).
+
+ ttb es el numero de veces que un usuario sera kickeado
+ antes de ser baneado. No des ttb para desabilitar
+ el sistema de ban una vez activado.
+
+BOT_HELP_KICK_BADWORDS
+ Sintaxis: KICK #canal BADWORDS {ON|OFF} [ttb]
+
+ Setea el kick por bad words a encendido o apagado.
+ Al habilitarlo, esta opcion le dice al bot que kickee
+ usuarios que digan ciertas palabras en el canal.
+
+ Puedes definir bad words para tu canal usando el comando
+ BADWORDS. Tipea /msg %S HELP BADWORDS para mayor
+ informacion.
+
+ ttb es el numero de veces que un usuario sera kickeado
+ antes de ser baneado. No des ttb para desabilitar
+ el sistema de ban una vez activado.
+
+BOT_HELP_BADWORDS
+ Sintaxis: BADWORDS canal ADD palabra [SINGLE | START | END]
+ BADWORDS canal DEL {palabra | numero | lista}
+ BADWORDS canal LIST [mascara | lista]
+ BADWORDS canal CLEAR
+
+ Mantiene la lista de bad words para un canal. La lista
+ de bad words determina cuales palabtas deben ser kickeadas
+ cuando el kick por bad words esta habilitado. Para mayor
+ informacion, tipea /msg %S HELP KICK BADWORDS.
+
+ El comando BADWORDS ADD añade una palabra a la lista
+ de bad words. Si SINGLE es especificado, el kick sera
+ hecho solo si el usuario dice la palabra completa. Si
+ START es especificado, el kick sera hecho solo si el
+ usuario dice una palabra que comience con palabra.
+ Si END es especificado, el kick sera hecho solo si el
+ usuario dice una palabra que termine con palabra. Si
+ no especificas nada, un kick sera hecho cada vez que
+ palabra sea dicha por un usuario.
+
+ El comando BADWORDS DEL remueve la palabra dada de la
+ lista de bad words. Si una lista de numeros es dada, esas
+ instancias son borradas. (ver el ejemplo para LIST mas
+ abajo).
+
+ El comando BADWORDS LIST muestra la lista de bad
+ words. Si una mascara es dada, solo las instancias
+ concordando con la mascara son mostradas. Si una lista
+ de numeros es dada, solo esas instancias son mostradas;
+ por ejemplo:
+
+ BADWORDS #canal LIST 2-5,7-9
+ Lista bad words enumeradas 2 a 5 y 7 a 9.
+
+ El comando BADWORDS CLEAR limpia todas las instancias
+ de la lista de bad words.
+
+BOT_HELP_SAY
+ Sintaxis: SAY canal texto
+
+ Hace al bot decir el texto dado en el canal dado.
+
+BOT_HELP_ACT
+ Sintaxis: ACT canal texto
+
+ Hace al bot hacer el equivalente del comando "/me"
+ en el canal dado usando el texto dado.
+
+BOT_SERVADMIN_HELP
+
+ El siguiente comando esta disponible a administradores
+ de Servicios:
+
+ BOT Mantiene la lista de bots de la red
+
+BOT_SERVADMIN_HELP_BOT
+ Sintaxis: BOT ADD nick usuario host real
+ BOT CHANGE nick-ant nick-nue [usuario [host [real]]]
+ BOT DEL nick
+ BOT LIST
+
+ Permite a los administradores de Servicios crear, modificar
+ y borrar bots que usuarios podran usar en sus propios
+ canales.
+
+ BOT ADD añade un bot con el nickname, usuario, host
+ y nombre real dados. Ya que no se hacen chequeos de
+ integridad para estos seteos, ten mucho cuidado.
+ BOT CHANGE permite cambiar el nickname, usuario, host
+ o nombre real de un bot sin tener que borrarlo (y la
+ informacion asociada a el).
+ BOT DEL remueve el bot dado de la lista de bots.
+ BOT LIST es un alias de BOTLIST y solo lista
+ todos los bots disponibles en la red.
+
+ Notese: si creas un bot con un nick ya registrado,
+ sera botado. Ademas, si un usuario esta actualmente
+ usando el nick, sera killeado.
+
+BOT_SERVADMIN_HELP_SET
+
+ Estas opciones estan reservadas a administradores de
+ Servicios:
+
+ NOBOT Previene a un bot de ser asignado
+ a un canal
+ PRIVATE Previene a un bot de ser asignado
+ por alguien mas que un operador
+ de IRC
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Sintaxis: SET canal NOBOT {ON|OFF}
+
+ Esta opcion hace al canal no asignable. Si un
+ bot ya esta asignado al canal, es desasignado
+ automaticamente cuando abilitas esta opcion.
+
+ Limitado a administradores de Servicios.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Sintaxis: SET nick-del-bot PRIVATE {ON|OFF}
+
+ Esta opcion previene un bot de ser asignado
+ a un canal por usuarios que no son operadores
+ de IRC.
+
+ Limitado a administradores de Servicios.
+HOST_EMPTY
+ La lista vhost esta vacia.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ vhost para %s seteado a %s.
+HOST_IDENT_SET
+ vhost para %s seteado a %s@%s.
+HOST_SETALL
+ vhost para el grupo %s seteado a %s.
+HOST_DELALL
+ El vhost para el group %s ha sido removido.
+HOST_DELALL_SYNTAX
+ Sintaxis: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost para el grupo %s seteado a %s@%s.
+HOST_SET_ERROR
+ Error! Un vhost solo puede contener A-Z, a-z, 0-9, '.' y '-'.
+HOST_SET_IDENT_ERROR
+ Un vhost ident debe tener el formato de un ident valido
+HOST_SET_TOOLONG
+ Error! El vhost es muy largo. Usa un host con menos de %d caracteres.
+HOST_SET_IDENTTOOLONG
+ Error! El Ident es muy largo. Usa un ident con menos de %d caracteres.
+HOST_NOREG
+ Usuario %s no encontrado en la base de datos de nickserv.
+HOST_SET_SYNTAX
+ Sintaxis /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Sintaxis /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Acceso Denegado.
+HOST_NOT_ASSIGNED
+ Por favor contactar a un Operador para que asigne un vhost a este nick.
+HOST_ACTIVATED
+ Tu vhost %s ha sido activado.
+HOST_IDENT_ACTIVATED
+ Tu vhost %s@%s ha sido activado.
+HOST_ID
+ Por favor identificate con los servicios primero.
+HOST_NOT_REGED
+ Necesitas registrarte antes de que un vhost sea asignado a ti.
+HOST_DEL
+ vhost para %s removido.
+HOST_DEL_SYNTAX
+ Sintaxis: /msg %s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Tu vhost ha sido removido. Para habilitar nuevamente el enmascaramiento de hosts tipea /mode %s +x.
+HOST_NO_VIDENT
+ Tu IRCD no soporta vIdent's. Si esto es incorrecto, por favor reportalo como un posible bug.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_GROUP
+ Todos los vhosts en el grupo %s han sido seteados a %s
+HOST_IDENT_GROUP
+ Todos los vhosts en el grupo %s han sido seteados a %s@%s
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_LIST_FOOTER
+ Todos los registros mostrados (Cuenta: %d)
+HOST_LIST_RANGE_FOOTER
+ Todos los registros mostrados de %d a %d
+HOST_LIST_KEY_FOOTER
+ Todos los registro mostrados que coinciden con la clave %s (Cuenta: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ Comandos para %S:
+ ON Activa tu vhost asignado.
+ OFF Desactiva tu vhost asignado.
+ GROUP Sincroniza vhost en todos los nicks del grupo.
+
+HOST_OPER_HELP
+ Comandos disponibles solo para operadores de servicios:
+ SET Setea el vhost de otro usuario.
+ SETALL Setea el vhost de todos los nicks en un grupo.
+ DEL Borra el vhost de otro usuario.
+ DELALL Borra el vhost de todos los nicks en un grupo.
+
+HOST_ADMIN_HELP
+ Comandos disponibles solo para administradores de servicios:
+ LIST Muestra uno o mas vhosts.
+
+HOST_HELP_ON
+ Sintaxis: ON
+
+ Activa el vhost actualmente asignado al nick en uso.
+ Cuando uses este comando cualquier usuario que haga un /whois
+ a ti vera el vhost asignado en vez de tu IP real.
+
+HOST_HELP_SET
+ Sintaxis: SET <nick> <host>.
+
+ Setea el vhost para el nick dado al host dado. Si
+ tu IRCD soporta vIdents, al usar SET <nick> <ident>@<host>
+ setea idents para usuarios ademas de vhosts.
+
+ Limitado a operadores de Servicios.
+
+HOST_HELP_DELALL
+ Sintaxis: DELALL <nick>.
+
+ Elimina el vhost para todos los nicks en el mismo grupo que el
+ nick dado.
+
+ Limitado a Host Removers.
+
+
+HOST_HELP_SETALL
+ Sintaxis: SETALL <nick> <host>.
+
+ Setea el vhost para todos los nicks en el mismo grupo que
+ el nick dado. Si tu IRCD soporta vIdents, al usar
+ SETALL <nick> <ident>@<host> setea idents para usuarios
+ ademas de vhosts.
+
+ * NOTA: Esto no actualizara el vhost para ningun nick
+ agregado al grupo despues que este comando haya sido usado.
+
+ Limitado a Operadores de Servicios.
+
+HOST_HELP_OFF
+ Sintaxis: OFF
+
+ Desactiva el vhost actualmente asignado al nick en uso.
+ Cuando uses este comando cualquier usuario que haga un /whois
+ a ti vera tu IP real.
+
+HOST_HELP_DEL
+ Sintaxis: DEL <nick>
+
+ Borra el vhost asignado al nick dado de la base de datos.
+
+ Limitado a Operadores de Servicios.
+
+HOST_HELP_LIST
+ Sintaxis: LIST [<clave>|<#X-Y>]
+
+ Este comando lista los vhosts registrados a el operador
+ si una Clave es dada, solo las entradas en las que el nick
+ o el vhost coincidan con el patron dado en <clave> seran mostradas
+ ej. DrStein* para todas las entradas que comiencen con "DrStein"
+
+ Si un #X-Y estilo es usado, solo las entradas en el rango entre X
+ e Y seran mostradas, ej. #1-3 va a mostrar las primeras 3 entradas
+ de nicks/vhosts.
+
+ La lista usa el valor de NSListMax como un limite maximo de numeros
+ de items a mostrar al operador 1 vez.
+
+ Limitado a Operadores de Servicios.
+
+HOST_HELP_GROUP
+ Sintaxis: GROUP
+
+ Este comando permite a usuarios a setear el vhost de su
+ nick actual para ser el vhost para todos los nicks en el
+ mismo grupo.
diff --git a/lang/fixlang.pl b/lang/fixlang.pl
new file mode 100755
index 000000000..bd0f175bf
--- /dev/null
+++ b/lang/fixlang.pl
@@ -0,0 +1,118 @@
+#!/usr/bin/perl
+#
+# Tries to fix a language file using the reference
+# language (en_us), and injecting all new strings
+# (in english) into the newly generated fixed.pl
+#
+# check the result with obs.pl then copy on top
+# of the source language file.
+#
+my $srcfile = $ARGV[0];
+my $dstfile = "fixed.l";
+my $engfile = "en_us.l";
+my %is_there= ();
+my $pos=0;
+my $wc=0;
+
+my @defs;
+my @efile;
+
+sub error {
+
+ my $msg = shift ;
+ print "*** Error: $msg \n";
+ exit ;
+}
+
+sub not_del {
+ $line = shift;
+ if ($is_there{$line}) {
+ return 1;
+ } else {
+ return 0;
+ }
+
+}
+
+# Could not think of a worse of doing this...
+sub new_def {
+ my $ndef;
+ my $start=0;
+
+ $def = shift;
+ for (@efile) {
+ my $line = $_;
+ chomp $line;
+
+ if (/^[A-Z]/) {
+ $start=0;
+ }
+
+ if ($start) {
+ $ndef.=$_;
+ }
+
+ if ($line eq $def) {
+ $ndef=$_;
+ $start=1;
+ }
+
+ }
+ return $ndef;
+}
+
+error("Usage $0 [lang.l]") unless ($srcfile);
+error("Can't find language file: $srcfile") if (! -f $srcfile);
+error("Can't find language file: $engfile") if (! -f $engfile);
+
+open (EFILE, "< $engfile");
+while (<EFILE>) {
+ my $line = $_;
+ push(@efile, $line);
+ chomp $line;
+ if (/^[A-Z]/) {
+ $wc = push (@defs, $line);
+ }
+}
+close(EFILE);
+
+# Need to load entiry text into hash...
+for (@defs) {
+ $is_there{$_} = 1;
+}
+
+open (SFILE, "< $srcfile");
+open (DFILE, "> $dstfile");
+while (<SFILE>) {
+ my $line = $_;
+ chomp $line;
+ if (/^[A-Z]/) {
+
+ $del = 0;
+ if (not_del($line)) {
+ while ($line ne $defs[$pos]) {
+ print "ADD: $defs[$pos]\n";
+ # Need to reference the hash...
+ my $ndef = new_def($defs[$pos]);
+ print DFILE $ndef;
+ $pos++;
+ }
+ $pos++;
+ } else {
+ $del = 1;
+ print "DEL: $line\n";
+ }
+ }
+
+ if (! $del) {
+ print DFILE "$line\n";
+ }
+}
+
+for($pos ; $pos < $wc; $pos++) {
+ print "ADD: $defs[$pos]\n";
+ my $ndef = new_def($defs[$pos]);
+ print DFILE $ndef;
+}
+close(SFILE);
+close(DFILE);
diff --git a/lang/fr.l b/lang/fr.l
new file mode 100644
index 000000000..fd4f9b0b5
--- /dev/null
+++ b/lang/fr.l
@@ -0,0 +1,6204 @@
+# French language file.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# Updated by Kevin@epiknet.org (03/15/2003)
+# www.epiknet.org - www.botstats.com
+#
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ Français (French)
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %d %b %Y %H:%M:%S %Z
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %d %b %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %d %b %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Dim
+ Lun
+ Mar
+ Mer
+ Jeu
+ Ven
+ Sam
+# %A
+STRFTIME_DAYS_LONG
+ Dimanche
+ Lundi
+ Mardi
+ Mercredi
+ Jeudi
+ Vendredi
+ Samedi
+# %b
+STRFTIME_MONTHS_SHORT
+ Jan
+ Fév
+ Mar
+ Avr
+ Mai
+ Jun
+ Jul
+ Aoû
+ Sep
+ Oct
+ Nov
+ Déc
+# %B
+STRFTIME_MONTHS_LONG
+ Janvier
+ Février
+ Mars
+ Avril
+ Mai
+ Juin
+ Juillet
+ Août
+ Septembre
+ Octobre
+ Novembre
+ Décembre
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Erreur interne - impossible d'effectuer la commande.
+UNKNOWN_COMMAND
+ Commande %s inconnue.
+UNKNOWN_COMMAND_HELP
+ Commande %s inconnue. Tapez "/msg %s HELP" pour obtenir de l'aide.
+SYNTAX_ERROR
+ Syntaxe: %s
+MORE_INFO
+ Tapez /msg %s HELP %s pour plus d'informations.
+NO_HELP_AVAILABLE
+ Aucune aide disponible sur %s.
+OBSOLETE_COMMAND
+ Cette commande est dépassée; utilisez %s à la place.
+
+BAD_USERHOST_MASK
+ Le masque doit avoir le format user@host.
+BAD_EXPIRY_TIME
+ Echéance invalide.
+USERHOST_MASK_TOO_WIDE
+ La couverture de %s est trop grande; utilisez un masque + précis.
+
+SERVICE_OFFLINE
+ %s n'est pas connecté actuellement.
+READ_ONLY_MODE
+ Note: les Services sont en mode lecture-seule; les changements ne seront pas sauvegardés!
+PASSWORD_INCORRECT
+ Mot de passe incorrect.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Accès refusé.
+PERMISSION_DENIED
+ Permission refusée.
+RAW_DISABLED
+ The RAW option has been disabled. If you must use it, enable the DisableRaw directive in Services configuration.
+
+MORE_OBSCURE_PASSWORD
+ Veuillez réessayer avec un mot de passe plus difficile à trouver. Les mots de passe doivent contenir au moins cinq caractères, ne doivent pas être trop facilement devinables (par exemple votre vrai nom ou votre nick), et ne doit pas contenir d'espaces ou de tabulations.
+PASSWORD_TRUNCATED
+ Note: Votre mot de passe a été tronqué à %d caractères.
+
+NICK_NOT_REGISTERED
+ Votre nick n'est pas enregistré.
+NICK_NOT_REGISTERED_HELP
+ Votre nick n'est pas enregistré. Tapez /msg %s HELP pour des informations sur l'enregistrement des nicks.
+NICK_X_NOT_REGISTERED
+ Le nick %s n'est pas enregistré.
+NICK_X_IN_USE
+ Nick %s is currently in use.
+NICK_X_NOT_IN_USE
+ Le nick %s n'est actuellement pas utilisé.
+NICK_X_NOT_ON_CHAN
+ %s n'est pas sur %s actuellement.
+NICK_X_FORBIDDEN
+ Le nick %s ne peut être enregistré ou utilisé.
+NICK_X_FORBIDDEN_OPER
+ Le nick %s a été interdit par %s:
+ %s
+NICK_X_ILLEGAL
+ Nick %s is an illegal nickname and cannot be used.
+NICK_X_TRUNCATED
+ Nick %s was truncated to %d characters.
+CHAN_X_NOT_REGISTERED
+ Le channel %s n'est pas enregistré.
+CHAN_X_NOT_IN_USE
+ Le channel %s n'existe pas.
+CHAN_X_FORBIDDEN
+ Le channel %s ne peut être enregistré ou utilisé.
+CHAN_X_FORBIDDEN_OPER
+ Le channel %s a été interdit par %s:
+ %s
+CHAN_X_SUSPENDED
+ Suspended: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ L'authentification par mot de passe est requise pour cette commande.
+ Réessayez après avoir tapé /msg %s IDENTIFY motdepasse.
+CHAN_IDENTIFY_REQUIRED
+ L'authentification par mot de passe est requise pour cette commande.
+ Réessayez après avoir tapé /msg %s IDENTIFY %s motdepasse.
+
+MAIL_DISABLED
+ Les services ont été configurés pour ne pas envoyer de mail.
+MAIL_INVALID
+ L'adresse e-mail de %s est invalide.
+MAIL_X_INVALID
+ %s n'est pas une adresse e-mail valide.
+MAIL_LATER
+ Impossible d'envoyer un e-mail maintenant; réessayez un peu
+ plus tard.
+MAIL_DELAYED
+ Attendez %d secondes et réessayez.
+
+NO_REASON
+ Aucune raison
+UNKNOWN
+ <inconnu>
+
+DURATION_DAY
+ 1 jour
+DURATION_DAYS
+ %d jours
+DURATION_HOUR
+ 1 heure
+DURATION_HOURS
+ %d heures
+DURATION_MINUTE
+ 1 minute
+DURATION_MINUTES
+ %d minutes
+DURATION_SECOND
+ 1 seconde
+DURATION_SECONDS
+ %d secondes
+
+# Human readable expiration
+NO_EXPIRE
+ n'expire pas
+EXPIRES_SOON
+ expire à la prochaine mise à jour de la base de données
+EXPIRES_M
+ expire dans %d minutes
+EXPIRES_1M
+ expire dans %d minute
+EXPIRES_HM
+ expire dans %d heures, %d minutes
+EXPIRES_H1M
+ expire dans %d heures, %d minute
+EXPIRES_1HM
+ expire dans %d heure, %d minutes
+EXPIRES_1H1M
+ expire dans %d heure, %d minute
+EXPIRES_D
+ expire dans %d jours
+EXPIRES_1D
+ expire dans %d jour
+
+# Generic Footer message
+END_OF_ANY_LIST
+ End of %s list.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Ce nick appartient à quelqu'un d'autre. Veuillez en changer.
+ (Si c'est votre nick, tapez /msg %s IDENTIFY motdepasse.)
+NICK_IS_SECURE
+ Ce nick est enregistré et protégé. Si c'est votre nick,
+ tapez /msg %s IDENTIFY motdepasse.
+ Sinon, veuillez choisir un nick différent.
+NICK_MAY_NOT_BE_USED
+ Ce nick ne peut être utilisé. Veuillez en choisir un autre.
+FORCENICKCHANGE_IN_1_MINUTE
+ Si vous ne changez pas d'ici 1 minute, je changerai votre nick.
+FORCENICKCHANGE_IN_20_SECONDS
+ Si vous ne changez pas d'ici 20 secondes, je changerai votre nick.
+FORCENICKCHANGE_NOW
+ Ce nick a été enregistré; vous ne pouvez pas l'utiliser.
+FORCENICKCHANGE_CHANGING
+ Votre nick est maintenant changé en %s.
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER motdepasse [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER motdepasse email
+NICK_REGISTRATION_DISABLED
+ Désolés, l'enregistrement de nicks est temporairement désactivé.
+NICK_REGISTRATION_FAILED
+ Désolés, l'enregistrement a échoué.
+NICK_REG_PLEASE_WAIT
+ Veuillez attendre %d secondes avant d'utiliser la commande REGISTER à nouveau.
+NICK_CANNOT_BE_REGISTERED
+ Le nick %s ne peut être enregistré.
+NICK_ALREADY_REGISTERED
+ Le nick %s est déjà enregistré!
+NICK_REGISTERED
+ Le nick %s est maintenant enregistré sous votre masque: %s
+NICK_PASSWORD_IS
+ Votre mot de passe est %s - notez le pour une utilisation ultérieure.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP cible motdepasse
+NICK_GROUP_DISABLED
+ Désolés, le groupage de nick est temporairement désactivé.
+NICK_GROUP_FAILED
+ Désolés, le groupage de nick a échoué.
+NICK_GROUP_PLEASE_WAIT
+ Attendez %d secondes avant d'utiliser la commande GROUP à nouveau.
+NICK_GROUP_CHANGE_DISABLED
+ Votre nick est déjà enregistré; tapez /msg %s DROP d'abord.
+NICK_GROUP_SAME
+ Vous êtes déjà un membre du groupe de %s.
+NICK_GROUP_TOO_MANY
+ Il y a trop de nicks dans le groupe de %s; listez-les et
+ effacez-en quelques uns.
+ Tapez /msg %s HELP GLIST et /msg %s HELP DROP pour
+ plus d'informations.
+NICK_GROUP_JOINED
+ Vous êtes maintenant dans le groupe de %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY motdepasse
+NICK_IDENTIFY_FAILED
+ Désolés, l'identification a échoué.
+NICK_IDENTIFY_SUCCEEDED
+ Mot de passe accepté - vous êtes maintenant identifié.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Vous devez maintenant associer un e-mail à votre nick.
+ Cet e-mail vous permettra de retrouver votre mot de passe
+ au cas où vous le perdriez.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Tapez /msg %S SET EMAIL e-mail pour définir votre e-mail.
+ Votre vie privée est respectée; cet e-mail ne sera pas
+ divulgué à des tierces personnes.
+
+# LOGOUT responses
+NICK_ALREADY_IDENTIFIED
+ You are already identified.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status updated (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Votre nick n'est plus identifié.
+NICK_LOGOUT_X_SUCCEEDED
+ Le nick %s n'est plus identifié.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ Can't logout %s because he's a services administrator.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Désolés, l'effacement de nick est temporairement désactivé.
+NICK_DROPPED
+ Votre nick a été effacé.
+NICK_X_DROPPED
+ Le nick %s a été effacé.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET option paramètres
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] option paramètres
+NICK_SET_DISABLED
+ Désolés, la configuration des options du nick est temporairement désactivée.
+NICK_SET_UNKNOWN_OPTION
+ L'option SET %s est inconnue.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ L'option SET %s est inconnue, ou le nick n'est pas enregistré.
+NICK_SET_OPTION_DISABLED
+ L'option %s ne peut être changée sur ce réseau.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ Le nouvel affichage DOIT être un nick de votre groupe de nicks!
+NICK_SET_DISPLAY_CHANGED
+ Le nouvel affichage est maintenant %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Impossible de changer votre mot de passe.
+NICK_SET_PASSWORD_CHANGED
+ Votre mot de passe a été changé.
+NICK_SET_PASSWORD_CHANGED_TO
+ Votre mot de passe est maintenant %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE nombre
+NICK_SET_LANGUAGE_UNKNOWN
+ Numéro de langue %d inconnu. Tapez /msg %s HELP SET LANGUAGE pour une liste de langues.
+NICK_SET_LANGUAGE_CHANGED
+ Votre langue est maintenant le Français.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ L'adresse de votre site est maintenant %s.
+NICK_SET_URL_UNSET
+ L'adresse de votre site a été effacée.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ Votre adresse e-mail est maintenant %s.
+NICK_SET_EMAIL_UNSET
+ Votre adresse e-mail a été effacée.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ Vous ne pouvez pas effacer votre e-mail sur ce réseau.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ Votre numéro ICQ est maintenant %s.
+NICK_SET_ICQ_UNSET
+ Votre numéro ICQ a été effacé.
+NICK_SET_ICQ_INVALID
+ %s n'est pas un nombre valide.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Votre message d'accueil est maintenant %s.
+NICK_SET_GREET_UNSET
+ Votre message d'accueil a été effacé.
+
+# SET KILL responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ La protection est maintenant activée.
+NICK_SET_KILL_QUICK
+ La protection est maintenant activée, avec un délai réduit.
+NICK_SET_KILL_IMMED
+ La protection est maintenant activée, sans délai.
+NICK_SET_KILL_IMMED_DISABLED
+ L'option IMMED n'est pas disponible sur ce réseau.
+NICK_SET_KILL_OFF
+ La protection est maintenant désactivée.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ La sécurité est maintenant activé.
+NICK_SET_SECURE_OFF
+ La sécurité est maintenant désactivé.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ Votre nick est maintenant privé.
+NICK_SET_PRIVATE_OFF
+ Votre nick est maintenant public.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Votre adresse e-mail ne sera plus affichée par la commande INFO de %s.
+NICK_SET_HIDE_EMAIL_OFF
+ Votre adresse e-mail sera affichée par la commande INFO de %s.
+NICK_SET_HIDE_MASK_ON
+ Votre masque user@host ne sera plus affiché par la commande INFO de %s.
+NICK_SET_HIDE_MASK_OFF
+ Votre masque user@host sera affiché par la commande INFO de %s.
+NICK_SET_HIDE_QUIT_ON
+ Votre dernière raison de /QUIT ne sera plus affichée par la commande INFO de %s.
+NICK_SET_HIDE_QUIT_OFF
+ Votre dernière raison de /QUIT sera affichée par la commande INFO de %s.
+
+# SET NOEXPIRE responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Services will now reply to you with messages.
+NICK_SET_MSG_OFF
+ Services will now reply to you with notices.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nick] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ Le nick %s n'expirera pas.
+NICK_SET_NOEXPIRE_OFF
+ Le nick %s expirera.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mask]
+NICK_ACCESS_ALREADY_PRESENT
+ Le mask %s existe déjà sur votre liste d'accès.
+NICK_ACCESS_REACHED_LIMIT
+ Vous ne pouvez avoir que %d entrées dans la liste d'accès d'un nick.
+NICK_ACCESS_ADDED
+ %s ajouté à votre liste d'accès.
+NICK_ACCESS_NOT_FOUND
+ %s introuvable sur votre liste d'accès.
+NICK_ACCESS_DELETED
+ %s supprimé de votre liste d'accès.
+NICK_ACCESS_LIST
+ Liste d'accès:
+NICK_ACCESS_LIST_X
+ Liste d'accès de %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s est %s
+NICK_INFO_SERVICES_OPER
+ %s est opérateur des services.
+NICK_INFO_SERVICES_ADMIN
+ %s est administrateur des services.
+NICK_INFO_ADDRESS
+ Adresse: %s
+NICK_INFO_ADDRESS_ONLINE
+ Connecté de: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s est actuellement connecté.
+NICK_INFO_TIME_REGGED
+ Enregistré le: %s
+NICK_INFO_LAST_SEEN
+ Dernière présence: %s
+NICK_INFO_LAST_QUIT
+ Dernier quit: %s
+NICK_INFO_URL
+ Adresse de son site: %s
+NICK_INFO_EMAIL
+ Adresse e-mail: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ Numéro ICQ: %d
+NICK_INFO_GREET
+ Message d'accueil: %s
+NICK_INFO_OPTIONS
+ Options: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Protection
+NICK_INFO_OPT_SECURE
+ Sécurité
+NICK_INFO_OPT_PRIVATE
+ Confidentialité
+NICK_INFO_OPT_MSG
+ Mode message
+NICK_INFO_OPT_NONE
+ Aucune
+NICK_INFO_NO_EXPIRE
+ Ce nick n'expirera pas.
+NICK_INFO_FOR_MORE
+ Pour plus d'informations, tapez /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST modèle
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST modèle [FORBIDDEN] [NOEXPIRE] [UNCONFIRMED]
+NICK_LIST_HEADER
+ Liste des entrées correspondantes à %s:
+NICK_LIST_RESULTS
+ Fin de la liste - %d/%d correspondances affichées.
+
+# GLIST responses
+NICK_ALIST_SYNTAX
+ ALIST nickname
+NICK_ALIST_HEADER
+ Channels that you have access on:
+ Num Channel Level Description
+NICK_ALIST_HEADER_X
+ Channels that %s has access on:
+ Num Channel Level Description
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ Fin de la liste - %d/%d correspondances affichées.
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Liste des nicks dans votre groupe:
+NICK_GLIST_HEADER_X
+ Liste des nicks dans le groupe de %s:
+NICK_GLIST_FOOTER
+ %d nicks dans le groupe.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nick [motdepasse]
+NICK_NO_RECOVER_SELF
+ Vous ne pouvez utiliser RECOVER sur vous-même!
+NICK_RECOVERED
+ L'utilisateur se servant de votre nick a été déconnecté.
+ /msg %s RELEASE %s pour le récupérer avant que la minute ne s'écoule.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nick [motdepasse]
+NICK_RELEASE_NOT_HELD
+ Le nick %s n'est pas en tutelle.
+NICK_RELEASED
+ La tutelle des Services sur votre nick a été enlevée.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nick [motdepasse]
+NICK_NO_GHOST_SELF
+ Vous ne pouvez utiliser GHOST sur vous-même!
+NICK_GHOST_KILLED
+ L'utilisateur fantôme utilisant votre nick a été déconnecté.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nick
+NICK_GETPASS_UNAVAILABLE
+ La commande GETPASS est indisponible car l'encryption est utilisée.
+NICK_GETPASS_PASSWORD_IS
+ Le mot de passe de %s est %s.
+
+# SENDPASS responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host No WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails Match %s to %s.
+NICK_GETEMAIL_NOT_USED
+ No Emails listed for %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nickname
+NICK_SENDPASS_UNAVAILABLE
+ La commande SENDPASS est indisponible car l'encryption est utilisée.
+NICK_SENDPASS_SUBJECT
+ Mot de passe du nick %s
+NICK_SENDPASS_HEAD
+ Bonjour,
+NICK_SENDPASS_LINE_1
+ Vous avez demandé à recevoir le mot de passe du nick %s par e-mail.
+NICK_SENDPASS_LINE_2
+ Le mot de passe est %s. Pour des raisons de sécurité, vous devriez le changer dès que vous lisez cet e-mail.
+NICK_SENDPASS_LINE_3
+ Si vous ne savez pas de quoi il retourne dans cet e-mail, il s'agit probablement d'une erreur; nous vous prions de nous excuser et vous demandons d'ignorer cet e-mail.
+NICK_SENDPASS_LINE_4
+ NE REPONDEZ PAS A CE MAIL!
+NICK_SENDPASS_LINE_5
+ Les administrateurs de %s.
+NICK_SENDPASS_OK
+ Le mot de passe de %s a été envoyé.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nick [raison]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nick raison
+NICK_FORBID_SUCCEEDED
+ Le nick %s est désormais interdit.
+NICK_FORBID_FAILED
+ Impossible d'interdire le nick %s!
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+NICK_REQUESTED
+ Une demande d'enregistrement pour ce pseudo est en cours. Merci de patienter 24 heures.
+NICK_REG_RESENT
+ Votre mot de passe a été renvoyé à %s.
+NICK_REG_UNABLE
+ Pseudo non enregistré... Re-essayez plus tard.
+NICK_IS_PREREG
+ Une demande d'enregistrement pour ce pseudo est en cours. La confirmation n'a pas été effectuée.
+NICK_ENTER_REG_CODE
+ Un passcode a été envoyé à %s, merci de taper /msg %s confirm <passcode> une fois que vous l'aurez reçu pour compléter l'enregistrement.
+NICK_CONFIRM_NOT_FOUND
+ Aucune validation en attente... Tapez: "/msg %s register <password> <email>" pour l'enregistrer.
+NICK_CONFIRM_INVALID
+ Passcode invalide, merci de le vérifier.
+NICK_REG_MAIL_SUBJECT
+ Enregistrement d'un pseudo (%s)
+NICK_REG_MAIL_HEAD
+ Bonjour,
+NICK_REG_MAIL_LINE_1
+ Vous venez de demander l'enregistrement du pseudo %s.
+NICK_REG_MAIL_LINE_2
+ Veuillez tapez " /msg %s confirm %s " sur IRC afin de valider l'enregistrement.
+NICK_REG_MAIL_LINE_3
+ Si vous ne savez pas pourquoi vous avez reçu cet email, ignorez-le.
+NICK_REG_MAIL_LINE_4
+ NE REPONDEZ PAS A CE MESSAGE
+NICK_REG_MAIL_LINE_5
+ %s administrateurs.
+NICK_GETPASS_PASSCODE_IS
+ Le passcode pour %s est %s.
+NICK_FORCE_REG
+ Pseudo %s confirmé
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Status automatique d'opérateur du channel
+CHAN_LEVEL_AUTOVOICE
+ Mode +v automatique
+CHAN_LEVEL_AUTOHALFOP
+ Mode +h automatique
+CHAN_LEVEL_AUTOPROTECT
+ Mode +a automatique
+CHAN_LEVEL_AUTODEOP
+ Non autorisé à avoir le status d'opérateur du channel
+CHAN_LEVEL_NOJOIN
+ Non autorisé à joindre le channel s'il est restreint
+CHAN_LEVEL_INVITE
+ Autorisé à utiliser la commande INVITE
+CHAN_LEVEL_AKICK
+ Autorisé à utiliser la commande AKICK
+CHAN_LEVEL_SET
+ Autorisé à utiliser la commande SET (mais pas FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ Autorisé à utiliser la commande CLEAR
+CHAN_LEVEL_UNBAN
+ Autorisé à utiliser la commande UNBAN
+CHAN_LEVEL_OPDEOP
+ Autorisé à utiliser les commandes OP/DEOP
+CHAN_LEVEL_ACCESS_LIST
+ Autorisé à voir la liste d'accès
+CHAN_LEVEL_ACCESS_CHANGE
+ Autorisé à modifier la liste d'accès
+CHAN_LEVEL_MEMO
+ Autorisé à lister/lire les memos
+CHAN_LEVEL_ASSIGN
+ Autorisé à attribuer/retirer un bot
+CHAN_LEVEL_BADWORDS
+ Autorisé à utiliser la commande BADWORDS
+CHAN_LEVEL_NOKICK
+ Jamais kické par les kickers du bot
+CHAN_LEVEL_FANTASIA
+ Autorisé à utiliser les commandes fantaisistes
+CHAN_LEVEL_SAY
+ Autorisé à utiliser les commandes ACT et SAY
+CHAN_LEVEL_GREET
+ Message d'accueil affiché
+CHAN_LEVEL_VOICEME
+ Autorisé à se (de)voicer
+CHAN_LEVEL_VOICE
+ Autorisé à utiliser les commandes VOICE/DEVOICE
+CHAN_LEVEL_GETKEY
+ Autorisé à utiliser la commande GETKEY
+CHAN_LEVEL_OPDEOPME
+ Autorisé à se (de)op
+CHAN_LEVEL_HALFOPME
+ Autorisé à se (de)halfop
+CHAN_LEVEL_HALFOP
+ Autorisé à utiliser les commandes HALFOP/DEHALFOP
+CHAN_LEVEL_PROTECTME
+ Autorisé à se (de)protéger
+CHAN_LEVEL_PROTECT
+ Autorisé à utiliser les commandes PROTECT/DEPROTECT
+CHAN_LEVEL_KICKME
+ Autorisé à se kicker
+CHAN_LEVEL_KICK
+ Autorisé à utiliser la commande KICK
+CHAN_LEVEL_SIGNKICK
+ Pas de kick signé quand SIGNKICK LEVEL est utilisé
+CHAN_LEVEL_BANME
+ Autorisé à se bannir
+CHAN_LEVEL_BAN
+ Autorisé à utiliser la commande BAN
+CHAN_LEVEL_TOPIC
+ Autorisé à utiliser la commande TOPIC
+CHAN_LEVEL_INFO
+ Autorisé à utiliser la commande INFO avec l'option ALL
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Ce channel a été enregistré avec %s.
+CHAN_NOT_ALLOWED_OP
+ Vous ne pouvez être opérateur du channel %s.
+CHAN_MAY_NOT_BE_USED
+ Ce channel ne peut être utilisé.
+CHAN_NOT_ALLOWED_TO_JOIN
+ Vous n'êtes pas autorisé à être sur ce channel.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER channel motdepasse description
+CHAN_REGISTER_DISABLED
+ Désolés, l'enregistrement de channels est temporairement désactivé.
+CHAN_REGISTER_NOT_LOCAL
+ Les channels locaux ne peuvent être enregistrés.
+CHAN_MUST_REGISTER_NICK
+ Vous devez d'abord enregistrer votre nick. Tapez /msg %s HELP pour savoir comment enregistrer votre nick.
+CHAN_MUST_IDENTIFY_NICK
+ Vous devez d'abord vous identifier avec %s, en utilisant la commande:
+ /msg %s IDENTIFY motdepasse
+CHAN_MAY_NOT_BE_REGISTERED
+ Le channel %s ne peut être enregistré.
+CHAN_ALREADY_REGISTERED
+ Le channel %s est déjà enregistré!
+CHAN_MUST_BE_CHANOP
+ Vous devez être un opérateur du channel pour l'enregistrer.
+CHAN_REACHED_CHANNEL_LIMIT
+ Désolés, vous avez déjà atteint votre limite de %d channels.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Désolés, vous avez déjà dépassé votre limite de %d channels.
+CHAN_REGISTRATION_FAILED
+ Désolés, l'enregistrement a échoué.
+CHAN_REGISTERED
+ Le channel %s a été enregistré sous votre nick: %s
+CHAN_PASSWORD_IS
+ Le mot de passe du channel est %s - notez le pour une utilisation ultérieure.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY channel motdepasse
+CHAN_IDENTIFY_FAILED
+ Désolés, l'identification a échoué.
+CHAN_IDENTIFY_SUCCEEDED
+ Password accepté - vous avez maintenant un level d'accès sur %s équivalent
+ à celui de son propriétaire.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT channel nick
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT channel [nick]
+CHAN_LOGOUT_SUCCEEDED
+ L'utilisateur %s n'est plus identifié pour le channel %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Tous les utilisateurs identifiés au channel %s ne le sont plus.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP channel
+CHAN_DROP_DISABLED
+ Désolés, l'effacement de channels est temporairement désactivé.
+CHAN_DROPPED
+ Le channel %s a été effacé.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET channel option paramètres
+CHAN_SET_DISABLED
+ Désolés, la configuration des options du channel est temporairement désactivée.
+CHAN_SET_UNKNOWN_OPTION
+ Option SET %s inconnue.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s a trop de channels enregistrés.
+CHAN_FOUNDER_CHANGED
+ Le propriétaire de %s est maintenant %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Le successeur de %s est maintenant %s.
+CHAN_SUCCESSOR_UNSET
+ Il n'y a plus de successeur sur %s.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s ne peut être successeur et propriétaire du channel %s.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Impossible de changer le mot de passe.
+CHAN_PASSWORD_CHANGED
+ Le mot de passe de %s a été changé.
+CHAN_PASSWORD_CHANGED_TO
+ Le mot de passe de %s est maintenant %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ La description de %s est maintenant %s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ L'adresse du site de %s est maintenant %s.
+CHAN_URL_UNSET
+ L'adresse du site de %s a été effacée.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ L'e-mail de %s est maintenant %s.
+CHAN_EMAIL_UNSET
+ L'e-mail de %s a été effacé.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Le message d'entrée de %s a été changé.
+CHAN_ENTRY_MSG_UNSET
+ Le message d'entrée de %s a été effacé.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s n'est pas un type de ban valide.
+CHAN_SET_BANTYPE_CHANGED
+ Le type de ban du channel %s est maintenant le numéro %d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Mode %c ignoré car inconnu.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Mode %c ignoré car il ne peut être maintenu.
+CHAN_SET_MLOCK_L_REQUIRED
+ Vous devez faire toujours garder le mode +l pour en faire autant avec le mode +L.
+CHAN_SET_MLOCK_K_REQUIRED
+ Vous devez faire toujours garder le mode +i pour en faire autant avec le mode +K.
+CHAN_MLOCK_CHANGED
+ Les modes maintenus du channel %s sont maintenant %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET channel KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Le maintien du topic est maintenant activé.
+CHAN_SET_KEEPTOPIC_OFF
+ Le maintien du topic est maintenant désactivé.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET channel TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Le verrouillage du topic est maintenant activé.
+CHAN_SET_TOPICLOCK_OFF
+ Le verrouillage du topic est maintenant désactivé.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET channel PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ L'option de paix est maintenant activée.
+CHAN_SET_PEACE_OFF
+ L'option de paix est maintenant désactivée.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET channel PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Votre channel est maintenant privé.
+CHAN_SET_PRIVATE_OFF
+ Votre channel est maintenant public.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET channel SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Le contrôle des ops est maintenant activé.
+CHAN_SET_SECUREOPS_OFF
+ Le contrôle des ops est maintenant désactivé.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET channel SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Le contrôle du propriétaire est maintenant activé.
+CHAN_SET_SECUREFOUNDER_OFF
+ Le contrôle du propriétaire est maintenant désactivé.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET channel RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ L'accès restreint est maintenant activé.
+CHAN_SET_RESTRICTED_OFF
+ L'accès restreint est maintenant désactivé.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET channel SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ La sécurité est maintenant activée.
+CHAN_SET_SECURE_OFF
+ La sécurité est maintenant désactivée.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET channel SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Les kicks signés sont maintenant activés.
+CHAN_SET_SIGNKICK_LEVEL
+ Les kicks signés sont maintenant activés, mais dépend du
+ level de l'utilisateur qui utilise la commande.
+CHAN_SET_SIGNKICK_OFF
+ Les kicks signés sont maintenant désactivés.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET channel OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ La notice sur OP/DEOP est maintenant activée.
+CHAN_SET_OPNOTICE_OFF
+ La notice sur OP/DEOP est maintenant désactivée.
+
+# SET OPNOTICE responses
+CHAN_SET_XOP_SYNTAX
+ SET channel XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ Le système de listes de xOPs est maintenant activé.
+CHAN_SET_XOP_OFF
+ Le système de listes de xOPs est maintenant désactivé.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET channel NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ Le channel %s n'expirera pas.
+CHAN_SET_NOEXPIRE_OFF
+ Le channel %s expirera.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Désolé, vous ne pouvez avoir que %d entrées sur les listes des AOPs/SOPs/VOPs d'un channel.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Vous ne pouvez pas utiliser cette commande.
+ Utilisez la commandes ACCESS à la place.
+ Tapez /msg %s HELP ACCESS pour plus d'informations.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP channel {ADD|DEL|LIST|CLEAR} [nick [level] | liste-d'entrées]
+CHAN_AOP_DISABLED
+ Désolés, la modification des listes des AOPs des channels est temporairement désactivée.
+CHAN_AOP_NICKS_ONLY
+ Les listes des AOPs des channels ne peuvent contenir que des nicks enregistrés.
+CHAN_AOP_ADDED
+ %s ajouté à la liste des AOPs de %s.
+CHAN_AOP_MOVED
+ %s moved to %s AOP list.
+CHAN_AOP_NO_SUCH_ENTRY
+ Entrée inexistante (#%d) sur la liste des AOPs de %s.
+CHAN_AOP_NOT_FOUND
+ %s introuvable sur la liste des AOPs de %s.
+CHAN_AOP_NO_MATCH
+ Aucune entrée correspondante sur la liste des AOPs de %s.
+CHAN_AOP_DELETED
+ %s supprimé de la liste des AOPs de %s.
+CHAN_AOP_DELETED_ONE
+ 1 entrée supprimée de la liste des AOPs de %s.
+CHAN_AOP_DELETED_SEVERAL
+ %d entrées supprimées de la liste des AOPs de %s.
+CHAN_AOP_LIST_EMPTY
+ La liste des AOPs de %s est vide.
+CHAN_AOP_LIST_HEADER
+ Liste des AOPs de %s:
+ Num Nick
+CHAN_AOP_CLEAR
+ La liste des AOPs est maintenant vide.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP channel {ADD|DEL|LIST|CLEAR} [nick [level] | liste-d'entrées]
+CHAN_HOP_DISABLED
+ Désolés, la modification des listes des HOPs des channels est temporairement désactivée.
+CHAN_HOP_NICKS_ONLY
+ Les listes des HOPs des channels ne peuvent contenir que des nicks enregistrés.
+CHAN_HOP_ADDED
+ %s ajouté à la liste des HOPs de %s.
+CHAN_HOP_MOVED
+ %s moved to %s HOP list.
+CHAN_HOP_NO_SUCH_ENTRY
+ Entrée inexistante (#%d) sur la liste des HOPs de %s.
+CHAN_HOP_NOT_FOUND
+ %s introuvable sur la liste des HOPs de %s.
+CHAN_HOP_NO_MATCH
+ Aucune entrée correspondante sur la liste des HOPs de %s.
+CHAN_HOP_DELETED
+ %s supprimé de la liste des HOPs de %s.
+CHAN_HOP_DELETED_ONE
+ 1 entrée supprimée de la liste des HOPs de %s.
+CHAN_HOP_DELETED_SEVERAL
+ %d entrées supprimées de la liste des HOPs de %s.
+CHAN_HOP_LIST_EMPTY
+ La liste des HOPs de %s est vide.
+CHAN_HOP_LIST_HEADER
+ Liste des HOPs de %s:
+ Num Nick
+CHAN_HOP_CLEAR
+ La liste des HOPs est maintenant vide.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP channel {ADD|DEL|LIST|CLEAR} [nick [level] | liste-d'entrées]
+CHAN_SOP_DISABLED
+ Désolés, la modification des listes des SOPs des channels est temporairement désactivée.
+CHAN_SOP_NICKS_ONLY
+ Les listes des SOPs des channels ne peuvent contenir que des nicks enregistrés.
+CHAN_SOP_ADDED
+ %s ajouté à la liste des SOPs de %s.
+CHAN_SOP_MOVED
+ %s moved to %s SOP list.
+CHAN_SOP_NO_SUCH_ENTRY
+ Entrée inexistante (#%d) sur la liste des SOPs de %s.
+CHAN_SOP_NOT_FOUND
+ %s introuvable sur la liste des SOPs de %s.
+CHAN_SOP_NO_MATCH
+ Aucune entrée correspondante sur la liste des SOPs de %s.
+CHAN_SOP_DELETED
+ %s supprimé de la liste des SOPs de %s.
+CHAN_SOP_DELETED_ONE
+ 1 entrée supprimée de la liste des SOPs de %s.
+CHAN_SOP_DELETED_SEVERAL
+ %d entrées supprimées de la liste des SOPs de %s.
+CHAN_SOP_LIST_EMPTY
+ La liste des SOPs de %s est vide.
+CHAN_SOP_LIST_HEADER
+ Liste des SOPs de %s:
+ Num Nick
+CHAN_SOP_CLEAR
+ La liste des SOPs est maintenant vide.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP channel {ADD|DEL|LIST|CLEAR} [nick [level] | liste-d'entrées]
+CHAN_VOP_DISABLED
+ Désolés, la modification des listes des VOPs des channels est temporairement désactivée.
+CHAN_VOP_NICKS_ONLY
+ Les listes des VOPs des channels ne peuvent contenir que des nicks enregistrés.
+CHAN_VOP_ADDED
+ %s ajouté à la liste des VOPs de %s.
+CHAN_VOP_MOVED
+ %s moved to %s VOP list.
+CHAN_VOP_NO_SUCH_ENTRY
+ Entrée inexistante (#%d) sur la liste des VOPs de %s.
+CHAN_VOP_NOT_FOUND
+ %s introuvable sur la liste des VOPs de %s.
+CHAN_VOP_NO_MATCH
+ Aucune entrée correspondante sur la liste des VOPs de %s.
+CHAN_VOP_DELETED
+ %s supprimé de la liste des VOPs de %s.
+CHAN_VOP_DELETED_ONE
+ 1 entrée supprimée de la liste des VOPs de %s.
+CHAN_VOP_DELETED_SEVERAL
+ %d entrées supprimées de la liste des VOPs de %s.
+CHAN_VOP_LIST_EMPTY
+ La liste des VOPs de %s est vide.
+CHAN_VOP_LIST_HEADER
+ Liste des VOPs de %s:
+ Num Nick
+CHAN_VOP_CLEAR
+ La liste des VOPs est maintenant vide.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS channel {ADD|DEL|LIST|CLEAR} [nick [level] | liste-d'entrées]
+CHAN_ACCESS_XOP
+ Vous ne pouvez pas utiliser cette commande.
+ Utilisez les commandes AOP, SOP et VOP à la place.
+ Tapez /msg %s HELP commande pour plus d'informations.
+CHAN_ACCESS_DISABLED
+ Désolés, la modification des listes d'accès des channels est temporairement désactivée.
+CHAN_ACCESS_LEVEL_NONZERO
+ Le level d'accès doit être différent de zéro.
+CHAN_ACCESS_LEVEL_RANGE
+ Le level d'accès doit être compris entre %d et %d inclus.
+CHAN_ACCESS_NICKS_ONLY
+ Les listes d'accès des channels ne peuvent contenir que des nicks enregistrés.
+CHAN_ACCESS_REACHED_LIMIT
+ Désolés, vous ne pouvez avoir que %d entrées sur la liste d'accès d'un channel.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Le level d'accès de %s sur %s est inchangé de %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Le level d'accès de %s sur %s est maintenant de %d.
+CHAN_ACCESS_ADDED
+ %s ajouté à la liste d'accès de %s au level %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ Entrée inexistante (#%d) sur la liste d'accès de %s.
+CHAN_ACCESS_NOT_FOUND
+ %s introuvable sur la liste d'accès de %s.
+CHAN_ACCESS_NO_MATCH
+ Aucune entrée correspondante sur la liste d'accès de %s.
+CHAN_ACCESS_DELETED
+ %s supprimé de la liste d'accès de %s.
+CHAN_ACCESS_DELETED_ONE
+ 1 entrée supprimée de la liste d'accès de %s.
+CHAN_ACCESS_DELETED_SEVERAL
+ %d entrées supprimées de la liste d'accès de %s.
+CHAN_ACCESS_LIST_EMPTY
+ La liste d'accès de %s est vide.
+CHAN_ACCESS_LIST_HEADER
+ Liste d'accès de %s:
+ Num Lev Nick
+CHAN_ACCESS_LIST_FOOTER
+ Fin de liste d'accès.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ La liste d'accès est maintenant vide.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK channel {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-ou-usermask]
+CHAN_AKICK_DISABLED
+ Désolés, la modification de la liste de kicks automatiques du channel
+ est temporairement désactivée.
+CHAN_AKICK_ALREADY_EXISTS
+ %s existe déjà sur la liste de kicks automatiques de %s.
+CHAN_AKICK_REACHED_LIMIT
+ Désolés, vous ne pouvez avoir plus de %d entrées de kicks automatiques
+ sur un channel.
+CHAN_AKICK_ADDED
+ %s ajouté à la liste de kicks automatiques de %s.
+CHAN_AKICK_NO_SUCH_ENTRY
+ Entrée (#%d) inexistante sur la liste de kicks automatiques de %s.
+CHAN_AKICK_NOT_FOUND
+ %s introuvable sur la liste de kicks automatiques de %s.
+CHAN_AKICK_NO_MATCH
+ Aucune entrée correspondante sur la liste de kicks automatiques de %s.
+CHAN_AKICK_STUCK
+ %s est maintenant maintenu en permanence sur le channel %s.
+CHAN_AKICK_UNSTUCK
+ %s n'est plus maintenu en permanence sur le channel %s.
+CHAN_AKICK_DELETED
+ %s supprimé de la liste de kicks automatiques de %s.
+CHAN_AKICK_DELETED_ONE
+ 1 entrée supprimée de la liste de kicks automatiques de %s.
+CHAN_AKICK_DELETED_SEVERAL
+ %d entrées supprimées de la liste de kicks automatiques de %s.
+CHAN_AKICK_LIST_EMPTY
+ la liste de kicks automatiques de %s est vide.
+CHAN_AKICK_LIST_HEADER
+ Liste de kicks automatiques de %s:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (par %s le %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (maintenu) (par %s le %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ L'application des entrées de la liste de kicks automatiques
+ pour %s est terminé; %d utilisateurs étaient concernés.
+CHAN_AKICK_CLEAR
+ La liste de kicks automatiques est maintenant vide.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS channel {SET | DIS[ABLE] | LIST | RESET} [option [level]]
+CHAN_LEVELS_XOP
+ Cette commande est inutile dans ce mode.
+CHAN_LEVELS_RANGE
+ Le level doit être compris entre %d et %d inclus.
+CHAN_LEVELS_CHANGED
+ Le level pour %s du channel %s est maintenant de %d.
+CHAN_LEVELS_UNKNOWN
+ L'option %s est inconnue. Tapez /msg %s HELP LEVELS DESC pour une
+ liste d'options valides.
+CHAN_LEVELS_DISABLED
+ Le level %s est maintenant désactivé sur le channel %s.
+CHAN_LEVELS_LIST_HEADER
+ Options de level d'accès du channel %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (désactivé)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (propriétaire uniquement)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ Les levels d'accès de %s ont été réinitialisés à leur valeur par défaut.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO channel [ALL]
+CHAN_INFO_HEADER
+ Informations pour le channel %s:
+CHAN_INFO_FOUNDER
+ Propriétaire: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Propriétaire: %s
+CHAN_INFO_SUCCESSOR
+ Successeur: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Successeur: %s
+CHAN_INFO_DESCRIPTION
+ Description: %s
+CHAN_INFO_ENTRYMSG
+ Message d'entrée: %s
+CHAN_INFO_TIME_REGGED
+ Enregistré: %s
+CHAN_INFO_LAST_USED
+ Dernière utilisation: %s
+CHAN_INFO_LAST_TOPIC
+ Dernier topic: %s
+CHAN_INFO_TOPIC_SET_BY
+ Topic changé par: %s
+CHAN_INFO_URL
+ Adresse du site: %s
+CHAN_INFO_EMAIL
+ E-mail: %s
+CHAN_INFO_BANTYPE
+ Type de ban: %d
+CHAN_INFO_OPTIONS
+ Options: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Maintien du topic
+CHAN_INFO_OPT_OPNOTICE
+ Notice sur OP
+CHAN_INFO_OPT_PEACE
+ Paix
+CHAN_INFO_OPT_PRIVATE
+ Confidentialité
+CHAN_INFO_OPT_RESTRICTED
+ Accès restreint
+CHAN_INFO_OPT_SECURE
+ Sécurité
+CHAN_INFO_OPT_SECUREOPS
+ Contrôle des ops
+CHAN_INFO_OPT_SECUREFOUNDER
+ Contrôle du propriétaire
+CHAN_INFO_OPT_SIGNKICK
+ Kicks signés
+CHAN_INFO_OPT_TOPICLOCK
+ Verrouillage du topic
+CHAN_INFO_OPT_XOP
+ Système de listes de xOPs
+CHAN_INFO_OPT_NONE
+ Aucune
+CHAN_INFO_MODE_LOCK
+ Modes maintenus: %s
+CHAN_INFO_NO_EXPIRE
+ Ce channel n'expirera pas.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST modèle
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Liste d'entrées correspondantes à %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Fin de la liste - %d/%d correspondances affichées.
+
+# CLIST responses
+CHAN_INVITE_SYNTAX
+ INVITE channel
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN channel
+CHAN_UNBANNED
+ Vous avez été débanni de %s.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC channel [topic]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR channel quoi
+CHAN_CLEARED_BANS
+ Tous les bans du channel %s ont été supprimés.
+CHAN_CLEARED_EXCEPTS
+ Tous les excepts du channel %s ont été supprimés.
+CHAN_CLEARED_MODES
+ Tous les modes du channel %s ont été réinitialisés.
+CHAN_CLEARED_OPS
+ Tous les ops du channel %s ont été enlevés.
+CHAN_CLEARED_VOICES
+ Tous les voices du channel %s ont été enlevés.
+CHAN_CLEARED_USERS
+ Tous les utilisateurs du channel %s ont été kickés.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS channel
+CHAN_GETPASS_UNAVAILABLE
+ La commande GETPASS est indisponible car l'encryption est utilisée.
+CHAN_GETPASS_PASSWORD_IS
+ Le mot de passe du channel %s est %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS channel
+CHAN_SENDPASS_UNAVAILABLE
+ La commande SENDPASS est indisponible car l'encryption est utilisée.
+CHAN_SENDPASS_SUBJECT
+ Mot de passe du channel %s
+CHAN_SENDPASS_HEAD
+ Bonjour,
+CHAN_SENDPASS_LINE_1
+ Vous avez demandé à recevoir le mot de passe du channel %s par e-mail.
+CHAN_SENDPASS_LINE_2
+ Le mot de passe est %s. Pour des raisons de sécurité, vous devriez le changer dès que vous lisez ce mail.
+CHAN_SENDPASS_LINE_3
+ Si vous ne savez pas de quoi il retourne dans cet e-mail, il s'agit probablement d'une erreur; nous vous prions de nous excuser et vous demandons d'ignorer cet e-mail.
+CHAN_SENDPASS_LINE_4
+ NE REPONDEZ PAS A CE MAIL!
+CHAN_SENDPASS_LINE_5
+ Les administrateurs de %s.
+CHAN_SENDPASS_OK
+ Le mot de passe de %s a été envoyé.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID channel [raison]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID channel raison
+CHAN_FORBID_SUCCEEDED
+ Le channel %s est maintenant interdit.
+CHAN_FORBID_FAILED
+ Impossible d'interdire le channel %s!
+
+# Misc responses
+CHAN_FORBID_REASON
+ This channel has been forbidden.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND channel [reason]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND channel reason
+CHAN_SUSPEND_SUCCEEDED
+ Channel %s is now suspended.
+CHAN_SUSPEND_FAILED
+ Couldn't suspended channel %s!
+CHAN_SUSPEND_REASON
+ This channel has been suspended.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND channel
+CHAN_UNSUSPEND_ERROR
+ No # found in front of channel name.
+CHAN_UNSUSPEND_SUCCEEDED
+ Channel %s is now released.
+CHAN_UNSUSPEND_FAILED
+ Couldn't release channel %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s matches an except on %s and cannot be banned until the except have been removed.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Vous avez 1 nouveau memo.
+MEMO_HAVE_NEW_MEMOS
+ Vous avez %d nouveaux memos.
+MEMO_TYPE_READ_LAST
+ Tapez /msg %s READ LAST pour le lire.
+MEMO_TYPE_READ_NUM
+ Tapez /msg %s READ %d pour le lire.
+MEMO_TYPE_LIST_NEW
+ Tapez /msg %s LIST NEW pour les lister.
+MEMO_AT_LIMIT
+ Attention: Vous avez atteint votre nombre maximum de memos (%d). Vous ne pourrez plus recevoir de nouveaux memos sauf si vous supprimez quelques uns de vos memos actuels.
+MEMO_OVER_LIMIT
+ Attention: Vous avez dépassé votre nombre maximum de memos (%d). Vous ne pourrez plus recevoir de nouveaux memos sauf si vous supprimez quelques uns de vos memos actuels.
+MEMO_X_MANY_NOTICE
+ Il y a %d memos sur le canal %s.
+MEMO_X_ONE_NOTICE
+ Il y a %d memo sur le canal %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ Il y a un nouveau mémo dans le canal %s.
+ Tapez /msg %s READ %s %d pour le lire.
+MEMO_NEW_MEMO_ARRIVED
+ Vous avez un nouveau memo de %s.
+ Tapez /msg %s READ %d pour le lire.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ Vous n'avez pas de memos.
+MEMO_X_HAS_NO_MEMOS
+ %s n'a pas de memos.
+MEMO_DOES_NOT_EXIST
+ Memo %d n'existe pas!
+MEMO_LIST_NOT_FOUND
+ Aucun memo correspondant trouvé.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | channel} texte-du-memo
+MEMO_SEND_DISABLED
+ Désolés, l'envoi de memos est temporairement désactivé.
+MEMO_SEND_PLEASE_WAIT
+ Veuillez patienter %d secondes avant d'utiliser la commande SEND à nouveau.
+MEMO_X_GETS_NO_MEMOS
+ %s ne peut recevoir de memos.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s a trop de memos et ne peut en recevoir plus.
+MEMO_SENT
+ Memo envoyé à %s.
+
+# CANCEL responses
+MEMO_MASS_SENT
+ A massmemo has been sent to all registered users.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | channel}
+MEMO_CANCEL_DISABLED
+ Désolés, l'annulation de memos est temporairement désactivée
+MEMO_CANCEL_NONE
+ Aucun memo n'était annulable.
+MEMO_CANCELLED
+ Le dernier memo envoyé à %s a été supprimé.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [channel] [liste | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ Vous n'avez pas de nouveaux memos.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s n'a pas de nouveaux memos.
+MEMO_LIST_MEMOS
+ Memos pour %s. Pour lire, tapez: /msg %s READ num
+MEMO_LIST_NEW_MEMOS
+ Nouveaux memos pour %s. Pour lire, tapez: /msg %s READ num
+MEMO_LIST_CHAN_MEMOS
+ Memos pour %s. Pour lire, tapez: /msg %s READ %s num
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nouveaux memos pour %s. Pour lire, tapez: /msg %s READ %s num
+MEMO_LIST_HEADER
+ Num Expéditeur Date/Heure
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [channel] {liste | LAST | NEW}
+MEMO_HEADER
+ Memo %d de %s (%s). Pour supprimer, tapez: /msg %s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d de %s (%s). Pour supprimer, tapez: /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [channel] {num | liste | ALL}
+MEMO_DELETED_NONE
+ Aucun memo supprimé.
+MEMO_DELETED_ONE
+ Le memo %d a été supprimé.
+MEMO_DELETED_SEVERAL
+ Les memos %s ont été supprimés.
+MEMO_DELETED_ALL
+ Tous vos memos ont été supprimés.
+
+# SET responses
+MEMO_CHAN_DELETED_ALL
+ Tous les mémos du canal %s ont été supprimés.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET option paramètres
+MEMO_SET_DISABLED
+ Désolés, la configuration des options est temporairement désactivée.
+MEMO_SET_UNKNOWN_OPTION
+ Option SET %s inconnue.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s vous notifiera maintenant des memos quand vous vous connectez et quand ils vous sont envoyés.
+MEMO_SET_NOTIFY_LOGON
+ %s vous notifiera maintenant des memos quand vous vous connectez ou enlevez /AWAY.
+MEMO_SET_NOTIFY_NEW
+ %s vous notifiera maintenant des memos quand ils vous sont envoyés.
+MEMO_SET_NOTIFY_OFF
+ %s ne vous enverra aucune notification de memos.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [channel] limite
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [utilisateur | channel] {limite | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Vous n'êtes pas autorisé à changer votre limite de memos.
+MEMO_SET_LIMIT_FORBIDDEN
+ La limite de memos pour %s ne peut être changée.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ Vous ne pouvez mettre votre limite de memos à plus de %d.
+MEMO_SET_LIMIT_TOO_HIGH
+ Vous ne pouvez mettre la limite de memos de %s à plus de %d.
+MEMO_SET_LIMIT_OVERFLOW
+ Limite de memos trop grande; limitation à %d.
+MEMO_SET_YOUR_LIMIT
+ Votre limite de memos a été placée à %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ Vous ne pourrez désormais plus recevoir de memos.
+MEMO_UNSET_YOUR_LIMIT
+ Votre limite de memos a été désactivée.
+MEMO_SET_LIMIT
+ Limite de memos de %s définie à %d.
+MEMO_SET_LIMIT_ZERO
+ Limite de memos de %s définie à 0.
+MEMO_UNSET_LIMIT
+ Limite de memos de %s désactivée.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [channel]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | channel]
+MEMO_INFO_NO_MEMOS
+ Vous n'avez aucun memo actuellement.
+MEMO_INFO_MEMO
+ Vous avez actuellement 1 memo.
+MEMO_INFO_MEMO_UNREAD
+ Vous avez actuellement 1 memo, qui n'a pas encore été lu.
+MEMO_INFO_MEMOS
+ Vous avez actuellement %d memos.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Vous avez actuellement %d memos, desquels 1 n'a pas été lu.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Vous avez actuellement %d memos, desquels %d n'ont pas été lus.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Vous avez actuellement %d memos; aucun d'entre eux n'a été lu.
+MEMO_INFO_LIMIT
+ Votre limite de memos est de %d.
+MEMO_INFO_HARD_LIMIT
+ Votre limite de memos est de %d, et ne peut être changée.
+MEMO_INFO_LIMIT_ZERO
+ Votre limite de memos est de 0; vous ne recevrez aucun nouveau memo.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Votre limite de memos est de 0; vous ne recevrez aucun nouveau memo. Vous ne pouvez pas changer cette limite.
+MEMO_INFO_NO_LIMIT
+ Vous n'avez aucune limite sur le nombre de memos que vous pouvez garder.
+MEMO_INFO_NOTIFY_OFF
+ Vous ne serez pas notifié des nouveaux memos.
+MEMO_INFO_NOTIFY_ON
+ Vous serez notifié de nouveaux memos à la connexion et quand ils arrivent.
+MEMO_INFO_NOTIFY_RECEIVE
+ Vous serez notifié quand de nouveaux memos arrivent.
+MEMO_INFO_NOTIFY_SIGNON
+ Vous serez notifié de nouveaux memos à la connexion.
+MEMO_INFO_X_NO_MEMOS
+ %s n'a actuellement aucun memo.
+MEMO_INFO_X_MEMO
+ %s a actuellement 1 memo.
+MEMO_INFO_X_MEMO_UNREAD
+ %s a actuellement 1 memo, qui n'a pas encore été lu.
+MEMO_INFO_X_MEMOS
+ %s a actuellement %d memos.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s a actuellement %d memos, desquels 1 n'a pas été lu.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s a actuellement %d memos, desquels %d n'ont pas été lus.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s a actuellement %d memos; desquels aucun n'a été lu.
+MEMO_INFO_X_LIMIT
+ La limite de memos de %s est de %d.
+MEMO_INFO_X_HARD_LIMIT
+ La limite de memos de %s est de %d, qui ne peut pas être changée.
+MEMO_INFO_X_NO_LIMIT
+ %s n'a aucune limitation de memos.
+MEMO_INFO_X_NOTIFY_OFF
+ %s n'est pas notifié de nouveaux memos.
+MEMO_INFO_X_NOTIFY_ON
+ %s est notifié de nouveaux memos quand ils arrivent et à la connexion.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s est notifié quand de nouveaux memos arrivent.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s est notifié de nouveaux memos à la connexion.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Le bot %s n'existe pas.
+BOT_NOT_ASSIGNED
+ Vous devez attribuer un bot au channel avant d'utiliser
+ cette commande.
+ Tapez /msg %S HELP ASSIGN pour plus d'informations.
+BOT_NOT_ON_CHANNEL
+ Le bot n'est pas sur le channel %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ Ne dites pas %s sur ce channel!
+BOT_REASON_BADWORD_GENTLE
+ Surveillez vos paroles!
+BOT_REASON_BOLD
+ N'utilisez pas de caractères gras sur ce channel!
+BOT_REASON_CAPS
+ Cessez d'utiliser tant de majuscules!
+BOT_REASON_COLOR
+ N'utilisez pas de couleurs sur ce channel!
+BOT_REASON_FLOOD
+ Arrêtez d'envoyer autant de messages!
+BOT_REASON_REPEAT
+ Arrêtez de vous répéter!
+BOT_REASON_REVERSE
+ N'utilisez pas de caractères inversés sur ce channel!
+BOT_REASON_UNDERLINE
+ N'utilisez pas de caractères soulignés sur ce channel!
+
+# !seen replies
+BOT_SEEN_BOT
+ Je suis là, %s!
+BOT_SEEN_YOU
+ %s est en pleine recherche spirituelle...
+BOT_SEEN_ON_CHANNEL
+ %s est sur le channel actuellement!
+BOT_SEEN_ON_CHANNEL_AS
+ %s est sur le channel actuellement (c'est %s) !
+BOT_SEEN_ON
+ %s a été vu pour la dernière fois ici il y a %s.
+BOT_SEEN_NEVER
+ Je n'ai jamais vu %s sur ce channel.
+BOT_SEEN_UNKNOWN
+ Je ne sais pas qui est %s.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick user host real
+ BOT CHANGE oldnick newnick [user [host [real]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ Le bot %s existe déjà.
+BOT_BOT_CREATION_FAILED
+ Désolés, la création du bot a échoué.
+BOT_BOT_READONLY
+ Désolés, la modification des bots est temporairement désactivée.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) ajouté à la liste des bots.
+BOT_BOT_ANY_CHANGES
+ L'ancienne information est égale à la nouvelle.
+BOT_BOT_CHANGED
+ Le bot %s a été changé en %s!%s@%s (%s)
+BOT_BOT_DELETED
+ Le bot %s a été supprimé.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Liste des bots:
+BOT_BOTLIST_PRIVATE_HEADER
+ Bots réservés aux opérateurs IRC:
+BOT_BOTLIST_FOOTER
+ %d bots disponibles.
+BOT_BOTLIST_EMPTY
+ Il n'y a aucun bot disponible actuellement.
+ Demandez à un administrateur des services d'en créer un!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN chan nick
+BOT_ASSIGN_READONLY
+ Désolés, l'attribution des bots est temporairement désactivée.
+BOT_ASSIGN_ALREADY
+ Bot %s is already assigned to channel %s.
+BOT_ASSIGN_ASSIGNED
+ Le bot %s a été attribué à %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN chan
+BOT_UNASSIGN_UNASSIGNED
+ Il n'y a plus de bot attribué à %s.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {chan | nick}
+BOT_INFO_NOT_FOUND
+ %s n'est pas un bot ou channel enregistré valide.
+BOT_INFO_BOT_HEADER
+ Information pour le bot %s:
+BOT_INFO_BOT_MASK
+ Masque : %s@%s
+BOT_INFO_BOT_REALNAME
+ Vrai nom : %s
+BOT_INFO_BOT_CREATED
+ Créé : %s
+BOT_INFO_BOT_USAGE
+ Utilisé sur : %d channel(s)
+BOT_INFO_BOT_OPTIONS
+ Options : %s
+BOT_INFO_OPT_PRIVATE
+ Privé
+BOT_INFO_CHAN_HEADER
+ Information pour le channel %s:
+BOT_INFO_CHAN_BOT
+ Nick du bot : %s
+BOT_INFO_CHAN_BOT_NONE
+ Nick du bot : non attribué.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Kicker de mots interdits : %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Kicker de mots interdits : %s (%d kick(s) pour un ban)
+BOT_INFO_CHAN_KICK_BOLDS
+ Kicker de car. gras : %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Kicker de car. gras : %s (%d kick(s) pour un ban)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Kicker de majuscules : %s (minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Kicker de majuscules : %s (%d kick(s) pour un ban; minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Kicker de majuscules : %s
+BOT_INFO_CHAN_KICK_COLORS
+ Kicker de couleurs : %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Kicker de couleurs : %s (%d kick(s) pour un ban)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Kicker de flood : %s (%d lignes en %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Kicker de flood : %s (%d kick(s) pour un ban; %d lignes en %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Kicker de flood : %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Kicker de répétition : %s (%d fois)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Kicker de répétition : %s (%d kick(s) pour un ban; %d fois)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Kicker de répétition : %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Kicker de reverses : %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Kicker de reverses : %s (%d kick(s) pour un ban)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Kicker de car. soulignés : %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Kicker de car. soulignés : %s (%d kick(s) pour un ban)
+BOT_INFO_ACTIVE
+ actif
+BOT_INFO_INACTIVE
+ inactif
+BOT_INFO_CHAN_OPTIONS
+ Options : %s
+BOT_INFO_OPT_DONTKICKOPS
+ Protection des ops
+BOT_INFO_OPT_DONTKICKVOICES
+ Protection des voices
+BOT_INFO_OPT_FANTASY
+ Fantaisie
+BOT_INFO_OPT_GREET
+ Message d'accueil
+BOT_INFO_OPT_NOBOT
+ Pas de bot
+BOT_INFO_OPT_SYMBIOSIS
+ Symbiose
+BOT_INFO_OPT_NONE
+ Aucune
+
+# SET responses
+BOT_SET_SYNTAX
+ SET channel option paramètres
+BOT_SET_DISABLED
+ Désolés, la configuration des options du bot est
+ temporairement désactivée.
+BOT_SET_UNKNOWN
+ Option %s inconnue.
+ Tapez /msg %S HELP SET pour plus d'informations.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET channel DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Le bot ne kickera pas les ops du channel %s.
+BOT_SET_DONTKICKOPS_OFF
+ Le bot kickera les ops du channel %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET channel DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Le bot ne kickera pas les voices du channel %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Le bot kickera les voices du channel %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET channel FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ La fantaisie est maintenant activée sur le channel %s.
+BOT_SET_FANTASY_OFF
+ La fantaisie est maintenant désactivée sur le channel %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET channel GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Le message d'accueil est maintenant activé sur le channel %s.
+BOT_SET_GREET_OFF
+ Le message d'accueil est maintenant désactivé sur le channel %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET channel NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ Le mode sans bot est maintenant activé sur le channel %s.
+BOT_SET_NOBOT_OFF
+ Le mode sans bot est maintenant désactivé sur le channel %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET channel PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Le mode privé du bot %s est maintenant activé.
+BOT_SET_PRIVATE_OFF
+ Le mode privé du bot %s est maintenant désactivé.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET channel SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ La symbiose est maintenant activée sur le channel %s.
+BOT_SET_SYMBIOSIS_OFF
+ La symbiose est maintenant désactivée sur le channel %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK channel option {ON|OFF} [paramètres]
+BOT_KICK_DISABLED
+ Désolés, la configuration des kickers est temporairement
+ désactivée.
+BOT_KICK_UNKNOWN
+ Option %s inconnue.
+ Tapez /msg %S HELP KICK pour plus d'informations.
+BOT_KICK_BAD_TTB
+ %s ne peut être pris comme nombre de fois pour un ban.
+
+BOT_KICK_BADWORDS_ON
+ Le bot kickera maintenant les mots interdits. Utilisez
+ la commande BADWORDS pour ajouter ou supprimer un mot.
+BOT_KICK_BADWORDS_ON_BAN
+ Le bot kickera maintenant les mots interdits, et mettra
+ un ban après %d kicks pour le même utilisateur. Utilisez
+ la commande BADWORDS pour ajouter ou supprimer un mot.
+BOT_KICK_BADWORDS_OFF
+ Le bot ne kickera plus les mots interdits.
+BOT_KICK_BOLDS_ON
+ Le bot kickera maintenant les caractères gras.
+BOT_KICK_BOLDS_ON_BAN
+ Le bot kickera maintenant les caractères gras, et mettra
+ un ban après %d kicks pour le même utilisateur.
+BOT_KICK_BOLDS_OFF
+ Le bot ne kickera plus les caractères gras.
+BOT_KICK_CAPS_ON
+ Le bot kickera maintenant les majuscules (qui doivent
+ constituer au moins %d caractères et %d%% du message
+ entier).
+BOT_KICK_CAPS_ON_BAN
+ Le bot kickera maintenant les majuscules (qui doivent
+ constituer au moins %d caractères et %d%% du message
+ entier), et mettra un ban après %d kicks pour le même
+ utilisateur.
+BOT_KICK_CAPS_OFF
+ Le bot ne kickera plus les majuscules.
+BOT_KICK_COLORS_ON
+ Le bot kickera maintenant les couleurs.
+BOT_KICK_COLORS_ON_BAN
+ Le bot kickera maintenant les couleurs, et mettra
+ un ban après %d kicks pour le même utilisateur.
+BOT_KICK_COLORS_OFF
+ Le bot ne kickera plus les couleurs.
+BOT_KICK_FLOOD_ON
+ Le bot kickera maintenant le flood (%d lignes en %d
+ secondes).
+BOT_KICK_FLOOD_ON_BAN
+ Le bot kickera maintenant le flood (%d lignes en %d
+ secondes), et mettra un ban après %d kicks pour le
+ même utilisateur.
+BOT_KICK_FLOOD_OFF
+ Le bot ne kickera plus le flood.
+BOT_KICK_REPEAT_ON
+ Le bot kickera maintenant les répétitions (les
+ utilisateurs qui disent %d fois la même chose).
+BOT_KICK_REPEAT_ON_BAN
+ Le bot kickera maintenant les répétitions (les
+ utilisateurs qui disent %d fois la même chose), et
+ mettra un ban après %d kicks pour le même utilisateur.
+BOT_KICK_REPEAT_OFF
+ Le bot ne kickera plus les répétitions.
+BOT_KICK_REVERSES_ON
+ Le bot kickera maintenant les reverses.
+BOT_KICK_REVERSES_ON_BAN
+ Le bot kickera maintenant les reverses, et mettra
+ un ban après %d kicks pour le même utilisateur.
+BOT_KICK_REVERSES_OFF
+ Le bot ne kickera plus les reverses.
+BOT_KICK_UNDERLINES_ON
+ Le bot kickera maintenant les caractères soulignés.
+BOT_KICK_UNDERLINES_ON_BAN
+ Le bot kickera maintenant les caractères soulignés,
+ et mettra un ban après %d kicks pour le même
+ utilisateur.
+BOT_KICK_UNDERLINES_OFF
+ Le bot ne kickera plus les caractères soulignés.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS channel {ADD|DEL|LIST|CLEAR} [mot | liste-d'entrées] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Désolés, la modification de la liste des mots interdits
+ est temporairement désactivée.
+BOT_BADWORDS_REACHED_LIMIT
+ Désolés, vous ne pouvez avoir que %d entrées sur la
+ liste des mots interdits.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s existe déjà dans la liste des mots interdits de %s.
+BOT_BADWORDS_ADDED
+ %s ajouté à la liste des mots interdits de %s.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ Entrée (#%d) introuvable sur la liste des mots
+ interdits de %s.
+BOT_BADWORDS_NOT_FOUND
+ %s introuvable sur la liste des mots interdits de %s.
+BOT_BADWORDS_NO_MATCH
+ Aucune entrée correspondante sur la liste des mots interdits
+ de %s.
+BOT_BADWORDS_DELETED
+ %s supprimé de la liste des mots interdits de %s.
+BOT_BADWORDS_DELETED_ONE
+ 1 entrée supprimée de la liste des mots interdits de %s.
+BOT_BADWORDS_DELETED_SEVERAL
+ %d entrées supprimées de la liste des mots interdits de %s.
+BOT_BADWORDS_LIST_EMPTY
+ La liste des mots interdits de %s est vide.
+BOT_BADWORDS_LIST_HEADER
+ Liste des mots interdits de %s:
+ Num Mot Type
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ La liste des mots interdits est maintenant vide.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY channel texte
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT channel texte
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_EXCEPT
+ Utilisateur trouvé dans les excepts.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_BAD_NICK
+ Bot Nicks may only contain valid nick characters.
+BOT_BAD_HOST
+ Bot Hosts may only contain valid host characters.
+BOT_BAD_IDENT
+ Bot Idents may only contain valid characters.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Les Services ne peuvent changer les modes. Vos serveurs sont-ils configurés correctement?
+OPER_BOUNCY_MODES_U_LINE
+ Les Services ne peuvent changer les modes. Les U:lines de vos serveurs sont-elles configurées correctement?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL message
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Option STATS inconnus %s.
+OPER_STATS_CURRENT_USERS
+ Utilisateurs courants: %d (%d ops)
+OPER_STATS_MAX_USERS
+ Utilisateurs maximum: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Les services tournent depuis %d jours, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Les services tournent depuis %d jour, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Les services tournent depuis %d heures, %d minutes
+OPER_STATS_UPTIME_HM1S
+ Les services tournent depuis %d heures, %d minutes
+OPER_STATS_UPTIME_H1MS
+ Les services tournent depuis %d heures, %d minute
+OPER_STATS_UPTIME_H1M1S
+ Les services tournent depuis %d heures, %d minute
+OPER_STATS_UPTIME_1HMS
+ Les services tournent depuis %d heure, %d minutes
+OPER_STATS_UPTIME_1HM1S
+ Les services tournent depuis %d heure, %d minutes
+OPER_STATS_UPTIME_1H1MS
+ Les services tournent depuis %d heure, %d minute
+OPER_STATS_UPTIME_1H1M1S
+ Les services tournent depuis %d heure, %d minute
+OPER_STATS_UPTIME_MS
+ Les services tournent depuis %d minutes, %d secondes
+OPER_STATS_UPTIME_M1S
+ Les services tournent depuis %d minutes, %d seconde
+OPER_STATS_UPTIME_1MS
+ Les services tournent depuis %d minute, %d secondes
+OPER_STATS_UPTIME_1M1S
+ Les services tournent depuis %d minute, %d seconde
+OPER_STATS_BYTES_READ
+ Octets lus : %5d ko
+OPER_STATS_BYTES_WRITTEN
+ Octets écrits : %5d ko
+OPER_STATS_USER_MEM
+ Utilisateur : %6d enregistrements, %5d ko
+OPER_STATS_CHANNEL_MEM
+ Channel : %6d enregistrements, %5d ko
+OPER_STATS_GROUPS_MEM
+ Groupes NS : %6d enregistrements, %5d ko
+OPER_STATS_ALIASES_MEM
+ Aliases NS : %6d enregistrements, %5d ko
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d enregistrements, %5d ko
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d enregistrements, %5d ko
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d enregistrements, %5d ko
+OPER_STATS_SESSIONS_MEM
+ Sessions : %6d enregistrements, %5d ko
+OPER_STATS_PROXY_MEM
+ Proxies : %6d enregistrements, %5d ko
+OPER_STATS_AKILL_COUNT
+ Nombre d'AKILLs actuel: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Temps d'échéance des AKILLs par défaut: %d jours
+OPER_STATS_AKILL_EXPIRE_DAY
+ Temps d'échéance des AKILLs par défaut: 1 jour
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Temps d'échéance des AKILLs par défaut: %d heures
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Temps d'échéance des AKILLs par défaut: 1 heure
+OPER_STATS_AKILL_EXPIRE_MINS
+ Temps d'échéance des AKILLs par défaut: %d minutes
+OPER_STATS_AKILL_EXPIRE_MIN
+ Temps d'échéance des AKILLs par défaut: 1 minute
+OPER_STATS_AKILL_EXPIRE_NONE
+ Temps d'échéance des AKILLs par défaut: Pas d'échéance
+OPER_STATS_SGLINE_COUNT
+ Nombre de SGLINEs actuel: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Temps d'échéance des SGLINEs par défaut: %d jours
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Temps d'échéance des SGLINEs par défaut: 1 jour
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Temps d'échéance des SGLINEs par défaut: %d heures
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Temps d'échéance des SGLINEs par défaut: 1 heure
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Temps d'échéance des SGLINEs par défaut: %d minutes
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Temps d'échéance des SGLINEs par défaut: 1 minute
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Temps d'échéance des SGLINEs par défaut: Pas d'échéance
+OPER_STATS_SQLINE_COUNT
+ Nombre de SQLINEs actuel: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Temps d'échéance des SQLINEs par défaut: %d jours
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Temps d'échéance des SQLINEs par défaut: 1 jour
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Temps d'échéance des SQLINEs par défaut: %d heures
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Temps d'échéance des SQLINEs par défaut: 1 heure
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Temps d'échéance des SQLINEs par défaut: %d minutes
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Temps d'échéance des SQLINEs par défaut: 1 minute
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Temps d'échéance des SQLINEs par défaut: Pas d'échéance
+OPER_STATS_SZLINE_COUNT
+ Nombre de SZLINEs actuel: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Temps d'échéance des SZLINEs par défaut: %d jours
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Temps d'échéance des SZLINEs par défaut: 1 jour
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Temps d'échéance des SZLINEs par défaut: %d heures
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Temps d'échéance des SZLINEs par défaut: 1 heure
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Temps d'échéance des SZLINEs par défaut: %d minutes
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Temps d'échéance des SZLINEs par défaut: 1 minute
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Temps d'échéance des SZLINEs par défaut: Pas d'échéance
+OPER_STATS_RESET
+ Statistiques réinitialisées.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE channel modes
+
+# CLEARMODES responses
+OPER_UMODE_SYNTAX
+ UMODE nick modes
+
+# OLINE responses
+OPER_UMODE_SUCCESS
+ Mode de %s changés.
+OPER_UMODE_CHANGED
+ %s a changé vos modes.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flags
+OPER_OLINE_SUCCESS
+ Une O:LINE avec les flags %s a été ajoutée pour %s.
+
+# CLEARMODES responses
+OPER_OLINE_IRCOP
+ Vous êtes maintenant IRCOp.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES channel [ALL]
+OPER_CLEARMODES_DONE
+ Les modes binaires et les bans sont supprimés de %s.
+OPER_CLEARMODES_ALL_DONE
+ Tous les modes supprimés du channel %s.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK channel utilisateur raison
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick newnick
+OPER_SVSNICK_NEWNICK
+ The nick %s is now being changed to %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+OPER_ADMIN_SKELETON
+ Les services sont en mode skeleton; la commande ADMIN n'est pas disponible.
+OPER_ADMIN_EXISTS
+ %s est déjà sur la liste des Services admins.
+OPER_ADMIN_REACHED_LIMIT
+ Vous ne pouvez avoir que %d Services admins.
+OPER_ADMIN_ADDED
+ %s a été ajouté à la liste des Services admins.
+OPER_ADMIN_NOT_FOUND
+ %s est introuvable sur la liste des Services admins.
+OPER_ADMIN_NO_MATCH
+ Aucune entrée correspondante sur la liste des Services admins.
+OPER_ADMIN_DELETED
+ %s a été supprimé de la liste des Services admins.
+OPER_ADMIN_DELETED_ONE
+ 1 entrée a été supprimée de la liste des Services admins.
+OPER_ADMIN_DELETED_SEVERAL
+ %d entrées ont été supprimées de la liste des Services admins.
+OPER_ADMIN_LIST_EMPTY
+ La liste des Services admins est vide.
+OPER_ADMIN_LIST_HEADER
+ Liste des Services admins:
+ Num Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ La liste des Services admins a été vidée.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+OPER_OPER_SKELETON
+ Les services sont en mode skeleton; la commande OPER n'est pas disponible.
+OPER_OPER_EXISTS
+ %s est déjà sur la liste des Services operators.
+OPER_OPER_REACHED_LIMIT
+ Vous ne pouvez avoir que %d Services operators.
+OPER_OPER_ADDED
+ %s a été ajouté à la liste des Services operators.
+OPER_OPER_NOT_FOUND
+ %s est introuvable sur la liste des Services operators.
+OPER_OPER_NO_MATCH
+ Aucune entrée correspondante sur la liste des Services operators.
+OPER_OPER_DELETED
+ %s a été supprimé de la liste des Services operators.
+OPER_OPER_DELETED_ONE
+ 1 entrée a été supprimée de la liste des Services operators.
+OPER_OPER_DELETED_SEVERAL
+ %d entrées ont été supprimées de la liste des Services operators.
+OPER_OPER_LIST_EMPTY
+ La liste des Services operators est vide.
+OPER_OPER_LIST_HEADER
+ Liste des Services operators:
+ Num Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ La liste des Services operators a été vidée.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+échéance] {masque | liste d'entrées} [raison]]
+OPER_AKILL_EXISTS
+ %s existe déjà sur la liste d'AKILL.
+OPER_AKILL_ALREADY_COVERED
+ %s est déjà couvert par %s.
+OPER_AKILL_REACHED_LIMIT
+ Désolé, vous ne pouvez avoir que %d AKILLs.
+OPER_AKILL_NO_NICK
+ Rappel: les masques AKILL ne peuvent contenir de nick; assurez vous que vous n'avez pas mis de partie nick dans le masque.
+OPER_AKILL_ADDED
+ %s ajouté à la liste d'AKILL.
+OPER_AKILL_CHANGED
+ L'échéance de %s a été changée.
+OPER_AKILL_NOT_FOUND
+ %s introuvable sur la liste d'AKILL.
+OPER_AKILL_NO_MATCH
+ Aucune entrée correspondante sur la liste d'AKILL.
+OPER_AKILL_DELETED
+ %s supprimé de la liste d'AKILL.
+OPER_AKILL_DELETED_ONE
+ 1 entrée supprimée de la liste d'AKILL.
+OPER_AKILL_DELETED_SEVERAL
+ %d entrées supprimées de la liste d'AKILL.
+OPER_AKILL_LIST_EMPTY
+ La liste d'AKILL est vide.
+OPER_AKILL_LIST_HEADER
+ Liste d'AKILL actuelle:
+ Num Masque Raison
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Liste d'AKILL actuelle:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (par %s le %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ La liste d'AKILL a été vidée.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+échéance] {masque | liste d'entrées} [raison]]
+OPER_SGLINE_UNSUPPORTED
+ Désolé, SGLINE n'est pas disponible sur ce réseau.
+OPER_SGLINE_EXISTS
+ %s existe déjà sur la liste de SGLINEs.
+OPER_SGLINE_ALREADY_COVERED
+ %s est déjà couvert par %s.
+OPER_SGLINE_REACHED_LIMIT
+ Désolé, vous ne pouvez avoir que %d SGLINEs.
+OPER_SGLINE_ADDED
+ %s ajouté à la liste de SGLINEs.
+OPER_SGLINE_CHANGED
+ L'échéance de %s a été changée.
+OPER_SGLINE_NOT_FOUND
+ %s introuvable sur la liste de SGLINEs.
+OPER_SGLINE_NO_MATCH
+ Aucune entrée correspondante sur la liste de SGLINEs.
+OPER_SGLINE_DELETED
+ %s supprimé de la liste de SGLINEs.
+OPER_SGLINE_DELETED_ONE
+ 1 entrée supprimée de la liste de SGLINEs.
+OPER_SGLINE_DELETED_SEVERAL
+ %d entrées supprimées de la liste de SGLINEs.
+OPER_SGLINE_LIST_EMPTY
+ La liste de SGLINEs est vide.
+OPER_SGLINE_LIST_HEADER
+ Liste de SGLINEs actuelle:
+ Num Masque Raison
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Liste de SGLINEs actuelle:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (par %s le %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ La liste de SGLINEs a été vidée.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+échéance] {masque | liste d'entrées}[:raison]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Les SQLINEs de channels ne sont pas supportés par votre serveur, vous ne pouvez donc pas les utiliser.
+OPER_SQLINE_EXISTS
+ %s existe déjà sur la liste de SQLINEs.
+OPER_SQLINE_ALREADY_COVERED
+ %s est déjà couvert par %s.
+OPER_SQLINE_REACHED_LIMIT
+ Désolé, vous ne pouvez avoir que %d SQLINEs.
+OPER_SQLINE_ADDED
+ %s ajouté à la liste de SQLINEs.
+OPER_SQLINE_CHANGED
+ L'échéance de %s a été changée.
+OPER_SQLINE_NOT_FOUND
+ %s introuvable sur la liste de SQLINEs.
+OPER_SQLINE_NO_MATCH
+ Aucune entrée correspondante sur la liste de SQLINEs.
+OPER_SQLINE_DELETED
+ %s supprimé de la liste de SQLINEs.
+OPER_SQLINE_DELETED_ONE
+ 1 entrée supprimée de la liste de SQLINEs.
+OPER_SQLINE_DELETED_SEVERAL
+ %d entrées supprimées de la liste de SQLINEs.
+OPER_SQLINE_LIST_EMPTY
+ La liste de SQLINEs est vide.
+OPER_SQLINE_LIST_HEADER
+ Liste de SQLINEs actuelle:
+ Num Masque Raison
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Liste de SQLINEs actuelle:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (par %s le %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ La liste de SQLINEs a été vidée.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+échéance] {masque | liste d'entrées} [raison]]
+OPER_SZLINE_UNSUPPORTED
+ Désolé, SZLINE n'est pas disponible sur ce réseau.
+OPER_SZLINE_EXISTS
+ %s existe déjà sur la liste de SZLINEs.
+OPER_SZLINE_ALREADY_COVERED
+ %s est déjà couvert par %s.
+OPER_SZLINE_REACHED_LIMIT
+ Désolé, vous ne pouvez avoir que %d SZLINEs.
+OPER_SZLINE_ONLY_IPS
+ Rappel: vous ne pouvez ajouter que des masques d'IP à la liste de SZLINEs.
+OPER_SZLINE_ADDED
+ %s ajouté à la liste de SZLINEs.
+OPER_SZLINE_CHANGED
+ L'échéance de %s a été changée.
+OPER_SZLINE_NOT_FOUND
+ %s introuvable sur la liste de SZLINEs.
+OPER_SZLINE_NO_MATCH
+ Aucune entrée correspondante sur la liste de SZLINEs.
+OPER_SZLINE_DELETED
+ %s supprimé de la liste de SZLINEs.
+OPER_SZLINE_DELETED_ONE
+ 1 entrée supprimée de la liste de SZLINEs.
+OPER_SZLINE_DELETED_SEVERAL
+ %d entrées supprimées de la liste de SZLINEs.
+OPER_SZLINE_LIST_EMPTY
+ La liste de SZLINEs est vide.
+OPER_SZLINE_LIST_HEADER
+ Liste de SZLINEs actuelle:
+ Num Masque Raison
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Liste de SZLINEs actuelle:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (par %s le %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ La liste de SZLINEs a été vidée.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET option valeur
+OPER_SET_IGNORE_ON
+ Le code d'ignore sera utilisé.
+OPER_SET_IGNORE_OFF
+ Le code d'ignore ne sera pas utilisé.
+OPER_SET_IGNORE_ERROR
+ La valeur pour IGNORE doit être ON ou OFF.
+OPER_SET_READONLY_ON
+ Les Services sont maintenant en mode lecture-seule.
+OPER_SET_READONLY_OFF
+ Les Services sont maintenant en mode lecture-écriture.
+OPER_SET_READONLY_ERROR
+ La valeur pour READONLY doit être ON ou OFF.
+OPER_SET_LOGCHAN_ON
+ Services is now reporting log messages to %s.
+OPER_SET_LOGCHAN_OFF
+ Services is no longer reporting log messages to a channel.
+OPER_SET_LOGCHAN_ERROR
+ Setting for LOGCHAN must be ON or OFF and LogChannel must be defined.
+OPER_SET_DEBUG_ON
+ Les Services sont maintenant en debug mode.
+OPER_SET_DEBUG_OFF
+ Les Services sont maintenant en non-debug mode.
+OPER_SET_DEBUG_LEVEL
+ Les Services sont maintenant en debug mode (level %d).
+OPER_SET_DEBUG_ERROR
+ La valeur pour DEBUG doit être ON, OFF, ou un nombre positif.
+OPER_SET_NOEXPIRE_ON
+ Les Services sont maintenant en mode sans expiration.
+OPER_SET_NOEXPIRE_OFF
+ Les Services sont maintenant en mode expiration.
+OPER_SET_NOEXPIRE_ERROR
+ La valeur de NOEXPIRE doit être ON ou OFF.
+OPER_SET_UNKNOWN_OPTION
+ Option inconnue %s.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} serveur
+OPER_NOOP_SET
+ Toutes les O:lines de %s ont été supprimées.
+OPER_NOOP_REVOKE
+ Toutes les O:lines de %s ont été réinitialisées.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE nomduserveur [raison]
+
+# RAW responses
+OPER_JUPE_HOST_ERROR
+ Please use a valid server name when juping
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW texte
+
+# UPDATE responses
+OPER_UPDATING
+ Mise à jour des bases de données.
+
+# RELOAD responses
+OPER_RELOAD
+ Le fichier de configuration des Services a été rechargé.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN non défini; impossible de redémarrer redémarrer.
+ Relancez le script \2configure\2 et recompilez les Services pour
+ activer la commande RESTART.
+
+# LISTIGNORE responses
+OPER_IGNORE_SYNTAX
+ Syntaxe: IGNORE {ADD|DEL|LIST|CLEAR} [durée] [pseudo]
+OPER_IGNORE_VALID_TIME
+ Vous devez entrer une durée valide
+OPER_IGNORE_TIME_DONE
+ %s est ignoré pour %s.
+OPER_IGNORE_PERM_DONE
+ %s est ignoré permanent.
+OPER_IGNORE_DEL_DONE
+ %s n'est plus ignoré
+OPER_IGNORE_LIST
+ Liste des ignores:
+OPER_IGNORE_LIST_NOMATCH
+ %s n'a pas été trouvé dans la liste des ignores.
+OPER_IGNORE_LIST_EMPTY
+ L'ignore list est vide.
+
+# KILLCLONES responses
+OPER_IGNORE_LIST_CLEARED
+ Ignore liste purgée.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Impossible de trouver l'utilisateur %s.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Liste des channels:
+ Nom Users Modes Topic
+OPER_CHANLIST_HEADER_USER
+ Liste des channels de %s:
+ Nom Users Modes Topic
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ Fin de la liste des channels.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Liste des utilisateurs:
+ Nick Masque
+OPER_USERLIST_HEADER_CHAN
+ Liste des utilisateurs de %s:
+ Nick Masque
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Fin de la liste des utilisateurs.
+
+# CACHE responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {hostname | pattern} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ La détection de proxies est désactivée.
+OPER_CACHE_NOT_FOUND
+ %s n'a pas été trouvé dans le cache.
+OPER_CACHE_REMOVED
+ %s a été supprimé du cache.
+OPER_CACHE_HEADER
+ Nom d'hôte Status
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ Fin de la liste - %d/%d correspondances affichées.
+OPER_CACHE_QUEUED
+ En attente
+OPER_CACHE_PROGRESS
+ En cours
+OPER_CACHE_NORMAL
+ Normal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ Proxy HTTP
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ON
+ Vous êtes maintenant SuperAdmin.
+OPER_SUPER_ADMIN_OFF
+ Vous n'êtes plus SuperAdmin
+OPER_SUPER_ADMIN_SYNTAX
+ Syntaxe incorrect, spécifiez ON ou OFF.
+OPER_SUPER_ADMIN_WALL_ON
+ %s est maintenant SuperAdmin
+OPER_SUPER_ADMIN_WALL_OFF
+ %s n'est plus SuperAdmin
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ONLY
+ Seulement les SuperAdmins peuvent utiliser cette commande.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ This service is temporarly disabled, please try again later
+OPER_DEFCON_NO_CONF
+ The Defcon system must be enabled in the services.conf file
+OPER_DEFCON_CHANGED
+ Services are now at DEFCON %d
+OPER_DEFCON_WALL
+ %s Changed the DEFCON level to %d
+DEFCON_GLOBAL
+ The Defcon Level is now at Level: %d
+
+# Modules strings
+
+OPER_MODULE_LOADED
+ Module %s loaded
+OPER_MODULE_UNLOADED
+ Module %s unloaded
+OPER_MODULE_LOAD_FAIL
+ Unable to load module %s
+OPER_MODULE_REMOVE_FAIL
+ Unable to remove module %s
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST
+ Module: %s
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Providing IRCD handler for: %s
+OPER_MODULE_NO_LIST
+ No modules currently loaded
+OPER_MODULE_NO_INFO
+ No information about module %s is available
+OPER_MODULE_INFO_SYNTAX
+ MODINFO FileName
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ The following commands have been loaded by a module:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [paramètres]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+échéance] mask limite raison
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {mask | liste}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE num position
+OPER_EXCEPTION_DISABLED
+ La limitation de sessions est désactivée.
+OPER_EXCEPTION_ALREADY_PRESENT
+ Le mask %s est déjà présent sur la liste d'exceptions.
+OPER_EXCEPTION_TOO_MANY
+ La liste des exceptions à la limitation de sessions est pleine!
+OPER_EXCEPTION_ADDED
+ La limite de sessions de %s est maintenant de %d.
+OPER_EXCEPTION_MOVED
+ L'exception pour %s (#%d) a été déplacée à la position %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ L'entrée %d n'existe pas sur la liste des exceptions à la limitation de sessions.
+OPER_EXCEPTION_NOT_FOUND
+ %s non trouvé sur la liste des exceptions à la limitation de sessions.
+OPER_EXCEPTION_NO_MATCH
+ Aucune entrée correspondante sur la liste des exceptions à la limitation de sessions.
+OPER_EXCEPTION_DELETED
+ %s supprimé de la liste des exceptions à la limitation de sessions.
+OPER_EXCEPTION_DELETED_ONE
+ 1 entrée supprimée de la liste des exceptions à la limitation de sessions.
+OPER_EXCEPTION_DELETED_SEVERAL
+ %d entrées supprimées de la liste des exceptions à la limitation de sessions.
+OPER_EXCEPTION_LIST_HEADER
+ Liste actuelle des exceptions à la limitation de sessions:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Num Limite Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (par %s le %s; %s)
+ Limite: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Limite de session invalide. Elle doit être un entier valide supérieur ou égal à zero et plus petit que %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Hostmask invalide. Seuls les hostmasks réels sont valides puisque les exceptions ne sont pas comparés aux nicks et usernames.
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST limite | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST limite
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ La limitation de session est désactivée.
+OPER_SESSION_INVALID_THRESHOLD
+ Valeur minimale invalide. Elle doit être un entier valide supérieur à 1.
+OPER_SESSION_NOT_FOUND
+ %s introuvable sur la liste des sessions.
+OPER_SESSION_LIST_HEADER
+ Hosts ayant au moins %d sessions:
+OPER_SESSION_LIST_COLHEAD
+ Sessions Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ L'host %s a actuellement %d sessions avec une limite de %d.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Syntax: EXCEPTION ADD [+échéance] mask limite raison
+ EXCEPTION DEL {mask | liste}
+ EXCEPTION MOVE num position
+ EXCEPTION LIST [mask | liste]
+ EXCEPTION VIEW [mask | liste]
+
+ Permet aux Services admins de manipuler la liste des hosts qui
+ ont des limites de session spécifiques - autoriser certaines
+ machines, telles que des servers de shell, pour supporter plus
+ que le nombre de clients par défaut à la fois. Une fois qu'une
+ host atteint sa limite de session, tous les clients essayant
+ de se connecter de cette host seront déconnectés. Avant que
+ l'utilisateur ne soit déconnecté, ils sont avertis, par un
+ /NOTICE de %S, de l'endroit où ils pourront trouver de
+ l'aide concernant la limitation de session. Le contenu de cette
+ notice est une option de configuration.
+
+ EXCEPTION ADD ajoute le mask donné à la liste des exceptions.
+ Notez que les masks nick!user@host et user@host sont
+ invalides! Seuls les masks d'host réels, tels que box.host.dom
+ et *.host.dom, sont autorisés parce que la limitation de sessions
+ ne prend pas en compte le nick ou l'username. limit doit être un
+ nombre supérieur ou égal à zero. Ceci détermine combien de sessions
+ sont supportées à la fois. Une valeur de zero signifie que l'host
+ a une limite de sessions illimitée. Consultez l'aide de AKILL pour
+ les détails sur le format du paramètre optionnel échéance.
+ EXCEPTION DEL supprime le mask donné de la liste des exceptions.
+ EXCEPTION MOVE déplace l'exception num vers position. Les
+ exceptions se trouvant entre seront déplacées vers le haut ou le
+ bas pour combler le trou.
+ EXCEPTION LIST et EXCEPTION VIEW montrent toutes les
+ exceptions actuelles; si un mask optionnel est donné, la liste
+ est limitée aux exceptions correspondantes au mask. La différence
+ est que EXCEPTION VIEW est plus informative, puisqu'elle affiche
+ également le nick de la personne qui a ajouté l'exception, sa
+ limite de sessions, la raison, le mask ainsi que la date d'échéance.
+
+ Notez qu'un client se connectant "utilisera" la première
+ exception à laquelle leur host correspond. Les
+ grandes listes d'exception et les exceptions utilisant
+ excessivement les wildcards entrainent une dégradation des
+ performances des Services.
+
+ Réservée Services admins.
+
+OPER_HELP_SESSION
+ Syntax: SESSION LIST minimal
+ SESSION VIEW host
+
+ Permet aux Services admins de voir la liste des sessions.
+
+ SESSION LIST liste les hosts ayant au minimum minimal
+ sessions. La limite minimale doit être un nombre supérieur à
+ 1. Ceci pour prévenir d'un listing accidentel d'un large
+ nombre d'hosts à session unique.
+
+ SESSION VIEW affiche des informations détaillées sur une
+ host spécifique - comprenant le nombre de sessions actuelles
+ ainsi que la limite de sessions. La valeur host ne doit
+ pas contenir de wildcards.
+
+ Consultez l'aide de EXCEPTION pour plus d'informations
+ concernant la limitation et comment définir les limites de
+ sessions pour certaines hosts et groupes.
+
+ Réservée aux Services admins.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Displays all Services Staff nicks along with level
+ and on-line status.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ The defcon system can be used to implement a pre-defined
+ set of restrictions to services useful during an attemtped
+ attack on the network.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * No new channel registrations
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * No new nick registrations
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * No MLOCK changes
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Force Chan Modes (%s) to be set on all channels
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Use the reduced session limit of %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill any NEW clients connecting
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignore any non-opers with message
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Silently ignore non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL any new clients connecting
+
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * No new memos sent
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+expiry] channel reason
+
+ Puts an AKILL for every nick on the specified channel. It
+ uses the entire and complete real ident@host for every nick,
+ then enforces the AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Logon News - %s] %s
+NEWS_OPER_TEXT
+ [Oper News - %s] %s
+
+NEWS_RANDOM_TEXT
+ [Random News - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Syntaxe: LOGONNEWS {ADD|DEL|LIST} [texte|nombre]
+NEWS_LOGON_LIST_HEADER
+ Articles des logon news:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s par %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ Il n'y a pas de logon news.
+NEWS_LOGON_ADD_SYNTAX
+ Syntaxe: LOGONNEWS ADD texte
+NEWS_LOGON_ADD_FULL
+ News list pleine!
+NEWS_LOGON_ADDED
+ Ajouté un nouvel article de logon news (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Syntaxe: LOGONNEWS DEL {num | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Article de logon news #%d non trouvé!
+NEWS_LOGON_DELETED
+ Article de logon news #%d supprimé.
+NEWS_LOGON_DEL_NONE
+ Aucun article de logon news à supprimer!
+NEWS_LOGON_DELETED_ALL
+ Tous les articles de logon news supprimés.
+
+NEWS_OPER_SYNTAX
+ Syntaxe: OPERNEWS {ADD|DEL|LIST} [texte|nombre]
+NEWS_OPER_LIST_HEADER
+ Articles oper news:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s par %s)
+ %s
+NEWS_OPER_LIST_NONE
+ Il n'y a pas d'oper news.
+NEWS_OPER_ADD_SYNTAX
+ Syntaxe: OPERNEWS ADD texte
+NEWS_OPER_ADD_FULL
+ News list pleine!
+NEWS_OPER_ADDED
+ Ajouté un nouvel article d'oper news (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Syntaxe: OPERNEWS DEL {num | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Article oper news #%d non trouvé!
+NEWS_OPER_DELETED
+ Article oper news #%d supprimé.
+NEWS_OPER_DEL_NONE
+ Pas d'articles oper news à supprimer!
+NEWS_OPER_DELETED_ALL
+ Tous les articles oper news supprimés.
+
+NEWS_RANDOM_SYNTAX
+ Syntaxe: RANDOMNEWS {ADD|DEL|LIST} [texte|nombre]
+NEWS_RANDOM_LIST_HEADER
+ Nouvelles aléatoires:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s par %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Il n'y a pas de nouvelles aléatoires.
+NEWS_RANDOM_ADD_SYNTAX
+ Syntaxe: RANDOMNEWS ADD texte
+NEWS_RANDOM_ADD_FULL
+ La liste de nouvelles est pleine!
+NEWS_RANDOM_ADDED
+ Nouvelle aléatoire ajoutée (n°%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Syntaxe: RANDOMNEWS DEL {num | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Nouvelle aléatoire n°%d non trouvée!
+NEWS_RANDOM_DELETED
+ Nouvelle aléatoire n°%d supprimée.
+NEWS_RANDOM_DEL_NONE
+ Aucune nouvelle aléatoire à supprimer!
+NEWS_RANDOM_DELETED_ALL
+ Toutes les nouvelles aléatoires ont été supprimés.
+
+NEWS_HELP_LOGON
+ Syntaxe: LOGONNEWS ADD texte
+ LOGONNEWS DEL {nombre | ALL}
+ LOGONNEWS LIST
+
+ Edite ou affiche la liste de messages logon news. Lorsqu'un
+ utilisateur se connecte au réseau, ces messages leur seront
+ envoyés. (Cependant, pas plus de trois messages ne seront
+ envoyés pour éviter le flood des utilisateurs. Si il y a
+ plus de trois messages de news, seuls les trois plus récents
+ seront envoyés.)
+
+ LOGONNEWS LIST peut être utilisée par tout IRC operator pour
+ lister les messages de news courants. ADD et DEL peuvent
+ uniquement être utilisés par les Services admins.
+
+NEWS_HELP_OPER
+ Syntaxe: OPERNEWS ADD texte
+ OPERNEWS DEL {nombre | ALL}
+ OPERNEWS LIST
+
+ Edite ou affiche la liste des messages oper news. Quand un
+ utilisateur utilise la commande /OPER, ces messages lui seront
+ envoyés. (Cependant, pas plus de trois messages ne seront
+ envoyés afin de ne pas flooder l'utilisateur. Si il y a plus
+ de trois messages news, seuls les trois plus récents seront
+ envoyés.)
+
+ OPERNEWS LIST peut être utilisée par tout IRC operator pour
+ lister les messages oper news actuels. ADD et DEL peuvent
+ uniquement être utilisées par les Services admins.
+
+NEWS_HELP_RANDOM
+ Syntaxe: RANDOMNEWS ADD texte
+ RANDOMNEWS DEL {nombre | ALL}
+ RANDOMNEWS LIST
+
+ Edite ou affiche la liste des nouvelles aléatoires. Lorsqu'un
+ utilisateur se connecte au réseau, une (et une seule) de ces
+ nouvelles sera choisie et lui sera envoyée.
+
+ RANDOMNEWS LIST peut être utilisée par tout opérateur IRC pour
+ lister les nouvelles aléatoires actuellement définies. ADD et
+ DEL ne peuvent être utilisés que par les administrateurs des
+ services.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S est un service conçu pour donner des informations
+ sur les Services. Les rubriques d'aide des Services sont
+ accessibles par les commandes HELP des différents Services:
+
+ /msg %s HELP
+ pour des informations sur l'enregistrement des nicks
+
+ /msg %s HELP
+ pour des informations sur l'enregistrement et le
+ contrôle des channels
+
+ /msg %s HELP
+ pour des informations sur l'envoi de messages aux
+ utilisateurs non connectés
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ pour des informations sur l'installation d'un bot
+ sur votre channel
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ %S vous permet d'enregistrer un nick et d'empêcher les
+ autres de l'utiliser. Les commandes suivantes
+ permettent l'enregistrement et la gestion des nicks; pour
+ les utiliser, tapez /msg %S commande. Pour plus
+ d'informations sur une certaine commande, tapez
+ /msg %S HELP commande.
+
+ REGISTER Enregistre un nick
+ GROUP Joint un groupe
+ IDENTIFY Vous identifie avec votre mot de passe
+ ACCESS Modifie la liste des adresses autorisées
+ SET Configure les options, protection comprise
+ DROP Annule l'enregistrement d'un nick
+ RECOVER Change le nick d'un utilisateur qui a pris
+ votre nick
+ RELEASE Pour reprendre la tutelle de votre nick
+ après un RECOVER
+ SENDPASS A utiliser en cas de perte de mot de passe
+
+ Autres commandes: GHOST, INFO, GLIST, LIST, LOGOUT, STATUS
+
+ REMARQUE: Ce service est conçu pour fournir un moyen aux
+ utilisateurs IRC d'assurer que leur identité n'est pas
+ usurpée. Il n'est PAS destiné à faciliter le "vol" des
+ nicks ou autres choses de ce genre. L'abus de %S entraînera,
+ au minimum, la perte du(des) nick(s) faisant l'objet de
+ l'abus.
+
+NICK_HELP_EXPIRES
+
+ Les nicks qui ne sont plus utilisés sont sujets à
+ l'expiration automatique, c'est-à-dire qu'ils seront effacés
+ après %d jours de non utilisation.
+
+NICK_HELP_REGISTER
+ Syntaxe: REGISTER motdepasse [email]
+
+ Enregistre votre nick dans la base de données de %S. Une fois
+ que votre nick est enregistré, vous pouvez utiliser les
+ commandes SET et ACCESS pour configurer votre nick comme
+ vous le souhaitez. Rappelez vous bien du mot de passe utilisé
+ pendant l'enregistrement - vous en aurez besoin pour effectuer
+ des changements sur votre nick plus tard. (Notez que ANOPE,
+ Anope, et anope sont tous des passwords différents!)
+
+ Conseils pour choisir un mot de passe:
+
+ Les mots de passe ne doivent pas être trop facilement
+ devinables. Par exemple, utiliser votre vrai nom comme
+ mot de passe est une mauvaise idée. Utiliser votre nick
+ comme mot de passe est une idée encore pire ;) et, en
+ fait, %S ne le permettra pas. De même, les mots de passe
+ courts sont vulnérables aux recherches méthodiques,
+ donc vous devez choisir un mot de passe d'au moins
+ 5 caractères. Enfin, le caractère espace ne peut être
+ utilisé dans les mots de passe.
+
+ Le paramètre email est optionnel et permet de définir
+ un e-mail immédiatement. Toutefois, il peut être obligatoire
+ sur certains réseaux.
+ Votre vie privée est respectée; cet e-mail ne sera pas
+ divulgué à des tierces personnes.
+
+ Cette commande crée également un nouveau groupe pour votre
+ nick. Celui-ci vous permettra plus tard d'enregistrer
+ d'autres nicks en bénéficiant de la même configuration,
+ du même jeu de memos, et des même privilèges sur vos
+ channels. Pour plus d'information sur cette fonction,
+ tapez /msg %S HELP GROUP.
+
+NICK_HELP_GROUP
+ Syntaxe: GROUP cible motdepasse
+
+ Cette commande joint votre nick au groupe du nick cible.
+ motdepasse est le mot de passe du nick cible.
+
+ Joindre un groupe vous permettra de partager votre configuration,
+ vos memos et vos privilèges de channel avec tous les nicks
+ du groupe, et bien plus encore!
+
+ Un groupe existe tant qu'il est utile. Cela signifie que même
+ si un des nicks du groupe est effacé, les éléments partagés
+ sus-nommés sont conservés pour peu qu'il reste d'autres nicks
+ dans le groupe.
+
+ Il est préférable d'utiliser cette commande avec un nick
+ non enregistré puisqu'il sera automatiquement enregistré
+ lorsque vous utiliserez cette commande. Vous pouvez l'utiliser
+ avec un nick enregistré (pour changer votre groupe) uniquement
+ si vos administrateurs l'autorisent. (/msg %S HELP
+ IDENTIFY pour plus d'informations).
+
+ Vous ne pouvez être que dans un groupe à la fois. La fusion
+ de groupes n'est pas possible.
+
+ Note: tous les nicks du groupe ont le même mot de passe.
+
+NICK_HELP_IDENTIFY
+ Syntaxe: IDENTIFY motdepasse
+
+ Informe %S que vous êtes vraiment le propriétaire de
+ ce nick. Beaucoup de commandes demandent que vous soyez
+ identifié avec cette commande avant de les utiliser. Le
+ mot de passe est celui que vous avez donné avec la commande
+ REGISTER.
+
+NICK_HELP_UPDATE
+ Syntax: UPDATE
+
+ Updates your current status, i.e. it checks for new memos,
+ sets needed chanmodes (ModeonID) and updates your vhost and
+ your userflags (lastseentime, etc).
+
+NICK_HELP_LOGOUT
+ Syntaxe: LOGOUT
+
+ Cette commande inverse l'effet de la commande IDENTIFY,
+ c'est-à-dire qu'elle fait en sorte que vous ne soyez plus
+ reconnu en tant que propriétaire réel du nick. Notez
+ cependant que l'on ne vous demandera pas de vous réidentifier.
+
+NICK_HELP_DROP
+ Syntaxe: DROP [nick]
+
+ Efface votre nick de la base de données de %S. Un nick
+ qui a été effacé est libre d'être réenregistré par
+ n'importe qui.
+
+ Vous pouvez effacer un nick de votre groupe en le mettant
+ dans le paramètre nick.
+
+ Pour utiliser cette commande, vous devez d'abord vous
+ identifier avec votre mot de passe (/msg %S HELP
+ IDENTIFY pour plus d'informations).
+
+NICK_HELP_ACCESS
+ Syntaxe: ACCESS ADD mask
+ ACCESS DEL mask
+ ACCESS LIST
+
+ Modifie ou affiche la liste d'accès de votre nick. C'est
+ la liste des adresses qui seront automatiquement reconnues
+ par %S comme autorisées à utiliser le nick. Si vous voulez
+ utiliser le nick depuis une adresse différente, vous devez
+ envoyer une commande IDENTIFY pour que %S vous reconnaisse.
+
+ Exemples:
+
+ ACCESS ADD anyone@*.bepeg.com
+ Autorise l'accès à l'utilisateur anyone d'une
+ machine avec le domaine bepeg.com.
+
+ ACCESS DEL anyone@*.bepeg.com
+ Inverse la commande précédente.
+
+ ACCESS LIST
+ Affiche votre liste d'accès.
+
+NICK_HELP_SET
+ Syntaxe: SET option paramètres
+
+ Configure diverses options du nick. option peut être:
+
+ DISPLAY Change l'affichage de votre groupe
+ dans les services
+ PASSWORD Change le mot de passe de votre nick
+ LANGUAGE Change la langue dans laquelle les Services
+ vous envoient leurs messages
+ URL Associe une adresse de site à votre nick
+ EMAIL Associe un e-mail à votre nick
+ ICQ Associe un numéro ICQ à votre nick
+ GREET Associe un message d'accueil à votre nick
+ KILL Active ou désactive la protection
+ SECURE Active ou désactive la sécurité du nick
+ PRIVATE Empêche votre nick d'être affiché par
+ /msg %S LIST
+ HIDE Cache certaines parties des informations du nick
+ MSG Change le mode de communication des Services
+
+ Pour utiliser cette commande, vous devez d'abord vous
+ identifier avec votre mot de passe (/msg %S HELP
+ IDENTIFY pour plus d'informations).
+
+ Tapez /msg %S HELP SET option pour plus d'information
+ sur une option spécifique.
+
+NICK_HELP_SET_DISPLAY
+ Syntaxe: SET DISPLAY nouvel-affichage
+
+ Change l'affichage utilisé pour nommer votre groupe de
+ nicks dans les Services. Le nouvel affichage DOIT être un
+ nick de votre groupe.
+
+NICK_HELP_SET_PASSWORD
+ Syntaxe: SET PASSWORD nouveau-mot-de-passe
+
+ Change le mot de passe utilisé pour vous identifier en tant
+ que propriétaire du nick.
+
+NICK_HELP_SET_LANGUAGE
+ Syntaxe: SET LANGUAGE nombre
+
+ Change la langue utilisée par les Services lorsqu'ils vous
+ envoient un message (par exemple, quand ils répondent à une
+ commande que vous avez envoyé). nombre doit être choisi
+ dans la liste suivante des langues supportées:
+
+NICK_HELP_SET_URL
+ Syntaxe: SET URL adresse
+
+ Associe l'adresse de votre site web à votre nick. Cette adresse
+ sera affichée lorsque quelqu'un demandera des informations sur
+ votre nick avec la commande INFO.
+
+NICK_HELP_SET_EMAIL
+ Syntaxe: SET EMAIL adresse
+
+ Associe l'e-mail donné avec votre nick. L'email
+ sera affiché lorsque quelqu'un demandera des informations
+ sur votre nick avec la commande INFO.
+
+NICK_HELP_SET_ICQ
+ Syntaxe: SET ICQ numéro
+
+ Associe le numéro ICQ donné à votre nick. Ce numéro
+ sera affiché lorsque quelqu'un demandera des informations sur
+ votre nick avec la commande INFO.
+
+NICK_HELP_SET_GREET
+ Syntaxe: SET GREET message
+
+ Définit un message d'accueil pour votre nick, qui sera
+ affiché lorsque vous joignez un channel qui a l'option
+ GREET active, à condition d'avoir un niveau d'accès
+ suffisant.
+
+NICK_HELP_SET_KILL
+ Syntaxe: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Active ou désactive la protection automatique
+ pour votre nick. Avec la protection activée, si
+ un autre utilisateur essaie de prendre votre nick, il aura
+ une minute pour changer de nick, après quoi son nick sera
+ changé de force par %S.
+
+ Si vous sélectionnez QUICK, l'utilisateur aura seulement 20
+ secondes pour changer de nick au lieu des 60 habituelles. Si
+ vous sélectionnez IMMED, l'utilisateur verra son nick changé
+ immédiatement sans être d'abord prévenu et sans avoir de chance
+ pour changer son nick; n'utilisez cette option que si nécessaire.
+ De plus, les administrateurs de votre réseau peuvent avoir
+ désactivé cette option.
+
+NICK_HELP_SET_SECURE
+ Syntaxe: SET SECURE {ON | OFF}
+
+ Active ou désactive %S caractéristiques de sécurité pour
+ votre nick. Si la sécurité est active, vous devrez obligatoirement
+ entrer votre mot de passe pour être reconnu en tant que
+ propriétaire du nick, que votre masque soit dans la liste d'accès
+ ou non. Cependant, si vous êtes sur la liste d'accès, %S ignorera
+ la configuration de la protection offerte par SET KILL.
+
+NICK_HELP_SET_PRIVATE
+ Syntaxe: SET PRIVATE {ON | OFF}
+
+ Active ou désactive %S mode privé de votre nick.
+ Si le mode privé est actif, votre nick n'apparaitra pas
+ dans les listes de nicks générées par la commande LIST
+ de %S. (Cependant, quiconque connaissant votre nick peut
+ tout de même avoir des informations en utilisant
+ la commande INFO).
+
+NICK_HELP_SET_HIDE
+ Syntaxe: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Vous permet d'empêcher l'affichage de certaines parties
+ des informations quand quelqu'un fait un %S INFO sur votre
+ nick. Vous pouvez cacher votre adresse e-mail (EMAIL), masque
+ user@host vu pour la dernière fois (USERMASK), et la dernière
+ raison de /QUIT (QUIT). Le second paramètre indique si
+ l'option doit être affichée (OFF) ou cachée (ON).
+
+NICK_HELP_SET_MSG
+ Syntaxe: SET MSG {ON | OFF}
+
+ Vous permet de choisir la façon dont les Services communiquent
+ avec vous. Si cette option est activée, ils utiliseront des
+ messages, sinon ils utiliseront des notices.
+
+NICK_HELP_RECOVER
+ Syntaxe: RECOVER nick [motdepasse]
+
+ Vous permet de récupérer votre nick si quelqu'un d'autre
+ l'a pris; c'est équivalent à ce que ce que %S fait
+ automatiquement si quelqu'un essaie d'utiliser un nick
+ protégé par SET KILL.
+
+ Quand vous utilisez cette commande, %S connectera un faux
+ utilisateur avec le même nick que l'utilisateur dont
+ vous essayez de récupérer le nick. Cela provoque la déconnexion
+ par les serveurs IRC de l'autre utilisateur. Ce faux utilisateur
+ restera connecté pendant une minute pour s'assurer que l'autre
+ utilisateur ne se reconnecte pas immédiatement; après cette
+ minute, vous pouvez reprendre votre nick. Alternativement,
+ utilisez la commande RELEASE (/msg %S HELP RELEASE) pour
+ reprendre votre nick plus tôt.
+
+ Pour utiliser la commande RECOVER pour un nick, l'adresse
+ telle qu'elle est montrée dans un /WHOIS doit être sur la
+ liste d'accès du nick, vous devez être identifié et dans
+ le groupe du nick, ou vous devez fournir le mot de passe
+ correct du nick.
+
+NICK_HELP_RELEASE
+ Syntaxe: RELEASE nick [motdepasse]
+
+ Ordonne à %S de supprimer toute tutelle sur votre nick
+ provoquée par la protection de SET KILL ou
+ l'utilisation de la commande RECOVER. Par défaut, les
+ tutelles durent une minute; cette commande les
+ arrête plus tôt.
+
+ Pour utiliser la commande RELEASE pour un nick, l'adresse
+ telle qu'elle est montrée dans un /WHOIS doit être sur la
+ liste d'accès du nick, vous devez être identifié et dans
+ le groupe du nick, ou vous devez fournir le mot de passe
+ correct du nick.
+
+NICK_HELP_GHOST
+ Syntaxe: GHOST nick [motdepasse]
+
+ Arrête une session IRC "fantôme" utilisant votre nick. Une
+ session "fantôme" est un utilisateur non connecté
+ actuellement, mais dont le serveur IRC croit qu'il l'est
+ toujours pour une raison ou une autre. Habituellement,
+ ceci arrive lorsque votre ordinateur plante ou que votre connexion
+ à Internet s'arrête lorsque vous êtes sur IRC.
+
+ Pour utiliser la commande GHOST pour un nick, l'adresse
+ telle qu'elle est montrée dans un /WHOIS doit être sur la
+ liste d'accès du nick, ou vous devez fournir le mot de passe
+ correct pour le nick.
+
+NICK_HELP_INFO
+ Syntaxe: INFO nick [ALL]
+
+ Affiche des informations sur le nick donné, telles que
+ le propriétaire du nick, l'adresse avec laquelle il était
+ connecté pour la dernière fois, et les options du nick. Si
+ vous êtes identifié pour le nick pour lequel vous demandez
+ des informations et que ALL est spécifié, toutes
+ les informations seront affichées, qu'elles soient cachées
+ ou non.
+
+NICK_HELP_LIST
+ Syntaxe: LIST modèle
+
+ Liste tous les nicks enregistrés qui correspondent
+ au modèle donné, dans le format nick!user@host. Les
+ nicks avec l'option PRIVATE active ne seront pas
+ affichés.
+
+ Exemples:
+
+ LIST *!joeuser@foo.com
+ Liste tous les nicks appartenant à joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Liste tous les nicks enregistrés avec Bot dans leurs
+ noms (ne différencie pas minuscules et majuscules).
+
+ LIST *!*@*.bar.org
+ Liste tous les nicks appartenant aux utilisateurs dans le
+ domaine bar.org.
+
+NICK_HELP_ALIST
+ Syntax: ALIST [level]
+
+ Lists all channels you have access on. Optionally, you can specify
+ a level in XOP or ACCESS format. The resulting list will only
+ include channels where you have the given level of access.
+
+ Examples:
+ ALIST Founder
+ Lists all channels where you have Founder
+ access.
+
+ ALIST AOP
+ Lists all channels where you have AOP access
+ or greater.
+
+ ALIST 10
+ Lists all channels where you have level 10
+ access or greater.
+
+ Channels that have the NOEXPIRE option set will be prefixed by
+ an exclamation mark.
+
+NICK_HELP_GLIST
+ Syntaxe: GLIST
+
+ Liste tous les nicks dans votre groupe.
+
+NICK_HELP_STATUS
+ Syntaxe: STATUS nick...
+
+ Retourne si l'utilisateur utilisant le nick donné est reconnu
+ en tant que propriétaire du nick. La réponse a ce format:
+
+ nick code-status
+
+ où nick est le nick envoyé avec la commande, et
+ code-status peut être l'un des suivants:
+
+ 0 - cet utilisateur n'est pas online ou le nick n'est pas
+ enregistré
+ 1 - utilisateur non reconnu comme propriétaire
+ 2 - utilisateur reconnu comme propriétaire uniquement via
+ la liste d'accès
+ 3 - utilisateur reconnu comme propriétaire via l'identification
+
+ Jusqu'à seize nicks peuvent être envoyés avec chaque commande;
+ le reste sera ignoré. Aucun message d'erreur n'est généré si
+ aucun nick n'est donné.
+
+NICK_HELP_SENDPASS
+ Syntaxe: SENDPASS nickname
+
+ Envoie le mot de passe du nick donné à l'adresse e-mail
+ qui a été définie pour ce nick. Cette commande est très
+ utile pour régler les problèmes de mots de passe perdus.
+
+ Peut être limitée aux IRC operators sur certains
+ réseaux.
+
+ Cette commande est indisponible quand l'encryption est
+ activée.
+
+NICK_SERVADMIN_HELP
+
+ Les commandes suivantes sont réservées aux Services admins:
+
+ GETPASS Retrouve le mot de passe pour un nick
+ (uniquement si l'encryption est désactivée)
+ FORBID Empêche l'utilisation d'un nick
+
+ Les Services admins peuvent également effacer n'importe quel
+ nick sans avoir besoin de s'identifier pour le nick, et
+ peuvent voir l'access list pour n'importe kel nick
+ (/msg %S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Syntaxe: LOGOUT [nick [REVALIDATE]]
+
+ Sans paramètre, inverse l'effet de la commande IDENTIFY,
+ c'est-à-dire qu'elle fait en sorte que vous ne soyez plus
+ reconnu en tant que propriétaire réel du nick. Notez
+ cependant que l'on ne vous demandera pas de vous réidentifier.
+
+ Avec un paramètre, fait la même chose avec le nick donné. Si
+ vous spécifiez également REVALIDATE, les Services demanderont
+ au nick donné de se ré-identifier. Cette utilisation est
+ réservée aux Services admins.
+
+NICK_SERVADMIN_HELP_DROP
+ Syntaxe: DROP [nick]
+
+ Sans paramètre, efface votre nick de la base de données
+ de %S.
+
+ Avec un paramètre, efface le nick donné de la base de
+ données. Vous pouvez effacer n'importe quel nick de votre
+ groupe sans privilèges particuliers. La possibilité
+ d'effacer n'importe quel nick est cependant réservée aux
+ Services admins.
+
+NICK_SERVADMIN_HELP_SET
+
+ Les Services admins peuvent également définir l'option
+ NOEXPIRE, qui empêche les nicks d'expirer. De plus,
+ les Services admins peuvent définir les options de n'importe
+ quel nick sans avoir à entrer de mot de passe, en utilisant
+ le format SET nickname option paramètres.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Syntaxe: SET [nick] NOEXPIRE {ON | OFF}
+
+ Définit si le nick donné expirera. Activer ceci empêchera
+ le nick d'expirer. Si aucun nick n'est donné, définit
+ l'élément no-expire pour votre nick.
+
+ Réservée aux Services admins.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Les services admins peuvent utiliser le paramètre ALL
+ avec n'importe quel nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Syntaxe: LIST modèle [FORBIDDEN] [NOEXPIRE]
+
+ Liste tous les nicks enregistrés qui correspondent au modèle
+ donné, de format nick!user@host. Les nicks ayant l'option
+ PRIVATE ne seront affichés qu'aux Services admins. Les
+ nicks ayant l'option NOEXPIRE seront préfixés par un !
+ devant leur nick pour les Services admins.
+
+ Si les options FORBIDDEN ou NOEXPIRE sont données, seuls
+ les nicks qui, respectivement, sont interdits ou ont l'option
+ NOEXPIRE active seront affichées. Si les deux options sont
+ données, les deux types de nicks seront affichés. Ces options
+ sont réservées aux Services admins.
+
+ Exemples:
+
+ LIST *!joeuser@foo.com
+ Liste tous les nicks enregistrés appartenant à
+ joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Liste tous les nicks enregistrés ayant Bot dans
+ leur nom (ne respecte pas les majuscules).
+
+ LIST * NOEXPIRE
+ Liste tous les nicks qui n'expireront pas.
+
+NICK_SERVADMIN_HELP_ALIST
+ Syntax: ALIST [nickname] [level]
+
+ With no parameters, lists channels you have access on. With
+ one parameter, lists channels that nickname has access
+ on. With two parameters lists channels that nickname has
+ level access or greater on.
+
+ This use limited to Services admins.
+
+NICK_SERVADMIN_HELP_GLIST
+ Syntaxe: GLIST [nick]
+
+ Sans paramètre, liste tous les nicks qui sont dans
+ votre groupe.
+
+ Avec un paramètre, liste tous les nicks qui sont dans
+ le groupe du nick donné.
+ Cette utilisation est limitée aux administrateurs des
+ Services.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Syntaxe: GETPASS nick
+
+ Retourne le mot de passe du nick donné. Notez que pour
+ chaque utilisation de cette commande, un message comprenant
+ la personne qui a émis la commande et le nick sur lequel
+ il a été utilisé sera enregistré et envoyé en WALLOPS/GLOBOPS.
+
+ Réservée aux Services admins.
+
+ Cette commande est indisponible quand l'encryption est activée.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Returns the matching nicks that used given email. Note that
+ you can not use wildcards for either user or emailhost. Whenever
+ this command is used, a message including the person who issued
+ the command and the email it was used on will be logged.
+
+ Limited to Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Syntaxe: FORBID nick [raison]
+
+ Empêche un nick d'être enregistré ou utilisé par
+ quelqu'un. Peut être annulé en effaçant le nick.
+
+ Sur certains réseaux, la raison est requise.
+
+ Réservée aux Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ %S vous permet d'enregistrer et de contrôler divers
+ aspects des channels. %S empêche souvent de malicieux
+ utilisateurs de faire des "take overs" sur les channels
+ en limitant ceux qui sont autorisés à être channel
+ operator. Les commandes disponibles sont listées ci-dessous;
+ pour les utiliser, tapez /msg %S command. Pour plus
+ d'informations sur une commande spécifique, tapez
+ /msg %S HELP command.
+
+ REGISTER Enregistre un channel
+ IDENTIFY Vous identifie avec votre mot de passe
+ SET Configure les options et informations du
+ channel
+ AOP Modifie la liste des utilisateurs AOPs
+ SOP Modifie la liste des utilisateurs SOPs
+ ACCESS Modifie la liste des utilisateurs privilégiés
+ LEVELS Redéfinit la signification des levels d'accès
+ AKICK Gère la liste des kicks automatiques
+ DROP Annule l'enregistrement d'un channel
+ SENDPASS Aide à retrouver les mots de passe égarés
+
+ Autres commandes: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO,
+ INVITE, KICK, LIST, LOGOUT, OP, TOPIC,
+ UNBAN, VOICE, VOP
+
+CHAN_HELP_UNREAL
+
+ Ces commandes sont également disponibles sur ce réseau:
+ DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER,
+ PROTECT
+
+CHAN_HELP_ULTIMATE
+
+ Ces commandes sont également disponibles sur ce réseau:
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ Ces commandes sont également disponibles sur ce réseau:
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Notez que tout channel non utilisé pendant %d jours
+ (c'est-à-dire une période pendant laquelle aucun
+ utilisateur figurant sur la liste d'accès du channel
+ ne vient sur le channel) sera automatiquement effacé.
+
+CHAN_HELP_REGISTER
+ Syntaxe: REGISTER channel motdepasse description
+
+ Enregistre un channel dans la base de données de %S. Pour
+ utiliser cette commande, vous devez d'abord être un
+ opérateur sur le channel que vous essayez
+ d'enregistrer. Le mot de passe est utilisé avec la commande
+ IDENTIFY pour permettre à d'autres de faire des changements
+ dans la configuration du channel plus tard. Le dernier
+ paramètre, qui doit être inclus, est une description
+ générale du channel.
+
+ Quand vous enregistrez un channel, vous êtes enregistré
+ comme "propriétaire" du channel. Le propriétaire du channel peut
+ tout changer dans la configuration du channel; %S donnera
+ aussi automatiquement au propriétaire les droits d'opérateur
+ du channel quand il ou elle joint le channel.
+ Consultez la commande ACCESS (/msg %S HELP ACCESS) pour
+ savoir comment donner un sous ensemble de ces droits à
+ d'autres utilisateurs du channel.
+
+ REMARQUE: Pour enregistrer un channel, vous devez
+ d'abord enregistrer votre nick. Si ce n'est pas déjà fait,
+ tapez /msg %s HELP pour savoir comment faire.
+
+CHAN_HELP_IDENTIFY
+ Syntaxe: IDENTIFY channel motdepasse
+
+ Certifie à %S que vous êtes autorisé à modifier le channel donné.
+ Beaucoup de commandes demandent que vous utilisiez cette
+ commande avant de les utiliser si vous n'êtes pas le propriétaire.
+ Le mot de passe est le même que celui que vous avez envoyé avec la
+ commande REGISTER.
+
+CHAN_HELP_LOGOUT
+ Syntaxe: LOGOUT channel nick
+
+ Cette commande supprime l'identification du nick sélectionné
+ pour le channel donné.
+
+ Si vous êtes le propriétaire du channel, vous pouvez utiliser
+ la commande sur n'importe qui, sinon vous ne pouvez que
+ l'utiliser sur vous même.
+
+CHAN_HELP_DROP
+ Syntaxe: DROP channel
+
+ Efface le channel donné. Peut uniquement être utilisé par
+ le propriétaire du channel, qui doit utiliser la commande
+ IDENTIFY d'abord.
+
+CHAN_HELP_SET
+ Syntaxe: SET channel option paramètres
+
+ Permet au propriétaire du channel de configurer diverses options
+ du channel et d'autres informations.
+
+ Options disponibles:
+
+ FOUNDER Définit le propriétaire d'un channel
+ SUCCESSOR Définit le successeur d'un channel
+ PASSWORD Définit le mot de passe du channel
+ DESC Définit la description du channel
+ URL Associe un site avec un channel
+ EMAIL Associe un E-mail avec le channel
+ ENTRYMSG Définit un message envoyé aux utilisateurs
+ qui entrent sur le channel
+ TOPIC Change le topic du channel
+ BANTYPE Définit comment les services mettent les bans
+ sur le channel
+ MLOCK Oblige ou interdit des modes de channel
+ KEEPTOPIC Maintient le topic quand le channel n'est
+ pas utilisé
+ OPNOTICE Envoie une notice quand OP/DEOP sont utilisés
+ PEACE Régule l'utilisation de commandes sensibles
+ PRIVATE Cacher le channel de la commande LIST
+ RESTRICTED Restreindre l'accès au channel
+ SECURE Active les fonctions de sécurité de %S
+ SECUREOPS Contrôle plus strict du status de chanop
+ SECUREFOUNDER Contrôle plus strict du status de propriétaire
+ du channel
+ SIGNKICK Signe les kicks générés par la commande KICK
+ TOPICLOCK Le topic peut uniquement être changé avec
+ TOPIC
+ XOP Change le système de privilèges utilisateurs
+
+ Tapez /msg %S HELP SET option pour plus d'informations sur
+ une option particulière.
+
+CHAN_HELP_SET_FOUNDER
+ Syntaxe: SET channel FOUNDER nick
+
+ Change le propriétaire d'un channel. Le nouveau nick doit être
+ enregistré.
+
+CHAN_HELP_SET_SUCCESSOR
+ Syntaxe: SET channel SUCCESSOR nick
+
+ Change le successeur d'un channel. Si le nick du propriétaire
+ expire ou est effacé alors que le channel est toujours
+ enregistré, le successeur deviendra le nouveau propriétaire du
+ channel. Cependant, si le successeur a déjà trop de channels
+ enregistrés (%d), le channel sera tout de même effacé, comme
+ si aucun successeur n'avait été nommé. Le nouveau nick
+ doit être enregistré.
+
+CHAN_HELP_SET_PASSWORD
+ Syntaxe: SET channel PASSWORD motdepasse
+
+ Définit le mot de passe utilisé pour s'identifier en tant
+ que propriétaire du channel.
+
+CHAN_HELP_SET_DESC
+ Syntaxe: SET channel DESC description
+
+ Définit la description du channel, qui apparait dans les
+ commandes LIST et INFO.
+
+CHAN_HELP_SET_URL
+ Syntaxe: SET channel URL [adresse]
+
+ Associe l'adresse de site web donnée avec le channel. Cette adresse
+ sera affichée à chaque fois que quelqu'un demande des informations
+ sur le channel avec la commande INFO. Si aucun paramètre
+ n'est donné, supprime l'adresse de site du channel.
+
+CHAN_HELP_SET_EMAIL
+ Syntaxe: SET channel EMAIL [adresse]
+
+ Associe l'e-mail donné avec le channel. Cet
+ e-mail sera affiché lorsque quelqu'un demande des informations
+ sur le channel avec la commande INFO. Si aucun paramètre
+ n'est donné, supprime l'e-mail actuel du channel.
+
+CHAN_HELP_SET_ENTRYMSG
+ Syntaxe: SET channel ENTRYMSG [message]
+
+ Définit le message qui sera envoyé en /notice aux
+ utilisateurs quand ils entrent dans un channel. Si aucun
+ paramètre n'est donné, aucun message n'est envoyé à
+ l'entrée.
+
+CHAN_HELP_SET_BANTYPE
+ Syntaxe: SET channel BANTYPE typedeban
+
+ Définit le type de ban qui sera utilisé par les services
+ lorsqu'ils doivent bannir quelqu'un de votre channel.
+
+ typedeban est un nombre entre 0 et 3 qui signifie:
+
+ 0: ban de style *!user@host
+ 1: ban de style *!*user@host
+ 2: ban de style *!*@host
+ 3: ban de style *!*user@*.domain
+
+CHAN_HELP_SET_KEEPTOPIC
+ Syntaxe: SET channel KEEPTOPIC {ON | OFF}
+
+ Active ou désactive l'option de maintien du topic pour
+ un channel. Lorsque le maintien du topic est défini, le
+ topic pour le channel sera retenu par %S même après que le
+ dernier utilisateur quitte le channel, et sera restauré la
+ prochaine fois que le channel est créé.
+
+CHAN_HELP_SET_TOPICLOCK
+ Syntaxe: SET channel TOPICLOCK {ON | OFF}
+
+ Active ou désactive l'option de verrouillage du topic pour
+ un channel. Lorsque le verrouillage du topic est actif,
+ %S ne permettra pas le changement du topic du channel sauf
+ avec la commande TOPIC.
+
+CHAN_HELP_SET_MLOCK
+ Syntaxe: SET channel MLOCK modes
+
+ Configure les modes maintenus sur le channel. %S vous permet de
+ toujours garder certains modes, d'empêcher l'utilisation d'autres
+ modes et de laisser les modes restants en libre utilisation par
+ les opérateurs du channel.
+
+ Le paramètre modes est construit de la même façon que dans la
+ commande /MODE, les modes précédés d'un + étant toujours gardés,
+ et ceux précédés d'un - ne pouvant être utilisés. Notez cependant
+ que, contrairement à la commande /MODE, chaque utilisation de
+ SET MLOCK réinitialisera les modes maintenus avant de mettre en
+ place les nouveaux!
+
+ Remarque: Si vous choisissez de toujours garder le mode +k,
+ comme dans le second exemple ci-dessous, vous devez également
+ activer l'option RESTRICTED du channel (HELP SET
+ RESTRICTED pour plus d'informations), sinon toute personne
+ entrant sur le channel lorsqu'il est vide verra la clef!
+
+ Exemples:
+
+ SET #channel MLOCK +nt-iklps
+ Garde toujours les modes n et t, et empêche l'utilisation
+ des modes i, k, l, p, et s. Le mode m est libre d'être
+ mis ou retiré.
+
+ SET #channel MLOCK +knst-ilmp ma-clef
+ Garde toujours les modes k, n, s, et t, et désactive
+ les modes i, l, m, et p. La clef du channel sera
+ "ma-clef".
+
+ SET #channel MLOCK +
+ Réinitialise tous les modes précédemment maintenus, qui
+ pourront désormais être librement utilisés.
+
+CHAN_HELP_SET_PEACE
+ Syntaxe: SET channel PEACE {ON | OFF}
+
+ Active ou désactive l'option de paix pour un channel.
+ Quand elle est active, cette option empêche un
+ utilisateur de kicker, bannir ou enlever un privilège
+ de channel d'un user qui a un niveau supérieur ou
+ égal au sien via les commandes de %S.
+
+CHAN_HELP_SET_PRIVATE
+ Syntaxe: SET channel PRIVATE {ON | OFF}
+
+ Active ou désactive l'option private pour un channel.
+ Si private est défini, un /msg %S LIST ne comprendra
+ le channel dans aucune liste.
+
+CHAN_HELP_SET_RESTRICTED
+ Syntaxe: SET channel RESTRICTED {ON | OFF}
+
+ Active ou désactive l'option d'accès restreint pour un
+ channel. Lorsque l'accès restreint est actif, les
+ utilisateurs qui n'auraient normalement pas la permission
+ d'être channel operator (les utilisateurs avec un niveau
+ d'accès négatif et, si le contrôle des ops est actif, les utilisateurs
+ qui ne sont pas sur la liste d'accès) seront kickés et bannis
+ du channel.
+
+CHAN_HELP_SET_SECURE
+ Syntaxe: SET channel SECURE {ON | OFF}
+
+ Active ou désactive %S caractéristiques de sécurité
+ pour un channel. Lorsque la sécurité est active, seuls les
+ utilisateurs qui ont enregistré leurs nicks avec %s et
+ qui sont identifiés avec leur mot de passe auront accès
+ au channel sous contrôle de la liste d'accès.
+
+CHAN_HELP_SET_SECUREOPS
+ Syntaxe: SET channel SECUREOPS {ON | OFF}
+
+ Active ou désactive le contrôle des ops sur un channel.
+ Lorsque le contrôle des ops est actif, les utilisateurs
+ qui ne sont pas sur la liste d'accès ne pourront être op.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Syntaxe: SET channel SECUREFOUNDER {ON | OFF}
+
+ Active ou désactive l'option contrôle du propriétaire pour un channel.
+ Lorsque le contrôle du propriétaire est activé, seul le vrai
+ propriétaire pourra effacer le channel, changer son mot de passe,
+ son propriétaire et son successeur, et non pas ceux qui sont identifiés
+ avec %S.
+
+CHAN_HELP_SET_SIGNKICK
+ Syntaxe: SET channel SIGNKICK {ON | LEVEL | OFF}
+
+ Active ou désactive les kicks signés sur un channel.
+ Quand cette option est utilisée, les kicks générés
+ par la commande %S KICK auront le nick qui a utilisé
+ la commande dans leur raison.
+
+ Si vous sélectionnez LEVEL, ceux qui ont un level qui est
+ supérieur ou égal au level SIGNKICK sur le channel ne
+ génèreront pas de kicks signés. Consultez /msg %S HELP LEVELS
+ pour plus d'informations.
+
+CHAN_HELP_SET_XOP
+ Syntaxe: SET channel XOP {ON | OFF}
+
+ Active ou désactive le système de listes de xOPs pour
+ un channel. Si vous choisissez ce système, vous devez
+ utiliser les commandes AOP/SOP/VOP pour donner
+ des privilèges aux utilisateurs, sinon vous devez
+ utiliser la commande ACCESS.
+
+ Info technique: quand vous passez du système de liste
+ d'accès au système de listes de xOPs, les définitions de
+ niveaux et les niveaux des utilisateurs seront changés, et
+ donc vous ne les récupérerez pas tels quels si vous repassez
+ au système de liste d'accès!
+
+ Vous devriez également vérifier que les utilisateurs sont
+ dans la bonne liste de xOPs après être passé du système
+ de liste d'accès à celui de listes de xOPs, car la
+ conversion n'est pas parfaite à tous les coups... en fait,
+ elle est déconseillée si vous avez changé les définitions
+ des niveaux avec la commande LEVELS.
+
+ Passer du système de listes de xOPs au système de liste
+ d'accès ne pose aucun problème par contre.
+
+CHAN_HELP_SET_OPNOTICE
+ Syntaxe: SET channel OPNOTICE {ON | OFF}
+
+ Active ou désactive l'option notice sur OP/DEOP pour un channel.
+ Lorsque notice sur OP/DEOP est défini, %S enverra un notice au
+ channel à chaque fois que les commandes OP ou DEOP sont
+ utilisées par un utilisateur sur le channel.
+
+CHAN_HELP_AOP
+ Syntaxe: AOP channel ADD nick
+ AOP channel DEL {nick | liste d'entrées | liste}
+ AOP channel LIST [masque | liste]
+ AOP channel CLEAR
+
+ Gère la liste des AOPs (AutoOPs) d'un channel. La liste des
+ AOPs donne aux utilisateurs le droit de recevoir le
+ status d'opérateur automatiquement sur votre channel,
+ de se débannir ou de s'inviter en cas de besoin, d'avoir
+ leur message d'accueil affiché à leur arrivée, etc.
+
+ La commande AOP ADD ajoute le nick donné à la liste des
+ AOPs.
+
+ La commande AOP DEL supprime le nick donné de
+ la liste des AOPs. Si une liste de numéros d'entrées est
+ donnée, ces entrées sont supprimées. (Consultez l'exemple
+ pour LIST ci-dessous.)
+
+ La commande AOP LIST affiche la liste des AOPs. Si un
+ masque joker est donné, seules les entrées correspondantes
+ au masque sont affichées. Si une liste de numéros d'entrées
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ AOP #channel LIST 2-5,7-9
+ Liste toutes les entrées comprises entre 2 et 5 et
+ entre 7 et 9.
+
+ La commande AOP CLEAR supprime toutes les entrées
+ de la liste des AOPs.
+
+ Les commandes AOP ADD et AOP DEL sont utilisables
+ en étant SOP ou plus, alors que la commande AOP CLEAR
+ ne peut être utilisée que par le propriétaire du channel.
+ Cependant, la commande AOP LIST peut être utilisée
+ en étant AOP ou plus.
+
+ Cette commande peut avoir été désactivée pour votre channel,
+ et vous devrez dans ce cas utiliser la liste d'accès. Tapez
+ /msg %S HELP ACCESS pour savoir comment utiliser la liste
+ d'accès, et /msg %S HELP SET XOP pour savoir comment
+ passer du système de liste d'accès à celui de liste des xOPs.
+
+CHAN_HELP_HOP
+ Syntaxe: HOP channel ADD nick
+ HOP channel DEL {nick | liste d'entrées | liste}
+ HOP channel LIST [masque | liste]
+ HOP channel CLEAR
+
+ Gère la liste des HOPs (HalfOPs) d'un channel. La liste des
+ HOPs donne aux utilisateurs le droit de recevoir le
+ status de semi-opérateur automatiquement sur votre channel.
+
+ La commande HOP ADD ajoute le nick donné à la liste des
+ HOPs.
+
+ La commande HOP DEL supprime le nick donné de
+ la liste des HOPs. Si une liste de numéros d'entrées est
+ donnée, ces entrées sont supprimées. (Consultez l'exemple
+ pour LIST ci-dessous.)
+
+ La commande HOP LIST affiche la liste des HOPs. Si un
+ masque joker est donné, seules les entrées correspondantes
+ au masque sont affichées. Si une liste de numéros d'entrées
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ HOP #channel LIST 2-5,7-9
+ Liste toutes les entrées comprises entre 2 et 5 et
+ entre 7 et 9.
+
+ La commande HOP CLEAR supprime toutes les entrées
+ de la liste des HOPs.
+
+ Les commandes HOP ADD, HOP DEL et HOP LIST sont
+ utilisables en étant AOP ou plus, alors que la commande
+ HOP CLEAR ne peut être utilisée que par le propriétaire
+ du channel.
+
+ Cette commande peut avoir été désactivée pour votre channel,
+ et vous devrez dans ce cas utiliser la liste d'accès. Tapez
+ /msg %S HELP ACCESS pour savoir comment utiliser la liste
+ d'accès, et /msg %S HELP SET XOP pour savoir comment
+ passer du système de liste d'accès à celui de liste des xOPs.
+
+CHAN_HELP_SOP
+ Syntaxe: SOP channel ADD nick
+ SOP channel DEL {nick | liste d'entrées | liste}
+ SOP channel LIST [masque | liste]
+ SOP channel CLEAR
+
+ Gère la liste des SOPs (SuperOPs) d'un channel. La liste
+ des SOPs donne aux utilisateurs tous les droits donnés
+ par la liste des AOPs, et ajoute ceux de pouvoir
+ utiliser la liste de kicks automatiques et de mots
+ interdits, de pouvoir lire et envoyer des memos de
+ channel, etc.
+
+ La commande SOP ADD ajoute le nick donné à la liste des
+ SOPs.
+
+ La commande SOP DEL supprime le nick donné de
+ la liste des SOPs. Si une liste de numéros d'entrées est
+ donnée, ces entrées sont supprimées. (Consultez l'exemple
+ pour LIST ci-dessous.)
+
+ La commande SOP LIST affiche la liste des SOPs. Si un
+ masque joker est donné, seules les entrées correspondantes
+ au masque sont affichées. Si une liste de numéros d'entrées
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ SOP #channel LIST 2-5,7-9
+ Liste toutes les entrées comprises entre 2 et 5 et
+ entre 7 et 9.
+
+ La commande SOP CLEAR supprime toutes les entrées
+ de la liste des SOPs.
+
+ Les commandes SOP ADD, SOP DEL et SOP CLEAR ne sont
+ utilisables que par le propriétaire du channel.
+ Cependant, la commande SOP LIST peut être utilisée
+ en étant AOP ou plus.
+
+ Cette commande peut avoir été désactivée pour votre channel,
+ et vous devrez dans ce cas utiliser la liste d'accès. Tapez
+ /msg %S HELP ACCESS pour savoir comment utiliser la liste
+ d'accès, et /msg %S HELP SET AOP pour savoir comment
+ passer du système de liste d'accès à celui de liste des xOPs.
+
+CHAN_HELP_VOP
+ Syntaxe: VOP channel ADD nick
+ VOP channel DEL {nick | liste d'entrées | liste}
+ VOP channel LIST [masque | liste]
+ VOP channel CLEAR
+
+ Gère la liste des VOPs (VOicePeople) d'un channel. La
+ liste des VOPs permet aux utilisateurs d'obtenir le status
+ de voice automatiquement ou de se l'attribuer s'ils
+ ne l'ont pas encore.
+
+ La commande VOP ADD ajoute le nick donné à la liste des
+ VOPs.
+
+ La commande VOP DEL supprime le nick donné de
+ la liste des VOPs. Si une liste de numéros d'entrées est
+ donnée, ces entrées sont supprimées. (Consultez l'exemple
+ pour LIST ci-dessous.)
+
+ La commande VOP LIST affiche la liste des VOPs. Si un
+ masque joker est donné, seules les entrées correspondantes
+ au masque sont affichées. Si une liste de numéros d'entrées
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ VOP #channel LIST 2-5,7-9
+ Liste toutes les entrées comprises entre 2 et 5 et
+ entre 7 et 9.
+
+ La commande VOP CLEAR supprime toutes les entrées
+ de la liste des VOPs.
+
+ Les commandes VOP ADD, VOP DEL et VOP LIST sont
+ utilisables en étant AOP ou plus, alors que la commande
+ VOP CLEAR ne peut être utilisée que par le propriétaire
+ du channel.
+
+ Cette commande peut avoir été désactivée pour votre channel,
+ et vous devrez dans ce cas utiliser la liste d'accès. Tapez
+ /msg %S HELP ACCESS pour savoir comment utiliser la liste
+ d'accès, et /msg %S HELP SET AOP pour savoir comment
+ passer du système de liste d'accès à celui de liste des xOPs.
+
+CHAN_HELP_ACCESS
+ Syntaxe: ACCESS channel ADD nick level
+ ACCESS channel DEL {nick | numéros d'entrée | liste}
+ ACCESS channel LIST [mask | liste]
+ ACCESS channel CLEAR
+
+ Gère la liste d'accès d'un channel. La liste d'accès
+ détermine quels utilisateurs ont le status d'opérateur ou
+ ont accès aux commandes de %S pour le channel. Différents
+ levels utilisateur donnent accès à différents lots de
+ privilèges; /msg %S HELP ACCESS LEVELS pour des informations
+ plus détaillées. Tout nick qui n'est pas sur la liste
+ d'accès a un level utilisateur de 0.
+
+ La commande ACCESS ADD ajoute le nick donné à la liste
+ d'accès avec le level utilisateur choisi; si le nick est
+ déjà présent dans la liste, son niveau d'accès est remplacé
+ par le level spécifié dans la commande. Le level spécifié
+ doit être inférieur que celui qui utilise la commande, et
+ si le nick est déjà dans la liste d'accès, le level
+ d'accès actuel de ce nick doit être inférieur à celui de
+ la personne utilisant la commande.
+
+ La commande ACCESS DEL supprime le nick donné de
+ la liste d'accès. Si une liste de numéros d'entrées est
+ donnée, ces entrées sont supprimées. (Consultez l'exemple
+ pour LIST ci-dessous.)
+
+ La commande ACCESS LIST affiche la liste d'accès. Si un
+ mask joker est donné, seules les entrées correspondantes
+ au mask sont affichées. Si une liste de numéros d'entrée
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ ACCESS #channel LIST 2-5,7-9
+ Liste toutes les entrées comprises entre 2 et 5 et
+ entre 7 et 9.
+
+ La commande ACCESS CLEAR supprime toutes les entrées
+ de la liste d'accès.
+
+CHAN_HELP_ACCESS_LEVELS
+ Levels d'accès utilisateur
+
+ Par défaut, les levels d'accès suivants sont définis:
+
+ Proprio Plein accès aux fonctions de %S; Op
+ automatique dès l'entrée sur le channel.
+ Notez que seule une personne peut
+ avoir le status de propriétaire (il ne peut
+ être donné en utilisant la commande
+ ACCESS).
+  10 Accès à la commande AKICK; Op automatique.
+  5 Op automatique.
+  3 Voice automatique.
+  0 Aucun privilège particulier.
+  <0 Ne doit pas être op.
+
+ Ces levels peuvent être changés, ou de nouveaux ajoutés,
+ en utilisant la commande LEVELS; tapez /msg %S HELP LEVELS
+ pour plus d'informations.
+
+CHAN_HELP_AKICK
+ Syntaxe: AKICK channel ADD masque [raison]
+ AKICK channel STICK masque
+ AKICK channel UNSTICK masque
+ AKICK channel DEL masque
+ AKICK channel LIST [masque]
+ AKICK channel VIEW [masque]
+ AKICK channel ENFORCE
+ AKICK channel CLEAR
+
+ Gère la liste de kicks automatiques d'un channel. Si
+ un utilisateur figurant sur la liste de kicks automatiques tente
+ de joindre un channel, %S bannira cet utilisateur du channel,
+ et kickera ensuite l'utilisateur.
+
+ La commande AKICK ADD ajoute le nick donné ou le
+ mask d'utilisateur à la liste de kicks automatiques. Si une
+ raison est donnée avec la commande, cette raison sera utilisée
+ lorsque l'utilisateur est kické; sinon, la raison par défaut est
+ "You have been banned from the channel".
+
+ La commande AKICK DEL supprime le nick ou le masque donné
+ de la liste de kicks automatiques. Cependant, il n'enlève pas
+ les bans placés par une des entrées; ceux-là doivent être supprimés
+ manuellement.
+
+ La commande AKICK STICK bannit en permanence le masque
+ donné sur le channel. Si quelqu'un essaie d'enlever le
+ ban, %S le remettra automatiquement. Vous ne pouvez l'utiliser
+ sur des nicks enregistrés.
+
+ La commande AKICK UNSTICK annule les effets de la commande
+ AKICK STICK, et vous pourrez donc à nouveau enlever le
+ ban du channel.
+
+ La commande AKICK LIST affiche la liste de kicks
+ automatiques, ou optionnellement seulement les entrées de la liste
+ de kicks automatiques qui correspondent au mask donné.
+
+ La commande AKICK VIEW est une version plus détaillée de
+ la commande AKICK LIST.
+
+ La commande AKICK ENFORCE force %S à bannir tous les
+ utilisateurs présents sur le channel qui sont concernés
+ par une des entrées de la liste de kicks automatiques.
+
+ La commande AKICK CLEAR supprime toutes les entrées
+ de la liste de kicks automatiques.
+
+CHAN_HELP_LEVELS
+ Syntaxe: LEVELS channel SET type level
+ LEVELS channel {DIS | DISABLE} type
+ LEVELS channel LIST
+ LEVELS channel RESET
+
+ La commande LEVELS permet un contrôle précis de la
+ signification des levels d'accès utilisés pour les channels.
+ Avec cette commande, vous pouvez définir le level d'accès
+ requis pour la majorité des fonctions de %S. (Les commandes
+ SET FOUNDER et SET PASSWORD, ainsi que cette commande,
+ sont toujours réservées au propriétaire du channel.)
+
+ LEVELS SET permet au level d'accès pour une fonction ou un
+ groupe de fonctions d'être changé. LEVELS DISABLE (ou DIS
+ en abrégé) désactive une fonction automatique ou empêche l'accès
+ à une fonction par quiconque sauf le propriétaire du channel.
+ LEVELS LIST montre les levels courants pour chaque fonction
+ ou groupe de fonctions. LEVELS RESET réinitialise les levels
+ avec les levels par défaut d'un channel fraichement créé
+ (consultez HELP ACCESS LEVELS).
+
+ Pour une liste de caractéristiques et fonctions pour lesquels
+ des levels peuvent être définis, consultez HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ Les noms de caractéristiques/fonctions suivants sont utilisés.
+ Notez que les levels pour AUTODEOP et NOJOIN sont des levels
+ maximum, alors que tous les autres sont des levels minimum.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Syntaxe: INFO channel [ALL]
+
+ Liste les informations concernant le channel nommé
+ enregistré, dont son propriétaire, la date d'enregistrement,
+ la date de dernière utilisation, la description, et
+ les modes bloqués, si il y en a. Si ALL est donné, le
+ message d'entrée et le successeur seront également affichés.
+
+ Par défaut, l'option ALL est limitée à ceux ayant un accès
+ de propriétaire sur le channel.
+
+CHAN_HELP_LIST
+ Syntaxe: LIST modèle
+
+ Liste tous les channels enregistrés correspondants au
+ modèle donné. (Les channels avec l'option PRIVATE ne
+ sont pas listés.)
+
+CHAN_HELP_OP
+ Syntaxe: OP [#channel [nick]]
+
+ Op le nick sélectionné sur un channel. Si nick n'est pas
+ donné, vous oppera sur le channel donné. Si nick et
+ channel ne sont pas donnés, vous oppera sur tous
+ les channels où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le channel.
+
+CHAN_HELP_DEOP
+ Syntaxe: DEOP [#channel [nick]]
+
+ Deop le nick sélectionné sur un channel. Si nick n'est pas
+ donné, vous deoppera sur le channel donné. Si nick et
+ channel ne sont pas donnés, vous deoppera sur tous
+ les channels où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le channel.
+
+CHAN_HELP_VOICE
+ Syntaxe: VOICE [#channel [nick]]
+
+ Voice le nick sélectionné sur un channel. Si nick n'est pas
+ donné, vous voicera sur le channel donné. Si nick et
+ channel ne sont pas donnés, vous voicera sur tous
+ les channels où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un level d'accès
+ de 5 ou plus sur le channel, ou aux VOPs ou à ceux ayant un
+ niveau d'accès de 3 ou plus en cas de voice de soi-même.
+
+CHAN_HELP_DEVOICE
+ Syntaxe: DEVOICE [#channel [nick]]
+
+ Devoice le nick sélectionné sur un channel. Si nick n'est pas
+ donné, vous devoicera sur le channel donné. Si nick et
+ channel ne sont pas donnés, vous devoicera sur tous
+ les channels où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un level d'accès
+ de 5 ou plus sur le channel, ou aux VOPs ou à ceux ayant un
+ niveau d'accès de 3 ou plus en cas de devoice de soi-même.
+
+CHAN_HELP_HALFOP
+ Syntaxe: HALFOP [#channel [nick]]
+
+ Halfop le nick sélectionné sur un channel. Si nick n'est pas
+ donné, vous halfoppera sur le channel donné. Si nick et
+ channel ne sont pas donnés, vous halfoppera sur tous
+ les channels où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un level d'accès
+ de 5 ou plus sur le channel, ou aux HOPs ou à ceux ayant un
+ niveau d'accès de 4 ou plus en cas de halfop de soi-même.
+
+CHAN_HELP_DEHALFOP
+ Syntaxe: DEHALFOP [#channel [nick]]
+
+ Dehalfop le nick sélectionné sur un channel. Si nick n'est pas
+ donné, vous dehalfoppera sur le channel donné. Si nick et
+ channel ne sont pas donnés, vous dehalfoppera sur tous
+ les channels où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un level d'accès
+ de 5 ou plus sur le channel, ou aux HOPs ou à ceux ayant un
+ niveau d'accès de 4 ou plus en cas de dehalfop de soi-même.
+
+CHAN_HELP_PROTECT
+ Syntaxe: PROTECT [#channel [nick]]
+
+ Protège le nick sélectionné sur un channel. Si nick n'est pas
+ donné, vous protègera sur le channel donné. Si nick et
+ channel ne sont pas donnés, vous protègera sur tous
+ les channels où vous êtes.
+
+ Par défaut, limité au propriétaire du channel, ou aux SOPs
+ ou à ceux ayant un niveau d'accès de 10 ou plus en cas de
+ protection de soi-même.
+
+CHAN_HELP_DEPROTECT
+ Syntaxe: DEPROTECT [#channel [nick]]
+
+ Enlève la protection du nick sélectionné sur un channel. Si
+ nick n'est pas donné, vous déprotègera sur le channel
+ donné. Si nick et channel ne sont pas donnés, vous
+ déprotègera sur tous les channels où vous êtes.
+
+ Par défaut, limité au propriétaire du channel, ou aux SOPs
+ ou à ceux ayant un niveau d'accès de 10 ou plus en cas de
+ suppression de protection pour soi-même.
+
+CHAN_HELP_OWNER
+ Syntaxe: OWNER [#channel]
+
+ Vous donne le status de propriétaire sur le channel donné.
+ Si channel n'est pas donné, vous donnera le status de
+ propriétaire sur tous les channels où vous êtes, à condition
+ bien sûr d'y avoir droit.
+
+ Limité à ceux ayant un accès de propriétaire sur le channel.
+
+CHAN_HELP_DEOWNER
+ Syntaxe: DEOWNER [#channel]
+
+ Vous supprime le status de propriétaire sur le channel
+ donné. Si channel n'est pas donné, vous donnera le status
+ de propriétaire sur tous les channels où vous êtes, à
+ condition bien sûr d'y avoir droit.
+
+ Limité à ceux ayant un accès de propriétaire sur le channel.
+
+CHAN_HELP_INVITE
+ Syntaxe: INVITE channel
+
+ Demande à %S de vous inviter sur le channel donné.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le channel.
+
+CHAN_HELP_UNBAN
+ Syntaxe: UNBAN channel
+
+ Demande à %S d'enlever tous les bans vous empêchant
+ d'entrer sur le channel donné.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le channel.
+
+CHAN_HELP_KICK
+ Syntaxe: KICK [#channel [nick [raison]]]
+
+ Kicke le nick sélectionné sur un channel. Si nick n'est pas
+ donné, vous kickera sur le channel donné. Si nick et
+ channel ne sont pas donnés, vous kickera sur tous
+ les channels où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le channel.
+
+CHAN_HELP_BAN
+ Syntaxe: BAN [#channel [nick [raison]]]
+
+ Bannit le nick sélectionné sur un channel. Si nick n'est pas
+ donné, vous bannira sur le channel donné. Si nick et
+ channel ne sont pas donnés, vous bannira sur tous
+ les channels où vous êtes.
+
+ Par défaut, limité aux AOPs ou à ceux ayant un niveau
+ d'accès de 5 ou plus sur le channel.
+
+CHAN_HELP_TOPIC
+ Syntaxe: TOPIC channel [topic]
+
+ %S change le topic du channel pour celui spécifié. Si
+ topic n'est pas donné, alors le topic du channel sera
+ supprimé. Cette commande est surtout utile en conjonction
+ avec la commande SET TOPICLOCK. Consultez
+ /msg %S HELP SET TOPICLOCK pour plus d'informations.
+
+ Par défault, limité à ceux ayant un accès de propriétaire
+ sur le channel.
+
+CHAN_HELP_CLEAR
+ Syntaxe: CLEAR channel quoi
+
+ Demande à %S d'enlever certains aspects d'un channel.
+ what peut être un des suivants:
+
+ MODES Réinitialise tous les modes d'un channel
+ BANS Enlève tous les bans d'un channel.
+ EXCEPTS Enlève tous les excepts d'un channel.
+ OPS Enlève le status de channel operator à
+ tous les channel operators du channel.
+ VOICES Enlève le status de "voice" (mode +v) à toute
+ personne ayant ce mode.
+ USERS Kicke tous les utilisateurs d'un channel.
+
+ Par défault, limité à ceux ayant un accès de propriétaire
+ sur le channel.
+
+CHAN_HELP_GETKEY
+ Syntaxe: GETKEY channel
+
+ Retourne la clef du channel donné. GETKEY est une commande
+ qui est principalement destiné à être utilisée par des
+ bots ou des scripts; pour cela, la réponse a le format
+ suivant:
+
+ KEY <channel> <clef>
+
+ La clef sera "NO KEY" si aucune clef n'est définie.
+
+CHAN_HELP_SENDPASS
+ Syntaxe: SENDPASS channel
+
+ Envoie le mot de passe du channel donné à l'adresse e-mail
+ qui a été définie pour le propriétaire de ce channel. Cette
+ commande est très utile pour régler les problèmes de mots
+ de passe perdus.
+
+ Peut être limitée aux IRC operators sur certains
+ réseaux.
+
+ Cette commande est indisponible quand l'encryption est
+ activée.
+
+CHAN_SERVADMIN_HELP
+
+ Les commandes suivantes sont disponibles pour les Services
+ admins:
+
+ GETPASS Retrouve le mot de passe du propriétaire pour
+ un channel (seulement si l'encryption
+ est désactivée)
+ FORBID Empêche un channel d'être utilisé
+ STATUS Retourne le level d'accès courant d'un
+ utilisateur sur un channel
+ CLIST Liste les channels dont un utilisateur est
+ le propriétaire
+
+ Les Services admins peuvent aussi effacer tout channel sans
+ avoir besoin de s'identifier avec un mot de pass, et peuvent
+ voir l'access, AKICK, et level lists de tout channel.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Syntaxe: LOGOUT channel [nick]
+
+ Cette commande supprime l'identification du nick sélectionné
+ pour le channel donné.
+
+ Si vous êtes le propriétaire du channel, vous pouvez utiliser
+ la commande sur n'importe qui, sinon vous ne pouvez que
+ l'utiliser sur vous même.
+
+ Si vous êtes un Services admin, vous pouvez utiliser
+ cette commande sur n'importe qui pour n'importe quel
+ channel sans avoir besoin d'être le propriétaire du channel.
+ Vous pouvez également omettre le paramètre nick; cela aura
+ pour effet de supprimer l'identification pour tous les
+ utilisateurs identifiés au channel.
+
+CHAN_SERVADMIN_HELP_DROP
+ Syntaxe: DROP channel
+
+ Efface le channel nommé. Seuls les Services admins
+ peuvent effacer un channel pour lequel ils n'ont
+ pas été identifiés.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Les Services admins peuvent aussi définir l'option
+ NOEXPIRE, avec lequel les channels peuvent être empêchés
+ d'expirer. De plus, les Services admins peuvent définir
+ les options de tout channel sans s'identifier avec le
+ password d'un channel.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Syntaxe: SET channel NOEXPIRE {ON | OFF}
+
+ Définit si le channel donné expirera. Mettre ceci à ON
+ empêche le channel d'expirer.
+
+ Réservée aux Services admins.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Les services admins peuvent utiliser le paramètre ALL
+ avec n'importe quel channel.
+
+CHAN_SERVADMIN_HELP_LIST
+ Syntaxe: LIST modèle
+
+ Liste tous les channels enregistrés correspondants au modèle
+ donné. Les channels avec l'option PRIVATE seront uniquement
+ affichés aux Services admins. Les channels ayant l'option
+ NOEXPIRE seront préfixés par un ! pour les Services admins.
+
+ Si les options FORBIDDEN ou NOEXPIRE sont données, seuls
+ les channels qui, respectivement, sont interdits ou ont l'option
+ NOEXPIRE active seront affichés. Si les deux options sont
+ données, les deux types de channels seront affichés. Ces options
+ sont réservées aux Services admins.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Syntaxe: GETPASS channel
+
+ Retourne le mot de passe du channel donné. Notez que
+ lorsque cette commande est utilisée, un message comprenant
+ la personne qui a utilisé cette commande et le channel
+ pour lequel elle a été utilisée sera loggée et envoyée en
+ un WALLOPS/GLOBOPS.
+
+ Réservée aux Services admins.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Syntaxe: FORBID channel [raison]
+
+ Empêche toute personne d'enregistrer ou d'utiliser le
+ channel donné. Peut être annulé en effacant le channel.
+
+ La raison peut être requise sur certains réseaux.
+
+ Réservée aux Services admins.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND channel [reason]
+
+ Disallows anyone from registering or using the given
+ channel. May be cancelled by using the UNSUSPEND
+ command to preserve all previous channel data/settings.
+
+ Reason may be required on certain networks.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Releases a suspended channel. All data and settings
+ are preserved from before the suspension.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Syntaxe: STATUS channel nick
+
+ Retourne le level d'accès actuel du nick donné pour le
+ channel donné. La réponse est de la forme:
+
+ STATUS channel nickname access-level
+
+ Si une erreur se produit, la réponse sera de la forme:
+
+ STATUS ERROR error-message
+
+ Réservée aux Services admins.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S est un utilitaire permettant aux utilisateurs IRC
+ d'envoyer de courts messages aux autres utilisateurs IRC,
+ qu'ils soient online à ce moment là ou non, ou aux
+ channels(*). Le nick de l'expéditeur ET du destinataire ou
+ le channel doivent être enregistrés pour pouvoir envoyer un
+ memo.
+
+ Les commandes de %S sont:
+
+ SEND Envoie un memo à un nick ou un channel
+ CANCEL Annule le dernier memo que vous avez envoyé
+ LIST Liste vos memos
+ READ Lit un ou des memos
+ DEL Efface un ou des memos
+ SET Définit des options relatifs aux memos
+ INFO Displays information about your memos
+
+MEMO_HELP_ADMIN
+ SENDALL Send a memo to all registered users
+
+MEMO_HELP_OPER
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_FOOTER
+
+ Tapez /msg %S HELP commande pour de l'aide sur
+ une des commandes ci-dessus.
+
+ (*) Par défaut, tout utilisateur avec au moins un level d'accès
+ de 10 sur un channel peut lire ces memos du channel. Ceci
+ peut être changé avec la commande LEVELS de %s.
+
+MEMO_HELP_SEND
+ Syntaxe: SEND {nick | channel} texte du memo
+
+ Envoie un memo au nick ou channel nommé contenant
+ texte du memo. En envoyant à un nick, le destinataire
+ sera informé qu'il/elle a un nouveau memo. Le nick/channel
+ destinataire doit être enregistré.
+
+MEMO_HELP_CANCEL
+ Syntaxe: CANCEL {nick | channel}
+
+ Supprime le dernier memo que vous avez envoyé à un nick ou
+ channel donné, à condition qu'il n'ait pas été lu lorsque vous
+ utilisez la commande.
+
+MEMO_HELP_LIST
+ Syntaxe: LIST [channel] [liste | NEW]
+
+ Liste tous les memos que vous avez actuellement. Avec NEW,
+ liste uniquement les nouveaux memos (non lus). Les memos non
+ lus sont marqués avec un "*" à gauche du numéro du memo. Vous
+ pouvez également spécifier une liste de numéros, comme dans
+ l'exemple ci dessous:
+
+ LIST 2-5,7-9
+ Liste les memos 2 à 5 et 7 à 9.
+
+MEMO_HELP_READ
+ Syntaxe: READ [channel] {nombre | liste | LAST | NEW}
+
+ Vous envoie le texte des memos spécifiés. Si LAST est donné,
+ vous envoie le dernier memo reçu. Si NEW est donné, vous
+ envoie tous vos nouveaux memos. Sinon, vous envoie le memo
+ numéro nombre. Vous pouvez également donner une liste
+ de nombres, comme dans cet exemple:
+
+ READ 2-5,7-9
+ Affiche les memos 2 à 5 et 7 à 9.
+
+MEMO_HELP_DEL
+ Syntaxe: DEL [channel] {nombre | liste | LAST | ALL}
+
+ Supprime le ou les memos spécifiés. Vous pouvez
+ fournir plusieurs numéros de memos ou des ordres de nombres
+ au lieu d'un nombre unique, comme dans le second exemple
+ ci-dessous.
+
+ Si LAST est donné, le dernier mémo sera supprimé.
+ Si ALL est donné, cela supprimera tous vos memos.
+
+ Exemples:
+
+ DEL 1
+ Supprime votre premier memo.
+
+ DEL 2-5,7-9
+ Supprime les memos compris entre 2 et 5 et entre 7 et 9.
+
+MEMO_HELP_SET
+ Syntaxe: SET option paramètres
+
+ Définit plusieurs options de memo. option peut être:
+
+ NOTIFY Définit si vous serez notifiés de vos
+ nouveaux memos (seulement pour les
+ nicks)
+ LIMIT Définit le nombre de memos maximum que
+ vous pouvez recevoir
+
+ Tapez /msg %S HELP SET option pour plus
+ d'informations sur une option spécifique.
+
+MEMO_HELP_SET_NOTIFY
+ Syntaxe: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Change quand vous serez notifié de vos nouveaux
+ memos:
+
+ ON Vous serez notifiés lorsque vous vous connectez,
+ lorsque vous enlevez /AWAY, et quand ils vous
+ sont envoyés.
+ LOGON Vous serez uniquement notifiés des memos lorsque
+ vous vous connectez ou quand vous enlevez
+ /AWAY.
+ NEW Vous serez uniquement notifiés des memos
+ lorsqu'ils vous sont envoyés.
+ OFF Vous ne recevrez aucune notification.
+
+ ON est la combination de LOGON et NEW.
+
+MEMO_HELP_SET_LIMIT
+ Syntaxe: SET LIMIT [channel] limite
+
+ Définit le nombre maximum de memos que vous (ou le channel
+ donné) est autorisé à avoir. Si vous définissez ceci à 0,
+ personne ne pourra vous envoyer de memos. Cependant, vous
+ ne pouvez pas définir ceci à plus que %d.
+
+MEMO_HELP_INFO
+ Syntaxe: INFO [channel]
+
+ Affiche des informations sur le nombre de memos que vous
+ avez, combien sont non lus, et combien de memos vous pouvez
+ recevoir au total. Avec un paramètre, affiche la même
+ information pour le channel donné.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Syntaxe: SET LIMIT [utilisateur | channel] {limite | NONE} [HARD]
+
+ Définit le nombre maximum de memos qu'un utilisateur ou
+ un channel est autorisé à avoir. Définir la limite à 0
+ empêche l'utilisateur de recevoir des memos; définir ceci
+ à NONE permet à l'utilisateur de recevoir et garder
+ autant de memos qu'ils veulent. Si vous ne donnez pas de
+ nick ou de channel, votre propre limite est définie.
+
+ Ajouter HARD empêche l'utilisateur de changer cette limite.
+ Ne pas ajouter HARD a l'effet inverse, permettant à
+ l'utilisateur de changer cette limite (même si une limite
+ antérieure a été définie avec HARD).
+
+ Cette utilisation de la commande SET LIMIT est réservée aux
+ Services admins. Les autres utilisateurs peuvent uniquement
+ entrer une limite pour eux-mêmes ou un channel sur lequel ils
+ ont de tels privilèges, ne peuvent supprimer %d limite, et
+ ne peuvent définir de limite stricte.
+
+MEMO_SERVADMIN_HELP_INFO
+ Syntaxe: INFO [nick | channel]
+
+ Sans paramètre, affiche les informations sur le nombre
+ de memos que vous avez, combien sont non lus, et combien
+ de memos vous pouvez recevoir au total.
+
+ Avec un paramètre de channel, affiche la même information
+ pour le channel donné.
+
+ With a nickname parameter, displays the same information
+ for the given nickname. This use Réservée aux Services
+ admins.
+ Avec un paramètre de nick, affiche la même information
+ pour le nick donné. Cette utilisation réservée aux Services
+ admins.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Syntax: STAFF memo-text
+
+ Sends all services staff a memo containing memo-text.
+ Note: If you have opers on both the oper list and the
+ admin list they will recive the memo twice. The same
+ applies for oper's on the Root list as well as other
+ lists.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL memo-text
+
+ Sends all registered users a memo containing memo-text.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ Commandes %S:
+ GLOBAL Envoie un message à tous les utilisateurs
+ STATS Affiche le status des Services et du réseau
+ OPER LIST Liste tous les opérateurs des Services
+ ADMIN LIST Liste tous les administrateurs des Services
+ STAFF Display Services staff and online status
+
+OPER_HELP_OPER_CMD
+ Commandes réservées aux opérateurs et administrateurs des Services:
+ MODE Change les modes d'un channel
+ KICK Expulse un utilisateur d'un channel
+ CLEARMODES Supprime tous les modes d'un channel
+ KILLCLONES Déconnecte tous les utilisateurs ayant un
+ certain hostname
+ AKILL Contrôle la liste des AKILLs
+ SGLINE Contrôle la liste des SGLINEs
+ SQLINE Contrôle la liste des SQLINEs
+ SZLINE Contrôle la liste des SZLINEs
+
+OPER_HELP_ADMIN_CMD
+ Commandes réservées aux administrateurs des Services:
+ OPER Modifie la liste des opérateurs des Services
+ CHANLIST Liste tous les channels
+ USERLIST Liste tous les utilisateurs
+ LOGONNEWS Définit les messages affichés aux utilisateurs
+ à la connexion
+ RANDOMNEWS Définit les messages affichés aléatoirement
+ aux utilisateurs à la connexion
+ OPERNEWS Définit les messages affichés aux utilisateurs
+ qui deviennent IRCops
+ SESSION Affiche la liste des sessions par host
+ EXCEPTION Modifie la liste d'exceptions à la limite de
+ session
+ CACHE Liste le cache de noms d'hôte utilisé par le
+ détecteur de proxy
+ NOOP Supprime temporairement toutes les O:lines
+ d'un serveur
+ JUPE "Jupiter" un serveur
+ IGNORE Modifier la liste d'ignore des services
+ UMODE Change un mode d'un utilisateur
+ OLINE Donne les flags d'un Oper à un utilisateur (UnrealIRCd seulement)
+ SET Configure des options globales des Services
+ RELOAD Recharge le fichier de configuration des Services
+ UPDATE Oblige les bases de données des Services
+ à être sauvegardées immédiatement.
+ RESTART Sauvegarde les bases de données et relance les
+ Services.
+ QUIT Arrête les Services sans sauvegarde
+ SHUTDOWN Arrête les Services avec sauvegarde
+
+ Commandes réservées aux super-utilisateurs des Services:
+ ADMIN Modifie la liste des administrateurs des Services
+
+OPER_HELP_ROOT_CMD
+ Commands available to Serivces Roots only:
+ MODLOAD Load a module
+ MODUNLOAD Un-Load a module
+ MODLIST List loaded modules
+ MODINFO Info about a loaded module
+
+OPER_HELP_LOGGED
+ Remarque: Toutes les commandes envoyées à %S sont enregistrées!
+
+OPER_HELP_GLOBAL
+ Syntaxe: GLOBAL message
+
+ Permet aux IRCops d'envoyer des messages à tous les
+ utilisateurs du réseau. Le message sera envoyé avec
+ le nick %s.
+
+OPER_HELP_STATS
+ Syntaxe: STATS [AKILL | ALL]
+
+ Sans option, affiche le nombre d'utilisateurs et d'IRCops
+ actuellement online (Services exclus), le plus grand nombre
+ d'utilisateurs online depuis le démarrage des Services, et
+ le nombre d'heures durant lesquelles les Services ont tourné.
+
+ Avec l'option AKILL, affiche la taille actuelle de l'AKILL
+ list et le temps d'échéance par défaut.
+
+ L'option ALL est réservée uniquement aux Services admins,
+ et affiche des informations sur l'utilisation de la mémoire
+ par les Services. L'utilisation de cette commande peut geler
+ les Services pendant un court instant sur de grands réseaux,
+ donc n'en abusez pas!
+
+ L'option RESET réinitialise le nombre maximum d'utilisateurs
+ au nombre courant d'utilisateurs sur le réseau.
+
+ UPTIME est l'équivalent de STATS.
+
+OPER_HELP_OPER
+ Syntaxe: OPER ADD nick
+ OPER DEL {nick | entrée | liste}
+ OPER LIST [mask | liste]
+ OPER CLEAR
+
+ Permet aux Services admins d'ajouter ou de supprimer des
+ nicks à ou de la liste des Services operators. Un utilisateur
+ dont le nick est dans la liste des Services operators et qui est
+ identifié auprès de %s aura accès aux commandes de Services
+ operator.
+
+ La commande OPER ADD ajoute le nick donné à la liste
+ des Services operators.
+
+ La commande OPER DEL supprime le nick donné de
+ la liste des Services operators. Si une liste de numéros
+ d'entrées est donnée, ces entrées sont supprimées. (Consultez
+ l'exemple pour LIST ci-dessous.)
+
+ La commande OPER LIST affiche la liste des Services operators.
+ Si un mask joker est donné, seules les entrées correspondantes
+ au mask sont affichées. Si une liste de numéros d'entrée
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ OPER LIST 2-5,7-9
+ Liste toutes les entrées comprises entre 2 et 5 et
+ entre 7 et 9.
+
+ La commande OPER CLEAR supprime toutes les entrées
+ de la liste des Services operators.
+
+ Un opérateur IRC peut utiliser la forme OPER LIST de
+ la commande. Toutes les autres utilisations sont réservées
+ aux Services admins.
+
+OPER_HELP_ADMIN
+ Syntaxe: ADMIN ADD nick
+ ADMIN DEL {nick | entrée | liste}
+ ADMIN LIST [mask | liste]
+ ADMIN CLEAR
+
+ Permet au Services root d'ajouter ou de supprimer des
+ nicks à ou de la liste des Services admins. Un utilisateur
+ dont le nick est dans la liste des Services admins et qui est
+ identifié auprès de %s aura accès aux commandes de Services
+ admin.
+
+ La commande ADMIN ADD ajoute le nick donné à la liste
+ des Services admins.
+
+ La commande ADMIN DEL supprime le nick donné de
+ la liste des Services admins. Si une liste de numéros
+ d'entrées est donnée, ces entrées sont supprimées. (Consultez
+ l'exemple pour LIST ci-dessous.)
+
+ La commande ADMIN LIST affiche la liste des Services admins.
+ Si un mask joker est donné, seules les entrées correspondantes
+ au mask sont affichées. Si une liste de numéros d'entrée
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ ADMIN LIST 2-5,7-9
+ Liste toutes les entrées comprises entre 2 et 5 et
+ entre 7 et 9.
+
+ La commande ADMIN CLEAR supprime toutes les entrées
+ de la liste des Services admins.
+
+ Un opérateur IRC peut utiliser la forme ADMIN LIST de
+ la commande. Toutes les autres utilisations sont réservées au
+ Services root.
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST} [time] [nick]
+
+ Autorise les ServicesAdmin a poser des ignores envers les services
+ sur les utilisateurs pendant une durée définie jusqu'a que les
+ soient redémarrés. La durée est indiquée en secondes par défaut.
+ Unités reconnues: s pour les secondes, m pour les minutres,
+ h pour les heures et d pour les jours. Vous ne pouvez PAS les combiner.
+ 0 = Permanent
+
+OPER_HELP_MODE
+ Syntaxe: MODE channel modes
+
+ Permet aux Services operators de définir les modes d'un
+ channel. Les paramètres sont les mêmes que pour la commande
+ /MODE normale.
+
+ Réservée aux Services operators.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user modes
+
+ Permet aux ServicesAdmin de changer un mode d'un utilisateur.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Permet de mettre un OperFlag à un utilisateur.
+ Préfixes: "+" et "-". Pour tout supprimer, spécifiez "-"
+
+ Limité aux ServicesAdmins.
+
+OPER_HELP_CLEARMODES
+ Syntaxe: CLEARMODES channel [ALL]
+
+ Enlève tous les modes binaires (i,k,l,m,n,p,s,t) et les bans
+ d'un channel. Si ALL est donné, enlève également tous les
+ ops et voices (modes +o et +v) du channel.
+
+ Réservée aux Services operators.
+
+OPER_HELP_KICK
+ Syntaxe: KICK channel utilisateur raison
+
+ Permet aux IRCops de kicker un utilisateur d'un channel.
+ Les paramètres sont les mêmes que pour la commande /KICK
+ normale. Le message de kick sera préfixé du nick de
+ l'IRCop ayant utilisé la commande KICK; par exemple:
+
+ *** SpamMan has been kicked off channel #my_channel by %S (Alcan (Flood))
+
+ Réservée aux Services operators.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick newnick
+
+ Forcefully changes a user's nickname from nick to newnick.
+
+ Limited to Services admins
+
+OPER_HELP_AKILL
+ Syntaxe: AKILL ADD [+échéance] masque raison
+ AKILL DEL {masque | numéro d'entrée | liste}
+ AKILL LIST [masque | liste]
+ AKILL VIEW [masque | liste]
+ AKILL CLEAR
+
+ Permet aux opérateurs des Services de manipuler la liste
+ d'AKILL. Si un utilisateur correspondant à un masque d'AKILL
+ tente de se connecter, les Services enverront un KILL pour
+ cet utilisateur et, sur les serveurs le supportant, demandera
+ à tous les serveurs d'ajouter un ban (K-line) du masque
+ qui correspondait.
+
+ AKILL ADD ajoute le masque user@host donné à la liste
+ d'AKILL pour la raison précisée (qui doit être donnée).
+ échéance est un nombre entier suivi par un d (jours), h
+ (heures), ou m (minutes). Les combinaisons (telles que
+ 1h30m) ne sont pas permises. Si l'unité n'est pas incluse,
+ la valeur est en jours par défaut (donc +30 est équivalent
+ à 30 jours). Pour ajouter une AKILL qui n'expire pas, utilisez
+ +0. Si le masque utilisateur à ajouter commence par un +,
+ une échéance doit être donnée, même si c'est la même que
+ celle par défaut. L'échéance par défaut pour les AKILLs peut
+ être consultée par la commande STATS AKILL.
+
+ La commande AKILL DEL supprime le masque donné de la liste
+ d'AKILL si il existe. Si une liste de numéros d'entrées
+ est donnée, ces entrées sont supprimées. (Voyez l'exemple
+ pour LIST ci-dessous.)
+
+ La commande AKILL LIST affiche la liste d'AKILL. Si un
+ masque joker est donné, seules les entrées correspondantes
+ au masque sont affichées. Si une liste de numéros d'entrées
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ AKILL LIST 2-5,7-9
+ Liste les entrées de la liste d'AKILL numéro 2 à 5
+ et 7 à 9.
+
+ AKILL VIEW est une version plus détaillée de AKILL LIST,
+ et affichera par qui et quand a été ajoutée une AKILL et
+ sa date d'expiration, en plus du masque user@host et de la
+ raison.
+
+ AKILL CLEAR vide toutes les entrées de la liste d'AKILL.
+
+ Résérvée aux opérateurs des Services.
+
+OPER_HELP_SGLINE
+ Syntaxe: SGLINE ADD [+échéance] masque:raison
+ SGLINE DEL {masque | numéro d'entrée | liste}
+ SGLINE LIST [masque | liste]
+ SGLINE VIEW [masque | liste]
+ SGLINE CLEAR
+
+ Permet aux opérateurs des Services de manipuler la liste
+ de SGLINEs. Si un utilisateur ayant un vrai nom correspondant
+ à un masque de SGLINE tente de se connecter, les Services ne
+ lui permettront pas de continuer sa session IRC.
+
+ SGLINE ADD ajoute le masque de vrai nom donné à la liste
+ de SGLINEs pour la raison précisée (qui doit être donnée).
+ échéance est un nombre entier suivi par un d (jours), h
+ (heures), ou m (minutes). Les combinaisons (telles que
+ 1h30m) ne sont pas permises. Si l'unité n'est pas incluse,
+ la valeur est en jours par défaut (donc +30 est équivalent
+ à 30 jours). Pour ajouter une SGLINE qui n'expire pas, utilisez
+ +0. Si le masque de vrai nom à ajouter commence par un +,
+ une échéance doit être donnée, même si c'est la même que
+ celle par défaut. L'échéance par défaut pour les SGLINEs peut
+ être consultée par la commande STATS AKILL.
+ Note: puisque le masque de vrai nom peut contenir des espaces,
+ le séparateur entre lui et la raison est un deux points.
+
+ La commande SGLINE DEL supprime le masque donné de la liste
+ de SGLINEs si il existe. Si une liste de numéros d'entrées
+ est donnée, ces entrées sont supprimées. (Voyez l'exemple
+ pour LIST ci-dessous.)
+
+ La commande SGLINE LIST affiche la liste des SGLINEs. Si un
+ masque joker est donné, seules les entrées correspondantes
+ au masque sont affichées. Si une liste de numéros d'entrées
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ SGLINE LIST 2-5,7-9
+ Liste les entrées de la liste de SGLINEs numéro 2 à 5
+ et 7 à 9.
+
+ SGLINE VIEW est une version plus détaillée de SGLINE LIST,
+ et affichera par qui et quand a été ajoutée une SGLINE et
+ sa date d'expiration, en plus du masque de vrai nom et de la
+ raison.
+
+ SGLINE CLEAR vide toutes les entrées de la liste de SGLINEs.
+
+ Résérvée aux opérateurs des Services.
+
+OPER_HELP_SQLINE
+ Syntaxe: SQLINE ADD [+échéance] masque raison
+ SQLINE DEL {masque | numéro d'entrée | liste}
+ SQLINE LIST [masque | liste]
+ SQLINE VIEW [masque | liste]
+ SQLINE CLEAR
+
+ Permet aux opérateurs des Services de manipuler la liste
+ de SQLINEs. Si un utilisateur ayant un nick correspondant
+ à un masque de SQLINE tente de se connecter, les Services ne
+ lui permettront pas de continuer sa session IRC.
+
+ Si le premier caractère du masque est un #, les services
+ empêcheront l'utilisation des channels correspondants (sur
+ les IRCds le supportant).
+
+ SQLINE ADD ajoute le masque donné à la liste de SQLINEs pour
+ la raison précisée (qui doit être donnée).
+ échéance est un nombre entier suivi par un d (jours), h
+ (heures), ou m (minutes). Les combinaisons (telles que
+ 1h30m) ne sont pas permises. Si l'unité n'est pas incluse,
+ la valeur est en jours par défaut (donc +30 est équivalent
+ à 30 jours). Pour ajouter une SQLINE qui n'expire pas, utilisez
+ +0. Si le masque à ajouter commence par un +,
+ une échéance doit être donnée, même si c'est la même que
+ celle par défaut. L'échéance par défaut pour les SQLINEs peut
+ être consultée par la commande STATS AKILL.
+
+ La commande SQLINE DEL supprime le masque donné de la liste
+ de SQLINEs si il existe. Si une liste de numéros d'entrées
+ est donnée, ces entrées sont supprimées. (Voyez l'exemple
+ pour LIST ci-dessous.)
+
+ La commande SQLINE LIST affiche la liste des SQLINEs. Si un
+ masque joker est donné, seules les entrées correspondantes
+ au masque sont affichées. Si une liste de numéros d'entrées
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ SQLINE LIST 2-5,7-9
+ Liste les entrées de la liste de SQLINEs numéro 2 à 5
+ et 7 à 9.
+
+ SQLINE VIEW est une version plus détaillée de SQLINE LIST,
+ et affichera par qui et quand a été ajoutée une SQLINE et
+ sa date d'expiration, en plus du masque et de la raison.
+
+ SQLINE CLEAR vide toutes les entrées de la liste de SQLINEs.
+
+ Résérvée aux opérateurs des services.
+
+OPER_HELP_SZLINE
+ Syntaxe: SZLINE ADD [+échéance] masque raison
+ SZLINE DEL {masque | numéro d'entrée | liste}
+ SZLINE LIST [masque | liste]
+ SZLINE VIEW [masque | liste]
+ SZLINE CLEAR
+
+ Permet aux opérateurs des Services de manipuler la liste
+ de SZLINEs. Si un utilisateur ayant une IP correspondante
+ à un masque de SZLINE tente de se connecter, les Services ne
+ lui permettront pas de continuer sa session IRC (et ce,
+ même si l'IP a un PTR RR).
+
+ SZLINE ADD ajoute le masque d'IP donné à la liste
+ de SZLINEs pour la raison précisée (qui doit être donnée).
+ échéance est un nombre entier suivi par un d (jours), h
+ (heures), ou m (minutes). Les combinaisons (telles que
+ 1h30m) ne sont pas permises. Si l'unité n'est pas incluse,
+ la valeur est en jours par défaut (donc +30 est équivalent
+ à 30 jours). Pour ajouter une SZLINE qui n'expire pas, utilisez
+ +0. Si le masque de vrai nom à ajouter commence par un +,
+ une échéance doit être donnée, même si c'est la même que
+ celle par défaut. L'échéance par défaut pour les SZLINEs peut
+ être consultée par la commande STATS AKILL.
+
+ La commande SZLINE DEL supprime le masque donné de la liste
+ de SZLINEs si il existe. Si une liste de numéros d'entrées
+ est donnée, ces entrées sont supprimées. (Voyez l'exemple
+ pour LIST ci-dessous.)
+
+ La commande SZLINE LIST affiche la liste des SZLINEs. Si un
+ masque joker est donné, seules les entrées correspondantes
+ au masque sont affichées. Si une liste de numéros d'entrées
+ est donnée, seules ces entrées sont affichées; par exemple:
+
+ SZLINE LIST 2-5,7-9
+ Liste les entrées de la liste de SZLINEs numéro 2 à 5
+ et 7 à 9.
+
+ SZLINE VIEW est une version plus détaillée de SZLINE LIST,
+ et affichera par qui et quand a été ajoutée une SZLINE et
+ sa date d'expiration, en plus du masque d'IP et de la
+ raison.
+
+ SZLINE CLEAR vide toutes les entrées de la liste de SZLINEs.
+
+ Résérvée aux opérateurs des Services.
+
+OPER_HELP_SET
+ Syntaxe: SET option valeur
+
+ Contrôle différentes options globales aux Servies.
+ Les noms des options actuelles sont:
+
+ READONLY Active ou désactive le mode lecture-seule.
+ LOGCHAN Report log messages to a channel
+ DEBUG Active ou désactive le mode de déboguage
+ NOEXPIRE Active ou désactive le mode sans expiration
+ SUPERADMIN Active ou désactive le mode super-admin
+
+ Réservée aux Services admins.
+
+OPER_HELP_SET_READONLY
+ Syntaxe: SET READONLY {ON | OFF}
+
+ Active ou désactive le mode lecture-seule. Dans le mode
+ lecture-seule, les utilisateurs normaux ne seront pas
+ autorisés à modifier les données des Services, comprenant
+ les access lists des channels et nicknames, etc. Les IRCops
+ ayant suffisamment de droits sur les Services pourront
+ modifier l'AKILL list des services et effacer ou interdire
+ des nicks et channels, mais de tels changements ne seront
+ pas sauvegardés à moins que le mode lecture-seule ne soit
+ désactivé avant que les Services ne soient arrêtés ou
+ relancés.
+
+ Cette option est équivalente à l'option de la ligne de commande
+ -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Syntaxe: SET LOGCHAN {ON | OFF}
+
+ Permet d'envoyer les logs sur un canal en plus d'écrire dans le
+ fichier de log. LogChannel doit être défini dans le fichier
+ de configuration des services.
+
+ Note: En mettant cette option sur OFF vous renforcerez la sécurité...
+
+OPER_HELP_SET_DEBUG
+ Syntaxe: SET DEBUG {ON | OFF | nombre}
+
+ Active ou désactive le debug mode. Dans le debug mode, toutes
+ les données envoyées vers et par les Services ainsi qu'un bon
+ nombre d'autres messages de déboguage sont écrits dans le
+ fichier de log. Si nombre est donné, le debug mode est activé,
+ avec le niveau de déboguage à nombre.
+
+ Cette option est équivalente à l'option de la ligne de commande
+ -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Syntaxe: SET NOEXPIRE {ON | OFF}
+
+ Active ou désactive le mode sans expiration. Dans le mode
+ sans expiration, les nicks, channels, akills et exceptions
+ n'expireront pas jusqu'à ce que l'option soit désactivée.
+
+ Cette option est équivalente à l'option de la ligne de commande
+ -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Syntax: SET SUPERADMIN {ON | OFF}
+
+ Vous permet d'avoir tous les privilèges comme le droit d'être reconnu
+ "founder" de toutes les canaux...
+
+ Utilisation temporaire.
+
+OPER_HELP_NOOP
+ Syntaxe: NOOP SET serveur
+ NOOP REVOKE serveur
+
+ NOOP SET supprime toutes les O:lines du serveur
+ donné et déconnecte tous les IRCops qui sont dessus
+ actuellement pour les empêcher de rehasher le serveur
+ (car cela annulerait les effets).
+
+ NOOP REVOKE remet en place toutes les O:lines
+ supprimées du serveur donné.
+
+ Note: Le paramètre serveur n'est en aucun cas
+ vérifié par les Services.
+
+ Réservée aux administrateurs des Services.
+
+OPER_HELP_JUPE
+ Syntaxe: JUPE serveur [raison]
+
+ Demande aux Services de juper un serveur -- c'est à dire,
+ créer un faux serveur connecté aux Services ce qui empêche
+ le vrai serveur ayant ce nom de se connecter. Le jupe peut
+ être enlevé en utilisant un SQUIT normal. Si une raison
+ est donnée, elle est placée dans le champ d'information du
+ serveur; sinon, l'information du serveur contiendra le
+ texte "Juped by <nick>", laissant paraître le nick
+ de la personne qui a jupé le serveur.
+
+ Réservée aux Services admins.
+
+OPER_HELP_RAW
+ Syntaxe: RAW texte
+
+ Envoie une chaîne de texte directement au serveur sur
+ lequel les Services sont connectés. Cette commande a un
+ champ d'utilisation très limité, et peut causer des
+ troubles dans un réseau en cas de mauvaise utilisation.
+ N'UTILISEZ PAS CETTE COMMANDE à moins d'être absolument
+ sûr de ce que vous faites!
+
+ Réservée aux Services admins.
+
+OPER_HELP_UPDATE
+ Syntaxe: UPDATE
+
+ Provoque la mise à jour de toutes les bases de données dès
+ que vous le demandez.
+
+ Réservée aux Services admins.
+
+OPER_HELP_RELOAD
+ Syntaxe: RELOAD
+
+ Provoque le rechargement du fichier de configuration des
+ Services. Notez que certaines directives demandent tout
+ de même le redémarrage des Services pour prendre effet
+ (comme le nom des services, l'activation de la limite
+ de sessions, etc.)
+
+ Réservée aux Services admins.
+
+OPER_HELP_QUIT
+ Syntaxe: QUIT
+
+ Provoque un arrêt immédiat des services; les bases de données
+ ne sont pas sauvegardées. Cette commande ne devrait pas être
+ utilisée à moins que des dommages dans la copie en mémoire des
+ bases de données ne soient soupçonnés. Pour des arrêts normaux,
+ utilisez la commande SHUTDOWN.
+
+ Réservée aux Services admins.
+
+OPER_HELP_SHUTDOWN
+ Syntaxe: SHUTDOWN
+
+ Provoque la sauvegarde de toutes les bases de données puis
+ l'arrêt des services.
+
+ Réservée aux Services admins.
+
+OPER_HELP_RESTART
+ Syntaxe: RESTART
+
+ Provoque la sauvegarde de toutes les bases de données et
+ le redémarrage des Services (c'est à dire qu'il arrête
+ le programme et le relance immédiatement).
+
+ Réservée aux Services admins.
+
+OPER_HELP_KILLCLONES
+ Syntaxe: KILLCLONES nick
+
+ Déconnecte tous les utilisateurs qui ont la même host que
+ nick. Une AKILL temporaire, de la forme *@host, est
+ ajoutée pour empêcher les clients de se reconnecter
+ immédiatement. Un wallops est également envoyé indiquant
+ qui a utilisé la commande, quelle host est affectée et
+ combien d'utilisateurs ont été déconnectés. Elle est
+ utile pour supprimer un nombre important de clones du
+ réseau.
+
+ Réservée aux Services admins.
+
+OPER_HELP_CHANLIST
+ Syntaxe: CHANLIST [{modèle | nickname} [SECRET]]
+
+ Liste tous les channels actuellement utilisés sur le réseau IRC, qu'ils
+ soient enregistrés ou non.
+
+ Si modèle est donné, seuls les channels correspondants sont listés. Si
+ un nickname est donné, les channels sur lesquels est l'utilisateur ayant
+ ce nick seront listés. Si SECRET est spécifié, liste seulement les channels
+ correspondants à modèle qui ont le mode +s ou +p.
+
+ Réservée aux Services admins.
+
+OPER_HELP_USERLIST
+ Syntaxe: USERLIST [{modèle | channel} [INVISIBLE]]
+
+ Liste tous les utilisateurs connectés sur le réseau IRC, enregistrés
+ ou non.
+
+ Si modèle est donné (format nick!user@host), seuls les utilisateurs
+ correspondants seront listés. Si channel est donné, seuls les
+ utilisateurs du channel seront listés. Si INVISIBLE est spécifié,
+ seuls les utilisateurs avec le mode +i seront listés.
+
+ Réservée aux Services admins.
+
+OPER_HELP_CACHE
+ Syntaxe: CACHE DEL nom d'hôte
+ CACHE LIST modèle [QUEUED | ALL]
+
+ La commande CACHE DEL supprime du cache le nom d'hôte
+ spécifié. Cette commande ne devrait être utilisée que
+ pour le déboguage.
+
+ La commande CACHE LIST liste tous les proxies
+ correspondants au modèle donné, ou, si l'option QUEUED
+ est donnée, les scans en attente ou en cours, ou, si
+ l'option ALL est donnée, tous les noms d'hôtes présents
+ dans la cache.
+
+ Réservée aux administrateurs des services.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD FileName
+
+ This command loads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ This command unloads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO FileName
+
+ This command lists information about the specified loaded module
+
+ Limited to Services Roots.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S vous permet d'avoir un bot sur votre channel.
+ Il a été conçu pour les utilisateurs qui ne
+ peuvent héberger ou configurer un bot, ou pour
+ être utilisé sur les réseaux qui n'autorisent pas
+ un bot d'un utilisateur. Les commandes disponibles
+ sont listées ci-dessous; pour les utiliser, tapez
+ /msg %S command. Pour plus d'information sur
+ une commande spécifique, tapez /msg %S HELP command.
+
+ BOTLIST Liste les bots disponibles
+ ASSIGN Attribue un bot à un channel
+ SET Configure les options du bot
+ KICK Configure les kickers
+ BADWORDS Gère la liste des mots interdits
+
+ Autres commandes: ACT INFO SAY UNASSIGN
+
+ Le bot joindra un channel dès qu'il y aura au moins
+ %d utilisateurs dessus.
+
+BOT_HELP_BOTLIST
+ Syntaxe: BOTLIST
+
+ Liste tous les bots disponibles sur ce réseau.
+
+BOT_HELP_ASSIGN
+ Syntaxe: ASSIGN chan nick
+
+ Attribue le bot désigné par nick au channel chan. Vous
+ pouvez ensuite configurer le bot pour qu'il convienne à
+ vos besoins.
+
+BOT_HELP_UNASSIGN
+ Syntaxe: UNASSIGN chan
+
+ Retire le bot d'un channel. Si vous utilisez cette commande,
+ le bot ne joindra plus le channel. Cependant, la configuration
+ du bot est conservée donc vous aurez toujours la possibilité
+ de réattribuer un bot plus tard sans avoir à le reconfigurer
+ entièrement.
+
+BOT_HELP_INFO
+ Syntax: INFO {chan | nick}
+
+ Vous permet de voir les informations %S pour un channel
+ ou un bot. Si le paramètre est un channel, vous verrez
+ des informations sur le channel tels que les kickers
+ actifs. Si le paramètre est un nick, vous verrez des
+ informations à propos d'un bot, comme le temps de
+ création ou le nombre de channels auxquels il a été
+ attribué.
+
+BOT_HELP_SET
+ Syntaxe: SET channel option parameters
+
+ Configure les options du bot. option peut être:
+
+ DONTKICKOPS Pour protéger les ops des kicks du bot
+ DONTKICKVOICES Pour protéger les voices des kicks du bot
+ FANTASY Active les commandes fantaisistes
+ GREET Active les messages d'accueil
+ SYMBIOSIS Permet au bot d'agir comme un vrai bot
+
+ Tapez /msg %S HELP SET option pour plus d'infos
+ sur une option spécifique.
+
+BOT_HELP_SET_DONTKICKOPS
+ Syntaxe: SET channel DONTKICKOPS {ON|OFF}
+
+ Active ou désactive la protection des ops sur un
+ channel. Quand elle est active, cette option empêche
+ le bot de kicker les ops même s'ils ne sont pas concernés
+ par le level NOKICK.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Syntaxe: SET channel DONTKICKVOICES {ON|OFF}
+
+ Active ou désactive la protection des voices sur un
+ channel. Quand elle est active, cette option empêche
+ le bot de kicker les voices même s'ils ne sont pas concernés
+ par le level NOKICK.
+
+BOT_HELP_SET_FANTASY
+ Syntax: SET channel FANTASY {ON|OFF}
+
+ Active ou désactive le mode fantaisie sur un
+ channel. Quand elle est active, cette option
+ permet aux utilisateurs d'utiliser les commandes
+ !op, !deop, !voice, !devoice, !kick, !kb, !unban
+ et !seen sur un channel (trouvez comment les utiliser;
+ essayez avec ou sans nick pour chacune, et avec
+ une raison pour certaines?).
+
+ Notez que les utilisateurs souhaitant utiliser
+ les commandes fantaisistes DOIVENT avoir
+ suffisamment d'accès pour les levels FANTASIA
+ et un autre level qui dépend de la commande
+ (par exemple, pour utiliser !op, un utilisateur
+ doit avoir suffisamment d'accès pour le level
+ OPDEOP).
+
+BOT_HELP_SET_GREET
+ Syntaxe: SET channel GREET {ON|OFF}
+
+ Active ou désactive le mode message d'accueil
+ sur un channel. Quand elle est active, cette option
+ fait afficher au bot le message d'accueil de chaque
+ utilisateur qui a un accès suffisant au channel.
+
+BOT_HELP_SET_SYMBIOSIS
+ Syntax: SET channel SYMBIOSIS {ON|OFF}
+
+ Active ou désactive la symbiose sur un channel.
+ Quand elle est active, cette option fait faire
+ au bot tout ce qui est normalement effectué
+ par %s sur les channels, tels que les MODEs,
+ les KICKs, et même le message d'entrée.
+
+BOT_HELP_KICK
+ Syntaxe: KICK channel option parameters
+
+ Configure les kickers du bot. option peut etre:
+
+ BOLDS Détermine si le bot kicke les
+ caractères gras
+ BADWORDS Détermine si le bot kicke les mots
+ interdits
+ CAPS Détermine si le bot kicke les majuscules
+ COLORS Détermine si le bot kicke les couleurs
+ FLOOD Détermine si le bot kicke les utilisateurs
+ qui floodent
+ REPEAT Détermine si le bot kicke les répétitions
+ REVERSES Détermine si le bot kicke les reverses
+ UNDERLINES Détermine si le bot kicke les caractères
+ soulignés
+
+ Tapez /msg %S HELP KICK option pour plus d'informations
+ sur une option en particulier.
+
+BOT_HELP_KICK_BOLDS
+ Syntaxe: KICK channel BOLDS {ON|OFF} [ttb]
+
+ Active ou désactive le kicker de caractères gras. Quand
+ elle est active, cette option demande au bot
+ de kicker les utilisateurs qui utilisent des
+ caractères gras.
+
+ ttb est le nombre de fois qu'un utilisateur peut
+ se faire kicker avant d'être banni. Ne donnez
+ pas ttb ou mettez le à 0 pour désactiver le système
+ de ban une fois activé.
+
+BOT_HELP_KICK_COLORS
+ Syntaxe: KICK channel COLORS {ON|OFF} [ttb]
+
+ Active ou désactive le kicker de couleurs. Quand
+ elle est active, cette option demande au bot
+ de kicker les utilisateurs qui utilisent des
+ couleurs.
+
+ ttb est le nombre de fois qu'un utilisateur peut
+ se faire kicker avant d'être banni. Ne donnez
+ pas ttb ou mettez le à 0 pour désactiver le système
+ de ban une fois activé.
+
+BOT_HELP_KICK_REVERSES
+ Syntaxe: KICK channel REVERSES {ON|OFF} [ttb]
+
+ Active ou désactive le kicker de reverses. Quand
+ elle est active, cette option demande au bot
+ de kicker les utilisateurs qui utilisent des
+ reverses.
+
+ ttb est le nombre de fois qu'un utilisateur peut
+ se faire kicker avant d'être banni. Ne donnez
+ pas ttb ou mettez le à 0 pour désactiver le système
+ de ban une fois activé.
+
+BOT_HELP_KICK_UNDERLINES
+ Syntaxe: KICK channel UNDERLINES {ON|OFF} [ttb]
+
+ Active ou désactive le kicker de caractères soulignés.
+ Quand elle est active, cette option demande au bot
+ de kicker les utilisateurs qui utilisent des
+ caractères soulignés.
+
+ ttb est le nombre de fois qu'un utilisateur peut
+ se faire kicker avant d'être banni. Ne donnez
+ pas ttb ou mettez le à 0 pour désactiver le système
+ de ban une fois activé.
+
+BOT_HELP_KICK_CAPS
+ Syntaxe: KICK channel CAPS {ON|OFF} [ttb [min [percent]]]
+
+ Active ou désactive le kicker de majuscules. Quand
+ elle est active, cette option demande au bot
+ de kicker les utilisateurs qui parlent en MAJUSCULES
+ sur le channel.
+
+ Le bot ne kicke que s'il y a au minimum min majuscules
+ et qu'elles constituent au moins percent%% de la
+ ligne de texte entière (si ces paramètres ne sont pas
+ donnés, les valeurs par défaut 10 caractères et 25%%
+ seront utilisés).
+
+ ttb est le nombre de fois qu'un utilisateur peut
+ se faire kicker avant d'être banni. Ne donnez
+ pas ttb ou mettez le à 0 pour désactiver le système
+ de ban une fois activé.
+
+BOT_HELP_KICK_FLOOD
+ Syntaxe: KICK channel FLOOD {ON|OFF} [ttb [ln [secs]]]
+
+ Active ou désactive le kicker de flood. Quand
+ elle est active, cette option demande au bot
+ de kicker les utilisateurs qui floodent le channel
+ en utilisant au moins ln lignes en secs secondes
+ (si ces paramètres ne sont pas donnés, les valeurs
+ par défaut sont 6 lignes en 10 secondes).
+
+ ttb est le nombre de fois qu'un utilisateur peut
+ se faire kicker avant d'être banni. Ne donnez
+ pas ttb ou mettez le à 0 pour désactiver le système
+ de ban une fois activé.
+
+BOT_HELP_KICK_REPEAT
+ Syntaxe: KICK #channel REPEAT {ON|OFF} [ttb [num]]
+
+ Active ou désactive le kicker de répétitions. Quand
+ elle est active, cette option demande au bot
+ de kicker les utilisateurs qui se répètent num fois
+ (si num n'est pas donné, la valeur par défaut est 3).
+
+ ttb est le nombre de fois qu'un utilisateur peut
+ se faire kicker avant d'être banni. Ne donnez
+ pas ttb ou mettez le à 0 pour désactiver le système
+ de ban une fois activé.
+
+BOT_HELP_KICK_BADWORDS
+ Syntaxe: KICK #channel BADWORDS {ON|OFF} [ttb]
+
+ Active ou désactive le kicker de mots interdits.
+ Quand elle est active, cette option demande au bot
+ de kicker les utilisateurs qui disent certains mots
+ sur le channel.
+
+ Vous pouvez définir les mots interdits pour votre
+ channel en utilisant la commande BADWORDS. Tapez
+ /msg %S HELP BADWORDS pour plus d'informations.
+
+ ttb est le nombre de fois qu'un utilisateur peut
+ se faire kicker avant d'être banni. Ne donnez
+ pas ttb ou mettez le à 0 pour désactiver le système
+ de ban une fois activé.
+
+BOT_HELP_BADWORDS
+ Syntaxe: BADWORDS channel ADD mot [SINGLE | START | END]
+ BADWORDS channel DEL {mot | entry-num | liste}
+ BADWORDS channel LIST [mask | liste]
+ BADWORDS channel CLEAR
+
+ Gère la liste des mots interdits d'un channel. La liste
+ des mots interdits détermine quels mots doivent être kickés
+ quand le kicker de mots interdits est activé. Pour plus
+ d'information, tapez /msg %S HELP KICK BADWORDS.
+
+ La commande BADWORDS ADD ajoute le mot donné à la liste
+ de mots interdits. Si SINGLE est donné, un kick ne sera
+ effectué que si un utilisateur dit le mot en entier. Si
+ START est donné, un kick ne sera effectué que si un
+ utilisateur dit un mot qui commande par mot. Si END
+ est spécifié, un kick ne sera effectué que si un utilisateur
+ dit un mot qui se termine par mot. Si vous ne spécifiez
+ rien, un kick sera effectué chaque fois que mot est dit
+ par un utilisateur.
+
+ La commande BADWORDS DEL supprime le mot donné de la liste
+ des mots interdits. Si une liste de numéro d'entrées est
+ donné, ces entrées seront supprimées. (Voyez l'exemple pour
+ LIST ci-dessous.)
+
+ La commande BADWORDS LIST affiche la liste des mots
+ interdits. Si un mask joker est donné, seules les entrées
+ correspondantes au mask seront affichées. Si une liste
+ de numéro d'entrées est donnée, seules ces entrées seront
+ affichées; par exemple:
+
+ BADWORDS #channel LIST 2-5,7-9
+ Liste les mots interdits 2 à 5 et 7 à 9.
+
+ La commande BADWORDS CLEAR supprime toutes les entrées
+ de la liste des mots interdits.
+
+BOT_HELP_SAY
+ Syntaxe: SAY channel texte
+
+ Fait dire au bot le texte donné sur le channel donné.
+
+BOT_HELP_ACT
+ Syntaxe: ACT channel texte
+
+ Fait faire au bot l'équivalent d'une commande "/me"
+ sur le channel donné avec le texte donné.
+
+BOT_SERVADMIN_HELP
+
+ La commande suivante est disponible pour les Services admins:
+
+ BOT Gère la liste des bots du réseau
+
+BOT_SERVADMIN_HELP_BOT
+ Syntax: BOT ADD nick user host real
+ BOT CHANGE oldnick newnick [user [host [real]]]
+ BOT DEL nick
+ BOT LIST
+
+ Permet aux Services admins de créer, modifier, et
+ supprimer les bots que les utilisateurs pourront
+ utiliser sur leurs channels.
+
+ BOT ADD ajoute un bot avec le nick, username, hostname
+ et realname donné. Aucun test d'intégrité ne sont effectués
+ pour ces données, donc faites très attention.
+ BOT CHANGE permet de changer le nick, username, hostname
+ ou realname d'un bot tout en conservant les données qui
+ lui sont associées.
+ BOT DEL supprime le bot donné de la liste des bots.
+ BOT LIST est un alias de BOTLIST qui liste tous
+ les bots disponibles sur le réseau.
+
+ Note: si vous créez un bot ayant un nick enregistré
+ avec NickServ, il sera effacé. De plus, si un utilisateur
+ utilise le nick du bot lors de sa création ou modification,
+ il sera déconnecté.
+
+BOT_SERVADMIN_HELP_SET
+
+ Ces options sont réservées aux Services admins:
+
+ NOBOT Empêche un bot d'être attribué à
+ un channel
+ PRIVATE Empêche un bot d'être attribué par
+ des non-opérateurs IRC
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Syntaxe: SET channel NOBOT {ON|OFF}
+
+ Cette option empêche un bot d'être attribué au channel.
+ Si un bot est déjà attribué, il est enlevé automatiquement
+ quand vous activez l'option.
+
+ Réservée aux administrateurs des services.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Syntaxe: SET nick-du-bot PRIVATE {ON|OFF}
+
+ Cette option empêche un bot d'être attribué à un
+ channel par des utilisateurs qui ne sont pas opérateurs
+ IRC.
+
+ Réservée aux administrateurs des services.
+HOST_EMPTY
+ Liste des vhost vide.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ vhost pour %s enregistrée en %s.
+HOST_IDENT_SET
+ vhost pour %s enregistrée en %s@%s.
+HOST_SETALL
+ vhost pour le groupe %s enregistrée en %s.
+HOST_DELALL
+ vhosts for group %s have been removed.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost pour le groupe %s enregistrée en %s@%s.
+HOST_SET_ERROR
+ Erreur! Une vhost peut seulement contenir les caratères A-Z, a-z, 0-9, '.' et '-'.
+HOST_SET_IDENT_ERROR
+ A vhost ident must be in the format of a valid ident
+HOST_SET_TOOLONG
+ Erreur! Le vhost est top longue, veuillez entrer moins de %d caratères.
+HOST_SET_IDENTTOOLONG
+ Erreur! l'Ident est trop long, veuillez entrer moins de %d caratères.
+HOST_NOREG
+ L'utilisateur %s n'a pas été trouvé dans la base de données de nickserv.
+HOST_SET_SYNTAX
+ Syntaxe /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntaxe /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Accés refusé.
+HOST_NOT_ASSIGNED
+ Contactez un opérateur afin d'avoir une vhost sous ce pseudo.
+HOST_ACTIVATED
+ Votre vhost %s est activée.
+HOST_IDENT_ACTIVATED
+ Votre vhost %s@%s est activée.
+HOST_ID
+ Veuillez vous identifier avant d'utiliser cette commande.
+HOST_NOT_REGED
+ Vous devez être enregistré avant d'utiliser cette commande.
+HOST_DEL
+ vhost pour %s supprimée.
+HOST_DEL_SYNTAX
+ Syntaxe: /msg %s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Votre vhost a été enlevée. Pour réactiver la protection de votre IP, tapez /mode %s +x
+HOST_NO_VIDENT
+ L'IRCD utilisé ne support par la modification de l'ident.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_GROUP
+ Toutes les vhost du groupe %s ont été enregistrées en %s
+HOST_IDENT_GROUP
+ Toutes les vhost du groupe %s ont été enregistrées en %s@%s
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_LIST_FOOTER
+ Displayed all records (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Displayed records from %d to %d
+HOST_LIST_KEY_FOOTER
+ Displayed records matching key %s (Count: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ %S commandes:
+ ON Active une vhost
+ OFF Désactive une vhost
+ GROUP Synchronise toutes les vhost d'un group
+
+HOST_OPER_HELP
+ Commandes pour les ServicesOpérateurs seulement:
+ SET Configure la vhost d'un pseudo
+ SETALL Configure la vhost pour tous les nicks d'un groupe
+ DEL Supprime la vhost d'un pseudo
+ LIST Recherche une vhost
+
+HOST_ADMIN_HELP
+ Commandes pour les ServicesAdmins seulement:
+
+HOST_HELP_ON
+ Syntaxe: ON
+
+ Active la vhost actuellement configurée pour ce pseudo.
+ Vous verrez cette vhost dans votre /whois à la place de
+ votre host actuelle.
+
+HOST_HELP_SET
+ Syntaxe: SET <nick> <hostmask>.
+
+ Configure la vhost donnée pour le pseudo indiqué.
+ Si l'ircd supporte la modification de l'ident, utilisez
+ SET <nick> <ident>@<hostmask>
+
+ Limité aux ServicesOpérateurs.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Deletes the vhost for all nick's in the same group as
+ that of the given nick.
+
+ Limited to Host Removers.
+
+
+HOST_HELP_SETALL
+ Syntaxe: SETALL <nick> <hostmask>.
+
+ Configure la vhost pour toutes les pseudos d'un même
+ groupe. Si l'ircd supporte la modification de l'ident, utilisez
+ SET <nick> <ident>@<hostmask>
+
+ Limité aux ServicesOpérateurs.
+
+HOST_HELP_OFF
+ Syntaxe: OFF
+
+ Désactive la vhost que vous avez actuellement. L'utilisation
+ de cette commande rendra visible votre IP.
+
+HOST_HELP_DEL
+ Syntaxe: DEL <nick>
+
+ Supprime la vhost pour le pseudo indiqué.
+
+ Limité aux ServicesOpérateurs.
+
+HOST_HELP_LIST
+ Syntax: LIST [<key>|<#X-Y>]
+
+ This command lists registered vhosts to the operator
+ if a Key is specified, only entries whos nick or vhost match
+ the pattern given in <key> are displayed e.g. Rob* for all
+ entries beginning with "Rob"
+
+ If a #X-Y style is used, only entries between the range of X
+ and Y will be displayed, e.g. #1-3 will display the first 3
+ nick/vhost entries.
+
+ The list uses the value of NSListMax as a hard limit for the
+ number of items to display to a operator at any 1 time.
+
+ Limited to Services operators.
+
+HOST_HELP_GROUP
+ Syntaxe: GROUP
+
+ Permet d'enregistrer la vHost du nick actuellement
+ utilisé pour tous les pseudos du groupe.
diff --git a/lang/gr.l b/lang/gr.l
new file mode 100644
index 000000000..a493e7d48
--- /dev/null
+++ b/lang/gr.l
@@ -0,0 +1,6049 @@
+# Greek language file.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ ÅëëçíéêÜ (Greek)
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %b %d %H:%M:%S %Y %Z
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %b %d %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %b %d %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Êõñ
+ Äåõô
+ Ôñßô
+ ÔåôÜ
+ ÐÝìð
+ Ðáñá
+ ÓÜââ
+# %A
+STRFTIME_DAYS_LONG
+ ÊõñéáêÞ
+ ÄåõôÝñá
+ Ôñßôç
+ ÔåôÜñôç
+ ÐÝìðôç
+ ÐáñáóêåõÞ
+ ÓÜââáôï
+# %b
+STRFTIME_MONTHS_SHORT
+ Éáí
+ Öåâ
+ Ìáñ
+ Áðñ
+ Ìáú
+ Éïõí
+ Éïõë
+ Áõã
+ Óåð
+ Ïêô
+ Íïå
+ Äåê
+# %B
+STRFTIME_MONTHS_LONG
+ ÉáíïõÜñéïò
+ ÖåâñïõÜñéïò
+ ÌÜñôéïò
+ Áðñßëéïò
+ ÌÜéïò
+ Éïýíéïò
+ Éïýëéïò
+ Áõãïõóôïò
+ ÓåðôÝìâñéïò
+ Ïêôþâñéïò
+ ÍïÝìâñéïò
+ ÄåêÝìâñéïò
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Åóùôåñéêü ëÜèïò - áäýíáôç ðñüóâáóç óôç ðáñÜêëçóç.
+UNKNOWN_COMMAND
+ ¢ãíùóôç åíôïëÞ %s.
+UNKNOWN_COMMAND_HELP
+ ¢ãíùóôç åíôïëÞ %s. "/msg %s HELP" ãéá âïÞèåéá.
+SYNTAX_ERROR
+ Óýíôáîç åíôïëÞò: %s
+MORE_INFO
+ /msg %s HELP %s ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+NO_HELP_AVAILABLE
+ Äåí õðÜñ÷åé äéáèÝóéìç âïÞèåéá ãéá %s.
+OBSOLETE_COMMAND
+ ÁõôÞ ç åíôïëÞ Ý÷åé áëëÜîåé; ÷ñçóéìïðïéÞóôå %s áíôß ãéá áõôü.
+
+BAD_USERHOST_MASK
+ Ç ìÜóêá ðñÝðåé íá åßíáé ôçò ìïñöÞò user@host.
+BAD_EXPIRY_TIME
+ ËáíèáóìÝíïò ÷ñüíïò ëÞîçò.
+USERHOST_MASK_TOO_WIDE
+ %s ç ìÜóêá åßíáé ðïëý ðëáôéÜ; Ðáñáêáëþ ÷ñçóéìïðïéÞóôå ìéá ðéï êáèïñéóìÝíç ìÜóêá.
+
+SERVICE_OFFLINE
+ Ï %s åßíáé ãéá ôçí þñá off.
+READ_ONLY_MODE
+ Óçìåßùóç: Ïé õðçñåóßåò åßíáé ìüíï áíáãíþóéìåò; ïé üðïéåò áëëáãÝò Ýãéíáí èá ÷áèïýí!
+PASSWORD_INCORRECT
+ ËÜèïò êùäéêüò.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Äåí Ý÷åéò ôçí åðéôñåðüìåíç Üäåéá.
+PERMISSION_DENIED
+ Äåí Ý÷åéò Üäåéá.
+RAW_DISABLED
+ The RAW option has been disabled. If you must use it, enable the DisableRaw directive in Services configuration.
+
+MORE_OBSCURE_PASSWORD
+ Ðáñáêáëþ ðñïóðÜèçóå îáíÜ ìå Ýíáí ðéï ðïëýðëïêï êùäéêü. Ïé êùäéêïß ðñÝðåé íá åßíáé ôïõëÜ÷éóôïí Ýùò ðÝíôå ÷áñáêôÞñåò, íá ìçí åßíáé åýêïëïé íá ìáíôåõôïýí (ð.÷. ôï ðñáãìáôéêü ïíïìÜ óïõ Þ ôï øåõäþíõìï óïõ), êáé íá ìçí ðåñéÝ÷åé êåíü Þ äéÜöïðïõò Üëëïõò ÷áñáêôÞñåò.
+PASSWORD_TRUNCATED
+ ÐáñáôÞñçóç: Ï êùäéêüò Ý÷åé ìåôáôñáðåß óå %d ÷áñáêôÞñåò.
+
+NICK_NOT_REGISTERED
+ Áõôü ôï øåõäþíõìï äåí Ý÷åé êáôï÷õñùèåß.
+NICK_NOT_REGISTERED_HELP
+ Áõôü ôï øåõäþíõìï äåí Ý÷åé êáôï÷õñùèåß. ÃñÜøå /msg %s HELP ãéá ðåñéóóüôåñåò ðëçñïöïñßåò ó÷åôéêÜ ãéá ôçí êáôï÷ýñùóç øåõäùíýìïõ..
+NICK_X_NOT_REGISTERED
+ Áõôü ôï øåõäþíõìï %s äåí åßíáé êáôï÷õñùìÝíï.
+NICK_X_IN_USE
+ Nick %s is currently in use.
+NICK_X_NOT_IN_USE
+ Áõôü ôï øåõäþíõìï %s äåí ÷ñçóéìïðïéåßôå áõôÞ ôç óôéãìÞ.
+NICK_X_NOT_ON_CHAN
+ %s äåí åßíáé áõôÞ ôç óôéãìÞ ìÝóá óôï êáíÜëé %s.
+NICK_X_FORBIDDEN
+ Áõôü ôï øåõäþíõìï %s äåí ìðïñåß íá êáôï÷õñùèåß Þ íá ÷ñçóéìïðïéçèåß.
+NICK_X_FORBIDDEN_OPER
+ Áõôü ôï øåõäþíõìï %s Ý÷åé ðáñáêñáôçèåß áðü ôïí %s:
+ %s
+NICK_X_ILLEGAL
+ Nick %s is an illegal nickname and cannot be used.
+NICK_X_TRUNCATED
+ Nick %s was truncated to %d characters.
+CHAN_X_NOT_REGISTERED
+ Áõôü ôï êáíÜëé %s äåí Ý÷åé êáôï÷õñùèåß.
+CHAN_X_NOT_IN_USE
+ Áõôü ôï êáíÜëé %s äåí õðÜñ÷åé.
+CHAN_X_FORBIDDEN
+ Áõôü ôï êáíÜëé %s äåí ìðïñåß íá êáôï÷õñùèåß Þ íá ÷ñçóéìïðïéçèåß.
+CHAN_X_FORBIDDEN_OPER
+ Áõôü ôï êáíÜëé %s Ý÷åé ðáñáêñáôçèåß áðü ôïí %s:
+ %s
+CHAN_X_SUSPENDED
+ Suspended: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Ï êùäéêüò áíáãíþñéóçò áðáéôåßôáé ãéá áõôÞ ôçí åíôïëÞ.
+ ÎáíáðñïóðáèÞóôå áöïý ãñÜøåôå /msg %s IDENTIFY ^_êùäéêüò^_.
+CHAN_IDENTIFY_REQUIRED
+ Ï êùäéêüò áíáãíþñéóçò áðáéôåßôáé ãéá áõôÞ ôçí åíôïëÞ.
+ ÎáíáðñïóðáèÞóôå áöïý ãñÜøåôå /msg %s IDENTIFY %s ^_êùäéêüò^_.
+
+MAIL_DISABLED
+ Ïé õðçñåóßåò Ý÷ïõí ñõèìéóôåß íá ìçí óôÝëíïõí ìÞíõìá óôç äéåýèõíóç.
+MAIL_INVALID
+ Ç äéåýèõíóç ãéá %s åßíáé ëáíèáóìÝíç.
+MAIL_X_INVALID
+ %s äåí åßíáé ëáíèáóìÝíç äéåýèõíóç.
+MAIL_LATER
+ Äåí ìðïñåß íá óôáëåß óôç äéåýèõíóç ôï ìÞíõìá ãéá ôçí þñá; ðáñáêáëþ ðñïóðÜèçóå ëßãï áñãüôåñá.
+MAIL_DELAYED
+ Ðáñáêáëþ ðåñßìåíå ^B%d^B äåõôåñüëåðôá êáé îáíáðñïóðÜèçóå.
+
+NO_REASON
+ ×ùñßò ëüãïò
+UNKNOWN
+ <Üãíùóôï>
+
+# Duration system
+DURATION_DAY
+ 1 ìÝñá
+DURATION_DAYS
+ %d ìÝñåò
+DURATION_HOUR
+ 1 þñá
+DURATION_HOURS
+ %d þñåò
+DURATION_MINUTE
+ 1 ëåðôü
+DURATION_MINUTES
+ %d ëåðôÜ
+DURATION_SECOND
+ 1 äåõôåñüëåðôï
+DURATION_SECONDS
+ %d äåõôåñüëåðôá
+
+# Human readable expiration
+NO_EXPIRE
+ äåí ëÞãåé ðïôÝ
+EXPIRES_SOON
+ ëÞãåé óôçí åðüìåíç áíáâÜèìéóç õðçñåóéþí
+EXPIRES_M
+ ëÞãåé ìÝóá óå %d ëåðôÜ
+EXPIRES_1M
+ ëÞãåé ìÝóá óå %d ëåðôü
+EXPIRES_HM
+ ëÞãåé ìÝóá óå %d þñåò, %d ëåðôÜ
+EXPIRES_H1M
+ ëÞãåé ìÝóá óå %d þñåò, %d ëåðôÜ
+EXPIRES_1HM
+ ëÞãåé ìÝóá óå %d þñá, %d ëåðôÜ
+EXPIRES_1H1M
+ ëÞãåé ìÝóá óå %d þñá, %d ëåðôÜ
+EXPIRES_D
+ ëÞãåé ìÝóá óå %d ìÝñåò
+EXPIRES_1D
+ ëÞãåé ìÝóá óå %d ìÝñá
+
+# Generic Footer message
+END_OF_ANY_LIST
+ End of %s list.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Áõôü ôï øåõäþíõìï áíÞêåé óå êÜðïéïí Üëëïí. Ðáñáêáëþ äéÜëåîå êÜðïéï Üëëï.
+ (Áí áõôü åßíáé ôï øåõäþíõìü óïõ, ãñÜøå /msg %s IDENTIFY ^_êùäéêü^_.)
+NICK_IS_SECURE
+ Áõôü ôï øåõäþíõìï åßíáé êáôï÷õñùìÝíï êáé ðñïóôáôåõìÝíï. Áí áõôü åßíáé ôï
+ øåõäþíõìï óïõ, ãñÜøå /msg %s IDENTIFY ^_êùäéêü^_. Áëëéþò,
+ ðáñáêáëþ äéÜëåîå êÜðïéï Üëëï øåõäþíõìï.
+NICK_MAY_NOT_BE_USED
+ Áõôü ôï øåõäþíõìï äåí ìðïñåß íá ÷ñçóéìïðïéçèåß. Ðáñáêáëþ äéÜëåîå êÜðïéï Üëëï.
+FORCENICKCHANGE_IN_1_MINUTE
+ Áí äåí áëëÜîåéò ôï øåõäþíõìï áõôü ìÝóá óå Ýíá ëåðôü, èá óôï áëëÜîù áõôüìáôá åãþ.
+FORCENICKCHANGE_IN_20_SECONDS
+ Áí äåí áëëÜîåéò ôï øåõäþíõìï áõôü ìÝóá óå 20 äåõôåñüëåðôá, èá óôï áëëÜîù áõôüìáôá åãþ.
+FORCENICKCHANGE_NOW
+ Áõôü ôï øåõäþíõìï åßíáé Þäç êáôï÷õñùìÝíï; äåí ìðïñåßò íá ôï ÷ñçóéìïðïéÞóåéò.
+FORCENICKCHANGE_CHANGING
+ Ôï øåõäþíõìü óïõ Ý÷åé áëëÜîåé óå %s
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER ^_êùäéêü^_ [^_email^_]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER ^_êùäéêü^_ ^_email^_
+NICK_REGISTRATION_DISABLED
+ Óõãíþìç, ç êáôï÷ýñùóç øåõäþíõìïõ åßíáé ãéá ôçí þñá áðåíåñãïðïéçìÝíç.
+NICK_REGISTRATION_FAILED
+ Óõãíþìç, ç êáôï÷ýñùóç áðÝôõ÷å.
+NICK_REG_PLEASE_WAIT
+ Ðáñáêáëþ ðåñßìåíå %d äåõôåñüëåðôá êáé ìåôÜ îáíá÷ñçóéìïðïßçóå ôçí åíôïëÞ êáôï÷ýñùóçò îáíÜ.
+NICK_CANNOT_BE_REGISTERED
+ Áõôü ôï øåõäþíõìï %s äåí ìðïñåß íá êáôï÷õñùèåß.
+NICK_ALREADY_REGISTERED
+ Áõôü ôï øåõäþíõìï %s åßíáé Þäç êáôï÷õñùìÝíï!
+NICK_REGISTERED
+ Áõôü ôï øåõäþíõìï %s êáôï÷õñþèçêå õðü ôçí äéåýèõíóÞ óïõ: %s
+NICK_PASSWORD_IS
+ Ï êùäéêüò óïõ åßíáé %s - èõìÞóïõ ôïí ãéá áñãüôåñç ÷ñÞóç.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP ^_óôü÷ïò^_ ^_êùäéêü^_
+NICK_GROUP_DISABLED
+ Óõãíþìç, ç ïìáäïðïßçóç ôïõ øåõäþíõìïý óïõ åßíáé ãéá ôçí þñá áðåíåñãïðïéçìÝíç.
+NICK_GROUP_FAILED
+ Óõãíþìç, ç ïìáäïðïßçóç ôïõ øåõäþíõìïý óïõ åßíáé ãéá ôçí þñá áðåíåñãïðïéçìÝíç.
+NICK_GROUP_PLEASE_WAIT
+ Ðáñáêáëþ ðåñßìåíå %d äåõôåñüëåðôá êáé ìåôÜ îáíá÷ñçóéìïðïßçóå ôçí åíôïëÞ ïìáäïðïßçóçò.
+NICK_GROUP_CHANGE_DISABLED
+ Áõôü ôï øåõäþíõìï åßíáé Þäç êáôï÷õñùìÝíï; ãñÜøå /msg %s DROP áñ÷éêÜ.
+NICK_GROUP_SAME
+ Åßóáé Þäç ìÝëïò ôçò ïìÜäáò ôïõ %s.
+NICK_GROUP_TOO_MANY
+ Åßíáé ðÜñá ðïëëÜ øåõäþíõìá ìÝóá %s's ïìÜäá; êñÜôá ìåñéêÜ êáé âãÜëå êÜðïéá.
+ ÃñÜøå ^B/msg %s HELP GLIST^B êáé /msg %s HELP DROP
+ ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+NICK_GROUP_JOINED
+ Åßóáé ôþñá ìÝóá óôçí ïìÜäá ôïõ %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY ^_êùäéêü^_
+NICK_IDENTIFY_FAILED
+ Óõãíþìç, ç áíáãíþñéóç áðÝôõ÷å.
+NICK_IDENTIFY_SUCCEEDED
+ Ï êùäéêüò Ýãéíå äåêôüò - ôþñá åßóáé áíáãíùñéóìÝíïò.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ ÐñÝðåé íá ðñïóèÝóåéò Ýíá e-mail ãéá ôï øåõäþíõìü óïõ.
+ Ìå áõôü ôï e-mail èá ìðïñåßò íá ëÜâåéò ôïí êùäéêü óïõ óå
+ ðåñßðôùóç ðïõ ôïí îå÷Üóåéò.
+NICK_IDENTIFY_EMAIL_HOWTO
+ ÃñÜøå /msg %S SET EMAIL ^_e-mail^_ ãéá íá ðñïóèÝóåéò ôï e-mail óôéò ðëçñïöïñßåò ôïõ øåõäþíõìïý óïõ.
+ Ç ìõóôéêüôçôá åßíáé óåâáóôÞ; áõôü ôï e-mail êáé ï êùäéêüò ôïõ äåí ðñÝðåé íá äùèåß óå
+ êáíÝíá ôñßôï ðñüóùðï.
+
+# LOGOUT responses
+NICK_ALREADY_IDENTIFIED
+ You are already identified.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status updated (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Ôï øåõäþíõìï óïõ äåí ôï êáôÝ÷åéò ôþñá,ðñÝðåé íá êÜíåéò ðÜëé åíôïëÞ áíáãíþñéóçò ãéá íá ôï êáôÝ÷åéò.
+NICK_LOGOUT_X_SUCCEEDED
+ Ôï øåõäþíõìü óïõ %s äåí êáôÝ÷åôáé ãéá ôçí þñá.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ Can't logout %s because he's a services administrator.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Óõãíþìç, ç õðçñåóßá ãéá íá óâÞíåé ôá øåõäþíõìá åßíáé áðåíåñãïðïéçìÝíç.
+NICK_DROPPED
+ Ôï øåõäþíõìü óïõ óâÞóôçêå åðéôõ÷þò áðü ôçí õðçñåóßá.
+NICK_X_DROPPED
+ Ôï øåõäþíõìï %s óâÞóôçêå åðéôõ÷þò áðü ôçí õðçñåóßá.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET ^_åðéëïãÞ^_ ^_ðáñÜìåôñïé^_
+NICK_SET_SERVADMIN_SYNTAX
+ SET [^_øåõäþíõìï^_] ^_åðéëïãÞ^_ ^_ðáñÜìåôñïé^_
+NICK_SET_DISABLED
+ Óõãíþìç, ç õðçñåóßá ãéá ôïí êáèïñéóìü êáé ôéò åðéëïãÝò ôïõ øåõäþíõìïõ åßíáé ãéá ôçí þñá áðåíåñãïðïéçìÝíç.
+NICK_SET_UNKNOWN_OPTION
+ ¢ãíùóôç SET åðéëïãÞ %s.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ ¢ãíùóôç SET åðéëïãÞ %s, Þ ôï øåõäþíõìï äåí åßíáé êáôï÷õñùìÝíï.
+NICK_SET_OPTION_DISABLED
+ Ç åðéëïãÞ %s äåí ìðïñåß íá ÷ñçóéìïðïéçèåß óôï äßêôõï áõôü.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ Ç íÝá åðßäåéîç ÐÑÅÐÅÉ íá áíáöÝñåôå óå Ýíá øåõäþíõìï ðïõ áíÞêåé óôçí ïìáäïðïéÞóç!
+NICK_SET_DISPLAY_CHANGED
+ Ç íÝá åðßäåéîç åßíáé ôþñá %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Óõãíþìç, äåí ãßíåôå íá áëëÜîåéò ôïí êùäéêü.
+NICK_SET_PASSWORD_CHANGED
+ Ï êùäéêüò Üëëáîå.
+NICK_SET_PASSWORD_CHANGED_TO
+ Ï êùäéêüò Üëëáîå óå %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE ^_number^_
+NICK_SET_LANGUAGE_UNKNOWN
+ ¢ãíùóôï íïýìåñï ãëþóóáò %d. ÃñÜøå /msg %s HELP SET LANGUAGE ãéá ôçí ëßóôá ìå ôéò ãëþóóåò.
+NICK_SET_LANGUAGE_CHANGED
+ Ç ãëþóóá Üëëáîå óå ÅëëçíéêÜ.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL Üëëáîå óå %s.
+NICK_SET_URL_UNSET
+ URL äåí õðÜñ÷åé.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ Ç äéåýèõíóç ôïõ e-mail Üëëáîå óå %s.
+NICK_SET_EMAIL_UNSET
+ Ç äéåýèõíóç ôïõ e-mail áðåíåñãïðïéÞèçêå.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ Äåí ìðïñåßò íá áðåíåñãïðïéÞóåéò ôçí äéåýèõíóç ôïõ e-mail óå áõôü ôï äßêôõï.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ Ôï íïýìåñï ôïõ ICQ Üëëáîå óå %s.
+NICK_SET_ICQ_UNSET
+ Ôï íïýìåñï ôïõ ICQ áðåíåñãïðïéÞèçêå.
+NICK_SET_ICQ_INVALID
+ %s äåí åßíáé óùóôüò áñéèìüò.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Ôï ìÞíõìá ÷áéñåôéóìïý Üëëáîå óå %s.
+NICK_SET_GREET_UNSET
+ Ç åðéëïãÞ ìÞíõìá ÷áéñåôéóìïý áðåíåñãïðïéÞèçêå.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ Ç åðéëïãÞ ðñïóôáóßáò åßíáé ôþñá ON.
+NICK_SET_KILL_QUICK
+ Ç åðéëïãÞ ðñïóôáóßáò åßíáé ôþñá ON, ìå åëëáôùìÝíï ÷ñüíï ãéá íá ãßíåé åíôïëÞ áíáãíþñéóç.
+NICK_SET_KILL_IMMED
+ Ç åðéëïãÞ ðñïóôáóßáò åßíáé ôþñá ON, ìå êáíÝíá ðåñéèþñéï íá ãßíåé åíôïëÞ áíáãíþñéóçò.
+NICK_SET_KILL_IMMED_DISABLED
+ Ç IMMED åðéëïãÞ äåí åßíáé äéáèÝóéìç óå áõôü ôï äßêôõï.
+NICK_SET_KILL_OFF
+ Ç åðéëïãÞ ðñïóôáóßáò Ýéíáé ôþñá OFF.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ Ç åðéëïãÞ áóöÜëåéáò åßíáé ôþñá ON.
+NICK_SET_SECURE_OFF
+ Ç åðéëïãÞ áóöÜëåéáò åßíáé ôþñá OFF.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ Ç åðéëïãÞ ìõóôéêüôçôáò åßíáé ôþñá ON.
+NICK_SET_PRIVATE_OFF
+ Ç åðéëïãÞ áóöÜëåéáò åßíáé ôþñá OFF.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Ç äéåýèõíóç ôïõ e-mail äåí èá ðáñïõóéÜæåôáé óôçí %s INFO åíôïëÞ
+NICK_SET_HIDE_EMAIL_OFF
+ Ç äéåýèõíóç ôïõ å-mail èá ðáñïõóéÜæåôáé óôçí %s INFO åíôïëÞ.
+NICK_SET_HIDE_MASK_ON
+ Äåí èá åìöáíßæåôáé ôï ôåëåõôáßï user@host óôçí %s INFO åíôïëÞ.
+NICK_SET_HIDE_MASK_OFF
+ Èá åìöáíßæåôáé ôï ôåëåõôáßï user@host óôçí %s INFO åíôïëÞ.
+NICK_SET_HIDE_QUIT_ON
+ Ôï ôåëåõôáßï áðï÷áéñåôéóôÞñéï ìÞíõìá áðï äù êáé óôï åîÞò äåí èá ðáñïõóéÜæåôáé óôçí %s INFO åíôïëÞ.
+NICK_SET_HIDE_QUIT_OFF
+ Ôï ôåëåõôáßï áðï÷áéñåôéóôÞñéï ìÞíõìá áðï äù êáé óôï åîÞò èá ðáñïõóéÜæåôáé óôçí %s INFO åíôïëÞ.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Ïé õðçñåóßåò èá óå åéäïðïéïýí ìå messages.
+NICK_SET_MSG_OFF
+ Ïé õðçñåóßåò èá óå åéäïðïéïýí ìå notices.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nickname] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ Ôï øåõäþíõìï %s äåí èá ëÞîåé.
+NICK_SET_NOEXPIRE_OFF
+ Ôï øåõäþíõìï %s èá ëÞîåé.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mask]
+NICK_ACCESS_ALREADY_PRESENT
+ Ç ìÜóêá %s åßíáé Þäç ìÝóá óôçí ëßóôá ðñüóâáóçò.
+NICK_ACCESS_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò ìüíï íá Ý÷åéò %d ðñüóâáóç óå êáôÜôáîç ôïõ øåõäþíõìïõ.
+NICK_ACCESS_ADDED
+ %s Ýãéíå ðñïóèÞêç óôçí ëßóôá ðñüóâáóÞò óïõ.
+NICK_ACCESS_NOT_FOUND
+ %s äåí âñÝèçêå óôç ëßóôá ðñüóâáóÞò óïõ.
+NICK_ACCESS_DELETED
+ %s äéáãñÜöôçêå áðü ôçí ëßóôá ðñüóâáóÞò óïõ.
+NICK_ACCESS_LIST
+ Ëßóôá ðñüóâáóçò:
+NICK_ACCESS_LIST_X
+ Ëßóôá ðñüóâáóçò ãéá %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s åßíáé %s
+NICK_INFO_SERVICES_OPER
+ %s åßíáé Ýíáò ÷åéñéóôÞò ôùí õðçñåóéþí.
+NICK_INFO_SERVICES_ADMIN
+ %s åßíáé ï åðéêåöáëÞò ôùí õðçñåóéþí.
+NICK_INFO_ADDRESS
+ Ôåëåõôáßá äéåýèõíóç: %s
+NICK_INFO_ADDRESS_ONLINE
+ Åßíáé óôï äßêôõï áðü: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s åßíáé Þóç ìÝóá óôï äßêôõï.
+NICK_INFO_TIME_REGGED
+ ÊáôÜóôáóç êáôï÷ýñùóçò ìå ôçí çìåñïìçíßá: %s
+NICK_INFO_LAST_SEEN
+ Ôåëåõôáßá öïñÜ ðïõ Þôáí óôï äßêôõï: %s
+NICK_INFO_LAST_QUIT
+ Ôåëåõôáßï áðï÷áéñåôéóôÞñéï ìÞíõìá: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ E-mail äéåýèõíóç: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ ÌÞíõìá ÷áéñåôéóìïý: %s
+NICK_INFO_OPTIONS
+ ÅðéëïãÝò: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Ðñïóôáóßá
+NICK_INFO_OPT_SECURE
+ ÁóöÜëåéá
+NICK_INFO_OPT_PRIVATE
+ Ìõóôéêüôçôá
+NICK_INFO_OPT_MSG
+ ÅðéëïãÞ ìçíýìáôïò
+NICK_INFO_OPT_NONE
+ ÊáíÝíá
+NICK_INFO_NO_EXPIRE
+ Áõôü ôï øåõäþíõìï äåí èá ëÞîåé ðïôÝ.
+NICK_INFO_FOR_MORE
+ Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò, ãñÜøå /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST pattern
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [NOEXPIRE]
+NICK_LIST_HEADER
+ Ç ëßóôá ìå ôéò êáôá÷ùñÞóåéò âñÝèçêáí %s:
+NICK_LIST_RESULTS
+ ÔÝëïò ôçò ëßóôáò - %d/%d âñÝèçêáí êáé åìöáíßóôçêáí.
+
+# GLIST responses
+NICK_ALIST_SYNTAX
+ ALIST nickname
+NICK_ALIST_HEADER
+ Channels that you have access on:
+ Num Channel Level Description
+NICK_ALIST_HEADER_X
+ Channels that %s has access on:
+ Num Channel Level Description
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ ÔÝëïò ôçò ëßóôáò - %d/%d âñÝèçêáí êáé åìöáíßóôçêáí.
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Ç ëßóôá ìå ôá øåõäþíõìá óôçí ïìÜäá:
+NICK_GLIST_HEADER_X
+ Ç ëßóôá ìå ôá øåõäþíõìá óôçí ïìÜäá ôïõ %s:
+NICK_GLIST_FOOTER
+ %d øåõäþíõìá ìÝóá óôçí ïìÜäá.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nickname [password]
+NICK_NO_RECOVER_SELF
+ Äåí ìðïñåßò íá øÜ÷íåéò ôïí åáõôü óïõ!
+NICK_RECOVERED
+ ¸êáíåò kill ôï ÷ñÞóôç ðïõ óïõ åß÷å ôï øåõäþíõìü óïõ.
+ /msg %s RELEASE %s ãéá íá ôï ðÜñåéò ðßóù ðñéí ãßíåé áõôüìáôá ìåôÜ áðü Ýíá ëåðôü.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nickname [password]
+NICK_RELEASE_NOT_HELD
+ Ôï øåõäþíõìï %s äåí êñáôåßôáé..
+NICK_RELEASED
+ Ïé õðçñåóßåò áðåëåõèÝñùááí ôï øåõäþíõìü óïõ.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nickname [password]
+NICK_NO_GHOST_SELF
+ Äåí ìðïñåßò íá óêïôþóåéò ôïí åáõôü óïõ!
+NICK_GHOST_KILLED
+ Ôï øåõäþíõìï óïõ Ýãéíå kill ìÝóù ghost åíôïëÞò.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nickname
+NICK_GETPASS_UNAVAILABLE
+ Ç GETPASS åíôïëÞ äåí åßíáé äéáèÝóéìç ãéáôß ÷ñçóéìïðïéåßôáé ç êùäéêïðïßçóç.
+NICK_GETPASS_PASSWORD_IS
+ Ï êùäéêüò ãéá ôïí %s åßíáé %s.
+
+# SENDPASS responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host No WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails Match %s to %s.
+NICK_GETEMAIL_NOT_USED
+ No Emails listed for %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nickname
+NICK_SENDPASS_UNAVAILABLE
+ Ç SENDPASS åíôïëÞ äåí åßíáé äéáèÝóéìç ãéáôß ÷ñçóéìïðïéåßôáé ç êùäéêïðïßçóç.
+NICK_SENDPASS_SUBJECT
+ Ï êùäéêüò ôïõ øåõäþíõìïõ (%s)
+NICK_SENDPASS_HEAD
+ ÃåéÜ,
+NICK_SENDPASS_LINE_1
+ Åßóáé óôçí ëßóôá ãéá íá ëÜâåéò ôïí êùäéêü ôïõ øåõäþíõìïý óïõ %s ìÝóù e-mail.
+NICK_SENDPASS_LINE_2
+ Ï êùäéêü óïõ åßíáé %s. Ãéá ðåñéóóüôåñç áóöÜëåéá, èá ðñÝðåé íá áëëÜîåéò üóï óýíôïìá ãßíåôáé ôïí êùäéêü óïõ áöïý ëÜâåéò ôïí êùäéêü óïõ óå e-mail.
+NICK_SENDPASS_LINE_3
+ Áí äåí ãíùñßæåéò ãéáôß áõôü ôï e-mail óôÜëèçêå óå óÝíá, ðáñáêáëþ áãíüçóÝ ôï ÷ùñßò åñùôÞóåéò êëð.
+NICK_SENDPASS_LINE_4
+ ÐÁÑÁÊÁËÙ ÌÇÍ ÁÐÁÍÔÇÓÅÉÓ ÓÅ ÁÕÔÏ ÔÏ E-MAIL!
+NICK_SENDPASS_LINE_5
+ %s åðéêåöáëåßò õðçñåóéþí.
+NICK_SENDPASS_OK
+ Ï êùäéêüò ôïõ %s Ý÷åé óôáëèåß.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nickname [reason]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nickname reason
+NICK_FORBID_SUCCEEDED
+ Ôï øåõäþíõìï %s áðü ôþñá ðáñáêñáôåßôáé.
+NICK_FORBID_FAILED
+ Äåí ìðïñåßò íá ðáñáêñáôÞóåéò áõôü ôï øåõäþíõìï %s!
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+NICK_REQUESTED
+ This nick has already been requested, please check your e-mail address for the pass code
+NICK_REG_RESENT
+ Your passcode has been re-sent to %s.
+NICK_REG_UNABLE
+ Nick NOT registered, please try again later.
+NICK_IS_PREREG
+ This nick is awaiting an e-mail verification code before completing registration.
+NICK_ENTER_REG_CODE
+ A passcode has been sent to %s, please type /msg %s confirm <passcode> to complete registration
+NICK_CONFIRM_NOT_FOUND
+ Registration step 1 may have expired, please use "/msg %s register <password> <email>" first.
+NICK_CONFIRM_INVALID
+ Invalid passcode has been entered, please check the e-mail again, and retry
+NICK_REG_MAIL_SUBJECT
+ Nickname Registration (%s)
+NICK_REG_MAIL_HEAD
+ Hi,
+NICK_REG_MAIL_LINE_1
+ You have requested to register the following nickname %s.
+NICK_REG_MAIL_LINE_2
+ Please type " /msg %s confirm %s " to complete registration.
+NICK_REG_MAIL_LINE_3
+ If you don't know why this mail is sent to you, please ignore it silently.
+NICK_REG_MAIL_LINE_4
+ PLEASE DON'T ANSWER TO THIS MAIL!
+NICK_REG_MAIL_LINE_5
+ %s administrators.
+NICK_GETPASS_PASSCODE_IS
+ Passcode for %s is %s.
+NICK_FORCE_REG
+ Nickname %s confirmed
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Ôï êáíÜëé äßíåé operator status óå êáôï÷õñùìÝíá Þ ìç øåõäþíõìá
+CHAN_LEVEL_AUTOVOICE
+ Ôï êáíÜëé äßíåé öùíÞ Þ +v óå êáôï÷õñùìÝíá Þ ìç øåõäþíõìá
+CHAN_LEVEL_AUTOHALFOP
+ Ôï êáíÜëé äßíåé half op Þ +h óå êáôï÷õñùìÝíá Þ ìç øåõäþíõìá
+CHAN_LEVEL_AUTOPROTECT
+ Ôï êáíÜëé äßíåé óå øåõäþíõìá +a äçëáäÞ áóöÜëåéá
+CHAN_LEVEL_AUTODEOP
+ Ôï êáíÜëé äåí åðéôñÝðåé ôï operator status
+CHAN_LEVEL_NOJOIN
+ Äåí åðéôñÝðåôáé íá ìðåßôå óôï êáíÜëé áí åßíáé RESTRICTED
+CHAN_LEVEL_INVITE
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéåßôáé INVITE åíôïëÞ
+CHAN_LEVEL_AKICK
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéåßôáé AKICK åíôïëÞ
+CHAN_LEVEL_SET
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéåßôáé SET åíôïëÞ (not FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéåßôáé CLEAR åíôïëÞ
+CHAN_LEVEL_UNBAN
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéåßôáé UNBAN åíôïëÞ
+CHAN_LEVEL_OPDEOP
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéåßôáé OP/DEOP åíôïëÝò
+CHAN_LEVEL_ACCESS_LIST
+ ÅðéôñÝðåôáé íá âëÝðåôáé ôçí ëßóôá ðñüóâáóçò
+CHAN_LEVEL_ACCESS_CHANGE
+ ÅðéôñÝðåôáé íá ðáñÝìâåôáé êáé íá áëëÜîåôáé ôçí ëßóôá ðñüóâáóçò
+CHAN_LEVEL_MEMO
+ ÅðéôñÝðåôáé íá äåßò ôçí ëßóôá êáé íá äéáâÜóåéò ôá ìçíýìáôá ðïõ Ý÷ïõí óôáëåß óôï êáíÜëé
+CHAN_LEVEL_ASSIGN
+ ÅðéôñÝðåôáé íá ìðåß/âãåß ôï bot
+CHAN_LEVEL_BADWORDS
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò ôçí BADWORDS åíôïëÞ
+CHAN_LEVEL_NOKICK
+ Ôá bot's íá ìçí ðåôÜíå Ýîù ôïõò kickers
+CHAN_LEVEL_FANTASIA
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò fantaisist åíôïëÝò
+CHAN_LEVEL_SAY
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò SAY êáé ACT åíôïëÝò
+CHAN_LEVEL_GREET
+ Ôï ìÞíõìá ÷áéñåôéóìïý íá äéáôõðþíåôáé
+CHAN_LEVEL_VOICEME
+ ÅðéôñÝðåôáé íá êÜíåéò (de)voice ôïí åáõôü óïõ
+CHAN_LEVEL_VOICE
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò VOICE/DEVOICE åíôïëÝò
+CHAN_LEVEL_GETKEY
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò ôçí GETKEY åíôïëÞ
+CHAN_LEVEL_OPDEOPME
+ ÅðéôñÝðåôáé íá êÜíåéò (de)op ôïí åáõôü óïõ
+CHAN_LEVEL_HALFOPME
+ ÅðéôñÝðåôáé íá êÜíåéò (de)halfop ôïí åáõôü óïõ
+CHAN_LEVEL_HALFOP
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò HALFOP/DEHALFOP åíôïëÝò
+CHAN_LEVEL_PROTECTME
+ ÅðéôñÝðåôáé íá êÜíåéò (de)protect ôïí åáõôü óïõ
+CHAN_LEVEL_PROTECT
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò PROTECT/DEPROTECT åíôïëÝò
+CHAN_LEVEL_KICKME
+ ÅðéôñÝðåôáé íá êÜíåéò kick ôïí åáõôü óïõ
+CHAN_LEVEL_KICK
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò ôçí KICK åíôïëÞ
+CHAN_LEVEL_SIGNKICK
+ ¼÷é signed kick üôáí ôï SIGNKICK LEVEL ÷ñçóéìïðïéåßôáé
+CHAN_LEVEL_BANME
+ ÅðéôñÝðåôáé íá êÜíåéò Ban ôïí åáõôü óïõ
+CHAN_LEVEL_BAN
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò ôçí BAN åíôïëÞ
+CHAN_LEVEL_TOPIC
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò ôçí TOPIC åíôïëÞ
+CHAN_LEVEL_INFO
+ ÅðéôñÝðåôáé íá ÷ñçóéìïðïéÞóåéò ôçí INFO åíôïëÞ ìå ôçí ALL åðéëïãÞ
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Áõôü ôï êáíÜëé Ý÷åé êáôï÷õñùèåß ìå ôïí %s.
+CHAN_NOT_ALLOWED_OP
+ Äåí ìðïñåßò íá Ý÷åéò chanop status óå áõôü ôï êáíÜëé %s.
+CHAN_MAY_NOT_BE_USED
+ Áõôü ôï êáíÜëé äåí ìðïñåß íá ÷ñçóéìïðïéçèåß.
+CHAN_NOT_ALLOWED_TO_JOIN
+ Äåí Ý÷åéò ôçí Üäåéá íá åßóáé óå áõôü ôï êáíÜëé.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER channel password description
+CHAN_REGISTER_DISABLED
+ Óõãíþìç, ç õðçñåóßá êáôï÷ýñùóåéò êáíáëéþí äåí ëåéôïõñãåß ãéá ôçí þñá.
+CHAN_REGISTER_NOT_LOCAL
+ ÊáíÜëéá ôïðéêÜ äåí ìðïñïýí íá êáôï÷õñùèïýí.
+CHAN_MUST_REGISTER_NICK
+ ÐñÝðåé íá êáôï÷õñþóåéò ôï øåõäþíõìü óïõ ðñþôá. ÃñÜøå /msg %s HELP ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôá ïíüìáôá ðïõ Ý÷ïõí êáôï÷õñùèåß..
+CHAN_MUST_IDENTIFY_NICK
+ Ðáñáêáëþ êÜíå ôçí åíôïëÞ áíáãíþñéóçò ìå ôïí %s ðñþôá, ÷ñçóéìïðïéþíôáò ôçí åíôïëÞ:
+ /msg %s IDENTIFY password
+CHAN_MAY_NOT_BE_REGISTERED
+ Ôï êáíÜëé %s äåí ìðïñåß íá êáôï÷õñùèåß.
+CHAN_ALREADY_REGISTERED
+ Ôï êáíÜëé %s åßíáé Þäç êáôï÷õñùìÝíï!
+CHAN_MUST_BE_CHANOP
+ ÐñÝðåé íá åßóáé íá Ý÷åéò operator status óôï êáíÜëé ãéá íá ôï êáôï÷õñþóåéò.
+CHAN_REACHED_CHANNEL_LIMIT
+ Óõãíþìç, Ý÷åéò Þäç öôÜóåé óôï üñéï êáôï÷ýñùóåéò ôùí %d êáíáëéþí.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Óõãíþìç, Ý÷åéò Þäç îåðåñÜóåé ôï üñéï êáôï÷ýñùóåéò ôùí %d êáíáëéþí.
+CHAN_REGISTRATION_FAILED
+ Óõãíþìç, ç êáôï÷ýñùóç áðÝôõ÷å.
+CHAN_REGISTERED
+ Ôï êáíÜëé %s åßíáé êáôï÷õñùìÝíï áðü ôï øåõäþíõìü óïõ: %s
+CHAN_PASSWORD_IS
+ Ï êùäéêüò ôïõ êáíáëéïý åßíáé %s - èõìÞóïõ ôïí ãéáôß èá ôïí ÷ñåéáóôåßò ìåôÜ.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY channel password
+CHAN_IDENTIFY_FAILED
+ Óõãíþìç, ç áíáãíþñéóç ãéá ôï êáíÜëé áðÝôõ÷å.
+CHAN_IDENTIFY_SUCCEEDED
+ Ï êùäéêüò Ýãéíå äåêôüò - ôþñá Ý÷åéò founder-level ðñüóâáóç óôï %s.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT channel nickname
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT channel [nickname]
+CHAN_LOGOUT_SUCCEEDED
+ Ï ÷ñÞóôçò %s Ýãéíå logged out áðü ôï êáíÜëé %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ ¼ëïé ïé ÷ñÞóôåò logged out áðü ôï êáíÜëé %s.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP channel
+CHAN_DROP_DISABLED
+ Óõãíþìç, ç õðçñåóßá äéáãñáöÞò êáíáëéþí åßíáé áðåíåñãïðïéçìÝíç.
+CHAN_DROPPED
+ Ôï êáíÜëé %s äéáãñÜöôçêå áðü ôéò õðçñåóßåò.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET channel option parameters
+CHAN_SET_DISABLED
+ Óõãíþìç, ïé åðéëïãÝò ãéá ôçí ñýèìéóç ôùí êáíáëéþí åßíáé áðåíåñãïðïéçìÝíåò.
+CHAN_SET_UNKNOWN_OPTION
+ ¢ãíùóôç SET åðéëïãÞ %s.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s Ý÷åé ðïëëÜ êáôï÷õñùìÝíá êáíÜëéá.
+CHAN_FOUNDER_CHANGED
+ Ï Founder ôïõ %s Üëëáîå êáé ðÞãå óôïí %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Ï Successor ôïõ %s Üëëáîå êáé ðÞãå óôïí %s.
+CHAN_SUCCESSOR_UNSET
+ Ï Successor ôïõ %s äåí Ý÷åé ïñéóôåß.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s äåí ìðïñåß íá åßíáé successor óôï êáíÜëé %s ãéáôß åßíáé founder óå áõôü.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Óõãíþìç, äåí ìðüñåóå íá ãßíåé äåêôüò ï êùäéêüò.
+CHAN_PASSWORD_CHANGED
+ %s ï êùäéêüò Üëëáîå.
+CHAN_PASSWORD_CHANGED_TO
+ %s ï êùäéêüò Üëëáîå óå %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ ÐåñéãñáöÞ ôïõ %s Üëëáîå óå %s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ URL ôïõ %s Üëëáîå óå %s.
+CHAN_URL_UNSET
+ URL ôïõ %s äåí Ý÷åé ïñéóôåß.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ E-mail äéåýèõíóç ôïõ %s Üëëáîå óå %s.
+CHAN_EMAIL_UNSET
+ E-mail äéåýèõíóç ôïõ %s äåí Ý÷åé ïñéóôåß.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Ôï ìÞíõìá õðïäï÷Þò ôïõ %s Üëëáîå.
+CHAN_ENTRY_MSG_UNSET
+ Ôï ìÞíõìá õðïäï÷Þò ôïõ %s äåí Ý÷åé ïñéóôåß.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s äåí åßíáé óùóôüò ban ôýðïò.
+CHAN_SET_BANTYPE_CHANGED
+ Ban ôýðïò ôïõ êáíáëéïý %s åßíáé ôþñá #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ ¢ãíùóôç åðéëïãÞ ÷áñáêôÞñá %c áãíïÞèçêå.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Ç åðéëïãÞ %c áãíïÞèçêå ãéáôß äåí ìðïñåßò íá ôï êëåéäþóåéò.
+CHAN_SET_MLOCK_L_REQUIRED
+ ÐñÝðåé íá ôï êëåéäþóåéò ìå +l üðùò êáé ìå +L.
+CHAN_SET_MLOCK_K_REQUIRED
+ ÐñÝðåé íá êëåéäþóåéò ìå +i üðùò êáé ìå +K.
+CHAN_MLOCK_CHANGED
+ Ç åðéëïãÞ êëåéäþìáôïò óôï êáíÜëé %s Üëëáîå óå %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET channel KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Ç åðéëïãÞ ôïõ Topic retention åßíáé ôþñá ON.
+CHAN_SET_KEEPTOPIC_OFF
+ Ç åðéëïãÞ ôïõ Topic retention åßíáé ôþñá OFF.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET channel TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Ç åðéëïãÞ ãéá êëåßäùìá ôïõ Topic åßíáé ôþñá ON.
+CHAN_SET_TOPICLOCK_OFF
+ Ç åðéëïãÞ ãéá êëåßäùìá ôïõ Topic åßíáé ôþñá OFF.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET channel PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Ç åðéëïãÞ Peace åßíáé ôþñá ON.
+CHAN_SET_PEACE_OFF
+ Ç åðéëïãÞ Peace åßíáé ôþñá OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET channel PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Ç åðéëïãÞ Private åßíáé ôþñá ON.
+CHAN_SET_PRIVATE_OFF
+ Ç åðéëïãÞ Private åßíáé ôþñá OFF.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET channel SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Ç åðéëïãÞ Secure ops åßíáé ôþñá ON.
+CHAN_SET_SECUREOPS_OFF
+ Ç åðéëïãÞ Secure ops åßíáé ôþñá OFF.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET channel SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Ç åðéëïãÞ Secure founder åßíáé ôþñá ON.
+CHAN_SET_SECUREFOUNDER_OFF
+ Ç åðéëïãÞ Secure founder åßíáé ôþñá OFF.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET channel RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Ç åðéëïãÞ Restricted access åßíáé ôþñá ON.
+CHAN_SET_RESTRICTED_OFF
+ Ç åðéëïãÞ Restricted access åßíáé ôþñá OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET channel SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Ç åðéëïãÞ Secure option åßíáé ôþñá ON.
+CHAN_SET_SECURE_OFF
+ Ç åðéëïãÞ Secure option åßíáé ôþñá OFF.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET channel SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Ç åðéëïãÞ Signed kick åßíáé ôþñá ON.
+CHAN_SET_SIGNKICK_LEVEL
+ Ç åðéëïãÞ Signed kick åßíáé ôþñá ON, áëëÜ ÷ñåéÜæåôáé ñýèìéóç ôï level Ýôóé
+ þóôå ï ÷ñÞóôçò íá ìðïñåß íá ÷ñçóéìïðïéÞóåé áõôÞ ôçí åíôïëÞ.
+CHAN_SET_SIGNKICK_OFF
+ Ç åðéëïãÞ Signed kick åßíáé ôþñá OFF.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET channel OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Ç åðéëïãÞ Op-notice åßíáé ôþñá ON.
+CHAN_SET_OPNOTICE_OFF
+ Ç åðéëïãÞ Op-notice åßíáé ôþñá OFF.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET channel XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ Ç xOP åðéëïãÞ ôïõ óõóôÞìáôïò åßíáé ôþñá ON.
+CHAN_SET_XOP_OFF
+ Ç xOP åðéëïãÞ ôïõ óõóôÞìáôïò åßíáé ôþñá OFF.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET channel NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ Ôï êáíÜëé %s äåí èá ëÞîåé.
+CHAN_SET_NOEXPIRE_OFF
+ Ôï êáíÜëé %s èá ëÞîåé.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò ìüíï íá ÷ñçóéìïðïéÞóåéò %d AOP/SOP/VOP óôï êáíÜëé.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Äåí ìðïñåßò íá ÷ñçóéìïðïéÞóåéò áõôÞ ôçí åíôïëÞ. ×ñçóéìïðïßçóå ôçí ACCESS åíôïëÞ áíôß ãéá áõôÞ.
+ ÃñÜøå /msg %s HELP ACCESS ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_AOP_DISABLED
+ Óõãíþìç, ç õðçñåóßá ãéá ôçí åíôïëÞ AOP åßíáé åêôüò ëåéôïõñãßáò.
+CHAN_AOP_NICKS_ONLY
+ Ç åíôïëÞ Channel AOP ëßóôá ðåñéÝ÷åé ìüíï êáôï÷õñùìÝíá øåõäþíõìá.
+CHAN_AOP_ADDED
+ Ï/ç %s ðñïóèÝèçêå åðéôõ÷þò óôçí AOP ëßóôá ôïõ %s.
+CHAN_AOP_MOVED
+ %s moved to %s AOP list.
+CHAN_AOP_NO_SUCH_ENTRY
+ Äåí õðÜñ÷åé áõôÞ ç èÝóç (#%d) óôçí AOP ëßóôá ôïõ %s.
+CHAN_AOP_NOT_FOUND
+ Ï/ç %s äåí âñÝèçêå ç èÝóç óôçí AOP ëßóôá ôïõ %s.
+CHAN_AOP_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí AOP ëßóôá ôïõ %s.
+CHAN_AOP_DELETED
+ Ï/ç %s äéáãñÜöçêå åðéôõ÷þò áðü ôçí AOP ëßóôá ôïõ %s.
+CHAN_AOP_DELETED_ONE
+ ÄéáãñÜöçêå 1 èÝóç áðü ôçí AOP ëßóôá ôïõ %s.
+CHAN_AOP_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí AOP ëßóôá ôïõ %s.
+CHAN_AOP_LIST_EMPTY
+ Ç AOP ëßóôá ôïõ %s åßíáé Üäåéá.
+CHAN_AOP_LIST_HEADER
+ Ç AOP ëßóôá ôïõ %s åßíáé :
+ Íïýìåñï Øåõäþíõìï
+CHAN_AOP_CLEAR
+ Ç AOP ëßóôá ôïõ êáíáëéïý Ý÷åé êáèáñéóôåß ðëÞñùò.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_HOP_DISABLED
+ Óõãíþìç, ç õðçñåóßá ãéá ôçí åíôïëÞ HOP åßíáé åêôüò ëåéôïõñãßáò.
+CHAN_HOP_NICKS_ONLY
+ Ç åíôïëÞ Channel HOP ëßóôá ðåñéÝ÷åé ìüíï êáôï÷õñùìÝíá øåõäþíõìá.
+CHAN_HOP_ADDED
+ Ï/ç %s ðñïóèÝèçêå åðéôõ÷þò óôçí HOP ëßóôá ôïõ %s.
+CHAN_HOP_MOVED
+ %s moved to %s HOP list.
+CHAN_HOP_NO_SUCH_ENTRY
+ Äåí õðÜñ÷åé áõôÞ ç èÝóç (#%d) óôçí HOP ëßóôá ôïõ %s.
+CHAN_HOP_NOT_FOUND
+ Ï/ç %s äåí âñÝèçêå óôçí HOP ëßóôá ôïõ %s.
+CHAN_HOP_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí HOP ëßóôá ôïõ %s.
+CHAN_HOP_DELETED
+ Ï/ç %s äéáãñÜöçêå åðéôõ÷þò áðü ôçí HOP ëßóôá ôïõ %s.
+CHAN_HOP_DELETED_ONE
+ ÄéáãñÜöçêå 1 8Ýóç áðü ôçí HOP ëßóôá ôïõ %s.
+CHAN_HOP_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí ÇOP ëßóôá ôïõ %s.
+CHAN_HOP_LIST_EMPTY
+ Ç HOP ëßóôá ôïõ %s åßíáé Üäåéá.
+CHAN_HOP_LIST_HEADER
+ Ç HOP ëßóôá ôïõ %s åßíáé:
+ Íïýìåñï Øåõäþíõìï
+CHAN_HOP_CLEAR
+ Ç HOP ëßóôá ôïõ êáíáëéïý Ý÷åé êáèáñéóôåß ðëÞñùò.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_SOP_DISABLED
+ Óõãíþìç, ç õðçñåóßá ãéá ôçí åíôïëÞ SOP åßíáé åêôüò ëåéôïõñãßáò.
+CHAN_SOP_NICKS_ONLY
+ Ç åíôïëÞ Channel SOP ëßóôá ðåñéëáìâÜíåé ìüíï êáôï÷õñùìÝíá øåõäþíõìá.
+CHAN_SOP_ADDED
+ Ï/ç %s ðñïóèÝèçêå åðéôõ÷þò óôçí SOP ëßóôá ôïõ %s.
+CHAN_SOP_MOVED
+ %s moved to %s SOP list.
+CHAN_SOP_NO_SUCH_ENTRY
+ Äåí õðÜñ÷åé áõôÞ ç èÝóç (#%d) óôçí SOP ëßóôá ôïõ %s.
+CHAN_SOP_NOT_FOUND
+ Ï/ç %s äåí âñÝèçêå óôçí SOP ëßóôá ôïõ %s.
+CHAN_SOP_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí SOP ëßóôá ôïõ %s.
+CHAN_SOP_DELETED
+ Ï/ç %s äéáãñÜöçêå åðéôõ÷þò áðü ôçí SOP ëßóôá ôïõ %s.
+CHAN_SOP_DELETED_ONE
+ ÄéáãñÜöçêå 1 8Ýóç áðü ôçí SOP ëßóôá ôïõ %s.
+CHAN_SOP_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí SOP ëßóôá ôïõ %s.
+CHAN_SOP_LIST_EMPTY
+ Ç SOP ëßóôá ôïõ %s åßíáé Üäåéá.
+CHAN_SOP_LIST_HEADER
+ Ç SOP ëßóôá ôïõ %s åßíáé:
+ Íïýìåñï Øåõäþíõìï
+CHAN_SOP_CLEAR
+ Ç SOP ëßóôá ôïõ êáíáëéïý Ý÷åé êáèáñéóôåß ðëÞñùò.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_VOP_DISABLED
+ Óõãíþìç, ç õðçñåóßá ãéá ôçí åíôïëÞ VOP åßíáé åêôüò ëåéôïõñãßáò.
+CHAN_VOP_NICKS_ONLY
+ Ç åíôïëÞ Channel VOP ëßóôá ðåñéëáìâÜíåé ìüíï êáôï÷õñùìÝíá øåõäþíõìá.
+CHAN_VOP_ADDED
+ Ï/ç %s ðñïóèÝèçêå åðéôõ÷þò óôçí VOP ëßóôá ôïõ %s.
+CHAN_VOP_MOVED
+ %s moved to %s VOP list.
+CHAN_VOP_NO_SUCH_ENTRY
+ Äåí õðÜñ÷åé áõôÞ ç èÝóç (#%d) óôçí VOP ëßóôá ôïõ %s.
+CHAN_VOP_NOT_FOUND
+ Ï/ç %s äåí âñÝèçêå óôçí VOP ëßóôá ôïõ %s.
+CHAN_VOP_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí VOP ëßóôá ôïõ %s.
+CHAN_VOP_DELETED
+ Ï/ç %s äéáãñÜöçêå åðéôõ÷þò áðü ôçí VOP ëßóôá ôïõ %s.
+CHAN_VOP_DELETED_ONE
+ ÄéáãñÜöçêå 1 8Ýóç áðü ôçí VOP ëßóôá ôïõ %s.
+CHAN_VOP_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí VOP ëßóôá ôïõ %s.
+CHAN_VOP_LIST_EMPTY
+ Ç VOP ëßóôá ôïõ %s åßíáé Üäåéá.
+CHAN_VOP_LIST_HEADER
+ Ç VOP ëßóôá ôïõ %s åßíáé:
+ Íïýìåñï Øåõäþíõìï
+CHAN_VOP_CLEAR
+ Ç VOP ëßóôá ôïõ êáíáëéïý Ý÷åé êáèáñéóôåß ðëÞñùò.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS channel {ADD|DEL|LIST|CLEAR} [nick [level] | entry-list]
+CHAN_ACCESS_XOP
+ Äåí ìðïñåßò íá ÷ñçóéìïðïéÞóåéò áõôÞ ôçí åíôïëÞ.
+ ×ñçóéìïðïßçóå AOP, SOP êáé VOP åíôïëÝò áíôß ãéá ôçí access.
+ ÃñÜøå /msg %s HELP command ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+CHAN_ACCESS_DISABLED
+ Óõãíþìç, ç õðçñåóßá ãéá ôçí åíôïëÞ access åßíáé åêôüò ëåéôïõñãßáò.
+CHAN_ACCESS_LEVEL_NONZERO
+ Ç Access level äåí ðñÝðåé íá åßíáé ðïôÝ óôï ìçäÝí.
+CHAN_ACCESS_LEVEL_RANGE
+ Ç Access level ðñÝðåé íá åßíáé áíÜìåóá óôï %d êáé %d óõìðáñáëáìâáíüìåíïõ.
+CHAN_ACCESS_NICKS_ONLY
+ Ç Channel access ëßóôá ðåñéëáìâÜíåé ìüíï êáôï÷õñùìÝíá øåõäþíõìá.
+CHAN_ACCESS_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò ìüíï íá Ý÷åéò %d access óôï êáíÜëé.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Ç Access level ôïõ %s óôï %s äåí áëëÜæåé áðü ôïí %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Ç Access level ãéá ôïí %s óôï %s Üëëáîå óå %d.
+CHAN_ACCESS_ADDED
+ Ï/ç %s ðñïóèÝèçêå óôï access list ôïõ %s ìå level %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ Äåí õðÜñ÷åé áõôÞ ç èÝóç (#%d) óôï %s access list.
+CHAN_ACCESS_NOT_FOUND
+ Ï/ç %s äåí âñÝèçêå óôïõ %s óôçí access list.
+CHAN_ACCESS_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôïõ %s óôçí access list.
+CHAN_ACCESS_DELETED
+ %s äéáãñÜöôçêå áðü ôï access list ôïõ %s.
+CHAN_ACCESS_DELETED_ONE
+ ÄéáãñÜöåé 1 èÝóç áðü %s access list.
+CHAN_ACCESS_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü %s access list.
+CHAN_ACCESS_LIST_EMPTY
+ Ç ëßóôá ôïõ %s access list åßíáé Üäåéá.
+CHAN_ACCESS_LIST_HEADER
+ Ç access ëßóôá ôïõ %s åßíáé:
+ Íïýíåñï Âáèìüò Øåõäþíõìï
+CHAN_ACCESS_LIST_FOOTER
+ Ôåëïò ôçò ëßóôáò ðñïóâáóçò.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ Ç access ëßóôá ôïõ êáíáëéïý êáèáñßóôçêå ðëÞñùò.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK channel {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-or-usermask] [reason]
+CHAN_AKICK_DISABLED
+ Óõãíþìç, ç õðçñåóßá ãéá ôçí åíôïëÞ akick åßíáé åêôüò ëåéôïõñãßáò.
+CHAN_AKICK_ALREADY_EXISTS
+ Ï/ç %s õðÜñ÷åé Þäç óôçí autokick ëßóôá ôïõ %s.
+CHAN_AKICK_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò ìüíï íá Ý÷åéò %d autokick ìÜóêá óôï êáíÜëé.
+CHAN_AKICK_ADDED
+ Ï/ç %s ðñïóèÝèçêå åðéôõ÷þò óôçí autokick ëßóôá ôïõ %s.
+CHAN_AKICK_NO_SUCH_ENTRY
+ Äåí õðÜñ÷åé áõôÞ ç èÝóç (#%d) óôï %s akick list.
+CHAN_AKICK_NOT_FOUND
+ O %s äåí âñÝèçêå óôçí autokick list ôïõ %s.
+CHAN_AKICK_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí autokick list ôïõ %s.
+CHAN_AKICK_STUCK
+ %s åßíáé áðü ôùñá åíåñãü óôï êáíÜëé %s.
+CHAN_AKICK_UNSTUCK
+ %s äåí åßíáé óõíÝ÷åéá åíåñãü ðéá óôï êáíÜëé %s.
+CHAN_AKICK_DELETED
+ Ï/ç %s äéáãñÜöôçêå áðü ôçí autokick list ôïõ %s.
+CHAN_AKICK_DELETED_ONE
+ ÄéáãñÜöôçêå 1 èÝóç áðü ôçí autokick list %s.
+CHAN_AKICK_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí autokick list %s.
+CHAN_AKICK_LIST_EMPTY
+ H autokick list ôïõ %s åßíáé Üäåéá.
+CHAN_AKICK_LIST_HEADER
+ Ç Autokick list ôïõ %s åßíáé:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (áðü %s óôï %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (stuck) (áðü %s óôï %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ Ç AKICK ENFORCE ãéá ôïí %s ïëïêëçñþèçêå; %d ÷ñÞóôåò èá åðéññåáóôïýí.
+CHAN_AKICK_CLEAR
+ Ç akick ëßóôá ôïõ êáíáëéïý Ý÷åé êáèáñéóôåß ðëÞñùò.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS channel {SET | DIS[ABLE] | LIST | RESET} [item [level]]
+CHAN_LEVELS_XOP
+ ÁõôÞ ç åíôïëÞ åßíáé ÷ñÞóéìç ãéá áõôÞ ôçí åðéëïãÞ.
+CHAN_LEVELS_RANGE
+ Ï âáèìüò ðñÝðåé íá åßíáé ìåôáîý %d êáé %d.
+CHAN_LEVELS_CHANGED
+ Ï âáèìüò ãéá ôïí %s óôï êáíÜëé %s Üëëîå óå %d.
+CHAN_LEVELS_UNKNOWN
+ Ç åðéëïãÞ %s äåí åßíáé ãíùóôÞ. ÃñÜøå /msg %s HELP LEVELS DESC ãéá ôç ëßóôá ìå ôéó áíáëõôéêÝò åðéëïãÝò.
+CHAN_LEVELS_DISABLED
+ %s áðåíåñãïðïéÞèçêáí óôï êáíÜëé %s.
+CHAN_LEVELS_LIST_HEADER
+ Ï âáèìüò access ãéá ôï êáíÜëé %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (áðåíåñãïðïéçìÝíï)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (êáíáëÜñ÷çò ìüíï)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ Ï âáèìüò Access ãéá ôï %s óâÞóôçêå óôï áñ÷éêü.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO channel [ALL]
+CHAN_INFO_HEADER
+ Ðëçñïöïñßåò ãéá ôï êáíÜëé %s:
+CHAN_INFO_FOUNDER
+ ÊáíáëÜñ÷çò: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ ÊáíáëÜñ÷çò: %s
+CHAN_INFO_SUCCESSOR
+ ÕðïêáíáëÜñ÷çò: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ ÕðïêáíáëÜñ÷çò: %s
+CHAN_INFO_DESCRIPTION
+ ÐåñéãñáöÞ: %s
+CHAN_INFO_ENTRYMSG
+ ÌÞíõìá åéóüäïõ: %s
+CHAN_INFO_TIME_REGGED
+ Êáôï÷õñþèçêå: %s
+CHAN_INFO_LAST_USED
+ Ôåëåõôáßá ÷ñÞóç: %s
+CHAN_INFO_LAST_TOPIC
+ Ôåëåõôáßï topic: %s
+CHAN_INFO_TOPIC_SET_BY
+ Ôï Topic ãñÜöôçêå áðü ôïí: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ E-mail äéåýèõíóç: %s
+CHAN_INFO_BANTYPE
+ Ôýðïò Ban: %d
+CHAN_INFO_OPTIONS
+ ÅðéëïãÝò: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Topic åííáëáãÞò
+CHAN_INFO_OPT_OPNOTICE
+ Ðïéïò ÷ñçóéìïðïßçóå OP
+CHAN_INFO_OPT_PEACE
+ Åéñçíéêü
+CHAN_INFO_OPT_PRIVATE
+ Ìõóôéêü
+CHAN_INFO_OPT_RESTRICTED
+ Ìüíï üóïé Ý÷ïõí Access
+CHAN_INFO_OPT_SECURE
+ ÁóöáëÝò
+CHAN_INFO_OPT_SECUREOPS
+ Ìüíï áõôïß ðïõ Ý÷ïõí access èá ðáßñíïõí op áðü opers
+CHAN_INFO_OPT_SECUREFOUNDER
+ ÁóöÜëåéá óôïí ÊáíáëÜñ÷ç
+CHAN_INFO_OPT_SIGNKICK
+ ÄçëùìÝíá kicks
+CHAN_INFO_OPT_TOPICLOCK
+ Êëåßäùìá ôïõ Topic
+CHAN_INFO_OPT_XOP
+ xOP ëßóôá óõóôÞìáôïò
+CHAN_INFO_OPT_NONE
+ ÊáíÝíá
+CHAN_INFO_MODE_LOCK
+ ÅðéëïãÝò êëåéäþìáôïò: %s
+CHAN_INFO_NO_EXPIRE
+ Áõôü ôï êáíÜëé äåí èá ëÞîåé.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST pattern
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Ïé èÝóåéò ôçò ëßóôáò ôáéñéÜæïõí ìå ôï %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ ÔÝëïò ëßóôáò - %d/%d âñÝèçêáí åìöáíßóôçêáí.
+
+# CLIST responses
+CHAN_INVITE_SYNTAX
+ INVITE êáíÜëé
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN êáíÜëé
+CHAN_UNBANNED
+ ãéíåò unban áðü ôï %s.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC êáíÜëé [topic]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR êáíÜëé ôé áêñéâþò
+CHAN_CLEARED_BANS
+ ¼ëá ôá bans áðü ôï êáíÜëé %s Ý÷ïõí áðïìáêñõíèåß.
+CHAN_CLEARED_EXCEPTS
+ ¼ëá ôá excepts áðü ôï êáíÜëé %s Ý÷ïõí áðïìáêñõíèåß.
+CHAN_CLEARED_MODES
+ ¼ëá ôá modes áðü ôï êáíÜëé %s Ý÷ïõí óâçóôåß.
+CHAN_CLEARED_OPS
+ ¼ëá ôá Mode +o Ý÷åé êáèáñéóôåß áðü ôï êáíÜëé %s.
+CHAN_CLEARED_VOICES
+ ¼ëá ôá Mode +v Ý÷åé êáèáñéóôåß áðü ôï êáíÜëé %s.
+CHAN_CLEARED_USERS
+ ¼ëïé ïé ÷ñÞóôåò Ýãéíáí kick áðü ôï êáíÜëé %s.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS êáíÜëé
+CHAN_GETPASS_UNAVAILABLE
+ Ç åíôïëÞ GETPASS äåí åßíáé äéáèÝóéìç ãéáôß ç êùäéêïðïßçóç åßíáé óå ëåéôïõñãßá.
+CHAN_GETPASS_PASSWORD_IS
+ Ï êùäéêüò ãéá ôï êáíÜëé %s åßíáé %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS êáíÜëé
+CHAN_SENDPASS_UNAVAILABLE
+ Ç åíôïëÞ SENDPASS äåí åßíáé äéáèÝóéìç ãéáôß ç êùäéêïðïßçóç åßíáé óå ëåéôïõñãßá.
+CHAN_SENDPASS_SUBJECT
+ Ï êùäéêüò ôïõ êáíáëéïý (%s)
+CHAN_SENDPASS_HEAD
+ Ãåéá,
+CHAN_SENDPASS_LINE_1
+ Ìáò åéäïðïßçóåò íá óïõ óôåßëïõìå ôïí êùäéêü ôïõ êáíáëéïý %s ìÝóù e-mail.
+CHAN_SENDPASS_LINE_2
+ Ï êùäéêüò åßíáé %s. Ãéá ðåñéóóüôåñç áóöÜëåéá, èá ðñÝðåé íá ôï áëëÜîåéò ôï ãñçãïñüñôåñï áðü ôç óôéãìÞ ðïõ Ýëáâåò áõôü ôï e-mail.
+CHAN_SENDPASS_LINE_3
+ Áí äåí îÝñåéò ãéáôß óïõ óôÜëèçêå áõôü ôï mail, ðáñáêáëþ áãíïçóÝ ôï.
+CHAN_SENDPASS_LINE_4
+ ÐÁÑÁÊÁËÙ ÌÇÍ ÁÐÁÍÔÇÓÅÉÓ ÓÅ ÁÕÔÏ ÔÏ MAIL!
+CHAN_SENDPASS_LINE_5
+ %s administrators.
+CHAN_SENDPASS_OK
+ Ï êùäéêüò ôïõ %s óôÜëèçêå åðéôõ÷þò.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID êáíÜëé [ëüãïò]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID êáíÜëé ëüãïò
+CHAN_FORBID_SUCCEEDED
+ Ôï êáíÜëé %s ðáñáêñáôåßôå.
+CHAN_FORBID_FAILED
+ Äåí ìðïñåß íá ðáñáêñáôçèåß ôï êáíÜëé %s!
+
+# Misc responses
+CHAN_FORBID_REASON
+ This channel has been forbidden.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND channel [reason]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND channel reason
+CHAN_SUSPEND_SUCCEEDED
+ Channel %s is now suspended.
+CHAN_SUSPEND_FAILED
+ Couldn't suspended channel %s!
+CHAN_SUSPEND_REASON
+ This channel has been suspended.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND channel
+CHAN_UNSUSPEND_ERROR
+ No # found in front of channel name.
+CHAN_UNSUSPEND_SUCCEEDED
+ Channel %s is now released.
+CHAN_UNSUSPEND_FAILED
+ Couldn't release channel %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s matches an except on %s and cannot be banned until the except have been removed.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ ¸÷åéò 1 íÝï ìÞíõìá.
+MEMO_HAVE_NEW_MEMOS
+ ¸÷åéò %d íÝá ìçíýìáôá.
+MEMO_TYPE_READ_LAST
+ ÃñÜøå /msg %s READ LAST ãéá íá ôï äéáâÜóåéò.
+MEMO_TYPE_READ_NUM
+ ÃñÜøå /msg %s READ %d ãéá íá äéáâÜóåéò.
+MEMO_TYPE_LIST_NEW
+ ÃñÜøå /msg %s LIST NEW ãéá íá äåéò ôçí ëßóôá ìå ôá ìçíýìáôá.
+MEMO_AT_LIMIT
+ Ðñïåéäïðïßçóç: ¸÷åé öôÜóåé óôï ìÝãéóôï íïýìåñï ìçíõìÜôùí (%d). Äåí èá ëÜâåéò êáéíïýñãéá ìçíýìáôá áí äåí óâÞóåéò ìåñéêÜ áðü ôá ðáëéÜ ðïõ Ý÷åéò.
+MEMO_OVER_LIMIT
+ Ðñïåéäïðïßçóç: ¸÷åéò îåðåñÜóåé ôï íïýìåñï ìçíõìÜôùí ðïõ ìðïñåßò íá ëÜâåéò (%d). Äåí èá ìðïñåßò íá ëÜâåéò Üëëá áí äåí óâÞóåéò ìåñéêÜ áðü ôá ðáëéÜ ìçíýìáôá ðïõ Ý÷åéò.
+MEMO_X_MANY_NOTICE
+ There are %d memos on channel %s.
+MEMO_X_ONE_NOTICE
+ There is %d memo on channel %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ There is a new memo on channel %s.
+ Type /msg %s READ %s %d to read it.
+MEMO_NEW_MEMO_ARRIVED
+ ¸÷åéò Ýíá íÝï ìÞíõìá áðü %s.
+ ÃñÜøå /msg %s READ %d ãéá íá ôï äéáâÜóåéò.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ Äåí Ý÷åéò ìçíýìáôá.
+MEMO_X_HAS_NO_MEMOS
+ %s äåí Ý÷åéò ìçíýìáôá.
+MEMO_DOES_NOT_EXIST
+ Ìçíýìáôá %d äåí õðÜñ÷ïõí!
+MEMO_LIST_NOT_FOUND
+ Äåí âñÝèçêáí ìçíýìáôá.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {øåõäþíõìï | êáíÜëé} ðåñéå÷üìåíï
+MEMO_SEND_DISABLED
+ Óõãíþìç, ôá ìçíýìáôá äåí ìðïñïýí íá óôáëïýí ãéáôß åßíáé áíåíåñãÞ ç õðçñåóßá.
+MEMO_SEND_PLEASE_WAIT
+ Ðáñáêáëþ ðåñßìåíå %d äåõôåñüëåðôá ðñéí ÷ñçóéìïðïéÞóåéò ôçí åíôïëÞ SEND îáíÜ.
+MEMO_X_GETS_NO_MEMOS
+ %s äåí ìðïñåßò íá ëÜâåéò Üëëá ìçíýìáôá.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s Ý÷åéò ðïëëÜ ìçíýìáôá êáé äåí ìðïñåßò íá ëÜâåéò Üëëá.
+MEMO_SENT
+ Ôï ìÞíõìá óôÜëèçêå óôïí %s.
+
+# CANCEL responses
+MEMO_MASS_SENT
+ A massmemo has been sent to all registered users.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {øåõäþíõìï | êáíÜëé}
+MEMO_CANCEL_DISABLED
+ Óõãíþìç, ç áêýñùóç ìçíýìáôïò åßíáé åêôüò ëåéôïõñãßáò.
+MEMO_CANCEL_NONE
+ ÊáíÝíá ìÞíõìá äåí áêõñþèçêå.
+MEMO_CANCELLED
+ Ôï ôåëåõôáßï ìÞíõìá ðïõ ðÞãáéíå ãéá ôïí %s áêõñþèçêå.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [êáíÜëé] [list | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ Äåí Ý÷åéò íÝá ìçíýìáôá.
+MEMO_X_HAS_NO_NEW_MEMOS
+ Ï/ç %s äåí Ý÷åé êáíÝíá íÝï ìÞíõìá.
+MEMO_LIST_MEMOS
+ ÌÞíõìá ãéá ôïí %s. Ãéá íá ôï äéáâÜóåéò, ãñÜøå: /msg %s READ num
+MEMO_LIST_NEW_MEMOS
+ ÍÝá ìçíýìáôá ãéá ôïí %s. Ãéá íá ôá äéáâÜóåéò, ãñÜøå: /msg %s READ num
+MEMO_LIST_CHAN_MEMOS
+ Ìçíýìáôá ãéá ôïí %s. Ãéá íá ôá äéáâÜóåéò, ãñÜøå: /msg %s READ %s num
+MEMO_LIST_CHAN_NEW_MEMOS
+ ÍÝá ìçíýìáôá ãéá ôï %s. Ãéá íá ôá äéáâÜóåéò, ãñÜøå: /msg %s READ %s num
+MEMO_LIST_HEADER
+ Íïýìåñï ÁðïóôïëÝáò Çìåñïìçíßá/¿ñá
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [êáíÜëé] {list | LAST | NEW}
+MEMO_HEADER
+ ÌÞíõìá %d áðü ôï %s (%s). Ãéá íá ôï óâÞóåéò, ãñÜøå: /msg %s DEL %d
+MEMO_CHAN_HEADER
+ ÌÞíõìá %d áðü %s (%s). Ãéá íá ôï óâÞóåéò, ãñÜøå: /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [êáíÜëé] {íïõ | list | ALL}
+MEMO_DELETED_NONE
+ ÊáíÝíá ìÞíõìá äåí äéáãñÜöçêå.
+MEMO_DELETED_ONE
+ ÌÞíõìá %d äéáãñÜöçêå.
+MEMO_DELETED_SEVERAL
+ Ìçíýìáôá %s äéáãñÜöçêáí.
+MEMO_DELETED_ALL
+ ¼ëá ôá ìçíýìáôá äéáãñÜöçêáí.
+
+# SET responses
+MEMO_CHAN_DELETED_ALL
+ All memos for channel %s have been deleted.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET åðéëïãÞ ðáñÜìåôñïé
+MEMO_SET_DISABLED
+ Óõãíþìç, ç åíôïëÞ setting åßíáé áðåíåñãïðïéçìÝíç.
+MEMO_SET_UNKNOWN_OPTION
+ ¢ãíùóôç SET åðéëïãÞ %s.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s áðü ôþñá üôáí èá êÜíåéò åíôïëÞ logon èá âëÝðåéò ôá ìçíýìáôá ðïõ èá óïõ óôÝëíïõí êáèþò èáóáé óôï äßêôõï.
+MEMO_SET_NOTIFY_LOGON
+ %s üôáí èá êÜíåéò log on Þ èá åðáíÝñ÷åóáé áðü away èá ëáìâÜíåéò ôá ìçíýìáôá.
+MEMO_SET_NOTIFY_NEW
+ %s èá óïõ ãßíåôáé ðáñáôÞñçóç ïôé Ýñ÷ïíôáé ìçíýìáôá áðü ôçí õðçñåóßá.
+MEMO_SET_NOTIFY_OFF
+ %s äåí èá óïõ Ýñ÷åôáé êáìßá ðáñáôÞñçóç áðü ôçí õðçñåóßá.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [êáíÜëé] üñéï
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [÷ñÞóôçò | êáíÜëé] {üñéï | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Äåí Ý÷åéò ôï äéêáßùìá íá áëëÜîåéò ôï üñéï ôùí ìçíõìÜôùí ðïõ èá ëáìâÜíåéò.
+MEMO_SET_LIMIT_FORBIDDEN
+ Ôï üñéï ôùí ìçíõìÜôùí ãéá ôïí %s äåí ìðïñåß íá áëëá÷ôåß.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ Äåí ìðïñåßò íá èÝóåéò ùò üñéï ìçíõìÜôùí ìåãáëýôåñï áðü %d.
+MEMO_SET_LIMIT_TOO_HIGH
+ Äåí ìðïñåßò íá èÝóåéò ùò üñéï ìçíõìÜôùí ãéá ôïí %s ìåãáëýôåñï áðü %d.
+MEMO_SET_LIMIT_OVERFLOW
+ Ôï üñéï ìçíõìÜôùí åßíáé ðïëý ìåãÜëï; ïñéïèÝôçóÝ ôï %d óõìðåñéëáìâáíïìÝíïõ.
+MEMO_SET_YOUR_LIMIT
+ Ôï üñéï ìçíõìÜôùí Üëëáîå óå %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ Äåí èá åßóáé éêáíüò íá ëÜâåéò Üëëá ìçíýìáôá.
+MEMO_UNSET_YOUR_LIMIT
+ Ôï üñéï ìçíõìÜôùí åßíáé áðåíåñãïðïéçìÝíï.
+MEMO_SET_LIMIT
+ Ôï üñéï ìçíõìÜôùí ãéá ôïí %s Üëëáîå óå %d.
+MEMO_SET_LIMIT_ZERO
+ Ôï üñéï ìçíõìÜôùí ãéá ôïí %s Üëëáîå óå 0.
+MEMO_UNSET_LIMIT
+ Ôï üñéï ìçíõìÜôùí áðåíåñãïðïéÞèçêå ãéá ôïí %s.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [êáíÜëé]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [øåõäþíõìï | êáíÜëé]
+MEMO_INFO_NO_MEMOS
+ ÌÝ÷ñéò óôéãìÞò äåí Ý÷åéò êáíÝíá ìÞíõìá.
+MEMO_INFO_MEMO
+ ÌÝ÷ñé óôéãìÞò Ý÷åéò 1 ìÞíõìá.
+MEMO_INFO_MEMO_UNREAD
+ ÌÝ÷ñé óôéãìÞò Ý÷åéò 1 memo, êáé äåí ôï Ý÷åéò äéáâÜóåé.
+MEMO_INFO_MEMOS
+ ÌÝ÷ñé óôéãìÞò Ý÷åéò %d ìçíýìáôá.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ ÌÝ÷ñé óôéãìÞò Ý÷åéò %d ìçíýìáôá, åê ôùí ïðïßùí 1 äåí Ý÷åé äéáâáóôåß.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ ÌÝ÷ñé óôéãìÞò Ý÷åéò %d ìçíýìáôá, åê ôùí ïðïßùí %d äåí Ý÷ïõí äéáâáóôåß.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ ÌÝ÷ñé óôéãìÞò Ý÷åéò %d ìçíýìáôá; åê ôùí ïðïßùí üëá äåí Ý÷ïõí äéáâáóôåß.
+MEMO_INFO_LIMIT
+ Ôï üñéï ìçíõìÜôùí åßíáé %d.
+MEMO_INFO_HARD_LIMIT
+ Ôï üñéï ìçíõìÜôùí åßíáé %d, êáé äåí ìðïñåß íá áëëá÷ôåß.
+MEMO_INFO_LIMIT_ZERO
+ Ôï üñéï ìçíõìÜôùí åßíáé 0; äåí èá ëÜâåéò ðïôÝ êáíÝíá Üëëï ìÞíõìá.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Ôï üñéï ìçíõìÜôùí åßíáé 0; äåí èá ëÜâåéò ðïôÝ êáíÝíá Üëëï ìÞíõìá. Äåí ìðïñåßò íá áëëÜîåéò áõôü ôï üñéï.
+MEMO_INFO_NO_LIMIT
+ Äåí Ý÷åéò èÝóåé êáíÝíá áñéèìü óôï üñéï ùóôå íá êñáôÞóåéò ìçíýìáôá.
+MEMO_INFO_NOTIFY_OFF
+ Äåí èá óïõ ãßíåé ðáñáôÞñçóç ãéá íÝá ìçíýìáôá.
+MEMO_INFO_NOTIFY_ON
+ Èá åéäïðïéçèåßò ãéá íÝá ìçíýìáôá üôáí êÜíåéò logon êáé üôáí öôÜóïõí.
+MEMO_INFO_NOTIFY_RECEIVE
+ Èá åéäïðïéçèåßò ãéá íÝá ìçíýìáôá üôáí èá öôÜóïõí.
+MEMO_INFO_NOTIFY_SIGNON
+ Èá åéäïðïéçèåßò ãéá íÝá ìçíýìáôá óôï logon.
+MEMO_INFO_X_NO_MEMOS
+ %s äåí Ý÷åéò êáíÝíá ìÞíõìá.
+MEMO_INFO_X_MEMO
+ %s Ý÷åéò 1 ìÞíõìá..
+MEMO_INFO_X_MEMO_UNREAD
+ %s Ý÷åéò 1 ìÞíõìá, êáé äåí ôï Ý÷åéò äéáâÜóåé áêüìá.
+MEMO_INFO_X_MEMOS
+ %s Ý÷åéò %d ìçíýìáôá.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s Ý÷åéò %d ìçíýìáôá, åê ôùí ïðïßùí 1 äåí Ý÷åé äéáâáóôåß.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s Ý÷åéò %d ìçíýìáôá, åê ôùí ïðïßùí %d äåí Ý÷ïõí äéáâáóôåß.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s Ý÷åéò %d ìçíýìáôá; åê ôùí ïðïßùí üëá äåí Ý÷ïõí äéáâáóôåß.
+MEMO_INFO_X_LIMIT
+ Ôïõ/ôçò %s's ôï üñéï ìçíõìÜôùí åßíáé %d.
+MEMO_INFO_X_HARD_LIMIT
+ %s's üñéï ìçíõìÜôùí åßíáé %d, êáé äåí ìðïñåß íá áëëá÷ôåß.
+MEMO_INFO_X_NO_LIMIT
+ %s äåí Ý÷åéò üñéï ìçíõìÜôùí.
+MEMO_INFO_X_NOTIFY_OFF
+ %s äåí èá ðáñáôçñçèåß ãéá íÝá ìçíýìáôá.
+MEMO_INFO_X_NOTIFY_ON
+ %s èá ðáñáôçñçèåß ãéá íÝá ìçíýìáôá óôï logon êáé üôáí èá öôÜóïõí.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s èá ðáñáôçñçèåß üôáí ôá íÝá ìçíýìáôá èá öôÜóïõí.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s èá ðáñáôçñçèåß ãéá íÝá ìçíýìáôá óôï logon.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Ôï Bot %s äåí õðÜñ÷åé.
+BOT_NOT_ASSIGNED
+ ÐñÝðåé íá êÜíåéò assign óôï bot ãéá íá ìðåß óôï êáíÜëé.
+ ÃñÜøå /msg %S HELP ASSIGN ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+BOT_NOT_ON_CHANNEL
+ Ôï Bot äåí åßíáé óôï êáíÜëé %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ Ìçí ÷ñçóéìïðïéåßò áõôÞ ôç ëÝîç %s óôï êáíÜëé!
+BOT_REASON_BADWORD_GENTLE
+ Ðñüóå÷å ôçí ãëþóóá óïõ!
+BOT_REASON_BOLD
+ Ìçí ÷ñçóéìïðïéåßò Ýíôïíïõò ÷áñáêôÞñåò ìÝóá óôï êáíÜëé!
+BOT_REASON_CAPS
+ Ìçí ãñÜöåéò ìå êåöáëáßá ãñÜììáôá!
+BOT_REASON_COLOR
+ Ìçí ÷ñçóéìïðïéåßò ÷ñþìáôá ìÝóá óôï êáíÜëé!
+BOT_REASON_FLOOD
+ Ìçí åðáíáëáìâÜíåéò óå ðïëëÝò óåéñÝò!
+BOT_REASON_REPEAT
+ Ìçí åðáíáëáìâÜíåéò ôá ßäéá!
+BOT_REASON_REVERSE
+ Ìçí åßóáé áíôßèåôïò ìÝóá óôï êáíÜëé!
+BOT_REASON_UNDERLINE
+ Ìçí ÷ñçóéìïðïéåßò ÷áñáêôÞñåò õðïãñÜììéóçò óôï êáíÜëé!
+
+# !seen replies
+BOT_SEEN_BOT
+ Ìå âñÞêåò, %s!
+BOT_SEEN_YOU
+ ØÜ÷íåéò ãéá ôïí åáõôü óïõ, å %s?
+BOT_SEEN_ON_CHANNEL
+ %s äåí åßíáé óôï êáíÜëé áõôÞ ôç óôéãìÞ!
+BOT_SEEN_ON_CHANNEL_AS
+ %s åßíáé óôï êáíÜëé áõôÞ ôç óôéãìÞ (as %s) !
+BOT_SEEN_ON
+ %s Þôáí åäþ ôçí ôåëåõôáßá öïñÜ ðñéí %s.
+BOT_SEEN_NEVER
+ Äåí Ý÷ù äåé êáíÝíáí %s óå áõôü ôï êáíÜëé.
+BOT_SEEN_UNKNOWN
+ Äåí îÝñù êáíÝíáí %s ðïéïò åßíáé.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick user host real
+ BOT CHANGE oldnick newnick [user [host [real]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ Bot %s õðÜñ÷åé Þäç.
+BOT_BOT_CREATION_FAILED
+ Óõãíþìç, ç äçìéïõñãßá ôïõ bot áðÝôõ÷å.
+BOT_BOT_READONLY
+ Óõãíþìç, ç õðçñåóßá ãéá ôï bot åßíáé áðåíåñãïðïéçìÝíç.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) ðñïóèÝèçêå óôïõ bot ôçí ëßóôá.
+BOT_BOT_ANY_CHANGES
+ Ïé ðáëéÝò ðëçñïöïñßåò åßíáé ßäéåò ìå ôéò êáéíïýñãéåò.
+BOT_BOT_CHANGED
+ Bot %s Üëëáîå óå %s!%s@%s (%s)
+BOT_BOT_DELETED
+ Bot %s äéáãñÜöçêå.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Bot ëßóôá:
+BOT_BOTLIST_PRIVATE_HEADER
+ Bots åßíáé ìüíï ãéá IRC operators:
+BOT_BOTLIST_FOOTER
+ %d bots äéáèÝóéìá.
+BOT_BOTLIST_EMPTY
+ Äåí õðÜñ÷ïõí äéáèÝóéìá bots áõôÞ ôç óôéãìÞ.
+ Ñþôá ôïí Services admin íá óïõ öôéÜîåé Ýíá!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN chan nick
+BOT_ASSIGN_READONLY
+ Óõãíþìç, ç õðçñåóßá bot assignment åßíáé áðåíåñãïðïéçìÝíç.
+BOT_ASSIGN_ALREADY
+ Bot %s is already assigned to channel %s.
+BOT_ASSIGN_ASSIGNED
+ Ôï Bot %s èá ìðåé óôï %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN chan
+BOT_UNASSIGN_UNASSIGNED
+ Äåí õðÜñ÷åé bot ðïõ íá åßíáé óôï %s ôþñá ðéá.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {chan | nick}
+BOT_INFO_NOT_FOUND
+ %s äåí åßíáé óùóôü bot Þ êáôï÷õñùìÝíï êáíÜëé.
+BOT_INFO_BOT_HEADER
+ Ðëçñïöïñßåò ãéá ôï bot %s:
+BOT_INFO_BOT_MASK
+ ÌÜóêá : %s@%s
+BOT_INFO_BOT_REALNAME
+ Ðñáãìáôéêü üíïìá : %s
+BOT_INFO_BOT_CREATED
+ ÄçìéïõñãÞèçêå : %s
+BOT_INFO_BOT_USAGE
+ ×ñçóéìïðïéåßôáé óôï/á : %d êáíÜëé/á
+BOT_INFO_BOT_OPTIONS
+ ÅðéëïãÝò : %s
+BOT_INFO_OPT_PRIVATE
+ Ìõóôéêü
+BOT_INFO_CHAN_HEADER
+ Ðëçñïöïñßåò ãéá ôï êáíÜëé %s:
+BOT_INFO_CHAN_BOT
+ ¼íïìá ôïõ Bot : %s
+BOT_INFO_CHAN_BOT_NONE
+ ¼íïìá ôïõ bot : äåí õðÜñ÷åé ãéá ôçí þñá.
+BOT_INFO_CHAN_KICK_BADWORDS
+ ÊáêÝò ëÝîåéò þóôå íá êÜíåé kick : %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ ÊáêÝò ëÝîåéò þóôå íá êÜíåé kick : %s (%d kick(s) to ban)
+BOT_INFO_CHAN_KICK_BOLDS
+ ¸íôïíç ÷áñáêôÞñåò ìå kick : %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ ¸íôïíç ÷áñáêôÞñåò ìå kick : %s (%d kick(s) to ban)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Êåöáëáßá ãñÜììáôá ìå kick : %s (minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Êåöáëáßá ãñÜììáôá ìå kick : %s (%d kick(s) to ban; minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Êåöáëáßá ãñÜììáôá ìå kick : %s
+BOT_INFO_CHAN_KICK_COLORS
+ ×ñþìáôá ìå kick : %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ ×ñþìáôá ìå kick : %s (%d kick(s) to ban)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ ÅðáíÜëçøç ìå kick : %s (%d lines in %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ ÅðáíÜëçøç ìå kick : %s (%d kick(s) to ban; %d lines in %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ ÅðáíÜëçøç ìå kick : %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ ÅðáíÜëçøç ìå kick : %s (%d times)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ ÅðáíÜëçøç ìå kick : %s (%d kick(s) to ban; %d times)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ ÅðáíÜëçøç ìå kick : %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Áíôéèåôïò ìå kick : %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Áíôéèåôïò kick : %s (%d kick(s) to ban)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ ÕðïãñÜììéóç ìå kick : %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ ÕðïãñÜììéóç ìå kick : %s (%d kick(s) to ban)
+BOT_INFO_ACTIVE
+ åíåñãïðïéçìÝíï
+BOT_INFO_INACTIVE
+ áðåíåñãïðïéçìÝíï
+BOT_INFO_CHAN_OPTIONS
+ ÅðéëïãÝò : %s
+BOT_INFO_OPT_DONTKICKOPS
+ Ðñïóôáóßá óôïõò Ops
+BOT_INFO_OPT_DONTKICKVOICES
+ Ðñïóôáóßá óôïõò Voices
+BOT_INFO_OPT_FANTASY
+ Öáíôáóßá
+BOT_INFO_OPT_GREET
+ ×áéñåôéóìüò
+BOT_INFO_OPT_NOBOT
+ ÊáíÝíá bot
+BOT_INFO_OPT_SYMBIOSIS
+ Óõìâßùóç
+BOT_INFO_OPT_NONE
+ ÊáíÝíá
+
+# SET responses
+BOT_SET_SYNTAX
+ SET channel option settings
+BOT_SET_DISABLED
+ Óõãíþìç, ç õðçñåóßá bot åßíáé áðåíåñãïðïéçìÝíç.
+BOT_SET_UNKNOWN
+ ¢ãíùóôç åðéëïãÞ %s.
+ ÃñÜøå /msg %S HELP SET ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET channel DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Ôï Bot äåí èá êÜíåé kick ôïõå ops ôïõ êáíáëéïý %s.
+BOT_SET_DONTKICKOPS_OFF
+ Ôï Bot èá êÜíåé kick ôïõò ops ôïõ êáíáëéïý %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET channel DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Ôï Bot äåí èá êÜíåé kick ôïõò voices ôïõ êáíáëéïý %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Ôï Bot èá êÜíåé kick ôïõò voices ôïõ êáíáëéïý %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET channel FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Ç Fantasy åðéëïãÞ åßíáé ôþñá ON óôï êáíÜëé %s.
+BOT_SET_FANTASY_OFF
+ Ç Fantasy åðéëïãÞ åßíáé ôùñá OFF óôï êáíÜëé %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET channel GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Ç åðéëïãÞ ÷áéñåôéóìïý åßíáé ON óôï êáíÜëé %s.
+BOT_SET_GREET_OFF
+ Ç åðéëïãÞ ÷áéñåôéóìïý åßíáé OFF óôï êáíÜëé %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET channel NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ ÊáíÝíá Bot Ý÷åé åðéëïãÞ ON óôï êáíÜëé %s.
+BOT_SET_NOBOT_OFF
+ ÊáíÝíá Bot Ý÷åé åðéëïãÞ OFF óôï êáíÜëé %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET channel PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Ìõóôéêüôçôá åðéëïãÞò ôïõ bot %s åßíáé ôþñá ON.
+BOT_SET_PRIVATE_OFF
+ Ìõóôéêüôçôá åðéëïãÞò ôïõ bot %s åßíáé ôþñá OFF.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET channel SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ ÅðéëïãÞ óõìâßùóçò åßíáé ôþñá ON óôï êáíÜëé %s.
+BOT_SET_SYMBIOSIS_OFF
+ ÅðéëïãÞ óõìâßùóçò åßíáé ôþñá OFF óôï êáíÜëé %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK channel option {ON|OFF} [settings]
+BOT_KICK_DISABLED
+ Óõãíþìç, ç õðçñåóßá kicker åßíáé áðåíåñãïðïéçìÝíç.
+BOT_KICK_UNKNOWN
+ ¢ãíùóôç åðéëïãÞ %s.
+ ÃñÜøå /msg %S HELP KICK ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+BOT_KICK_BAD_TTB
+ %s äåí ìðïñåß íá ðÜñåé ôüóï ÷ñüíï ôo ban.
+
+BOT_KICK_BADWORDS_ON
+ Ôï Bot áðü ôþñá èá êÜíåé kick êáêÝò ëÝîåéò. ×ñçóéìïðïßçóå ôçí BADWORDS åíôïëÞ
+ ãéá íá ðñïóèÝóåéò Þ íá áöáéñÝóåéò êáêÝò ëÝîåéò.
+BOT_KICK_BADWORDS_ON_BAN
+ Ôï Bot áðü ôþñá èá êÜíåé kick êáêÝò ëÝîåéò, êáé èá êÜíåé êáé ban ìåôÜ áðü
+ %d kicks ãéá ôïí ßäéï ÷ñÞóôç. ×ñçóéìïðïßçóå ôçí BADWORDS åíôïëÞ
+ ãéá íá ðñïóèÝóåéò Þ íá áöáéñÝóåéò êáêÝò ëÝîåéò.
+BOT_KICK_BADWORDS_OFF
+ Ôï Bot äåí èá êÜíåé kick êáêÝò ëÝîåéò ðëÝïí.
+BOT_KICK_BOLDS_ON
+ Ôï Bot èá êÜíåé ôþñá kick Ýíôïíïõò ÷áñáêôÞñåò.
+BOT_KICK_BOLDS_ON_BAN
+ Ôï Bot èá êÜíåé kick Ýíôïíïõò ÷áñáêôÞñåò, êáé èá êÜíåé ban ìåôÜ áðü
+ %d kicks ãéá ôïí ßäéï ÷ñÞóôç.
+BOT_KICK_BOLDS_OFF
+ Ôï Bot äåí èá êÜíåé kick Ýíôïíïõò ÷áñáêôÞñåò ðëÝïí.
+BOT_KICK_CAPS_ON
+ Ôï Bot èá êÜíåé kick êåöáëáßá (ðñÝðåé íá åßíáé ôïõëÜ÷éóôïí
+ %d ÷áñáêôÞñåò êáé %d%% áðü ôï ìÞíõìá).
+BOT_KICK_CAPS_ON_BAN
+ Ôï Bot èá êÜíåé kick êåöáëáßá (ðñÝðåé íá åßíáé ôïõëÜ÷éóôïí
+ %d ÷áñáêôÞñåò êáé %d%% áðü ôï ìÞíõìá), êáé èá
+ ãßíåé ban ìåôÜ áðü %d kicks ãéá ôïí ßäéï ÷ñÞóôç.
+BOT_KICK_CAPS_OFF
+ Ôï Bot äåí èá êÜíåé kick êåöáëáßá ðëÝïí.
+BOT_KICK_COLORS_ON
+ Ôï Bot èá êÜíåé kick ãéá ÷ñþìáôá.
+BOT_KICK_COLORS_ON_BAN
+ Ôï Bot èá êÜíåé kick ãéá ÷ñþìáôá, êáé èá êÜíåé ban ìåôÜ áðü %d
+ kicks ãéá ôïí ßäéï ÷ñÞóôç.
+BOT_KICK_COLORS_OFF
+ Ôï Bot äåí èá êÜíåé kick ãéá ÷ñþìáôá ðëÝïí.
+BOT_KICK_FLOOD_ON
+ Ôï Bot èá êÜíåé kick ãéá åðáíáëÞøåéò (%d ãñáììÝò óå %d äåõôåñüëåðôá).
+BOT_KICK_FLOOD_ON_BAN
+ Ôï Bot èá êÜíåé kick ãéá åðáíáëÞøåéò (%d ãñáììÝò óå %d äåõôåñüëåðôá), êáé
+ èá êÜíåé ban ìåôÜ áðü %d kicks ãéá ôïí ßäéï ÷ñÞóôç.
+BOT_KICK_FLOOD_OFF
+ Ôï Bot äåí èá êÜíåé kick ãéá åðáíáëÞøåéò ðëÝïí.
+BOT_KICK_REPEAT_ON
+ Ôï Bot èá êÜíåé kick ãéá åðáíáëÞøåéò (÷ñÞóôåò ðïõ ëÝíå %d öïñÝò
+ ôï ßäéï ðñÜãìá).
+BOT_KICK_REPEAT_ON_BAN
+ Ôï Bot èá êÜíåé kick ãéá åðáíáëÞøåéò (÷ñÞóôåò ðïõ ëÝíå %d öïñÝò
+ ôï ßäéï ðñÜãìá), êáé èá ãßíåôáé ban ìåôÜ áðü %d
+ kicks ãéá ôïí ßäéï ÷ñÞóôç.
+BOT_KICK_REPEAT_OFF
+ Ôï Bot äåí èá êÜíåé kick ãéá åðáíáëÞøåéò ðëÝïí.
+BOT_KICK_REVERSES_ON
+ Ôï Bot èá êÜíåé kick ãéá reserves.
+BOT_KICK_REVERSES_ON_BAN
+ Ôï Bot èá êÜíåé kick ãéá reverses, êáé èá êÜíåé ban ìåôÜ áðü %d
+ kicks ãéá ôïí ßäéï ÷ñÞóôç.
+BOT_KICK_REVERSES_OFF
+ Ôï Bot äåí èá êÜíåé kick ãéá reverses ðëÝïí.
+BOT_KICK_UNDERLINES_ON
+ Ôï Bot èá êÜíåé kick ãéá õðïãñáììéóìÝíïõò ÷áñáêôÞñåò.
+BOT_KICK_UNDERLINES_ON_BAN
+ Ôï Bot èá êÜíåé kick ãéá õðïãñáììéóìÝíïõò ÷áñáêôÞñåò, êáé èá êÜíåé ban ìåôÜ áðü %d
+ kicks ãéá ôïí ßäéï ÷ñÞóôç.
+BOT_KICK_UNDERLINES_OFF
+ Ôï Bot äåí èá êÜíåé kick ãéá õðïãñáììéóìÝíïõò ÷áñáêôÞñåò ðëÝïí.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS channel {ADD|DEL|LIST|CLEAR} [word | entry-list] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Óõãíþìç, ç õðçñåóßá bad words åßíáé áðåíåñãïðïéçìÝíç.
+BOT_BADWORDS_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò ìüíï íá Ý÷åéò %d êáêÝò ëÝîåéò ãéá Ýíá êáíÜëé.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s Ý÷åéò Þäç %s êáêÝò ëÝîåéò.
+BOT_BADWORDS_ADDED
+ %s ðñïóèÝèçêå óôçí ëßóôá ôùí êáêþí ëÝîåùí ôïõ %s.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ Äåí õðÜñ÷åé áõôÞ ç èÝóç (#%d) óôç ëßóôá ôùí êáêþí ëÝîåùí ôïõ %s.
+BOT_BADWORDS_NOT_FOUND
+ %s äåí âñÝèçêå óôç ëßóôá ôùí êáêþí ëÝîåùí ôïõ %s.
+BOT_BADWORDS_NO_MATCH
+ Äåí âñÝèçêáí ïé èÝóåéò óôçí ëßóôá ôùí êáêþí ëÝîåùí ôïõ %s.
+BOT_BADWORDS_DELETED
+ %s äéáãñÜöôçêå áðü ôçí ëßóôá ôùí êáêþí ëÝîåùí áðï ôï %s.
+BOT_BADWORDS_DELETED_ONE
+ ÄéáãñÜöçêå 1 èÝóç áðü ôïõ %s ëßóôá êáêþí ëÝîåùí.
+BOT_BADWORDS_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôï %s ,ôç ëßóôá ôùí êáêþí ëÝîåùí.
+BOT_BADWORDS_LIST_EMPTY
+ Ç ëßïóôá ôùí êáêþí ëÝîåùí ôïõ %s åßíáé Üäåéá.
+BOT_BADWORDS_LIST_HEADER
+ Ç ëßóôá ìå ôéò êáêÝò ëÝîåéò ôïõ %s åßíáé:
+ Íïýì ËÝîç Ôýðïò
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ Ç ëßóôá ôùí êáêþí ëÝîåùí åßíáé Üäåéá.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY channel text
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT channel text
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_EXCEPT
+ User matches channel except.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_BAD_NICK
+ Bot Nicks may only contain valid nick characters.
+BOT_BAD_HOST
+ Bot Hosts may only contain valid host characters.
+BOT_BAD_IDENT
+ Bot Idents may only contain valid characters.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Ïé õðçñåóßåò áäõíáôïýí íá áëëÜîïõí ôéò åðéëïãÝò. Ïé servers åßíáé óùóôÜ öôéáãìÝíïé?
+OPER_BOUNCY_MODES_U_LINE
+ Ïé õðçñåóßåò áäõíáôïýí íá áëëÜîïõí ôéò åðéëïãÝò. Ïé servers' U: ãñáììÝò åßíáé ïé óùóôÝò?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL message
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ ¢ãíùóôç STATS åðéëïãÞ %s..
+OPER_STATS_CURRENT_USERS
+ Ïé ùò ôþñá ÷ñÞóôåò: %d (%d ops)
+OPER_STATS_MAX_USERS
+ ÌÝãéóôïé ÷ñÞóôåò: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d ìÝñåò, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d ìÝñåò, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d þñåò, %d ëåðôÜ
+OPER_STATS_UPTIME_HM1S
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d þñåò, %d ëåðôÜ
+OPER_STATS_UPTIME_H1MS
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d þñåò, %d ëåðôü
+OPER_STATS_UPTIME_H1M1S
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d þñåò, %d ëåðôü
+OPER_STATS_UPTIME_1HMS
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d þñá, %d ëåðôÜ
+OPER_STATS_UPTIME_1HM1S
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d þñá, %d ëåðôÜ
+OPER_STATS_UPTIME_1H1MS
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d þñá, %d ëåðôü
+OPER_STATS_UPTIME_1H1M1S
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d þñá, %d ëåðôü
+OPER_STATS_UPTIME_MS
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d ëåðôÜ, %d äåõôåñüëåðôá
+OPER_STATS_UPTIME_M1S
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d ëåðôÜ, %d äåõôåñüëåðôï
+OPER_STATS_UPTIME_1MS
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d ëåðôü, %d äåõôåñüëåðôá
+OPER_STATS_UPTIME_1M1S
+ Ïé õðçñåóßåò åßíáé óõíäåäåìÝíåò %d ëåðôü, %d äåõôåñüëåðôï
+OPER_STATS_BYTES_READ
+ ÄéáâáóìÝíá Bytes : %5d kB
+OPER_STATS_BYTES_WRITTEN
+ ÃñáììÝíá Bytes : %5d kB
+OPER_STATS_USER_MEM
+ ×ñÞóôçò : %6d âÜóåéò, %5d kB
+OPER_STATS_CHANNEL_MEM
+ ÊáíÜëéá : %6d âÜóåéò, %5d kB
+OPER_STATS_GROUPS_MEM
+ NS ÏìÜäåò : %6d âÜóåéò, %5d kB
+OPER_STATS_ALIASES_MEM
+ NS Aliases : %6d âÜóåéò, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d âÜóåéò, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d âÜóåéò, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d âÜóåéò, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessions : %6d âÜóåéò, %5d kB
+OPER_STATS_PROXY_MEM
+ Proxies : %6d âÜóåéò, %5d kB
+OPER_STATS_AKILL_COUNT
+ Ùò ôþñá õðÜñ÷ïõí AKILLs: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò AKILL: %d ìÝñåò
+OPER_STATS_AKILL_EXPIRE_DAY
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò AKILL: 1 ìÝñá
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò AKILL: %d þñåò
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò AKILL: 1 þñá
+OPER_STATS_AKILL_EXPIRE_MINS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò AKILL: %d ëåðôÜ
+OPER_STATS_AKILL_EXPIRE_MIN
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò AKILL: 1 ëåðôü
+OPER_STATS_AKILL_EXPIRE_NONE
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò AKILL: Äåí ëÞãåé ðïôÝ
+OPER_STATS_SGLINE_COUNT
+ Ùò ôþñá õðÜñ÷ïõí SGLINEs: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SGLINE: %d ìÝñåò
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SGLINE: 1 ìÝñá
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SGLINE: %d þñåò
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SGLINE: 1 þñá
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SGLINE: %d ëåðôÜ
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SGLINE: 1 ëåðôü
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SGLINE: Äåí ëÞãåé ðïôÝ
+OPER_STATS_SQLINE_COUNT
+ Ùò ôþñá õðÜñ÷ïõí SQLINEs: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SQLINE: %d ìÝñåò
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SQLINE: 1 ìÝñá
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SQLINE: %d þñåò
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SQLINE: 1 þñá
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SQLINE: %d ëåðôÜ
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SQLINE: 1 ëåðôü
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SQLINE: Äåí ëÞãåé ðïôÝ
+OPER_STATS_SZLINE_COUNT
+ Ùò ôþñá õðÜñ÷ïõí SZLINEs: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SZLINE: %d ìÝñåò
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SZLINE: 1 ìÝñá
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SZLINE: %d þñåò
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SZLINE: 1 þñá
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SZLINE: %d ëåðôÜ
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SZLINE: 1 ëåðôü
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Åîáñ÷Þò ÷ñüíïò ëÞîçò SZLINE: Äåí ëÞãåé ðïôÝ
+OPER_STATS_RESET
+ Ôá óôáôéóôéêÜ óâÞóôçêáí.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE channel modes
+
+# CLEARMODES responses
+OPER_UMODE_SYNTAX
+ UMODE nick modes
+
+# OLINE responses
+OPER_UMODE_SUCCESS
+ Changed usermodes of %s.
+OPER_UMODE_CHANGED
+ %s changed your usermodes.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flags
+OPER_OLINE_SUCCESS
+ An O:Line with the flags %s has been added for %s.
+
+# CLEARMODES responses
+OPER_OLINE_IRCOP
+ You are now an IRC Operator.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES channel [ALL]
+OPER_CLEARMODES_DONE
+ ¼ëá ôá modes êáé ôá bans êáèáñßóôçêáí áðü ôï êáíÜëé %s.
+OPER_CLEARMODES_ALL_DONE
+ ¼ëá ôá modes êáèáñßóôçêáí áðü ôï êáíÜëé %s.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK channel user reason
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick newnick
+OPER_SVSNICK_NEWNICK
+ The nick %s is now being changed to %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+OPER_ADMIN_SKELETON
+ Ïé õðçñåóßåò åßíáé óå skeleton mode; Ç åíôïëÞ ADMIN äåí åßíáé äéáèÝóéìç.
+OPER_ADMIN_EXISTS
+ Ï/ç %s õðÜñ÷åé Þäç óôçí ëßóôá ôùí õðçñåóéþí.
+OPER_ADMIN_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò íá Ý÷åéò óôçí ëßóôá ôùí õðçñåóéþí ìüíï %d.
+OPER_ADMIN_ADDED
+ %s ðñïóèÝèçêå óôçí ëßóôá ôùí õðçñåóéþí.
+OPER_ADMIN_NOT_FOUND
+ %s äåí âñÝèçêå óôçí ëßóôá ôùí õðçñåóéþí.
+OPER_ADMIN_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí ëßóôá ôùí õðçñåóéþí.
+OPER_ADMIN_DELETED
+ %s äéáãñÜöçêå áðü ôçí ëßóôá ôùí õðçñåóéþí.
+OPER_ADMIN_DELETED_ONE
+ ÄéáãñÜöçêå 1 èÝóç áðü ôçí ëßóôá ôùí õðçñåóéþí.
+OPER_ADMIN_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí ëßóôá ôùí õðçñåóéþí.
+OPER_ADMIN_LIST_EMPTY
+ Ç ëßóôá ôùí õðçñåóéþí åßíáé Üäåéá.
+OPER_ADMIN_LIST_HEADER
+ Ç ëßóôá ôùí õðçñåóéþí åßíáé ïé åîÞò:
+ Íïýì Øåõä
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Ç ëßóôá ôùí õðçñåóéþí êáèáñßóôçêå.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+OPER_OPER_SKELETON
+ Ïé õðçñåóßåò åßíáé óå skeleton mode; Ç åíôïëÞ OPER äåí åßíáé äéáèÝóéìç.
+OPER_OPER_EXISTS
+ %s õðÜñ÷åé Þäç óôçí ëßóôá ôùí õðçñåóéþí ùò operator.
+OPER_OPER_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò ìüíï íá Ý÷åéò óôçí ëßóôá õðçñåóéþí %d operators.
+OPER_OPER_ADDED
+ %s ðñïóèÝèçêå óôçí ëßóôá ôùí õðçñåóéþí ùò operator.
+OPER_OPER_NOT_FOUND
+ %s äåí âñÝèçêå óôçí ëßóôá ôùí õðçñåóéþí áõôëïò ï operator.
+OPER_OPER_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí ëßóôá ôùí õðçñåóéþí ïé opers.
+OPER_OPER_DELETED
+ %s äéáãñÜöçêå áðü ôçí ëßóôá ôùí operators.
+OPER_OPER_DELETED_ONE
+ ÄéáãñÜöçêå 1 èÝóç áðü ôçí ëßóôá ôùí operators.
+OPER_OPER_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí ëßóôá ôùí operators.
+OPER_OPER_LIST_EMPTY
+ Ç ëßóôá ôùí operators åßíáé Üäåéá.
+OPER_OPER_LIST_HEADER
+ Ç ëßóôá ôùí operators åßíáé:
+ Íïõ Øåõä
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ Ç ëßóôá ôùí operators êáèáñßóôçêå.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_AKILL_EXISTS
+ %s õðÜñ÷åé Þäç óôçí ëßóôá AKILL.
+OPER_AKILL_ALREADY_COVERED
+ %s Ý÷åé Þäç êáëõöèåß áðü ôïí %s.
+OPER_AKILL_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò íá Ý÷åéò ìüíï %d AKILLs.
+OPER_AKILL_NO_NICK
+ Õðåíèýìéóç: Ïé ìÜóêåò ôùí AKILL äåí ðñÝðåé íá ðåñéÝ÷ïõí øåõäþíõìá; óéãïõñÝøïõ ïôé äåí ðåñéÝ÷åéò øåõäþíõìï óôçí ìÜóêá.
+OPER_AKILL_ADDED
+ %s ðñïóèÝèçêå óôçí ëßóôá AKILL.
+OPER_AKILL_CHANGED
+ Ôï ÷ñïíéêü üñéï ôïõ/çò %s Üëëáîå
+OPER_AKILL_NOT_FOUND
+ %s äåí âñÝèçêå óôçí ëßóôá AKILL.
+OPER_AKILL_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí ëßóôá AKILL.
+OPER_AKILL_DELETED
+ %s äéáãñÜöçêå áðü ôçí ëßóôá AKILL.
+OPER_AKILL_DELETED_ONE
+ ÄéáãñÜöçêå 1 èÝóç áðü ôçí ëßóôá AKILL.
+OPER_AKILL_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí ëßóôá AKILL.
+OPER_AKILL_LIST_EMPTY
+ Ç ëßóôá AKILL åßíáé Üäåéá.
+OPER_AKILL_LIST_HEADER
+ Ç åùò ôþñá AKILL ëßóôá åßíáé:
+ Íïõ ÌÜóêá Ëüãïò
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Ç Ýùò ôþñá AKILL ëßóôá åßíáé:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ Ç ëßóôá AKILL êáèáñßóôçêå.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list}[:reason]]
+OPER_SGLINE_UNSUPPORTED
+ Óõãíþìç, ç åíôïëÞ SGLINE äåí åßíáé äéáèÝóéìç óå áõôü ôï äßêôõï.
+OPER_SGLINE_EXISTS
+ %s õðÜñ÷åé Þäç óôçí ëßóôá SGLINE.
+OPER_SGLINE_ALREADY_COVERED
+ %s Ý÷åé Þäç êáëõöèåß áðü ôïí %s.
+OPER_SGLINE_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò íá Ý÷åéò ìüíï %d SGLINEs.
+OPER_SGLINE_ADDED
+ %s ðñïóèÝèçêå óôçí ëßóôá SGLINE.
+OPER_SGLINE_CHANGED
+ Ôï ÷ñïíéêü üñéï ôïõ/ôçò %s Üëëáîå.
+OPER_SGLINE_NOT_FOUND
+ %s äåí âñÝèçêå óôçí ëßóôá SGLINE.
+OPER_SGLINE_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí ëßóôá SGLINE.
+OPER_SGLINE_DELETED
+ %s äéáãñÜöçêå áðü ôçí ëßóôá SGLINE.
+OPER_SGLINE_DELETED_ONE
+ ÄéáãñÜöçêå 1 èÝóç áðü ôçí ëßóôá SGLINE.
+OPER_SGLINE_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí ëßóôá SGLINE.
+OPER_SGLINE_LIST_EMPTY
+ Ç ëßóôá SGLINE åßíáé Üäåéá.
+OPER_SGLINE_LIST_HEADER
+ Ç Ýùò ôþñá ëßóôá SGLINE åßíáé ïé åîçò:
+ Íïõ ÌÜóêá Ëüãïò
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Current SGLINE list:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ Ç ëßóôá SGLINE êáèáñßóôçêå.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Ç åíôïëÞ Channel SQLINEs äåí õðïóôçñßæåôáé áðü ôïí IRCd óïõ,ãéáõôï äåí ìðïñåßò íá ôéò ÷ñçóéìïðïéÞóåéò.
+OPER_SQLINE_EXISTS
+ %s õðÜñ÷åé Þäç óôçí ëßóôá SQLINE.
+OPER_SQLINE_ALREADY_COVERED
+ %s Ý÷åé Þäç êáëõöèåß áðü ôïí %s.
+OPER_SQLINE_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò íá Ý÷åéò ìüíï %d SQLINEs.
+OPER_SQLINE_ADDED
+ %s ðñïóèÝèçêå óôçí ëßóôá SQLINE.
+OPER_SQLINE_CHANGED
+ Ôï ÷ñïíéêü üñéï ôïõ/çò %s Üëëáîå.
+OPER_SQLINE_NOT_FOUND
+ %s äåí âñÝèçêå óôçí ëßóôá SQLINE.
+OPER_SQLINE_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí ëßóôá SQLINE.
+OPER_SQLINE_DELETED
+ %s äéáãñÜöçêå áðü ôçí ëßóôá SQLINE.
+OPER_SQLINE_DELETED_ONE
+ ÄéáãñÜöçêå 1 èÝóç áðü ôçí ëßóôá SQLINE.
+OPER_SQLINE_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí ëßóôá SQLINE.
+OPER_SQLINE_LIST_EMPTY
+ Ç ëßóôá SQLINE åßíáé Üäåéá.
+OPER_SQLINE_LIST_HEADER
+ Ç Ýùò ôþñá ëßóôá SQLINE åßíáé ïé åîÞò:
+ Íïõ ÌÜóêá Ëüãïò
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Ç Ýùò ôþñá ëßóôá SQLINE åßíáé ïé åîÞò:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ Ç ëßóôá SQLINE êáèáñßóôçêå.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_SZLINE_UNSUPPORTED
+ Óõãíþìç, ç åíôïëÞ SÆLINE äåí åßíáé äéáèÝóéìç óå áõôü ôï äßêôõï.
+OPER_SZLINE_EXISTS
+ %s õðÜñ÷åé Þäç óôçí ëßóôá SZLINE.
+OPER_SZLINE_ALREADY_COVERED
+ %s Ý÷åé Þäç êáëõöèåß áðü ôïí %s.
+OPER_SZLINE_REACHED_LIMIT
+ Óõãíþìç, ìðïñåßò íá Ý÷åéò ìüíï %d SZLINEs.
+OPER_SZLINE_ONLY_IPS
+ Õðåíèýìéóç: ìðïñåßò ìüíï íá ðñïóèÝóåéò IP ìÜóêåò óôçí ëßóôá SZLINE.
+OPER_SZLINE_ADDED
+ %s ðñïóèÝèçêå óôçí ëßóôá SZLINE.
+OPER_SZLINE_CHANGED
+ Ôï ÷ñïíéêü üñéï ôïõ/çò %s Üëëáîå.
+OPER_SZLINE_NOT_FOUND
+ %s äåí âñÝèçêå óôçí ëßóôá SZLINE.
+OPER_SZLINE_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí ëßóôá SZLINE.
+OPER_SZLINE_DELETED
+ %s äéáãñÜöçêå áðü ôçí ëßóôá SZLINE.
+OPER_SZLINE_DELETED_ONE
+ ÄéáãñÜöçêå 1 èÝóç áðü ôçí ëßóôá SZLINE.
+OPER_SZLINE_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí ëßóôá SZLINE.
+OPER_SZLINE_LIST_EMPTY
+ Ç ëßóôá SZLINE åßíáé Üäåéá.
+OPER_SZLINE_LIST_HEADER
+ Ç Ýùò ôþñá ëßóôá SZLINE åßíáé ïé åîÞò:
+ Íïõ ÌÜóêá Ëüãïò
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Ç Ýùò ôþñá ëßóôá SZLINE åßíáé ïé åîÞò:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ Ç ëßóôá SZLINE êáèáñßóôçêå.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET option setting
+OPER_SET_IGNORE_ON
+ Ç åíôïëÞ Ignore èá ÷ñçóéìïðïéåßôáé.
+OPER_SET_IGNORE_OFF
+ Ç åíôïëÞ Ignore äåí ÷ñçóéìïðïéåßôáé.
+OPER_SET_IGNORE_ERROR
+ Ç åðéëïãÞ ãéá IGNORE ðñÝðåé íá åßíáé ON Þ OFF.
+OPER_SET_READONLY_ON
+ Ôá Services åßíáé ôþñá ìüíï áíÜãíùóçò.
+OPER_SET_READONLY_OFF
+ Ôá Services åßíáé óå åðéëïãÞ áíÜãíùóçò-åããñáöÞò.
+OPER_SET_READONLY_ERROR
+ Ç åðéëïãÞ ãéá READONLY ðñÝðåé íá åßíáé ON Þ OFF.
+OPER_SET_LOGCHAN_ON
+ Services is now reporting log messages to %s.
+OPER_SET_LOGCHAN_OFF
+ Services is no longer reporting log messages to a channel.
+OPER_SET_LOGCHAN_ERROR
+ Setting for LOGCHAN must be ON or OFF and LogChannel must be defined.
+OPER_SET_DEBUG_ON
+ Ôá Services åßíáé ôþñá óå debug åðéëïãÞ.
+OPER_SET_DEBUG_OFF
+ Ôá Services åßíáé ôþñá óå ìç-debug åðéëïãÞ.
+OPER_SET_DEBUG_LEVEL
+ Ôá Services åßíáé ôþñá óå debug åðéëïãÞ (âáèìüò %d).
+OPER_SET_DEBUG_ERROR
+ Ç åðéëïãÞ ãéá DEBUG ðñÝðåé íá åßíáé ON, OFF, Þ Ýíá êáôçãïñéìáôéêü íïýìåñï.
+OPER_SET_NOEXPIRE_ON
+ Ôá Services åßíáé ôþñá óå åðéëïãÞ íá ìçí ëÞãåé.
+OPER_SET_NOEXPIRE_OFF
+ Ôá Services åßíáé ôþñá óå åðéëïãÞ íá ëÞãåé.
+OPER_SET_NOEXPIRE_ERROR
+ Ç åðéëïãÞ ãéá NOEXPIRE ðñÝðåé íá åßíáé ON Þ OFF.
+OPER_SET_UNKNOWN_OPTION
+ ¢ãíùóôç åðéëïãÞ %s.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} server
+OPER_NOOP_SET
+ ¼ëåò ïé O:ãñáììÝò ôïõ %s Ý÷ïõí áðïìáêñõíèåß.
+OPER_NOOP_REVOKE
+ ¼ëåò ïé O:ãñáììÝò ôïõ %s Ý÷ïõí óâçóôåß.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE servername [reason]
+
+# RAW responses
+OPER_JUPE_HOST_ERROR
+ Please use a valid server name when juping
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW text
+
+# UPDATE responses
+OPER_UPDATING
+ Ãßíåôáé Update óôéò âÜóåéò äåäïìÝíùí.
+
+# RELOAD responses
+OPER_RELOAD
+ Ôï áñ÷åßï ôùí õðçñåóéþí,conf file Ýãéíå reloaded,åðáíáöïñôþèçêå.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN not defined; äåí ìðïñåß íá ãßíåé åðáíåêêßíçóç. ÎáíáôñÝîå ôï \2configure\2 script êáé êÜíå recompile ôá Services ãéá íá åíåñãïðïéÞóåéò ôçí åíôïëÞ RESTART.
+
+# LISTIGNORE responses
+OPER_IGNORE_SYNTAX
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick]
+OPER_IGNORE_VALID_TIME
+ You have to enter a valid number as time.
+OPER_IGNORE_TIME_DONE
+ %s will now be ignored for %s.
+OPER_IGNORE_PERM_DONE
+ %s will now permanently be ignored.
+OPER_IGNORE_DEL_DONE
+ %s will no longer be ignored.
+OPER_IGNORE_LIST
+ Ç ëßóôá ignore ãéá ôéò õðçñåóßåò:
+OPER_IGNORE_LIST_NOMATCH
+ %s not found on ignore list.
+OPER_IGNORE_LIST_EMPTY
+ Ç ëßóôá ignore ôùí õðçñåóéþí åßíáé Üäåéá.
+
+# KILLCLONES responses
+OPER_IGNORE_LIST_CLEARED
+ Ignore list has been cleared.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Äåí ìðïñåß íá âñåèåß ï ÷ñÞóôçò %s.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Ëßóôá Êáíáëéïý:
+ ¼íïìá ×ñÞóôåò ÅðéëïãÝò Topic
+OPER_CHANLIST_HEADER_USER
+ %s channel list:
+ ¼íïìá ×ñÞóôåò ÅðéëïãÝò Topic
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ ÔÝëïò ëßóôáò êáíáëéïý.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Ëßóôá ÷ñçóôþí:
+ ¼íïìá ÌÜóêá
+OPER_USERLIST_HEADER_CHAN
+ %s ëßóôá ÷ñçóôþí:
+ ¼íïìá ÌÜóêá
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ ÔÝëïò ëßóôáò ÷ñçóôþí.
+
+# CACHE responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {hostname | pattern} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Ç Proxy áíß÷íåõóç åßíáé áðåíåñãïðïéçìÝíç.
+OPER_CACHE_NOT_FOUND
+ %s äåí âñÝèçêå óôï cache.
+OPER_CACHE_REMOVED
+ %s äéáãñÜöçêå áðü ôï cache.
+OPER_CACHE_HEADER
+ ÌÜóêá-host Status
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ ÔÝëïò ëßóôáò - %d/%d âñÝèçêáí.
+OPER_CACHE_QUEUED
+ Queued
+OPER_CACHE_PROGRESS
+ In progress
+OPER_CACHE_NORMAL
+ Normal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ HTTP proxy
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ON
+ You are now a SuperAdmin
+OPER_SUPER_ADMIN_OFF
+ You are no longer a SuperAdmin
+OPER_SUPER_ADMIN_SYNTAX
+ Setting for SuperAdmin must be ON or OFF.
+OPER_SUPER_ADMIN_WALL_ON
+ %s is now a Super-Admin
+OPER_SUPER_ADMIN_WALL_OFF
+ %s is no longer a Super-Admin
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ONLY
+ Only Super-Admins can use this command.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ This service is temporarly disabled, please try again later
+OPER_DEFCON_NO_CONF
+ The Defcon system must be enabled in the services.conf file
+OPER_DEFCON_CHANGED
+ Services are now at DEFCON %d
+OPER_DEFCON_WALL
+ %s Changed the DEFCON level to %d
+DEFCON_GLOBAL
+ The Defcon Level is now at Level: %d
+
+# Modules strings
+
+OPER_MODULE_LOADED
+ Module %s loaded
+OPER_MODULE_UNLOADED
+ Module %s unloaded
+OPER_MODULE_LOAD_FAIL
+ Unable to load module %s
+OPER_MODULE_REMOVE_FAIL
+ Unable to remove module %s
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST
+ Module: %s
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Providing IRCD handler for: %s
+OPER_MODULE_NO_LIST
+ No modules currently loaded
+OPER_MODULE_NO_INFO
+ No information about module %s is available
+OPER_MODULE_INFO_SYNTAX
+ MODINFO FileName
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ The following commands have been loaded by a module:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [params]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+÷ñüíïò ëÞîçò] ìÜóêá üñéï ëüãïò
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {ìÜóêá | ëßóôá}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE íïýìåñï èÝóç
+OPER_EXCEPTION_DISABLED
+ Ç Session limiting åíôïëÞ åßíáé áðåíåñãïðïéçìÝíç.
+OPER_EXCEPTION_ALREADY_PRESENT
+ Ç ìÜóêá %s åßíáé Þäç óôçí ëßóôá exception.
+OPER_EXCEPTION_TOO_MANY
+ Ç ëßóôá Session-limit exception åßíáé full!
+OPER_EXCEPTION_ADDED
+ Session limit ãéá ôïí %s ñõèìßóôçêå óå %d.
+OPER_EXCEPTION_MOVED
+ Exception ãéá %s (#%d) ìåôáêéíÞèçêå óôç èÝóç %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ Äåí âñÝèçêå èÝóç (#%d) óôç ëßóôá session-limit exception.
+OPER_EXCEPTION_NOT_FOUND
+ %s äåí âñÝèçêå óôçí ëßóôá session-limit exception.
+OPER_EXCEPTION_NO_MATCH
+ Äåí âñÝèçêáí èÝóåéò óôçí ëßóôá session-limit exception.
+OPER_EXCEPTION_DELETED
+ %s äéáãñÜöçêå áðü ôçí ëßóôá session-limit exception.
+OPER_EXCEPTION_DELETED_ONE
+ ÄéáãñÜöçêå 1 èÝóç áðü ôçí ëßóôá session-limit exception.
+OPER_EXCEPTION_DELETED_SEVERAL
+ ÄéáãñÜöçêáí %d èÝóåéò áðü ôçí ëßóôá session-limit exception.
+OPER_EXCEPTION_LIST_HEADER
+ Ç Ýùò ôþñá ëßóôá Session Limit Exception åßíáé ïé åîÞò:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Íïõ Limit Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (by %s on %s; %s)
+ Limit: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ ËÜèïò session limit. ÐñÝðåé íá åßíáé ëÜèïò ï integer greater Þ ðñÝðåé íá åßíáé ìåôáîý ìçäÝí êáé %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ ËÜèïò hostmask. Ìüíï ðñáãìáôéêÜ hostmasks ÷ñçóéìïðïéïýíôáé êáé ü÷é øåõäþíõìá Þ usernames.
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST limit | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST üñéï
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ Ç åíôïëÞ Session limiting åßíáé áðåíåñãïðïéçìÝíç.
+OPER_SESSION_INVALID_THRESHOLD
+ ËÜèïò threshold value. ÐñÝðåé íá åßíáé ìåãáëýôåñï áðü ôï 1.
+OPER_SESSION_NOT_FOUND
+ %s äåí âñÝèçêå óôçí ëßóôá session.
+OPER_SESSION_LIST_HEADER
+ Hosts ìå ôï ëéãüôåñï %d sessions:
+OPER_SESSION_LIST_COLHEAD
+ Sessions Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ Ôï host %s Ý÷åé ùò ôþñá %d sessions ìå üñéï ôï %d.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Óýíôáîç: EXCEPTION ADD [+expiry] mask limit reason
+ EXCEPTION DEL {mask | list}
+ EXCEPTION MOVE num position
+ EXCEPTION LIST [mask | list]
+ EXCEPTION VIEW [mask | list]
+
+ ÅðéôñÝðïõí óôïõò Services admins íá ïñßóïõí ôçí ëßóôá ôùí hosts ôá
+ ïðïßá Ý÷ïõí Ýíá óõãêåêñéìÝíï üñéï - áöÞíïíôáò áóöáëÞò ìç÷áíÞìáôá,
+ üðùò åßíáé ôá shell servers, to carry more than the default number
+ of clients at a time. Áí êÜðïéï host ðåñÜóåé áðü ôï session limit,
+ üëïé ïé clients ðïõ èá ðñïóðáèÞóïõí íá óõíäåèïýí ìå áõôü ôï host èá
+ áðïññéöèïýí-óêïôùèïýí.Ðñéí ï ÷ñÞóôçò óêïôùèåß-áðïññéöèåß, èán ðñïçäïðïéçèåß,
+ ìå /NOTICE áðü ôïí %S. Ôï óçìåßùìá áõôü åßíáé åðéëïãÞ áðü ôï configuration.
+
+ EXCEPTION ADD ðñïóèÝôåé ôï hostname óôçí Exception list.
+ Óçìåßùóç,áí ãñÜøåôå nick!user@host êáé user@host óáí ìÜóêåò åßíáé ëÜèïò!
+ Ìüíï ðñáãìáôéêÜ host masks, üðùò box.host.dom êáé *.host.dom,
+ åßíáé åðéôñåðüìåíá ãéáôß ôï üñéï ôùí sessions äåí ðåñéÝ÷åé øåõäþíõìá Þ
+ user names ìÝóá óôï account. üñéï ðñÝðåé íá åßíáé Ýíá íïýìåñï ìåãáëýôåñï áðü
+ Þ êïíôÜ óôï ìçäÝí. Áõôü åîáñôÜôáé áðü ôá ðüóá sessions áõôü ôï host
+ ìðïñåß íá ðÜñåé ìÝóá óôï ÷ñüíï. Ï âáèìüò ìçäÝí óçìáßíåé ïôé ôï host äåí èá Ý÷åé
+ üñéï óôçí session limit. Êïßôá ôï âïÞèçìá AKILL ãéá ðåñéóóüôåñåò ðëçñïöïñßåò
+ ìå ôçí óýíôáîç ôçò åíôïëÞò êáé ôçí ðáñÜìåôñï expiry.
+ EXCEPTION DEL óâÞíåé ôçí äùóìÝíç ìÜóêá áðü ôçí ëßóôá exception.
+ EXCEPTION MOVE áðïìáêñýíåé ôï exception íïýìåñï óå èÝóç.
+ EXCEPTION LIST and EXCEPTION VIEW äåß÷íåé üëá ôá Ýùò ôþñá
+ exceptions; áí ç êáèïñéóìÝíç ìÜóêá äøèåß, ôüôå èá åìöáíßæåôáé óôç ëßóôá.
+ EXCEPTION VIEW åßíáé ðéï áíáëõôéêÞ, åìöáíßæåé ôï øåõäþíõìï ôïõ ÷ñÞóôç
+ ðïõ ðñüóèåóå áõôü ôï exception, ìå ëüãï,ìÜóêá êáé ôï ÷ñüíï ëÞîçò óå ìÝñá êáé þñá.
+
+ Óçìåßùóç ôï óõíäåäåìÝíï client èá "÷ñçóéìïðïéåß" ôçí ðñþôç exception
+ êáé üðïõ ôáéñéÜîåé ôï host.
+
+ Ìüíï ãéá ôïõò Åðéêåöáëåßò Õðçñåóéþí.
+
+OPER_HELP_SESSION
+ Óýíôáîç: SESSION LIST threshold
+ SESSION VIEW host
+
+ ÁöÞíåé ôïõò åðéêåöáëåßò õðçñåóéþí íá äïõí ôçí ëßóôá session.
+
+ SESSION LIST Ëßóôá ìå hosts ìå ôïõëÜ÷éóôïí threshold sessions.
+ Ôï threshold ðñÝðåé íá åßíáé Ýíá íïýìåñï ìåãáëýôåñï áðü 1. Áõôü ãßíåôáé
+ ãéá íá áðïöåõ÷èïýí áôõ÷Þìáôá óôç ëßóôá ìåãÜëùí íïýìåñùí ìïíþí session hosts.
+ SESSION VIEW åìöáíßæåé áíáëõôéêÝò ðëçñïöïñßåò ó÷åôéêÜ ìå ôá specific
+ host - óõìåñéëáìâáíïìÝíïõ ðñüóöáôïõ session ìåôñçôÞ êáé session limit.
+ Ç ìÜóêá ðñÝðåé íá ìçí ðåñéëáìâÜíåôáé óå wildcards.
+
+ Êïßôá óôï EXCEPTION help ãéá ðåñéóóüôåñåò ðëçñïöïñßåò ó÷åôéêÜ ìå ôï session
+ limiting êáé ãéá ôï ðùò èá êÜíåéò session limits óå specific hosts êáé groups.
+
+ Ìüíï ãéá ôïõò Åðéêåöáëåßò Õðçñåóéþí.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Displays all Services Staff nicks along with level
+ and on-line status.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ The defcon system can be used to implement a pre-defined
+ set of restrictions to services useful during an attemtped
+ attack on the network.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * No new channel registrations
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * No new nick registrations
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * No MLOCK changes
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Force Chan Modes (%s) to be set on all channels
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Use the reduced session limit of %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill any NEW clients connecting
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignore any non-opers with message
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Silently ignore non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL any new clients connecting
+
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * No new memos sent
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+expiry] channel reason
+
+ Puts an AKILL for every nick on the specified channel. It
+ uses the entire and complete real ident@host for every nick,
+ then enforces the AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Êáíïíéóìïß Þ ðëçñïöïñßåò - %s] %s
+NEWS_OPER_TEXT
+ [ÍÝá ãéá Opers - %s] %s
+NEWS_RANDOM_TEXT
+ [ÍÝá ó÷åôéêÜ ìå ôï äßêôõï - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Óýíôáîç: LOGONNEWS {ADD|DEL|LIST} [ðåñéå÷üìåíï|íïýìåñï]
+NEWS_LOGON_LIST_HEADER
+ Êáíïíéóìïß:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ Äåí õðÜñ÷ïõí êáíïíéóìïß Þ ðëçñïöïñßåò.
+NEWS_LOGON_ADD_SYNTAX
+ Óýíôáîç: LOGONNEWS ADD ðåñéå÷üìåíï
+NEWS_LOGON_ADD_FULL
+ Ç ëßóôá ôùí íÝùí åßíáé ãåìÜôç!
+NEWS_LOGON_ADDED
+ ÐñïóôÝèçêå Ýíáò êáíïíéóìüò Þ ðëçñïöïñßá óôç èÝóç (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Óýíôáîç: LOGONNEWS DEL {íïýìåñï | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Êáíïíéóìüò óôç èÝóç #%d äåí âñÝèçêå!
+NEWS_LOGON_DELETED
+ Êáíïíéóìüò Þ ðëçñïöïñßá óôç èÝóç #%d äéáãñÜöçêå.
+NEWS_LOGON_DEL_NONE
+ ÊáíÝíáò Êáíïíéóìüò Þ ðëçñïöïñßá ãéá íá äéáãñáöåß!
+NEWS_LOGON_DELETED_ALL
+ ¼ëïé ïé êáíïíéóìïß Þ ïé ðëçñïöïñßåò äéáãñÜöçêáí.
+
+NEWS_OPER_SYNTAX
+ Óýíôáîç: OPERNEWS {ADD|DEL|LIST} [ðåñéå÷üìåíï|íïýìåñï]
+NEWS_OPER_LIST_HEADER
+ ÍÝá ôùí Opers:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_OPER_LIST_NONE
+ Äåí õðÜñ÷ïõí íÝá ãéá ôïõò opers.
+NEWS_OPER_ADD_SYNTAX
+ Óýíôáîç: OPERNEWS ADD ðåñéå÷üìåíï
+NEWS_OPER_ADD_FULL
+ Ç ëßóôá åßíáé ãåìÜôç!
+NEWS_OPER_ADDED
+ ÐñïóèÝèçêå Ýíá íÝï ìÞíõìá ãéá ôïõò opers èÝóç (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Óýíôáîç: OPERNEWS DEL {íïýìåñï | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Ç èÝóç #%d óôçí ëßóôá äåí âñÝèçêå!
+NEWS_OPER_DELETED
+ Ç èÝóç #%d äéáãñÜöçêå.
+NEWS_OPER_DEL_NONE
+ Äåí õðÜñ÷ïõí èÝóåéò óôçí ëßóôá ãéá íá äéáãñÜøåéò!
+NEWS_OPER_DELETED_ALL
+ ¼ëá ôá íÝá ãéá ôïõò opers äéáãñÜöçêáí.
+
+NEWS_RANDOM_SYNTAX
+ Óýíôáîç: RANDOMNEWS {ADD|DEL|LIST} [ðåñéå÷üìåíï|íïýìåñï]
+NEWS_RANDOM_LIST_HEADER
+ ÍÝá ãéá ôï äßêôõï:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Äåí õðÜñ÷ïõí íÝá.
+NEWS_RANDOM_ADD_SYNTAX
+ Óýíôáîç: RANDOMNEWS ADD ðåñéå÷üìåíï
+NEWS_RANDOM_ADD_FULL
+ Ç ëßóôá åßíáé ãåìÜôç!
+NEWS_RANDOM_ADDED
+ ÐñïóèÝèçêå Ýíá íÝï ìÞíõìá óôçí èÝóç (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Óýíôáîç: RANDOMNEWS DEL {íïýìåñï | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Ôï ìÞíõìá óôçí èÝóç #%d äåí âñÝèçêå!
+NEWS_RANDOM_DELETED
+ Ôï ìÞíõìá óôçí èÝóç #%d äéáãñÜöçêå.
+NEWS_RANDOM_DEL_NONE
+ Äåí âñÝèçêáí ìçíýìáôá ãéá íá äéáãñáöïýí!
+NEWS_RANDOM_DELETED_ALL
+ ¼ëá ôá ìçíýìáôá äéáãñÜöçêáí.
+
+NEWS_HELP_LOGON
+ Óýíôáîç: LOGONNEWS ADD ðåñéå÷üìåíï
+ LOGONNEWS DEL {íïýìåñï | ALL}
+ LOGONNEWS LIST
+
+ ÐñïóèÝôåéò Þ áöáéñåßò Þ âëÝðåéò ôçí ëßóôá ôùí ìõíçìÜôùí.
+ ¼ôáí óõíäÝåôáé Ýíáò ÷ñÞóôçò óôï äßêôõï, áõôÜ ôá ìçíýìáôá ôá ëáìâÜíåé
+ (Ï÷é ðáñáðÜíù áðü ôñßá ìçíýìáôá, ãéáôß ìðïñåß íá èåùñçèåß ùò flood.
+ Áí åßíáé ðáñáðÜíù áðü ôñéá, ôüôå ìüíï ôá ôñßá ðñþôá èá óôáëèïýí).
+
+ LOGONNEWS LIST ÷ñçóéìïðïéåßôáé ìüíï áðü ôïõò IRC operator ãéá íá äïýí
+ ôçí ëßóôá ôùí íÝùí ìçíõìÜôùí. ADD êáé DEL ÷ñçóéìïðïéåßôáé ìüíï áðü ôïõò
+ åðéêåöáëåßò ôùí õðçñåóéþí (services admins).
+
+NEWS_HELP_OPER
+ Óýíôáîç: OPERNEWS ADD ðåñéå÷üìåíï
+ OPERNEWS DEL {íïýìåñï | ALL}
+ OPERNEWS LIST
+
+ ÐñïóèÝôåéò Þ áöáéñåßò Þ âëÝðåéò ôçí ëßóôá ôùí opers. ¼ôáí Ýíáò
+ ÷ñÞóôçò êÜíåé ôçí åíôïëÞ oper (äçëáäç /OPER åíôïëÞ), áõôÜ ôá ìçíýìáôá
+ èá ôïõ óôáëèïýí. (ðáñáðÜíù áðü ôñéá ìçíýìáôá äåí ðñÝðåé íá åßíáé
+ ãéáôß èåùñåßôáé óáí åíï÷ëçôéêü flood. Áí åßíáé ðáñáðÜíù áðü ôñßá
+ ìçíýìáôá, ìüíï ôá ôñéá ðñþôá èá åìöáíéóôïýí êáé èá óôáëïýí.)
+
+ OPERNEWS LIST ìðïñåß íá ÷ñçóéìïðïéçèåß ìüíï áðü IRC operators.
+ Êáé âÝâáéá íá äåß ôçí ëßóôá ôùí ìõíçìÜôùí. ADD êáé DEL ìðïñåß íá ÷ñçóéìïðïéçèåß
+ áðü ôïõò åðéêåöáëÞò õðçñåóéþí.
+
+NEWS_HELP_RANDOM
+ Óýíôáîç: RANDOMNEWS ADD ðåñéå÷üìåíá
+ RANDOMNEWS DEL {íïýìåñï | ALL}
+ RANDOMNEWS LIST
+
+ Ìðïñåßò íá ðñïóèÝóåéò, íá áöáéñÝóåéò Þ íá äåéò ôçí ëßóôá ôùí ìçíõìÜôùí.
+ ¼ôáí Ýíáò ÷ñÞóôçò óõíäåèåß óôï äßêôõï, Ýíá (êáé ìüíï Ýíá) áðü ôá
+ ìçíýìáôá èá åðéëå÷èåß ôõ÷áßá êáé èá óôáëåß.
+
+ RANDOMNEWS LIST ìðïñåß íá ÷ñçóéìïðïéçèåß áðü ôïõò IRC operators ãéá íá
+ äïýí ôá ìçíýìáôá. ADD êáé DEL ìðïñåß íá ÷ñçóéìïðïéÞóïõí ïé
+ åðéêåöáëåßò ôùí õðçñåóéþí (Services admins).
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S åßíáé ìéá õðçñåóßá ó÷åäéáóìÝíç ùóôå íá óáò äßíåé ðëçñïöïñßåò ãéá
+ ôéò õðçñåóßåò. Ãéá ðåñéóóüôåñåò âïÞèåéåò åêôüò ôïõ HELP
+ èá âñåßôå óôéò ðáñáêÜôù (õðï)õðçñåóßåò ìå ðåñéóóüôåñç áíáëõôéêüôçô:
+
+ /msg %s HELP
+ ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí êáôï÷ýñùóç øåõäþíõìùí
+
+ /msg %s HELP
+ ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí êáôï÷ýñùóç êáé ôçí äéá÷åßñçóç
+ ôùí êáíáëéþí.
+
+ /msg %s HELP
+ ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí áðïóôïëÞ ìçíõìÜôùí óôïõò off-line ÷ñÞóôåò
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôéò åðéëïãÝò ôïõ bot óôï êáíÜëé óáò
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ O %S óáò åðéôñÝðåé íá êáôï÷õñþóåôå Ýíá øåõäþíõìï,
+ åìðïäßæïíôáò Ýôóé Üëëïõò ÷ñÞóôåò íá ôï ÷ñçóéìïðïéïýí.
+ Ïé ðáñáêÜôù åíôïëÝò, åðéôñÝðïõí ôçí êáôï÷ýñùóç êáé ôç äéá÷åßñçóç ôùí
+ øåõäùíýìùí; ãéá íá ÷ñçóéìïðïéÞóåôå áõôÜ, ãñÜøôå /msg %S ^_command^_.
+ Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìéá óõãêåêñéìÝíç åíôïëÞ,ãñÜøôå
+ /msg %S HELP ^_command^_.
+
+ REGISTER Êáôï÷õñþíåé Ýíá øåõäþíõìï
+ GROUP ÌðÝíåôå óå ïìÜäá øåõäþíõìïõ
+ IDENTIFY Óáò áíáãíùñßæåé ìå ôç ÷ñÞóç êùäéêïý
+ ACCESS ÁëëÜæåé ôç ëßóôá ôùí åîïõóéïäïôçìÝíùí äéåõèýíóåùí
+ SET ÁëëáãÞ åðéëïãþí, óõìðåñéëáìâÜíåôáé ç ðñïóôáóßá ìå áðïóýíäåóç
+ DROP ÄéáãñÜöåé Ýíá øåõäþíõìï
+ RECOVER Áðïóýíäåóç åíüò Üëëïõ ÷ñÞóôç ðïõ Ý÷åé ðÜñåé ôï øåõäþíõìü óáò
+ RELEASE ÁíÜêôçóç ôçò êáôáêñÜôçóçò ôïõ øåõäùíýìïõ,ìåôÜ áðü RECOVER
+ SENDPASS ÎÝ÷áóåò ôïí êùäéêü? Äïêßìáóå áõôü êáé èá óôï óôåßëïõìå åìåßò
+
+ ¢ëëåò åíôïëÝò: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS
+
+ ÐÁÑÁÔÇÑÇÓÇ: ÁõôÞ ç õðçñåóßá óêïðåýåé íá ðáñÝ÷åé Ýíá ôñüðï
+ óôïõò ÷ñÞóôåò ôïõ äéêôýïõ, íá äéáóöáëßóïõí üôé ç ôáõôüôçôÜ
+ ôïõò äåí åêôßèåôáé. ÄÅÍ õößóôáôáé ãéá íá åîõðçñåôåß Þ íá
+ äéåõêïëÞíåé ôçí "êëïðÞ" ôùí øåõäùíýìùí Þ Üëëåò íïóçñÝò
+ åíÝñãåéåò. Ç êáôÜ÷ñçóç ôïõ %S èá ïäçãÞóåé, ôïõëÜ÷éóôïí,
+ óå áðþëåéá ôùí áíÜëïãùí øåõäùíýìùí.
+
+NICK_HELP_EXPIRES
+
+ Øåõäþíõìá ôá ïðïßá äåí ÷ñçóéìïðïéïýíôáé ðëÝïí èá åßíáé óôçí äéáäéêáóßá
+ ôçò áõôüìáôçò ëÞîçò, ð.ò. èá äéáãñÜöïíôáé áõôüìáôá
+ ìåôÜ áðü %d ìÝñåò áí äåí ÷ñçóéìïðïéïýíôáé.
+
+NICK_HELP_REGISTER
+ Óýíôáîç: REGISTER password [email]
+
+ Êáôï÷õñþíïíôáò ôï øåõäþíõìï óïõ êáôáãñÜöåôáé óôï %S, ôçí âÜóç äåäïìÝíùí.
+ Áöïý ôï êáôï÷ýñùóåò, ìðïñåßò íá ÷ñçóéìïðïéÞóåéò ôéò åíôïëÝò
+ SET êáé ACCESS ãéá íá óåôÜñåéò ôï øåõäþíõìï üðùò èåò åóý.
+ Íá åßóáé óßãïõñïò ïôé èõìÜóáé ðÜíôá ôï êùäéêü ðïõ Ýêáíåò ôçí êáôï÷ýñùóç
+ ôïõ øåõäþíõìïý óïõ - èá óïõ ÷ñåéáóôåß óôï íá êÜíåéò áëëáãÝò
+ áñãüôåñá. (Óçìåßùóç ïôé case matters! ANOPE, Anope, êáé
+ anope Ý÷ïõí üëá äéáöïñåôéêïýò êùäéêïýò!)
+
+ ×ñÞóéìåò ïäçãßåò ãéá ôï äéÜëåãìá êùäéêþí:
+
+ Ïé êùäéêïß äåí èá ðñÝðåé íá åßíáé åýêïëç þóôå íá ìáíôåýïíôáé. Ãéá ðáñÜäåéãìá,
+ ÷ñçóéìïðïéþíôáò ôï ðñáãìáôéêü üíïìá óáí êùäéêüò åßíáé Üó÷çìç éäÝá.
+ ×ñçóéìïðïéþíôáò ôï øåõäþíõìï ùå êùäéêü åßíáé ç ðéï ÷åéñüôåñç
+ éäÝá ;) êáé, óôï êÜôù êÜôù, ï %S äåí èá óå áöÞóåé íá ôï êÜíåéò.
+ Åðßóçò, ìéêñïß êùäéêïß äåí åßíáé áîéüðéóôïé, ãé'áõôü
+ èá ðñÝðåé íá äéáëÝîåéò Ýíá êùäéêü ìå ôïõëÜ÷éóôïí ôï ëéãüôåñï 5 ÷áñáêôÞñåò.
+ ÔåëéêÜ, ï ÷áñáêôÞñáò ôï êåíü äåí ÷ñçóéìïðïéåßôáé óå êùäéêïýò.
+
+ Ç ðáñÜìåôñïò email åßíáé ðñïåðéëåãìÝíç êáé èá ðñÝðåé íá Ý÷åôå
+ óåôÜñåé ôï email ôïõ øåõäþíõìïý óáò Üìåóá. ¼ðùò êáé íá'÷åé, óå
+ ïñéóìÝíá äßêôõá áðáéôåßôáé áìÝóùò óôçí åíôïëÞ êáôï÷ýñùóçò.
+ Ç ìõóôéêüôçôá åßíáé óåâáóôÞ; áõôü ôï e-mail äåí èá ôï ðÜñåé
+ êáíÝíá ôñßôï Üôïìï.
+
+ ÁõôÞ ç åíôïëÞ äçìéïõñãåß íÝåò ïìÜäåò ãéá ôï øåõäþíõìü óáò,
+ êáé ìðïñïýí íá åðéôñÝðïõí ôçí êáôï÷ýñùóç Üëëùí øåõäïíýìùí áñãüôåñá
+ ìå ìïßñáóìá ßäéùí óåôáñéóìÜôùí, ßäéùí ìçíõìÜôùí êáé ßäéùí
+ äéêáéùìÜôùí óôá êáíÜëéá. Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò ãéá áõôÞ
+ ôç ìåëëïíôéêÞ åíôïëÞ, ãñÜøå /msg %S HELP GROUP.
+
+NICK_HELP_GROUP
+ Óýíôáîç: GROUP óôü÷ïò êùäéêüò
+
+ ÁõôÞ ç åíôïëÞ êÜíåé ôï øåõäþíõìï óïõ íá ìðÝíåé óôï óôü÷ï ôùí
+ øåõäùíýìùí ôçò ïìáäïðïßçóçò. Êùäéêüò åßíáé ï êùäéêüò ôïõ
+ óôü÷ïõ,äçë ôïõ Üëëïõ øåõäùíýìïõ.
+
+ Ìðáßíïíôáò óôçí ïìÜäá Ý÷åéò ðñüóâáóç êáé ìïéñÜæåóáé,ôá ìçíýìáôá
+ äçë memos, êáé êõñéáñ÷ßá óôá êáíÜëéá ðïõ áíôéóôïé÷ïýí üëá
+ ôá øåõäþíõìá óå áõôÞ ôçí ïìÜäá, êáé ðïëëÜ Üëëá!
+
+ Ç ïìÜäá öôéÜ÷åôáé ãéá íá óáò åîõðçñåôåß êáëýôåñá. Áõôü óçìáßíåé
+ ïôé áí äéáãñÜøåôå êÜðïéï øåõäþíõìï êáé åßíáé óôçí ïìÜäá,
+ äåí èá ÷Üóåôå ôéò ðëçñïöïñßåò êáé ôá ìïéñáóìÝíá ðñÜãìáôá ðïõ
+ Ý÷åôå ìå ôá Üëëá øåõäþíõìá, áñêåß üìùò óôçí ïìÜäá
+ íá õðÜñ÷åé ôïõëÜ÷éóôïí Ýíá øåõäþíõìï.
+
+ Ìðïñåßò íá åêôåëÝóåéò áõôÞ ôçí åíôïëÞ áêüìá êáé üôáí äåí
+ Ý÷åéò êáôï÷õñþóåé êÜðïéï øåõäþíõìï áêüìá. Áí ôï øåõäþíõìï åßíáé
+ êáôï÷õñùìÝíï, èá ðñÝðåé íá êÜíåéò åíôïëÞ áíáãíþñéóçò ðñþôá êáé
+ ìåôÜ íá ÷ñçóéìïðïéÞóåéò áõôÞ ôçí åíôïëÞ. ÃñÜøå
+ /msg %S HELP IDENTIFY ãéá ðåñéóóüôåñåò ðëçñïöïñßåò. Áõôü ôï
+ êïììÜôé ìðïñåß íá ìçí õðÜñ÷åé óôï äéêôõü óïõ.
+
+ Åßíáé ðñïôéìüôåñï íá ÷ñçóéìïðïéÞóåéò áõôÞ ôçí åíôïëÞ ìå ìç-êáôï÷õñùìÝíá
+ øåõäþíõìá ãéáôß èá ãßíåé áõôüìáôá ç êáôï÷ýñùóç üôáí èá ÷ñçóéìïðïéÞóåéò
+ áõôÞ ôçí åíôïëÞ. Ìðïñåßò êáé íá ôçí ÷ñçóéìïðïéÞóåéò êáé ìå êáôï÷õñùìÝíá
+ øåõäþíõìá (ãéá íá áëëÜîåéò ôçí ïìÜäá óïõ) ìüíï áí ï åðéêåöáëÞò ôùí
+ õðçñåóéþí óå áöÞóåé íá ôï êÜíåéò.
+
+ Ìðïñåßò íá åßóáé óå ìéá ïìÜäá êÜèå öïñÜ. Óå ðïëëÝò ïìÜäåò äåí åßíáé äõíáôüí.
+
+ Óçìåßùóç: üëá ôá øåõäþíõìá ðïõ áíÞêïõí óôçí ßäéá ïìÜäá Ý÷ïõí ôïí ßäéï
+ êùäéêü.
+
+NICK_HELP_IDENTIFY
+ Óýíôáîç: IDENTIFY êùäéêü
+
+ ËÝåé óôïí %S áí åßóáé üíôïò ï êÜôï÷ïò áõôïý ôïõ øåõäþíõìïõ.
+ ÐïëëÝò åíôïëÝò áðáéôïýí íá êÜíåéò åíôïëÞ áíáãíþñéóçò, äçë ìå ôçí åíôïëÞ
+ áõôÞ ðñéí ÷ñçóéìïðïéÞóåéò Üëëåò åíôïëÝò. Ï êùäéêüò èá ðñÝðåé íá åßíáé
+ ï ßäéïò ìå áõôüí ðïõ Ýäùóåò ãéá íá êáôï÷õñþóçò ôï øåõäþíõìï,
+ äçë ìå ôçí REGISTER åíôïëÞ.
+
+NICK_HELP_UPDATE
+ Syntax: UPDATE
+
+ Updates your current status, i.e. it checks for new memos,
+ sets needed chanmodes (ModeonID) and updates your vhost and
+ your userflags (lastseentime, etc).
+
+NICK_HELP_LOGOUT
+ Óýíôáîç: LOGOUT
+
+ Åßíáé ôï áíôßèåôï ôçò åíôïëÞò IDENTIFY, äçë
+ ç åíôïëÞ áõôç óå êÜíåé íá ìçí åßóáé ï êÜôï÷ïò áõôïý ôïõ øåõäþíõìïõ
+ ðëÝïí. Óçìåßùóç, üðùò êáé íá÷åé, äåí èá óïõ ãßíåé ðáñáôÞñçóç Þ íá óïõ
+ æçôçèåß íá îáíáêÜíåéò åíôïëÞ áíáãíþñéóçò.
+
+NICK_HELP_DROP
+ Óýíôáîç: DROP [øåõäþíõìï]
+
+ ÓâÞíåé ôï øåõäþíõìï óïõ áðü ôïõ %S ôçí âÜóç äåäïìÝíùí. Ôï øåõäþíõìï ðïõ
+ óâÞóôçêå åßíáé åëåýèåñï ãéá ïðïéïäÞðïôå íá ôï êáôï÷õñþóåé.
+
+ Ìðïñåßò íá óâÞóåéò ôï øåõäþíõìï áðü ôçí ïìÜäá ðáéñíþíôáò
+ áðü ôçí ðáñÜìåôñï øåõäþíõìïõ.
+
+ Ãéá íá ÷çóéìïðïéÞóåéò áõôÞ ôçí åíôïëÞ, ðñÝðåé ðñþôá íá êÜíåéò åíôïëÞ
+ áíáãíþñéóçò ìå ôïí êùäéêü óïõ ãéá ðåñéóóüôåñåò
+ with your password (/msg %S HELP IDENTIFY for more
+ ðëçñïöïñßåò.)
+
+NICK_HELP_ACCESS
+ Óýíôáîç: ACCESS ADD ^_ìÜóêá^_
+ ACCESS DEL ^_ìÜóêá^_
+ ACCESS LIST
+
+ ÁëëÜæåé Þ åìöáíßæåé ôç ëßóôá ðñüóâáóçò ôïõ øåõäùíýìïõ óáò.
+ ÁõôÞ åßíáé ç ëßóôá ôùí äéåõèýíóåùí ðïõ èá áíáãíùñßæïíôáé
+ áõôüìáôá áðü ôïí %S óáí åðéôñåðôïß ãéá ôç ÷ñÞóç
+ ôïõ øåõäùíýìïõ. Áí èÝëåôå íá ÷ñçóéìïðïéÞóåôå ôï øåõäþíõìï
+ áðü ìßá äéáöïñåôéêÞ äéåýèõíóç, ðñÝðåé íá áíáãíùñéóôåßôå
+ áðü ôïí %S ìå ôç ÷ñÞóç ôçò åíôïëÞò IDENTIFY.
+
+ Ðáñáäåßãìáôá:
+
+ ACCESS ADD anyone@*.bepeg.com
+ ÅðéôñÝðåé ðñüóâáóç óôï ÷ñÞóôç ìå ID anyone
+ áðü ïðïéïäÞðïôå õðïëïãéóôÞ ôçò äéåýèõíóçò bepeg.com.
+
+ ACCESS DEL anyone@*.bepeg.com
+ Áíáéñåß ôçí ðñïçãïýìåíç åíôïëÞ.
+
+ ACCESS LIST
+ Åìöáíßæåé ôçí ôñÝ÷ïõóá ëßóôá ðñüóâáóçò.
+
+NICK_HELP_SET
+ Óýíôáîç: SET option parameters
+
+ ÁëëÜæåé äéÜöïñåò åðéëïãÝò ôïõ øåõäùíýìïõ. Ç åðéëïãÞ ìðïñåß íá åßíáé:
+
+ DISPLAY ÁëëÜæåé ôçí ëßóôá ôùí ïìÜäùí
+ PASSWORD ÁëëÜæåé ôïí êùäéêü ôïõ øåõäùíýìïõ óáò
+ LANGUAGE ÁëëÜæåé ôç ãëþóóá ðïõ ÷ñçóéìïðïéïýí ïé
+ õðçñåóßåò üôáí ôéò ÷ñçóéìïðïéåßôå
+ URL Óõó÷åôßæåé Ýíá URL ìå ôï øåõäþíõìü óáò
+ EMAIL Óõó÷åôßæåé ìßá äéåýèõíóç e-mail ìå ôï øåõäþíõìü óáò
+ ICQ Óõó÷åôßæåé Ýíá íïýìåñï ICQ ìå ôï øåõäþíõìü óáò
+ GREET Óõó÷åôßæåé Ýíá ìÞíõìá ÷áéñåôéóìïý ìå ôï øåõäþíõìü óáò
+ KILL Åíåñãïðïéåß/áðåíåñãïðïéåß ôçí ðñïóôáóßá ìå áðïóýíäåóç
+ SECURE Åíåñãïðïéåß/áðåíåñãïðïéåß ôç ëåéôïõñãßá áóöÜëåéáò
+ PRIVATE Åìðïäßæåé ôï øåõäþíõìü óáò íá åìöáíßæåôáé
+ ìå ôçí åíôïëÞ /msg %S LIST
+ HIDE Áðïêñýðôåé óõãêåêñéìÝíá ôìÞìáôá ðëçñïöïñéþí ôïõ øåõäùíýìïõ
+ MSG ÁëëÜæåé ôçí ìÝèïäï åðéêïéíùíßáò ìå ôéò õðçñåóßåò
+
+ Ãéá íá ÷ñçóéìïðïéÞóåôå áõôÞ ôçí åíôïëÞ, ðñÝðåé ðñþôá íá
+ áíáãíùñéóôåßôå ìå ôïí êùäéêü óáò (ãéá ðåñéóóüôåñåò ðëçñïöïñßåò,
+ /msg %S HELP IDENTIFY).
+
+ ÐëçêôñïëïãÞóôå /msg %S HELP SET åðéëïãÞ ãéá ðåñéóóüôåñåò ðëçñïöïñßåò
+ óå ìßá óõãêåêñéìÝíç åðéëïãÞ.
+
+NICK_HELP_SET_DISPLAY
+ Óýíôáîç: SET DISPLAY íÝï-display
+
+ ÂëÝðåéò óôç ëßóôá ôï øåõäþíõìï óïõ óå ðïéá ïìÜäá åßíáé ôùí
+ õðçñåóéþí. Óôç ëßóôá ðñÝðåé íá åßíáé ôï øåõäþíõìï ðïõ åßíáé óôçí ïìÜäá.
+
+NICK_HELP_SET_PASSWORD
+ Óýíôáîç: SET PASSWORD íÝïò-êùäéêüò
+
+ ÁëëÜæåé ôïí êùäéêü ðïõ ÷ñçóéìïðïéåßò ãéá ôçí åíôïëÞ áíáãíþñéóçò ôïõ êÜôï÷ïõ
+ øåõäþíõìïõ.
+
+NICK_HELP_SET_LANGUAGE
+ Óýíôáîç: SET LANGUAGE íïýìåñï
+
+ ÁëëÜæåé ôçí ãëþóóá ôùí õðçñåóéþí ðïõ óôÝëíåé ìå ìçíýìáôá óå óÝíá
+ (ãéá ðáñÜäåéãìá, üôáí áíôáðïêñßíåóáé óå ìéá åíôïëÞ èá óïõ óôåßëåé óå Üëëç ãëþóóá).
+ Ôï íïýìåñï ðñÝðåé íá åßíáé Ýíá áðü ôá åðüìåíá ðïõ õðÜñ÷ïõí óôçí ëßóôá
+ õðïóôçñéæüìåíùí ãëùóóþí:
+
+
+NICK_HELP_SET_URL
+ Óýíôáîç: SET URL url
+
+ ÐñïóèÝôåé óôéò ðëçñïöïñßåò ôïõ øåõäþíõìïý óïõ ôï URL ðïõ ôïõ äßíåéò. Áõôü
+ ôï URL èá åìöáíßæåôáé êÜèå öïñÜ ðïõ êÜðïéïò èá èÝëåé íá äåé êÜðïéåó ðëçñïöïñßåò
+ ãéá ôï øåõäþíõìï óïõ ÷ñçóéìïðïéþíôáò ôçí åíôïëÞ INFO.
+
+NICK_HELP_SET_EMAIL
+ Óýíôáîç: SET EMAIL äéåýèõíóç
+
+ Äåß÷íåé ôçí äåýèõíóç E-mail ðïõ ôïõ Ý÷åéò äþóåé ãéá ôï øåõäþíõìï óïõ.
+ ÁõôÞ ç äéåýèõíóç èá åìöáíßæåôáé êÜèå öïñÜ ðïõ êÜðïéïò èá êïéôÜæåé ðëçñïöïñßåò
+ óôï êáíÜëé ìå ôçí åíôïëÞ INFO.
+
+NICK_HELP_SET_ICQ
+ Óýíôáîç: SET ICQ number
+
+ ÐñïóèÝôåé óôéò ðëçñïöïñßåò ôïõ øåõäþíõìïý óïõ ôï íïýìåñï ôïõ ICQ. Áõôü
+ ôï íïýìåñï èá åìöáíßæåôáé êÜèå öïñÜ ðïõ êÜðïéïò èá èÝëåé íá äåé êÜðïéåó ðëçñïöïñßåò
+ ãéá ôï øåõäþíõìï óïõ ÷ñçóéìïðïéþíôáò ôçí åíôïëÞ INFO.
+
+NICK_HELP_SET_GREET
+ Óýíôáîç: SET GREET message
+
+ ÐñïóèÝôåé óôï øåõäþíõìïý óïõ Ýíá ìÞíõìá ÷áéñåôéóìïý, ôï
+ ïðïßï èá åìöáíßæåôáé êÜèå öïñá ðïõ èá ìðÝíåéò óå êáíÜëé ìå ôçí ðñïõðüèåóç ïôé
+ ç åðéëïãÞ GREET èá åßíáé åíåñãïðïéçìÝíç, êáé ìå ôçí ðñïõðüèåóç ïôé èá Ý÷åéò
+ êáé ôçí êáôÜëëçëç access óå áõôü.
+
+NICK_HELP_SET_KILL
+ Óýíôáîç: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí áõôüìáôç ðñïóôáóßá ìå
+ áðïóýíäåóç ãéá ôï øåõäþíõìü óáò. Åíåñãïðïéþíôáò ôçí
+ ðñïóôáóßá ìå áðïóýíäåóç, áí êÜðïéïò Üëëïò ÷ñÞóôçò
+ ðñïóðáèÞóåé íá ðÜñåé ôï øåõäþíõìü óáò, èá äùèåß Ýíá ëåðôü
+ ãéá íá áëëÜîåé ôï øåõäþíõìü ôïõ, ìåôÜ áðü ôï ïðïßï èá
+ áðïóõíäåèåß áðü ôï IRC áðü ôïí %S.
+
+ Áí åðéëÝîåôå QUICK, èá äùèïýí ìüíï 20 äåõôåñüëåðôá óôï
+ ÷ñÞóôç ãéá íá áëëÜîåé ôï øåõäþíõìü ôïõ, áíôß ãéá ôá óõíçèéóìÝíá 60.
+ Áí åðéëÝîåôå IMMED, ï ÷ñÞóôçò èá áðïóõíäåèåß êáôåõèåßáí ÷ùñßò
+ ðñþôá íá ðñïåéäïðïéçèåß Þ íá ôïõ äùèåß ç åõêáéñßá íá áëëÜîåé ôï
+ øåõäþíõìü ôïõ;Ðáñáêáëïýìå ìç ÷ñçóéìïðïéåßôå áõôÞ ôçí åðéëïãÞ åêôüò á
+ åßíáé áðïëýôùò áðáñáßôçôï. Åðßóçò, ïé äéá÷åéñéóôÝò ôïõ
+ äéêôýïõ ìðïñåß íá Ý÷ïõí áðåíåñãïðïéÞóåé áõôÞ ôçí åðéëïãÞ.
+
+NICK_HELP_SET_SECURE
+ Óýíôáîç: SET SECURE {ON | OFF}
+
+ ÁëëÜæåé ï %S ôçí áóöÜëåéá óå on Þ off ãéá ôï øåõäþíõìï
+ Ìå ôçí ÁÓÖÁËÇ åðéëïãÞ, ðñÝðåé íá ãñÜøåéò ôïí êùäéêü áíáãíþñéóçò
+ ðñéí áíáãíùñéóôÞò óáí êÜôï÷ïò ôïõ øåõäþíõìïõ,
+ ìå ôçí õðüëçøç ïôé ç äéåýèõíóç åßíáé óôçí ëßóôá ôùí access.
+ ¼ðùò êáé íá÷åé, áí åßóáé óôçí ëßóôá access, ï %S
+ äåí èá êÜíåé auto-kill ìå ôçí õðüëçøç ôçò åðéëïãÞò KILL.
+
+NICK_HELP_SET_PRIVATE
+ Óýíôáîç: SET PRIVATE {ON | OFF}
+
+ Åíåñãïðïéåß/áðåíåñãïðïéåß ôçí åðéëïãÞ éäéþôåõóçò
+ ôïõ %S ãéá ôï øåõäþíõìü óáò. Ìå ôçí åíåñãïðïßçóç ôïõ
+ PRIVATE ôï øåõäþíõìü óáò äå èá åìöáíßæåôáé óôç ëßóôá
+ øåõäùíýìùí ðïõ ðñïêýðôåé ìå ôçí åíôïëÞ LIST ôïõ %S.
+ (ÂÝâáéá,ïðïéïóäÞðïôå ãíùñßæåé ôï øåõäþíõìü óáò, ìðïñåß
+ áêüìç íá ðÜñåé ðëçñïöïñßåò ãé áõôü, ÷ñçóéìïðïéþíôáò ôçí
+ åíôïëÞ INFO)
+
+NICK_HELP_SET_HIDE
+ Óýíôáîç: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Óáò åðéôñÝðåé íá åìðïäßóåôå ôçí åìöÜíéóç óõãêåêñéìÝíùí
+ ðëçñïöïñéþí üôáí êÜðïéïò åêôåëåß ôçí åíôïëÞ ôïõ %S INFO, óôï
+ øåõäþíõìü óáò. Ìðïñåßôå íá áðïêñýøåôå ôç äéåýèõíóç e-mail
+ user@host mask (USERMASK), and last quit message (QUIT).
+ óáò (EMAIL), ôçí ôåëåõôáßá äéåýèõíóç ìå ôçí ïðïßá óõíäåèÞêáôå
+ (USERMASK), êáé ôï ôåëåõôáßï ìÞíõìá (QUIT).
+ Ç äåýôåñç ðáñÜìåôñïò êáèïñßæåé ôï áí ç ðëçñïöïñßá èá ðñÝðåé
+ íá åìöáíßæåôáé (OFF) Þ íá áðïêñýðôåôáé (ON).
+
+NICK_HELP_SET_MSG
+ Óýíôáîç: SET MSG {ON | OFF}
+
+ Óáò åðéôñÝðåé íá äéáëÝîåôå ôï ôñüðï ìå ôïí ïðïßï ôá Services èá
+ åðéêïéíùíïýí ìáæß óïõ. Ìå ôçí åíôïëÞ MSG, ôá Services èá
+ ÷ñçóéìïðïéïýí ìçíýìáôá, äéáöïñåôéêÜ èá ÷ñçóéìïðïéïýí ðáñáôçñÞóåéò
+ (notices).
+
+NICK_HELP_RECOVER
+ Óýíôáîç: RECOVER nickname [password]
+
+ Óáò åðéôñÝðåé íá ðÜñåôå ðßóù ôï øåõäþíõìü óáò áí êÜðïéïò
+ Üëëïò ôï ÷ñçóéìïðïéåß. Ç ÷ñÞóç ôçò åíôïëÞò áõôÞò, Ý÷åé ôï
+ ßäéï áðïôÝëåóìá ìå ôçí áõôüìáôç áðïóýíäåóç ðïõ êÜíåé ï
+ %S üôáí êÜðïéïò ðñïóðáèÞóåé íá íá ÷ñçóéìïðïéÞóåé Ýíá
+ øåõäþíõìï ðïõ Ý÷åé åíåñãïðïéçìÝíç ôçí ðñïóôáóßá ìå
+ áðïóýíäåóç.
+
+ ¼ôáí ÷ñçóéìïðïéåßôå áõôÞ ôçí åíôïëÞ, ï %S óõíäÝåé Ýíáí
+ øåýôéêï ÷ñÞóôç ìå ôï ßäéï øåõäþíõìï åêåßíïõ ôïõ ÷ñÞóôç ôïõ
+ ïðïßïõ ôï øåõäþíõìï èÝëåôå íá ðÜñåôå ðßóù. Áõôü áíáãêÜæåé
+ ôïõò IRC servers íá áðïóõíäÝïõí åêåßíï ôï ÷ñÞóôç. Ï
+ øåýôéêïò ÷ñÞóôçò, èá ðáñáìåßíåé ôüôå óõíäåäåìÝíïò ãéá ôñßá
+ ëåðôÜ ãéá íá âåâáéþóåé ôï üôé ï Üëëïò ÷ñÞóôçò äå èá
+ åðáíáóõíäåèåß Üìåóá. ÌåôÜ áðü ôá ôñßá ëåðôÜ, ìðïñåßôå íá
+ îáíá÷ñçóéìïðïéÞóåôå ôï øåõäþíõìü óáò. ÅíáëëáêôéêÜ,
+ ÷ñçóéìïðïéÞóôå ôçí åíôïëÞ RELEASE (/msg %S HELP RELEASE)
+ ãéá íá ÷ñçóéìïðïéÞóåôå ôï øåõäþíõìü óáò íùñßôåñá.
+
+ Ãéá íá ÷ñçóéìïðïéÞóåôå ôçí åíôïëÞ RECOVER ãéá Ýíá
+ øåõäþíõìï, ðñÝðåé ç ôñÝ÷ïõóá äéåýèõíóÞ óáò üðùò åìöáíßæåôáé
+ óôï /WHOIS íá âñßóêåôáé óôç ëßóôá ðñüóâáóçò ôïõ øåõäùíýìïõ,
+ Þ íá Ý÷åôå äþóåé ôïí óùóôü êùäéêü ãéá ôï øåõäþíõìï.
+
+NICK_HELP_RELEASE
+ Óýíôáîç: RELEASE øåõäþíõìï [êùäéêüò]
+
+ Áðåëåõèåñþíåé êÜèå êáôáêñÜôçóç ôïõ øåõäùíýìïõ óáò áðü ôïí
+ %S åî' áéôßáò áõôüìáôçò áðïóýíäåóçò Þ ôçò ÷ñÞóçò ôçò
+ åíôïëÞò RECOVER. ÐñïêáèïñéóìÝíá, ôÝôïéåò êáôáêñáôÞóåéò
+ äéáñêïýí ãéá Ýíá ëåðôü; ÁõôÞ ç åíôïëÞ ôéò áðåëåõèåñþíåé
+ íùñßôåñá.
+
+ Ãéá íá ÷ñçóéìïðïéÞóåôå ôçí åíôïëÞ RELEASE ãéá Ýíá
+ øåõäþíõìï, ðñÝðåé ç ôñÝ÷ïõóá äéåýèõíóÞ óáò üðùò åìöáíßæåôáé
+ óôï /WHOIS íá âñßóêåôáé óôç ëßóôá ðñüóâáóçò ôïõ øåõäùíýìïõ,
+ Þ íá Ý÷åôå äþóåé ôïí óùóôü êùäéêü ãéá ôï øåõäþíõìï.
+
+NICK_HELP_GHOST
+ Óýíôáîç: GHOST øåõäþíõìï [êùäéêüò]
+
+ Äéáêüðôåé ìéá "åéêïíéêÞ" óýíäåóç ìå ôï øåõäþíõìü óáò.
+ "ÅéêïíéêÞ" óýíäåóç åßíáé áõôÞ ðïõ óôçí ðñáãìáôéêüôçôá äåí
+ õößóôáôáé, áëëÜ ï IRC server ãéá êÜðïéï ëüãï ðéóôåýåé üôé
+ åßíáé áêüìá åíåñãÞ. ÔõðéêÜ, áõôü óõìâáßíåé áí ï õðïëïãéóôÞò
+ Þ ôï modem óáò "êñåìÜóåé" Þ ç óýíäåóÞ óáò ìå ôïí ðáñï÷Ýá
+ internet äéáêïðåß, åíþ âñßóêåóôå óôï IRC.
+
+ Ãéá íá ÷ñçóéìïðïéÞóåôå ôçí åíôïëÞ GHOST ãéá Ýíá øåõäþíõìï,
+ ðñÝðåé ç ôñÝ÷ïõóá äéåýèõíóÞ óáò üðùò åìöáíßæåôáé óôï /WHOIS
+ íá âñßóêåôáé óôç ëßóôá ðñüóâáóçò ôïõ øåõäùíýìïõ, Þ íá Ý÷åôå
+ äþóåé ôïí óùóôü êùäéêü ãéá ôï øåõäþíõìï.
+
+NICK_HELP_INFO
+ Óýíôáîç: INFO øåõäþíõìï [ALL]
+
+ Åìöáíßæåé ðëçñïöïñßåò ãéá ôï øåõäþíõìï ðïõ èá äþóåôå, üðùò
+ ôïí êÜôï÷ï ôïõ øåõäùíýìïõ, ôçí ôåëåõôáßá äéåýèõíóç êáé þñá
+ óýíäåóçò êáé ôéò åðéëïãÝò ôïõ øåõäùíýìïõ. Áí Ý÷åôå
+ áíáãíùñéóôåß ãéá ôï øåõäþíõìï ðïõ æçôÜôå ðëçñïöïñßåò êáé
+ ÷ñçóéìïðïéÞóåôå ôçí ðáñÜìåôñï ALL óôçí åíôïëÞ, èá äåßôå
+ üëåò ôéò ðëçñïöïñßåò, Üó÷åôá áí áõôÝò áðïêñýðôïíôáé Þ ü÷é.
+
+NICK_HELP_LIST
+ Óýíôáîç: LIST õðüäåéãìá
+
+ Åìöáíßæåé üëá ôá êáôï÷õñùìÝíá øåõäþíõìá, ôá ïðïßá ôáéñéÜæïõí
+ ìå ôï õðüäåéãìá ôçò ìïñöÞò, nick!user@host ðïõ Ý÷åé äùèåß.
+ Øåõäþíõìá ðïõ Ý÷ïõí ôçí åðéëïãÞ PRIVATE åíåñãïðïéçìÝíç,äå
+ èá åìöáíéóôïýí.
+
+ Ðáñáäåßãìáôá:
+
+ LIST *!joeuser@foo.com
+ Åìöáíßæåé üëá ôá øåõäþíõìá ðïõ åßíáé êáôï÷õñùìÝíá
+ óôç äéåýèõíóç joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Åìöáíßæåé üëá ôá êáôï÷õñùìÝíá øåõäþíõìá ðïõ
+ ðåñéÝ÷ïõí ôç ëÝîç Bot (ìå ðåæÜ Þ êåöáëáßá).
+
+ LIST *!*@*.bar.org
+ Åìöáíßæåé üëá ôá øåõäþíõìá ðïõ áíïßêïõí óå ÷ñÞóôåò
+ ðïõ óõíäÝïíôáé ìå äéåýèõíóç bar.org.
+
+NICK_HELP_ALIST
+ Syntax: ALIST [level]
+
+ Lists all channels you have access on. Optionally, you can specify
+ a level in XOP or ACCESS format. The resulting list will only
+ include channels where you have the given level of access.
+
+ Examples:
+ ALIST Founder
+ Lists all channels where you have Founder
+ access.
+
+ ALIST AOP
+ Lists all channels where you have AOP access
+ or greater.
+
+ ALIST 10
+ Lists all channels where you have level 10
+ access or greater.
+
+ Channels that have the NOEXPIRE option set will be prefixed by
+ an exclamation mark.
+
+NICK_HELP_GLIST
+ Óýíôáîç: GLIST
+
+ Åìöáíßæåé üëá ôá øåõäþíõìá ðïõ áíÞêïõí óôçí ßäéá ïìÜäá.
+
+NICK_HELP_STATUS
+ Óýíôáîç: STATUS øåõäþíõìï(á)...
+
+ Óáò åíçìåñþíåé ãéá ôï áí ï ÷ñÞóôçò ðïõ ÷ñçóéìïðïéåß ôï
+ øåõäþíõìï ðïõ äþóáôå, Ý÷åé áíáãíùñéóôåß óáí êÜôï÷üò ôïõ.
+ Ôï áðïôÝëåóìá ôçò åíôïëÞò Ý÷åé ôç ìïñöÞ:
+
+ øåõäþíõìï êùäéêüò-êáôÜóôáóçò
+
+ üðïõ øåõäþíõìï åßíáé ôï øåõäþíõìï ãéá ôï ïðïßï èÝëåôå íá,ìÜèåôå
+ ôçí êáôÜóôáóÞ ôïõ êáé üðïõ êùäéêüò-êáôÜóôáóçò åßíáé Ýíáò
+ áðü ôïõò ðáñáêÜôù:
+
+ 0 - äåí õðÜñ÷åé ôÝôïéïò ÷ñÞóôçò óõíäåäåìÝíïò Þ ôï øåõäþíõìï åßíáé ìç êáôï÷õñùìÝíï
+ 1 - ï ÷ñÞóôçò äåí áíáãíùñßóôçêå óáí êÜôï÷ïò ôïõ øåõäùíýìïõ
+ 2 - ï ÷ñÞóôçò áíáãíùñßóôçêå óáí êÜôï÷ïò ìÝóù ôçò ëßóôáò ðñüóâáóçò ìüíï
+ 3 - ï ÷ñÞóôçò áíáãíùñßóôçêå óáí êÜôï÷ïò ôïõ øåõäùíýìïõ ìÝóù ôçò áíáãíþñéóçò ìå êùäéêü
+
+ ÌÝ÷ñé äåêáÝîé øåõäþíõìá ìðïñïýí íá ÷ñçóéìïðïéçèïýí ìå êÜèå åíôïëÞ; Ôá
+ õðüëïéðá èá áãíïïýíôáé. ÊáíÝíá ìÞíõìá ëÜèïõò äåí ðñïêýðôåé áí
+ äå äùèåß êáíÝíá øåõäþíõìï.
+
+NICK_HELP_SENDPASS
+ Óýíôáîç: SENDPASS øåõäþíõìï
+
+ Äßíåé ôïí êùäéêü ôïõ øåõäþíõìïõ ìÝóù the e-mail.
+ ÁõôÞ ç åíôïëÞ åßíáé ðñáãìáôéêÜ ÷ñÞóéìç ãéá íá ðÜñåé êÜðïéïò ôïí
+ ÷áìÝíï êùäéêü ôïõ êáé ìå ðåñéóóüôåñç áóöÜëåéá.
+
+ Ìüíï ïé IRC operators óôá äßêôõá ðïõ åßíáé ìðïñïýí íá ôï êÜíïõí.
+
+ ÁõôÞ ç åíôïëÞ åßíáé áäýíáôç áí Ý÷åé åíåñãïðïéçèåß ç êùäéêïðïßçóç ôùí êùäéêþí.
+
+NICK_SERVADMIN_HELP
+
+ Ïé ðáñáêÜôù åíôïëÝò åßíáé äéáèÝóéìåò ãéá ôïõò (åðéêåöáëåßò) Services admins:
+
+ GETPASS Åìöáíßæåé ôïí êùäéêü ãéá ôï óõãêåêñéìÝíï øåõäþíõìï
+ (ìüíï áí ç êùäéêïðïßçóç åßíáé áíåíåñãÞ)
+ FORBID ÊáôáóôÝëåé Ýíá øåõäþíõìï,äçë ôï êÜíåé íá ìçí ôï ÷ñçóéìïðïéåß
+ êáíåßò,üðïéïò ôï ðÜñåé Ý÷åé kill
+
+ Ïé Services admins (åðéêåöáëåßò) ìðïñïýí íá äéáãñÜøïõí Ýíá øåõäþíõìï ÷ùñßò íá
+ ÷ñåéáóôåß íá êÜíïõí åíôïëÞ áíáãíþñéóçò êáé êáí áëëáãÞ øåõäþíõìïõ, êáé ìðïñïýí íá
+ äïõí ôçí ëßóôá access ãéá êÜèå øåõäþíõìï (/msg %S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Óýíôáîç: LOGOUT [øåõäþíõìï [REVALIDATE]]
+
+ ×ùñßò êáìßá ðáñÜìåôñï, êÜíåé ôï áíôßèåôï ôçò åíôïëÞò IDENTIFY (áíáãíþñéóçò)
+ äçë óå êÜíåé ìç áíáãíùñßóçìï êÜôï÷ï ôïõ øåõäþíõìïõ ðëÝïí.
+ Óçìåßùóç, üðùò êáé íá÷åé, äåí èá óïõ æçôçèåß íá îáíáêÜíåéò åíôïëÞ áíáãíþñéóçò.
+
+ Ìå ôçí ðáñÜìåôñï áõôÞ, êÜíåé ôï ßäéï ãéá ôï äùóìÝíï øåõäþíõìï. Áí êÜíåéò
+ REVALIDATE, ïé õðçñåóßåò èá óå ñùôÞóïõí ãéá ðïéï øåõäþíõìï.
+ Áõôü ôï êÜíïõí ìüíï ïé (åðéêåöáëåßò) Services admins.
+
+NICK_SERVADMIN_HELP_DROP
+ Óýíôáîç: DROP [øåõäþíõìï]
+
+ ×ùñßò ôçí ðáñÜìåôñï, ìðïñåß íá óâçóôåß ôï øåõäþíõìï áðü ôïõ
+ %S ôçí âÜóç äåäïìÝíùí..
+
+ Ìå ôçí ðáñÜìåôñï, óâÞíåé ï øåõäþíõìï áðü ôçí âÜóç äåäïìÝíùí.
+ Ìðïñåß íá óâÞóåéò êÜðïéï øåõäþíõìï ðïõ ìðïñåß íá åßíáé óôçí ïìÜäá óïõ ÷ùñßò
+ íá Ý÷åéò îå÷ùñéóôÜ äéêáéþìáôá. Ôï óâÞóéìï ôïõ øåõäþíõìïõ Ý÷ïõí ôï äéêáßùìá íá ôï
+ êÜíïõí ïé (åðéêåöáëåßò) Services admins.
+
+NICK_SERVADMIN_HELP_SET
+
+ Ïé (åðéêåöáëåßò) Services admins ìðïñïýí íá åíåñãïðïéÞóïõí
+ ôçí åðéëïãÞ NOEXPIRE êáé Ýôóé ìðïñïýí êÜðïéá øåõäþíõìá
+ íá ôá êÜíïõí íá ìçí ëÞîïõí ðïôÝ. Åðßóçò, ïé Services admins
+ ìðïñïýí íá "ðåéñÜîïõí" ôéò åðéëïãÝò ïðïéõäÞðïôå øåõäþíõìïõ ÷ùñßò íá
+ ÷ñåéÜæåôáé íá ðëçêôñïëïãïýí ôïí êùäéêü, êÜíïíôáò ôï åîÞò:
+ SET øåõäþíõìï åðéëïãÞ ðáñÜìåôñïé.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Óýíôáîç: SET [øåõäþíõìï] NOEXPIRE {ON | OFF}
+
+ Ñõèìßæïõí üðïôå åßíáé íá ëÞãåé Þ íá ìçí ëÞãåé ôï øåõäþíõìï. Áí åßíáé
+ óå ON óçìáßíåé ïôé ôï øåõäþíõìï äåí èá ëÞîåé. Áí äåí äþóåéò øåõäþíõìï
+ êáé êÜíåéò áðëÜ "set expire on" óçìáßíåé ïôé ìéëÜò ãéá ôï äéêü óïõ øåõäþíõìï
+ êáé óôçí ðñïêåéìÝíç ðåñßðôùóç ôï øåõäþíõìï óïõ äåí èá ëÞîåé.
+
+ Ìüíï ãéá (åðéêåöáëåßò) Services admins.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Ïé Services admins ìðïñïýí íá ÷ñçóéìïðïéïýí ôçí ALL ðáñÜìåôñï ãéá
+ êÜèå øåõäþíõìï.
+
+NICK_SERVADMIN_HELP_LIST
+ Óýíôáîç: LIST pattern [FORBIDDEN] [NOEXPIRE]
+
+ Äßíåé ôçí ëßóôá üëùí ôùí êáôï÷õñùìÝíùí øåõäþíõìùí ðïõ ôáéñéÜæïõí ìå ôï áíÜëïãï
+ pattern, óå óýíôáîç nick!user@host. Øåõäþíõìá ìå åðéëïãÞ PRIVATE
+ èá öáßíïíôáé ìüíï óôïõò (åðéêåöáëåßò) Services admins. Øåõäþíõìá ìå
+ åðéëïãÞ NOEXPIRE èá Ý÷ïõí Ýíá ! ìðñïóôÜ áðü ôï øåõäþíõìï ôï ïðïßï èá ôï
+ ëÝðïõí ïé (åðéêåöáëåßò) Services admins.
+
+ Ðáñáäåßãìáôá:
+
+ LIST *!joeuser@foo.com
+ Åìöáíßæåé üëá ôá êáôï÷õñùìÝíá øåõäþíõìá ðïõ áíÞêïõí óôï joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Åìöáíßæåé üëá ôá êáôï÷õñùìÝíá øåõäþíõìá Bot.
+
+ LIST * NOEXPIRE
+ Åìöáíßæåé üëá ôá êáôï÷õñùìÝíá øåõäþíõìá ðïõ åßíáé óå no-expire.
+
+NICK_SERVADMIN_HELP_ALIST
+ Syntax: ALIST [nickname] [level]
+
+ With no parameters, lists channels you have access on. With
+ one parameter, lists channels that nickname has access
+ on. With two parameters lists channels that nickname has
+ level access or greater on.
+
+ This use limited to Services admins.
+
+NICK_SERVADMIN_HELP_GLIST
+ Óýíôáîç: GLIST [øåõäþíõìï]
+
+ ×ùñßò ôçí ðáñÜìåôñï, åìöáíßæåé üëá ôá øåõäþíõìá ðïõ åßíáé
+ óôçí ïìÜäá óïõ.
+
+ Ìå ôçí ðáñÜìåôñï, åìöáíßæåé üëá ôá øåõäþíõìá ðïõ åßíáé óôçí ïìÜäá
+ ôïõ æçôïýìåíïõ øåõäþíõìïõ. Ìüíï ïé Services admins
+ ìðïñïýí íá ôï êÜíïõí.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Óýíôáîç: GETPASS øåõäþíõìï
+
+ Äßíåé ôïí ÷áìÝíï êùäéêü óôï óõãêåêñéìÝíï øåõäþíõìï. Óçìåßùóç üôáí
+ ç åíôïëÞ áõôÞ ÷ñçóéìïðïéåßôáé, ôï ìÞíõìá ðïõ èá ðÜåé ãéá ôïí
+ óõãêåêñéìÝíï èá êáôáãñáöåß êáé ç åíôïëÞ ðïõ åêôåëÝóôçêå êáé ôï øåõäþíõìï
+ êáé èá óôáëåß ìÝóù WALLOPS/GLOBOPS.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+ ÁõôÞ ç åíôïëÞ äåí åßíáé äéáèÝóéìç áí åßíáé åíåñãÞ ç êùäéêïðïßçóç.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Returns the matching nicks that used given email. Note that
+ you can not use wildcards for either user or emailhost. Whenever
+ this command is used, a message including the person who issued
+ the command and the email it was used on will be logged.
+
+ Limited to Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Óýíôáîç: FORBID øåõäþíõìï [ëüãïò]
+
+ Äåí åðéôñÝðåé óôï øåõäþíõìï íá êáôï÷õñùèåß Þ íá ÷ñçóéìïðïéçèåß áðü
+ êáíÝíáí. Ìðïñåß íá áêõñùèåß áí äéáãñáöåß ôåëåßùò ôï øåõäþíõìï.
+
+ Óå ïñéóìÝíá äßêôõá, ï ëüãïò ðïõ ãßíåôáé áõôü ÷ñåéÜæåôáé.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ Ï %S óáò åðéôñÝðåé íá êáôï÷õñþóåôå êáé íá ÷åéñéóôåßôå
+ äéÜöïñåò ëåéôïõñãßåò ôùí êáíáëéþí. Ï %S ìðïñåß óõíÞèùò
+ íá áðïôñÝøåé êáêüâïõëïõò ÷ñÞóôåò íá êÜíïõí "êáôÜëçøç" óå
+ êáíÜëéá, ìå ôï íá ðåñéïñßæåé ôéò áñìïäéüôçôåò ôùí
+ äéá÷åéñéóôþí êáíáëéþí. Ïé äéáèÝóéìåò åíôïëÝò, âñßóêïíôáé
+ ðáñáêÜôù. Ãéá íá ôéò ÷ñçóéìïðïéÞóåôå, ðëçêôñïëïãÞóôå
+ /msg %S åíôïëÞ. Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå ìßá
+ óõãêåêñéìÝíç åíôïëÞ, ðëçêôñïëïãÞóôå /msg %S HELP åíôïëÞ.
+
+ REGISTER Êáôï÷õñþíåé Ýíá êáíÜëé
+ IDENTIFY Óáò áíáãíùñßæåé ìå êùäéêü
+ SET Ñõèìßæåé ôéò åðéëïãÝò êáé ôéò ðëçñïöïñßåò
+ ôïõ êáíáëéïý
+ AOP ÁëëÜæåé ôçí ëßóôá ôùí AOP ÷ñçóôþí
+ SOP ÁëëÜæåé ôçí ëßóôá ôùí SOP ÷ñçóôþí
+ ACCESS ÁëëÜæåé ôç ëßóôá ôùí åîïõóéïäïôçìÝíùí ÷ñçóôþí
+ LEVELS Åðáíáêáèïñßæåé ôï íüçìá ôùí åðéðÝäùí ðñüóâáóçò
+ AKICK Óõíôçñåß ôç ëßóôá áõôüìáôçò áðüññéøçò
+ DROP Áêõñþíåé ôçí êáôï÷ýñùóç åíüò êáíáëéïý
+ SENDPASS ÓôÝëíåé ôïí ÷áìÝíï êùäéêü ôïõ êáíáëéïý
+
+ ¢ëëåò åíôïëÝò: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO,
+ INVITE, KICK, LIST, LOGOUT, OP, TOPIC,
+ UNBAN, VOICE, VOP
+
+CHAN_HELP_UNREAL
+
+ ÁõôÝò ïé åíôïëÝò åßíáé äéáèÝóéìåò áå áõôü ôï äßêôõï:
+ DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER,
+ PROTECT
+
+CHAN_HELP_ULTIMATE
+
+ ÁõôÝò ïé åíôïëÝò åßíáé äéáèÝóéìåò áå áõôü ôï äßêôõï:
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ ÁõôÝò ïé åíôïëÝò åßíáé äéáèÝóéìåò áå áõôü ôï äßêôõï:
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Óçìåßùóç: ïðïéïäÞðïôå êáíÜëé äåí ÷ñçóéìïðïéåßôáé ãéá %d ìÝñåò
+ (äçë êáíÝíáò ÷ñÞóôçò ðïõ Ý÷åé access äåí ìðÝíåé óôï êáíÜëé
+ ãéá åêåßíç ôçí ðåñßïäï ôùí çìåñþí) èá äéáãñáöåß áõôüìáôá.
+
+CHAN_HELP_REGISTER
+ Óýíôáîç: REGISTER êáíÜëé êùäéêüò ðåñéãñáöÞ
+
+ Êáôï÷õñþíåé Ýíá êáíÜëé óôç âÜóç äåäïìÝíùí ôïõ %S. Ãéá
+ íá ÷ñçóéìïðïéÞóåôå áõôÞ ôçí åíôïëÞ, ðñÝðåé ðñþôá íá åßóôå
+ äéá÷åéñéóôÞò êáíáëéïý ìÝóá óôï êáíÜëé ðïõ ðñïóðáèåßôå íá
+ êáôï÷õñþóåôå. Ï êùäéêüò ÷ñçóéìïðïéåßôáé ìå ôçí åíôïëÞ
+ IDENTIFY ãéá íá óáò åðéôñÝðåé íá êÜíåôå áëëáãÝò óôéò
+ ñõèìßóåéò ôïõ êáíáëéïý áñãüôåñá. Ç ôåëåõôáßá ðáñÜìåôñïò,
+ ç ïðïßá êáé ðñÝðåé íá óõìðåñéëçöèåß, åßíáé ìßá ãåíéêÞ
+ ðåñéãñáöÞ ãéá ôï óêïðü ýðáñîçò ôïõ êáíáëéïý.
+
+ ¼ôáí êáôï÷õñþíåôå Ýíá êáíÜëé, ïñßæåóôå óáí "éäñõôÞò" ôïõ.
+ Ï éäñõôÞò åíüò êáíáëéïý, åðéôñÝðåôáé íá áëëÜîåé üëåò ôéò
+ ñõèìßóåéò ôïõ; Ï %S åðßóçò èá ôïõ äþóåé áõôüìáôá
+ áñìïäéüôçôåò éäñõôÞ êáé äéá÷åéñéóôÞ êáíáëéïý, ìå ôçí åßóïäü
+ ôïõ óôï êáíÜëé.Äåßôå ôçí åíôïëÞ ACCESS command.
+ (/msg %S HELP ACCESS) ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí ðáñï÷Þ ìÝñïõò ôùí
+ áñìïäéïôÞôùí áõôþí, óå Üëëïõò ÷ñÞóôåò ôïõ êáíáëéïý.
+
+ ÓÇÌÅÉÙÓÇ: Ãéá íá êáôï÷õñþóåôå Ýíá êáíÜëé, ðñÝðåé íá Ý÷åôå
+ ðñþôá êáôï÷õñþóåé ôï øåõäþíõìü óáò. Áí äåí ôï Ý÷åôå êÜíåé,
+ /msg %s HELP ãéá ðåñéóóüôåñåò ðëçñïöïñßåò ó÷åôéêÜ.
+
+CHAN_HELP_IDENTIFY
+ Óýíôáîç: IDENTIFY êáíÜëé êùäéêüò
+
+ Óå áíáãíùñßæåé ï %S ùò founder ôïõ æçôïýìåíïõ êáíáëéïý.
+ ÐïëëÝò åðéëïãÝò áðáéôïýí áõôÞ ôçí åíôïëÞ ðñéí óõíå÷ßóåôå ìå ôéò
+ Üëëåò. Ï êùäéêüò èá ðñÝðåé íá åßíáé ï ßäéïò ìå áõôüí ðïõ êÜíáôå
+ ôçí åíôïëÞ êáôï÷ýñùóçò.
+
+CHAN_HELP_LOGOUT
+ Óýíôáîç: LOGOUT êáíÜëé øåõäþíõìï
+
+ ÁõôÞ ç åíôïëÞ åßíáé ãéá øåõäþíõìá ðïõ äåí êÜíïõí åíôïëÞ áíáãíþñéóçò
+ ãéá ôï æçôïýìåíï êáíÜëé.
+
+ Áí åßóáé ï founder ôïõ êáíáëéïý, ìðïñåßò íá êÜíåéò log out ïðïéïäÞðïôå,
+ åêôüò êáé áí êÜíåéò ìüíï log out ôïí åáõôü óïõ.
+
+CHAN_HELP_DROP
+ Óýíôáîç: DROP êáíÜëé
+
+ ÊÜíåé ôï êáíÜëé îåêáôï÷õñþóçìï,ôï áöÞíåé åëåýèåñï ÷ùñßò founder. Ãéá íá
+ ãßíåé áõôü ðñÝðåé ï founder, íá êÜíåé IDENTIFY ðñþôá êáé ýóôåñá drop.
+
+CHAN_HELP_SET
+ Óýíôáîç: SET êáíÜëé åðéëïãÞ ðáñÜìåôñïé
+
+ ÅðéôñÝðïõí óôïí founder ôïõ êáíáëéïý íá åðéëÝîåé êáé íá ñõèìßóåé ôï êáíÜëé
+ ôïõ êáé Üëëåò ðëçñïöïñßåò.
+
+ ÄéáèÝóéìåò åðéëïãÝò:
+
+ FOUNDER ÁëëÜæåé ôïí founder ôïõ êáíáëéïý
+ SUCCESSOR ÁëëÜæåé ôïí successor ôïõ êáíáëéïý
+ PASSWORD ÁëëÜæåé ôïí êùäéêü ôïõ founder
+ DESC ÁëëÜæåé ôçí ðåñéãñáöÞ ôïõ êáíáëéïý
+ URL Óõó÷åôßæåé Ýíá URL ìå ôï êáíÜëé
+ EMAIL Óõó÷åôßæåé Ýíá E-mail ìå ôï êáíÜëé
+ ENTRYMSG ÁëëÜæåé ôï ìÞíõìá åéóáãùãÞò ðïõ óôÝëíåôå óå üëïõò ôïõò
+ ÷ñÞóôåò ðïõ ìðÝíïõí óôï êáíÜëé
+ BANTYPE ÁëëÜæåé ôïí ôýðï ôïõ ban ðïõ èá êÜíïõí ôá Services
+ MLOCK Êëåßäùìá ôùí Modes ôïõ êáíáëéïý
+ KEEPTOPIC Íá áëëÜæåé ôï topic üôáí äåí ÷ñçóéìïðïéåßôáé ôï êáíÜëé
+ OPNOTICE Íá óôÝëíåé ìÝóá óôï êáíÜëé ìÞíõìá ðïéïò ÷ñçóéìïðïéåß OP/DEOP
+ åíôïëÝò
+ PEACE Íá åëëáôþíåé ôçí ÷ñÞóç "âßáéùí" åíôïëþí
+ PRIVATE Íá ìçí åìöáíßæåôáé ôï êáíÜëé üôáí ãßíåôáé åíôïëÞ LIST
+ RESTRICTED Áðáãüñåõóç åéóüäïõ óôï êáíÜëé áí äåí Ý÷åéò access åêåß
+ SECURE Åíåñãïðïßçóç ôïõ %S ,ìåëëïíôéêÞ áóöÜëåéá
+ SECUREOPS Ìüíï üóïé Ý÷ïõí access èá Ý÷ïõí op
+ SECUREFOUNDER ÁóöÜëåéá ôïõ founder áðü ôï êáíÜëé
+ SIGNKICK Åìöáí. kicks ôá ïðïßá ãßíïíôáé ìå ôçí åíôïëÞ KICK
+ TOPICLOCK Ôï Topic ìðïñåß íá áëëÜîåé ìå ôçí åíôïëÞ TOPIC
+ XOP Áí åßíáé ON äïõëåýåé ìå AOP/SOP,áí åßíáé off ìå access
+
+ ÃñÜøå /msg %S HELP åðéëïãÞ ãéá ðåñéóóüôåñåò ðëçñïöïñßåò
+ ãéá ôçí êÜèå åíôïëÞ.
+
+CHAN_HELP_SET_FOUNDER
+ Óýíôáîç: SET êáíÜëé FOUNDER øåõäþíõìï
+
+ ÁëëÜæåé ôïí founder ôïõ êáíáëéïý. Ôï íÝï øåõäþíõìï ðñÝðåé íá åßíáé
+ êáôï÷õñùìÝíï.
+
+CHAN_HELP_SET_SUCCESSOR
+ Óýíôáîç: SET êáíÜëé SUCCESSOR øåõäþíõìï
+
+ ÁëëÜæåé ôïí successor ôïõ êáíáëéïý. Áí ôï øåõäþíõìï ôïõ founder
+ ëÞîåé Þ óâçóôåß (drop) ôüôå ôï êáíÜëé èá åßíáé áêüìá êáôï÷õñùìÝíï.
+ Ï successor èá ãßíåé ï íÝïò founder ôïõ êáíáëéïý.
+ Áí üìùò, ï successor Ý÷åé êáôï÷õñþóåé ðïëëÜ êáíÜëéá,
+ áí äçë Ý÷åé (%d), ôï êáíÜëé èá óâçóôåß,óáí íá ìçí åß÷å ïñéóôåß
+ successor. Ôï íÝï øåõäþíõìï èá ðñÝðåé íá åßíáé êáôï÷õñùìÝíï.
+
+CHAN_HELP_SET_PASSWORD
+ Óýíôáîç: SET êáíÜëé PASSWORD êùäéêü
+
+ ÁëëÜæåôå ôïí êùäéêü ðïõ êÜíåôå åíôïëÞ áíáãíþñéóçò ùò founder ôïõ
+ êáíáëéïý.
+
+CHAN_HELP_SET_DESC
+ Óýíôáîç: SET êáíÜëé DESC ðåñéãñáöÞ
+
+ ÁëëÜæåôå ôçí ðåñéãñáöÞ ôïõ êáíáëéïý, ç ïðïßá öÝíåôáé ìå ôçí åíôïëÞ
+ LIST êáé INFO.
+
+CHAN_HELP_SET_URL
+ Óýíôáîç: SET êáíÜëé URL [url]
+
+ Óõó÷åôßæåé Ýíá URL ìå ôï êáíÜëé. Áõôü ôï URL èá
+ åìöáíßæåôáé üôáí êÜðïéïò èá êïéôÜæåéò ôéò ðëçñïöïñßåò ôïõ êáíáëéïý
+ ìå ôçí åíôïëÞ INFO. Áí äåí äùèåß êáìßá ðáñÜìåôñïò,
+ èá óâçóôåß ïðïéïäÞðïôå URL åß÷å äùèåß ðáëáéüôåñá óôï êáíÜëé.
+
+CHAN_HELP_SET_EMAIL
+ Óýíôáîç: SET êáíÜëé EMAIL [äéåýèõíóç]
+
+ Óõó÷åôßæåé ìéá äéåýèõíóç E-mail ìå ôï êáíÜëé.
+ ÁõôÞ ç äéåýèõíóç åìöáíßæåôáé üôáí êÜðïéïò èÝëåé íá äåé
+ äéÜöïñåò ðëçñïöïñßåò ó÷åôéêÜ ìå ôï êáíÜëé, ìå ôçí åíôïëÞ INFO.
+ Áí äåí äùèåß êáìßá ðáñÜìåôñïò, äéáãñÜöåé ïðïéáäÞðïôå äéåýèõíóç E-mail
+ åß÷å äùèåß óôï êáíÜëé.
+
+CHAN_HELP_SET_ENTRYMSG
+ Óýíôáîç: SET êáíÜëé ENTRYMSG [ìÞíõìá]
+
+ ÁëëÜæåé ôï ìÞíõìá åéóáãùãÞò ôï ïðïßï óôÝëíåôå óå êÜèå ÷ñÞóôç ìÝóù /notice
+ (ðáñáôÞñçóç) üôáí áõôüò ìðÝíåé óôï êáíÜëé. Áí äåí äùèåß êáìßá ðáñÜìåôñïò,
+ äåí èá óôÝëíåôå êáíÝíá ìÞíõìá óôï ÷ñÞóôç,ï ïðïßïò èá åéóÝñ÷åôáé óôï êáíÜëé.
+
+CHAN_HELP_SET_BANTYPE
+ Óýíôáîç: SET êáíÜëé BANTYPE ôýðïò-ban
+
+ ÁëëÜæåé ôïí ôýðï ôïõ ban, ï ïðïßïò èá ÷ñçóéìïðïéåßôáé áðü ôéò õðçñåóßåò üôáí
+ èá ÷ñåéÜæåôáé íá êÜíåé êÜðïéïí ban áðü ôï êáíÜëé (ð÷ akick).
+
+ Ïé ôýðïé ban åßíáé áðü 0 Ýùò 3 êáé óçìáßíåé:
+
+ 0: ôï ban èá åßíáé ôçò ìïñöÞò *!user@host
+ 1: ôï ban èá åßíáé ôçò ìïñöÞò *!*user@host
+ 2: ôï ban èá åßíáé ôçò ìïñöÞò *!*@host
+ 3: ôï ban èá åßíáé ôçò ìïñöÞò *!*user@*.domain
+
+CHAN_HELP_SET_KEEPTOPIC
+ Óýíôáîç: SET êáíÜëé KEEPTOPIC {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ topic retention ôïõ êáíáëéïý.
+ ¼ôáí ôï topic retention åßíáé on, ôï topic ôïõ êáíáëéïý
+ èá õðåíèõìßæåôáé áðü ôïí %S ìåôÜ ôïí ôåëåõôáßï ÷ñÞóôç ðïõ èá öýãåé áðü
+ ôï êáíÜëé, êáé èá áðïèçêåýåôáé ãéá ôçí åðüìåíç öïñÜ.
+
+CHAN_HELP_SET_TOPICLOCK
+ Óýíôáîç: SET êáíÜëé KEEPTOPIC {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ êëåßäùìá topic ôïõ êáíáëéïý.
+ ¼ôáí ôï êëåßäùìá topic åßíáé on, ï %S äåí èá åðéôñÝðåé óå êáíÝíáí íá áëëÜîåé
+ ôï topic ôïõ êáíáëéïý åêôüò ôçò åíôïëÞò TOPIC ôïõ.
+
+CHAN_HELP_SET_MLOCK
+ Óýíôáîç: SET êáíÜëé MLOCK modes
+
+ Êáèïñßæåé ôï êëåßäùìá ôùí modes ãéá ôï êáíÜëé. Ï %S
+ óáò åðéôñÝðåé íá êáèïñßóåôå óõãêåêñéìÝíá modes ãéá ôï êáíÜëé
+ ôá ïðïßá èá åßíáé ðÜíôá åíåñãïðïéçìÝíá (Þ ü÷é). Ôá modes
+ ðïõ ìðïñïýí íá êëåéäùèïýí åßíáé: i, k, l, m, n, p, s, êáé t.
+ ÊÜèå Ýíá áðü áõôÜ ôá modes ìðïñåß íá êëåéäùèåß, íá îåêëåéäùèåß íá
+ ìç óõìðåñéëçöèåß êáèüëïõ.
+
+ Ç ðáñÜìåôñïò modes óõíôÜóóåôáé ìå ôïí ßäéï ôñüðï üðùò ç åíôïëÞ
+ /MODE. ¸ôóé ôá modes ìåôÜ áðü Ýíá + êëåéäþíïíôáé êáé ôá modes ìåôÜ
+ áðü Ýíá - îåêëåéäþíïíôáé.
+
+ Ðñïóï÷Þ: Áí ÷ñçóéìïðïéåßôå ôï mode êëåéäþìáôïò ìå êëåéäß,
+ üðùò óôï äåýôåñï ðáñÜäåéãìá ðáñáêÜôù, èá ðñÝðåé åðßóçò íá
+ åíåñãïðïéÞóåôå ôçí åðéëïãÞ RESTRICTED ãéá ôï êáíÜëé (äåßôå
+ HELP SET RESTRICTED), áëëéþò ïðïéïóäÞðïôå ìðáßíåé óôï
+ êáíÜëé üôáí áõôü åßíáé Üäåéï, èá ìðïñåß íá äåß ôï êëåéäß!
+
+ Ðáñáäåßãìáôá:
+
+ SET #êáíÜëé MLOCK +nt-iklps
+ Åíåñãïðïéåß ôá modes n êáé t, êáé áðåíåñãïðïéåß ôá modes i,
+ k, l, p êáé s. Ôï mode m, äå óõìðåñéëáìâÜíåôáé ãéá íá ìðïñåß
+ íá åßíáé åíåñãïðïéçìÝíï Þ ìç.
+
+ SET #êáíÜëé MLOCK +knst-ilmp my-key
+ Åíåñãïðïéåß ôá modes k, n, s êáé t, êáé áðåíåñãïðïéåß ôá
+ modes i, l, m êáé p. Åðßóçò êáèïñßæåé ôï êëåéäß ôïõ êáíáëéïý
+ íá åßíáé "my-key".
+
+ SET #êáíÜëé MLOCK +
+ Áöáéñåß ôï êëåßäùìá ôùí modes. ¼ëá ôá modes ôïõ
+ êáíáëéïý åßíáé åëåýèåñá íá åíåñãïðïéçèïýí Þ íá
+ áðåíåñãïðïéçèïýí.
+
+CHAN_HELP_SET_PEACE
+ Óýíôáîç: SET êáíÜëé PEACE {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðååñãïðïéåß ôçí åíôïëÞ peace óôï êáíÜëé.
+ ¼ôáí ç åíôïëÞ peace åßíáé on, ï ÷ñÞóôçò äåí ìðïñåß íá êÜíåé kick,
+ ban Þ íá áöáéñÝóåé op áðü êÜðïéïí ÷ñÞóôç ï ïðïßïò Ý÷åé ìåãáëýôåñï
+ level áðü áõôüí Þ ßóï ìå áõôüí ìÝóù åíôïëþí %S.
+
+CHAN_HELP_SET_PRIVATE
+ Óýíôáîç: SET êáíÜëé PRIVATE {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ private ãéá Ýíá êáíÜëé.
+ ¼ôáí åíåñãïðïéåßôáé ç private åíôïëÞ, ôï êáíÜëé äå óõìðåñéëáìâÜíåôáé
+ óôç ëßóôá ðïõ ðñïêýðôåé áðü ôçí åíôïëÞ /msg %S LIST.
+
+CHAN_HELP_SET_RESTRICTED
+ Óýíôáîç: SET êáíÜëé RESTRICTED {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðåñíåñãïðïéåß ôçí restricted access åðéëïãÞ ôïõ
+ êáíáëéïý. ¼ôáí åíåñãïðéçèåß ç restricted access , ÷ñÞóôåò ïé
+ ïðïßïé äåí Ý÷ïõí access óôï êáíÜëé, ïé õðçñåóßåò èá ôïõò êÜíïõí
+ kick êáé ban áðü ôï êáíÜëé.
+
+CHAN_HELP_SET_SECURE
+ Óýíôáîç: SET êáíÜëé SECURE {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôéò äõíáôüôçôåò áóöÜëåéáò ôïõ %S ãéá
+ Ýíá êáíÜëé. ¼ôáí åíåñãïðïéåßôáé ôï SECURE, ìüíï ïé ÷ñÞóôåò ðïõ
+ Ý÷ïõí êáôï÷õñùìÝíá ôá øåõäþíõìÜ ôïõò ìå ôï %s êáé Ý÷ïõí áíáãíùñéóôåß
+ ìå ôïí êùäéêü ôïõò, èá Ý÷ïõí ðñüóâáóç óôï êáíÜëé üðùò ïñßæåôáé êáé
+ áðü ôç ëßóôá ðñüóâáóçò.
+
+CHAN_HELP_SET_SECUREOPS
+ Óýíôáîç: SET êáíÜëé SECUREOPS {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ ðñïóôáôåõìÝíçò äéá÷åßñçóçò
+ ãéá Ýíá êáíÜëé. ¼ôáí åíåñãïðïéåßôáé ç ðñïóôáôåõìÝíç äéá÷åßñçóç, ïé
+ ÷ñÞóôåò ðïõ äåí åßíáé óôç ëßóôá ðñüóâáóçò, äå ìðïñïýí íá ðÜñïõí op.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Óýíôáîç: SET êáíÜëé SECUREFOUNDER {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ áóöáëÞò founder ãéá Ýíá êáíÜëé.
+ ¼ôáí åíåñãïðïéåßôáé ç åðéëïãÞ áóöáëÞò founder, ìüíï ï ðñáãìáôéêüò founder
+ ìðïñåß íá êÜíåé drop (óâÞóåé) ôï êáíÜëé, íá áëëÜîåé ôïí êùäéêü ôïõ,
+ ìüíï ï founder êáé ï successor, êáé ü÷é áõôïß ðïõ êÜíïõí åíôïëÞ
+ áíáãíþñéóçò ìå ôïí %S.
+
+CHAN_HELP_SET_SIGNKICK
+ Óýíôáîç: SET êáíÜëé SIGNKICK {ON | LEVEL | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ signed kicks ôïõ
+ êáíáëéïý. ¼ôáí åíåñãïðïéåßôáé ç åðéëïãÞ SIGNKICK, ôá kicks èá
+ åêôåëïýíôáé %S KICK command will have the nick that used the
+ ìå åíôïëÞ ðåñéÝ÷ïíôáò ôïí ëüãï.
+
+ Áí ÷ñçóéìïðïéåßò LEVEL, áõôïß ðïõ Ý÷ïõí ìåãáëýôåñç level Þ ßóç
+ ìå ôçí SIGNKICK level ôïõ êáíáëéïý äåí èá Ý÷ïõí
+ kicks signed. Äåò /msg %S HELP LEVELS ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+
+CHAN_HELP_SET_XOP
+ Óýíôáîç: SET êáíÜëé XOP {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ xOP system ãéá Ýíá êáíÜëé.
+ ¼ôáí åíåñãïðïéåßôáé ç åðéëïãÞ XOP, ÷ñçóéìïðïéåßò ôéò
+ åíôïëÝò AOP/SOP/VOP, ãéá íá äþóåéò óôïõò ÷ñÞóôåò ðïõ
+ èåò äéêáéþìáôá óôï êáíÜëé.Áëëéþò ÷ñçóéìïðïéåßò ôçí åíôïëÞ ACCESS.
+
+ Ôå÷íéêÞ óçìåßùóç: Áí Ý÷åéò áðåíåñãïðïéÞóç ôçí xOP åíôïëÞ,÷ñçóéìïðïéåßò
+ ôçí åíôïëÞ access.Áí äþóåéò access óå ÷ñÞóôåò êáé ìåôÜ ãéá êÜðïéï ëüãï
+ êÜíåéò ôï xOP åíåñãü,èá ðñÝðåé íá äþóåéò äéêáéþìáôá óôïõò ÷ñÞóôåò
+ áõôïýò ìå ôçí xOP åíôïëÞ!
+
+ Áí áðü xOP system ôï ãõñßóåôå óå access system
+ äåí èá õðÜñîåé êáíÝíá ðñüâëçìá.
+
+CHAN_HELP_SET_OPNOTICE
+ Óýíôáîç: SET êáíÜëé OPNOTICE {ON | OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ åíçìÝñùóçò op ãéá Ýíá êáíÜëé.
+ ¼ôáí åíåñãïðïéåßôáé ç åíçìÝñùóç op, ï %S óôÝëíåé Ýíá notice óôïõò ops
+ ôïõ êáíáëéïý, êÜèå öïñÜ ðïõ ÷ñçóéìïðïéïýíôáé ïé åíôïëÝò OP, DEOP, AKICK êáé
+ ACCESS áðü êÜðïéï ÷ñÞóôç ãéá ôï êáíÜëé.
+
+CHAN_HELP_AOP
+ Óýíôáîç: AOP êáíÜëé ADD øåõäþíõìï
+ AOP êáíÜëé DEL {øåõäþíõìï | íïýìåñï | ëßóôá}
+ AOP êáíÜëé LIST [ìÜóêá | ëßóôá]
+ AOP êáíÜëé CLEAR
+
+ ÁëëÜæåé ôçí AOP (AutoOP) ëßóôá ôïõ êáíáëéïý. Ç ëßóôá AOP
+ äßíåé óôïõò ÷ñÞóôåò ôï äéêáßùìá íá ãßíïíôáé áõôüìáôá opped óôï êáíÜëé óáò,
+ íá êÜíïõí unban Þ invite ôïõò åáõôïýò ôïõò áí ÷ñåéÜæåôáé, íá Ý÷ïõí ôï äéêü
+ ôïõò ìÞíõìá ÷áéñåôéóìïý üôáí ìðÝíïõí óå Ýíá êáíÜëé, êáé Üëëá ðïëëÜ.
+
+ Ç åíôïëÞ AOP ADD ðñïóèÝôåé Ýíá øåõäþíõìï óôçí ëßóôá AOP.
+
+ Ç åíôïëÞ AOP DEL áöáéñåß Ýíá øåõäþíõìï áðü ôçí ëßóôá AOP.
+ Áí ç ëßóôá äßíåôáé ìå èÝóåéò-íïýìåñá, ôüôå áõôÝò ïé èÝóåéò äéáãñÜöïíôáé.
+ (Äåò ôï ðáñÜäåéãìá ìå ôçí åíôïëÞ LIST.)
+
+ Ç åíôïëÞ AOP LIST åìöáíßæåé ôçí ëßóôá AOP. Áí äùèåß ìéá
+ óõãêåêñéìÝíç ìÜóêá, ìüíï ïé èÝóåéò ðïõ ôáéñéÜæïõí ìå áõôÞí èá åìöáíéóôïýí.
+ Áí êÜíåôå list ìå ôéò èÝóåéò-íïýìåñá,ôüôå ìüíï ôéò èÝóåéò ðïõ äþóáôå èá
+ äåßôå. Äçë ôá áíôßóôïé÷á øåõäþíõìá ðïõ áíÞêïõí óôéò èÝóåéò áõôÝò.
+ Ãéá ðáñÜäåéãìá:
+
+ AOP #êáíÜëé LIST 2-5,7-9
+ Åìöáíßæåé áðü ôçí ëßóôá AOP ôéò èÝóåéò ìå ôá
+ íïýìåñá 2 Ýùò 5 êáé 7 Ýùò 9.
+
+ Ç åíôïëÞ AOP CLEAR êáèáñßæåé üëåò ôéò èÝóåéò áðü ôçí ëßóôá AOP.
+
+ Ïé åíôïëÝò AOP ADD êáé AOP DEL åßíáé ðåñéïñéóìÝíåò óôïõò
+ SOPs Þ åðÜíù, åíþ ç åíôïëÞ AOP CLEAR ìðïñåß ìüíï íá ÷ñçóéìïðïéçèåß
+ áðü ôïí founder ôïõ êáíáëéïý. ¼ìùò, ïðïéïóäÞðïôå ÷ñÞóôçò ìðïñåß íá
+ ÷ñçóéìïðïéÞóåé ôçí åíôïëÞ AOP LIST.
+
+ ÁõôÞ ç åíôïëÞ ìðïñåß íá åßíáé áðåíåñãïðïéçìÝíç áðü ôï êáíÜëé óáò, êáé
+ óå áõôÞ ôçí ðåñßðôùóç èá ÷ñçóéìïðïéÞóåôå ôçí åíôïëÞ access list. Äåßôå
+ /msg %S HELP ACCESS ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí åíôïëÞ access list,
+ êáé /msg %S HELP SET XOP ãéá íá îÝñåôå ðùò èá åðéëÝîåôå áíÜìåóá óôï
+ access list êáé xOP list óýóôçìá.
+
+CHAN_HELP_HOP
+ Óýíôáîç: HOP êáíÜëé ADD øåõäþíõìï
+ HOP êáíÜëé DEL {øåõäþíõìï | èÝóåéò-íïõ | list}
+ HOP êáíÜëé LIST [ìÜóêá | list]
+ HOP êáíÜëé CLEAR
+
+ ÁëëÜæåé ôçí ëßóôá HOP (HalfOP) ôïõ êáíáëéïý. Ç ëßóôá HOP
+ äßíåé óôïõò ÷ñÞóôåò ôï äéêáßùìá íá åßíáé áõôüìáôá halfopped óôï
+ êáíÜëé óáò.
+
+ Ç åíôïëÞ HOP ADD ðñïóèÝôåé Ýíá øåõäþíõìï óôçí ëßóôá HOP.
+
+ Ç åíôïëÞ HOP DEL äéáãñÜöåé Ýíá øåõäþíõìï áðü ôçí ëßóôá HOP.
+ Áí äßíåôå ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá, áõôÝò ïé
+ èÝóåéò äéáãñÜöçêáí. (Äåò ôï ðáñÜäåéãìá ìå ôçí åíôïëÞ LIST.)
+
+ Ç åíôïëÞ HOP LIST åìöáíßæåé ôçí ëßóôá HOP. Áí äþóåôå ìéá æçôïýìåíç
+ ìÜóêá ôüôå èá åìöáíßóåé ôéò èÝóåéò ðïõ ôáéñéÜæåé ç ìÜóêá.
+ Áí êÜíåôå list ìå ôéò èÝóåéò-íïýìåñá,ôüôå ìüíï ôéò èÝóåéò ðïõ äþóáôå èá
+ äåßôå. Äçë ôá áíôßóôïé÷á øåõäþíõìá ðïõ áíÞêïõí óôéò èÝóåéò áõôÝò.
+
+ ÐáñÜäåéãìá:
+
+ HOP #êáíÜëé LIST 2-5,7-9
+ Åìöáíßæåé áðü ôçí ëßóôá HOP ôéò èÝóåéò ìå ôá
+ íïýìåñá 2 Ýùò 5 êáé 7 Ýùò 9.
+
+ Ç åíôïëÞ HOP CLEAR äéáãñÜöåé üëåò ôéó èÝóåéò ôçò ëßóôáò HOP.
+
+ Ïé åíôïëÝò HOP ADD, HOP DEL êáé HOP LIST åßíáé ðåñéïñéóìÝíåò
+ ìüíï óôïõò AOPs(áõôïß ðïõ åßíáé óôçí AOP access) Þ áíþôåñïõò,
+ åíþ ç åíôïëÞ HOP CLEAR ìðïñåß ìüíï íá ÷ñçóéìïðïéçèåß áðü ôïí
+ founder ôïõ êáíáëéïý.
+
+ ÁõôÞ ç åíôïëÞ ìðïñåß íá åßíáé áðåíåñãïðïéçìÝíç áðü ôï êáíÜëé óáò, êáé
+ óå áõôÞ ôçí ðåñßðôùóç èá ÷ñçóéìïðïéÞóåôå ôçí åíôïëÞ access list. Äåßôå
+ /msg %S HELP ACCESS ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí åíôïëÞ access list,
+ êáé /msg %S HELP SET XOP ãéá íá îÝñåôå ðùò èá åðéëÝîåôå áíÜìåóá óôï
+ access list êáé xOP list óýóôçìá.
+
+CHAN_HELP_SOP
+ Óýíôáîç: SOP êáíÜëé ADD øåõäþíõìï
+ SOP êáíÜëé DEL {øåõäþíõìï | èÝóåéò-íïõ | list}
+ SOP êáíÜëé LIST [ìÜóêá | list]
+ SOP êáíÜëé CLEAR
+
+ ÁëëÜæåé ôçí ëßóôá SOP (SuperOP) ôïõ êáíáëéïý. Ç ëßóôá SOP
+ äßíåé ôï äéêáßùìá óôïõò ÷ñÞóôåò íá ðñïóèÝôïõí Üëëïõò óôçí ëßóôá AOP,
+ íá ðñïóèÝôïõí óå üóïõò ÷ñåéÜæåôáé AutoKick, íá åéóÜãïõí óôçí ëßóôá
+ BadWord êáêÝò ëÝîåéò,íá óôÝëíïõí êáé íá äéáâÜæïõí ôá ìçíýìáôá ôïõ
+ êáíáëéïý,êáé Üëëá ðïëëÜ.
+
+ Ç åíôïëÞ SOP ADD ðñïóèÝôåé Ýíá øåõäþíõìï óôçí ëßóôá SOP.
+
+ Ç eíôïëÞ SOP DEL äéáãñÜöåé Ýíá øåõäþíõìï áðü ôçí ëßóôá SOP.
+ Áí óáò äßíåôå ç ëßóôá ìå ôá íïýìåñá-èÝóåéò, áõôÝò ïé èÝóåéò
+ äéáãñÜöïíôáé. (Äåò ôçí åíôïëÞ LIST.)
+
+ Ç åíôïëÞ SOP LIST åìöáíßæåé ôçí ëßóôá SOP. Áí äþóåôå ìéá
+ óõãêåêñéìÝíç ìÜóêá, èá åìöáíéóôïýí ïé èÝóåéò ðïõ áíôéóôïé÷åß ç ìÜóêá
+ áõôÞ. Áí êÜíåôå list ìå ôéò èÝóåéò-íïýìåñá,ôüôå ìüíï ôéò èÝóåéò ðïõ
+ äþóáôå èá äåßôå. Äçë ôá áíôßóôïé÷á øåõäþíõìá ðïõ áíÞêïõí óôéò
+ èÝóåéò áõôÝò.ÐáñÜäåéãìá::
+
+ SOP #êáíÜëé LIST 2-5,7-9
+ Åìöáíßæåé áðü ôçí ëßóôá SOP ôéò èÝóåéò ìå ôá
+ íïýìåñá 2 Ýùò 5 êáé 7 Ýùò 9..
+
+ Ç åíôïëÞ SOP CLEAR äéáãñÜöåé üëåò ôéó èÝóåéò ôçò ëßóôáò SOP.
+
+ Ïé åíôïëÝò SOP ADD, SOP DEL êáé SOP LIST ÷ñçóéìïðïéïýíôáé áðü
+ ôïí founder ôïõ êáíáëéïý.¼ðïéïò åßíáé ÷ñÞóôçò óôçí ëßóôá AOP ìðïñåß
+ íá åêôåëÝóåé åíôïëÞ SOP LIST.
+
+ ÁõôÞ ç åíôïëÞ ìðïñåß íá åßíáé áðåíåñãïðïéçìÝíç áðü ôï êáíÜëé óáò, êáé
+ óå áõôÞ ôçí ðåñßðôùóç èá ÷ñçóéìïðïéÞóåôå ôçí åíôïëÞ access list. Äåßôå
+ /msg %S HELP ACCESS ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí åíôïëÞ access list,
+ êáé /msg %S HELP SET XOP ãéá íá îÝñåôå ðùò èá åðéëÝîåôå áíÜìåóá óôï
+ access list êáé xOP list óýóôçìá.
+
+CHAN_HELP_VOP
+ Óýíôáîç: VOP êáíÜëé ADD øåõäþíõìï
+ VOP êáíÜëé DEL {øåõäþíõìï | èÝóåéò-íïõ | list}
+ VOP êáíÜëé LIST [ìÜóêá | list]
+ VOP êáíÜëé CLEAR
+
+ ÁëëÜæåé ôçí ëßóôá VOP (VOicePeople) ôïõ êáíáëéïý.
+ Ç ëßóôá VOP åðéôñÝðåé óôïõò ÷ñÞóôåò íá åßíáé áõôüìáôá voiced êáé íá äßíïõí
+ voice óôïí åáõôü ôïõò áí äåí åßíáé.
+
+ Ç åíôïëÞ VOP ADD ðñïóèÝôåé Ýíá øåõäþíõìï óôçí ëßóôá VOP.
+
+ Ç åíôïëÞ VOP DEL äéáãñÜöåé Ýíá øåõäþíõìï áðü ôçí ëßóôá VOP.
+ Áí äßíåôå ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá, áõôÝò ïé
+ èÝóåéò äéáãñÜöçêáí. (Äåò ôï ðáñÜäåéãìá ìå ôçí åíôïëÞ LIST.)
+
+ Ç åíôïëÞ VOP LIST åìöáíßæåé ôçí ëßóôá VOP. Áí äþóåôå ìéá óõãêåêñéìÝíç
+ ìÜóêá, èá åìöáíßóåé ôéò èÝóåéò ðïõ áíôéóôïé÷ïýí óôçí ìÜóêá áõôÞ.
+ Áí êÜíåôå list ìå ôéò èÝóåéò-íïýìåñá,ôüôå ìüíï ôéò èÝóåéò ðïõ äþóáôå èá
+ äåßôå. Äçë ôá áíôßóôïé÷á øåõäþíõìá ðïõ áíÞêïõí óôéò èÝóåéò áõôÝò.
+
+ ÐáñÜäåéãìá:
+
+ VOP #êáíÜëé LIST 2-5,7-9
+ Åìöáíßæåé áðü ôçí ëßóôá VOP ôéò èÝóåéò ìå ôá
+ íïýìåñá 2 Ýùò 5 êáé 7 Ýùò 9.
+
+ Ç åíôïëÞ VOP CLEAR äéáãñÜöåé üëåò ôéó èÝóåéò ôçò ëßóôáò VOP.
+
+ Ôéò åíôïëÝò VOP ADD, VOP DEL êáé VOP LIST ôéò ÷ñçóéìïðïéïýí
+ ìüíï áõôïé ðïõ åßíáé óôçí AOP Þ áíþôåñïé, åíþ ç åíôïëÞ VOP CLEAR
+ ÷ñçóéìïðïéåßôáé ìüíï áðü ôïí founder ôïõ êáíáëéïý.
+
+ ÁõôÞ ç åíôïëÞ ìðïñåß íá åßíáé áðåíåñãïðïéçìÝíç áðü ôï êáíÜëé óáò, êáé
+ óå áõôÞ ôçí ðåñßðôùóç èá ÷ñçóéìïðïéÞóåôå ôçí åíôïëÞ access list. Äåßôå
+ /msg %S HELP ACCESS ãéá ðëçñïöïñßåò ó÷åôéêÜ ìå ôçí åíôïëÞ access list,
+ êáé /msg %S HELP SET XOP ãéá íá îÝñåôå ðùò èá åðéëÝîåôå áíÜìåóá óôï
+ access list êáé xOP list óýóôçìá.
+
+CHAN_HELP_ACCESS
+ Óýíôáîç: ACCESS êáíÜëé ADD øåõäþíõìï âáèìüò
+ ACCESS êáíÜëé DEL {øåõäþíõìï | èÝóåéò-íïõ | list}
+ ACCESS êáíÜëé LIST [ìÜóêá | list]
+ ACCESS êáíÜëé CLEAR
+
+ ÁëëÜæåé ôçí access ëßóôá ôïõ êáíáëéïý. Ç ëßóôá access
+ êáèïñßæåé ðïéïé ÷ñÞóôåò èá Ý÷ïõí op óôï êáíÜëé Þ
+ access óôéò åíôïëÝò ìÝóù ôïõ %S ãéá ôï êáíÜëé. Äéáöïñåôéêüò âáèìüò
+ ôïõ ÷ñÞóôç áðü ôçí access ðïõ Ý÷åé,äéáöïñåôéêÜ äéêáéþìáôá èá Ý÷åé.
+ /msg %S HELP ACCESS LEVELS ãéá ðåñéóóüôåñåò êáé óõãêåêñéìÝíåò
+ ðëçñïöïñßåò. ÏðïéïäÞðïôå øåõäþíõìï ðïõ äåí åßíáé óôçí ëßóôá access Ý÷åé
+ ôõðéêÜ access 0, ãéáôß ôá levels áðü default äåí äßíïõí äéêáéþìáôá óôï êáíÜëé
+ üðïéïò Ý÷åé 0 íá êÜíåé êÜôé óôï êáíÜëé, ìå access 0 åßíáé óôï auto-deop.
+
+ Ç åíôïëÞ ACCESS ADD ðñïóèÝôåé Ýíá øåõäþíõìï óôçí ëßóôáìå ôï áíÜëïãï
+ âáèìü (level). Áí êÜðïéï øåõäþíõìï åßíáé Þóç óôçí ëßóôá êáé ôïõ äþåóåôå Ýíá
+ Üëëï âáèìü áðü áõôü ðïõ åß÷å ôüôå áëëÜæåé ï âáèìüò ôïõ(level).
+
+ Ç åíôïëÞ ACCESS DEL áöáéñåß Ýíá øåõäþíõìï áðü ôçí ëßóôá access.
+ Áí óáò äùèåß ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá,áõôÝò ïé èÝóåéò Ý÷ïõí äéáãñáöåß.
+ (Äåò ôï ðáñÜäåéãìá ôçò åíôïëÞò LIST.)
+
+ Ç åíôïëÞ ACCESS LIST åìöáíßæåé ôçí ëßóôá access. Áí äþóåôå ìéá
+ óõãêåêñéìÝíç ìÜóêá, èá óáò åìöáíßóåé ôéò èÝóåéò ðïõ áíôéóôïé÷åß áõôÞ ç ìÜóêá.
+ Áí êÜíåôå list ìå ôéò èÝóåéò-íïýìåñá,ôüôå ìüíï ôéò èÝóåéò ðïõ äþóáôå èá äåßôå.
+ Äçë ôá áíôßóôïé÷á øåõäþíõìá ðïõ áíÞêïõí óôéò èÝóåéò áõôÝò.
+
+ ÐáñÜäåéãìá:
+
+ ACCESS #êáíÜëé LIST 2-5,7-9
+ Åìöáíßæåé áðü ôçí ëßóôá access ôéò èÝóåéò ìå ôá
+ íïýìåñá 2 Ýùò 5 êáé 7 Ýùò 9.
+
+ Ç åíôïëÞ ACCESS CLEAR äéáãñÜöåé üëåò ôéó èÝóåéò ôçò ëßóôáò access.
+
+CHAN_HELP_ACCESS_LEVELS
+ User access levels
+
+ Áðü default, ïé åðüìåíåò access âáèìïß (levels) åßíáé ïé åîÞò:
+
+ Founder Full access óôïí %S ãéá åíôïëÝò êáíáëéïý; áõôüìáôï
+ opping üôáí ìðÝíåé óôï êáíÜëé. Óçìåßùóç
+ ìüíï Ýíá Üôïìï Ý÷åé ðñüóâáóç óáí founder
+ (äåí ìðïñåß íá äþóåé ìÝóù åíôïëÞò ACCESS
+ âáèìü ßäéï ìå ôïõ founder).
+  10 Ðñüóâáóç óôçí åíôïëÞ AKICK; áõôüìáôï opping.
+  5 Áõôüìáôï opping..
+  3 Áõôüìáôï voicing.
+  0 ÊáíÝíá éäéáßôåñï äéêáßùìá; ìðïñåß íá ðÜñåé op áðü Üëëïõò
+ ops (åêôüò êáé áí åßíáé åíåñãïðïéçìÝíá ôá secure-ops).
+  <0 Äåí ìðïñåß íá ðÜñåé op.
+
+ Áõôïß ïé âáèìïß (levels) ìðïñïýí íá áëëá÷ôïýí, Þ íá ðñïóèÝóåôå íÝá äéêÜ óáò,
+ ÷ñçóéìïðïéþíôáò ôçí åíôïëÞ LEVELS; ãñÜøôå /msg %S HELP LEVELS ãéá
+ ðëçñïöïñßåò.
+
+CHAN_HELP_AKICK
+ Óýíôáîç: AKICK êáíÜëé ADD ìÜóêá [ëüãïò]
+ AKICK êáíÜëé STICK ìÜóêá
+ AKICK êáíÜëé UNSTICK ìÜóêá
+ AKICK êáíÜëé DEL ìÜóêá
+ AKICK êáíÜëé LIST [ìÜóêá]
+ AKICK êáíÜëé VIEW [ìÜóêá]
+ AKICK êáíÜëé ENFORCE
+ AKICK êáíÜëé CLEAR
+
+ ÁëëÜæåé ôç ëßóôá áõôüìáôçò áðüññéøçò ãéá Ýíá êáíÜëé.
+ ÅÜí Ýíáò ÷ñÞóôçò ðïõ âñßóêåôáé óôç ëßóôá áõôüìáôçò áðüññéøçò,
+ ðñïóðáèÞóåé íá ìðåß óôï êáíÜëé, ï %S èá ôïõ áðáãïñÝøåé ôçí åßóïäï
+ (ban/kick).
+
+ Ç åíôïëÞ AKICK ADD ðñïóèÝôåé ôç ìÜóêá ðïõ
+ äßíåôáé óôç ëßóôá áõôüìáôçò áðüññéøçò. Áí äùèåß ìßá áéôéïëïãßá
+ ìå ôçí åíôïëÞ, áõôÞ ç áéôéïëïãßá èá ÷ñçóéìïðïéçèåß óôï kick ôïõ ÷ñÞóôç.
+ ÄéáöïñåôéêÜ ç ðñïêáèïñéóìÝíç áéôéïëïãßá åßíáé "You have been banned
+ from the channel" ("¸÷åé áðáãïñåõèåß ç åßóïäüò óáò óôï êáíÜëé").
+
+ Ç åíôïëÞ AKICK STICK êÜíåé ìüíéìá bans ôç ìÜóêá
+ ðïõ äßíåôáé. Áí êÜðïéïò ðñïóðáèÞóåé íá ôï áöáéñÝóåé ôï ban, ï %S
+ èá ôï îáíáâÜëåé áõôüìáôá. Äåí ìðïñåßôáé íá ôï ÷ñçóéìïðïéÞóåôå ãéá
+ êáôï÷õñùìÝíá øåõäþíõìá.
+
+ Ç åíôïëÞ AKICK UNSTICK áêõñþíåé ôçí åíôïëÞ AKICK STICK,
+ êáé Ýôóé èá ìðïñåßôå íá âãÜëåôå ôï ban áðü ôï êáíÜëé.
+
+ Ç åíôïëÞ AKICK DEL äéáãñÜöåé ôç ìÜóêá ðïõ
+ äßíåôáé, áðü ôç ëßóôá áõôüìáôçò áðüññéøçò. ÂÜæïíôáò ALL ãéá
+ ìÜóêá äéáãñÜöïíôáé üëá ìå ôç ìéá. Äå äéáãñÜöåé üìùò ôá bans ðïõ
+ Ý÷ïõí ôïðïèåôçèåß áðü ôçí áõôüìáôç áðüññéøç. ÁõôÜ ðñÝðåé íá
+ áöáéñåèïýí îå÷ùñéóôÜ.
+
+ Ç åíôïëÞ AKICK LIST åìöáíßæåé ôç ëßóôá áõôüìáôçò áðüññéøçò,
+ Þ åðéëåêôéêÜ ìüíï åêåßíåò ôéò åããñáöÝò ôçò ëßóôáò ðïõ
+ ôáéñéÜæïõí óôç ìÜóêá ðïõ äßíåôáé.
+
+ Ç åíôïëÞ AKICK VIEW åßíáé ðéï âåëôéùìÝíç Ýêäïóç áðü ôçí åíôïëÞ
+ AKICK LIST.
+
+ Ç åíôïëÞ AKICK ENFORCE êÜíåé ôïí %S íá åðáíáäñÜóç ôç
+ óõãêåêñéìÝíç AKICK ëßóôá âãÜæïíôáò Ýîù ôïõò ÷ñÞóôåò ðïõ ôáéñéÜæïõí ìå ôçí ìÜóêá
+ ðïõ åßíáé óôçí AKICK.
+
+ Ç åíôïëÞ AKICK CLEAR äéáãñÜöåé üëåò ôéò èÝóåéò ðïõ ðåñéÝ÷ïíôáé óôçí
+ ëßóôá akick.
+
+CHAN_HELP_LEVELS
+ Óýíôáîç: LEVELS êáíÜëé SET ôýðïò âáèìüò
+ LEVELS êáíÜëé {DIS | DISABLE} ôýðïò
+ LEVELS êáíÜëé LIST
+ LEVELS êáíÜëé RESET
+
+ Ç åíôïëÞ LEVELS åðéôñÝðåé ôï êáëü ÷åéñéóìü üóïí áöïñÜ
+ ôçí ñýèìéóç ôçò access levels ðïõ ÷ñçóéìïðïéåßôáé óôï êáíÜëé.
+ Ìå áõôÞ ôçí åíôïëÞ, ìðïñåßôå íá ÷åéñßæåóôå ôçí access level ðïõ
+ ðïõ åêôåëåß ï %S. (Ôéò åíôïëÝò SET FOUNDER êáé SET PASSWORD
+ ôéò ÷åéñßæåôáé ìüíï ï founder.)
+
+ Ç åíôïëÞ LEVELS SET åðéôñÝðåé ôçí áëëáãÞ ôùí access level (âáèìþí).
+ Ç åíôïëÞ LEVELS DISABLE (Þ DIS ãéá óõíôïìßá)
+ áðåíåñãïðïéåß áõôüìáôá ìåëëïíôéêÜ Þ äåí äßíåé äéêáéþìáôá óå üóïõò Ý÷ïõí access
+ åêôüò ôïõ founder êáíáëéïý áõôïý.
+ Ç åíôïëÞ áõôÞ LEVELS LIST äåß÷íåé ôá levels (âáèìïýò) ðïõ Ý÷åé ç êÜèå
+ åíôïëÞ.
+ Ç åíôïëÞ LEVELS RESET óâÞíåé ôá levels (âáèìïýò) êáé åðáíáöÝñåé ôá
+ default levels (âáèìïýò), äçë áõôÜ ôá levels ðïõ Ý÷åé Ýíá íÝï êáíÜëé (äåò
+ ôçí åíôïëÞ HELP ACCESS LEVELS).
+
+ Ãéá íá äåßò ôçí ëßóôá ìå ôéò åíôïëÝò ðïõ ìðïñåßò íá áëëÜîåéò ôá levels, äåò
+ ôçí åíôïëÞ HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ Ôá áêüëïõèá feature/function êáôáëáâáßíïíôáé. Óçìåßùóç,
+ ôá levels (âáèìïß) ãéá AUTODEOP êáé NOJOIN åßíáé ôá ìÝãéóôá levels,
+ åíþ üëá ôá Üëëá åßíáé ôá åëÜ÷éóôá levels.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Óýíôáîç: INFO êáíÜëé [ALL]
+
+ Åìöáíßæåé ðëçñïöïñßåò ó÷åôéêÜ ìå ôï üíïìá ôïõ êáôï÷õñùìÝíïõ êáíáëéïý,
+ ðåñéëáìâáíïìÝíïõ ôïí founder, ôçí þñá ôçò êáôï÷ýñùóçò, ðüôå ÷ñçóéìïðïéÞèçêå
+ ôåëåõôáßá öïñÜ, êáé ôá êëåéäùìÝíá mode, áí õðÜñ÷ïõí.
+ Áí ÷ñçóéìïðïéÞóåôå ôçí ðáñÜìåôñï ALL
+ èá åìöáíéóôåß ôï ìÞíõìá åéóáãùãÞò ôïõ êáíáëéïý êáé ï successor.
+
+ Áðü default, ç åðéëïãÞ ALL åßíáé ïñéóìÝíç ìüíï óå áõôïýò ðïõ Ý÷ïõí
+ founder access óôï óõãêåêñéìÝíï êáíÜëé.
+
+CHAN_HELP_LIST
+ Óýíôáîç: LIST pattern
+
+ Åìöáíßæåé üëá ôá êáôï÷õñùìÝíá êáíÜëéá óå ó÷Ýóç ìå áõôü ðïõ ôïõ äßíåéò íá øÜîåé.
+ (Ôá êáíÜëéá ðïõ Ý÷ïõí åðéëïãÞ PRIVATE äåí åìöáíßæïíôáé.)
+
+CHAN_HELP_OP
+ Óýíôáîç: OP [#êáíÜëé [øåõäþíõìï]]
+
+ Ç åíôïëÞ áõôÞ êÜíåé op ôï æçôïýìåíï øåõäþíõìï ôï ïðïßï åßíáé óôï êáíÜëé.
+ Áí äåí åðéëÝîåôå øåõäþíõìï èá äþóåé op óôïí åáõôü óáò.
+ Áí äåí äþóåôå ôï êáíÜëé êáé ôï øåõäþíõìï, 8á óáò äþóåé op
+ óå üëá ôá êáíÜëéá ðïõ åßóáóôå, ìå ôçí ðñïõðüèåóç ïôé Ý÷åôå
+ ôï äéêáßùìá óôá êáíÜëéá.(íá Ý÷åôå access)
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü áõôïýò ðïõ åßíáé AOPs Þ áðü áõôïýò ðïõ
+ Ý÷ïõí âáèìü (level) 5 access êáé üóïõò Ý÷ïõí ðáñáðÜíù level op/deop.
+
+CHAN_HELP_DEOP
+ Óýíôáîç: DEOP [#êáíÜëé [øåõäþíõìï]]
+
+ Ç åíôïëÞ áõôÞ êÜíåé deop ôï æçôïýìåíï øåõäþíõìï ôï ïðïßï åßíáé óôï êáíÜëé.
+ Áí äåí åðéëÝîåôå ôï øåõäþíõìï, èá êÜíåé deop óôïí åáõôü óáò.
+ Áí äåí äþóåôå ôï êáíÜëé êáé ôï øåõäþíõìï, 8á êÜíåé deop ôïí åáõôü óáò
+ óå üëá ôá êáíÜëéá ðïõ åßóáóôå, ìå ôçí ðñïõðüèåóç ïôé Ý÷åôå
+ ôï äéêáßùìá óôá êáíÜëéá.(íá Ý÷åôå access)
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü áõôïýò ðïõ åßíáé AOPs Þ áðü áõôïýò ðïõ
+ Ý÷ïõí âáèìü (level) 5 access êáé üóïõò Ý÷ïõí ðáñáðÜíù level op/deop.
+
+CHAN_HELP_VOICE
+ Óýíôáîç: VOICE [#êáíÜëé [øåõäþíõìï]]
+
+ Ç åíôïëÞ áõôÞ êÜíåé voice ôï æçôïýìåíï øåõäþíõìï ôï ïðïßï åßíáé óôï êáíÜëé.
+ Áí äåí åðéëÝîåôå øåõäþíõìï èá äþóåé voice óôïí åáõôü óáò.
+ Áí äåí äþóåôå ôï êáíÜëé êáé ôï øåõäþíõìï, 8á äþóåé voice óôïí åáõôü óáò
+ óå üëá ôá êáíÜëéá ðïõ åßóáóôå, ìå ôçí ðñïõðüèåóç ïôé Ý÷åôå
+ ôï äéêáßùìá óôá êáíÜëéá.(íá Ý÷åôå access)
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü AOPs Þ áðü áõôïýò ðïõ Ý÷ïõí level 5 access
+ êáé ðáñáðÜíù óôï êáíÜëé, Þ áðü ôïõò VOPs Þ áõôïýò ðïõ Ý÷ïõí level 3
+ êáé ðáñáðÜíù ãéá íá êÜíïõí voice ôïí åáõôü ôïõò.
+
+CHAN_HELP_DEVOICE
+ Óýíôáîç: DEVOICE [#êáíÜëé [øåõäþíõìï]]
+
+ Ç åíôïëÞ áõôÞ êÜíåé devoice ôï æçôïýìåíï øåõäþíõìï ôï ïðïßï åßíáé óôï êáíÜëé.
+ Áí äåí åðéëÝîåôå øåõäþíõìï èá êÜíåé devoice ôïí åáõôü óáò.
+ Áí äåí äþóåôå ôï êáíÜëé êáé ôï øåõäþíõìï, 8á óáò êÜíåé devoice
+ óå üëá ôá êáíÜëéá ðïõ åßóáóôå, ìå ôçí ðñïõðüèåóç ïôé Ý÷åôå
+ ôï äéêáßùìá óôá êáíÜëéá (íá Ý÷åôå access).
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü AOPs Þ áðü áõôïýò ðïõ Ý÷ïõí level 5 access
+ êáé ðáñáðÜíù óôï êáíÜëé, Þ áðü ôïõò VOPs Þ áõôïýò ðïõ Ý÷ïõí level 3
+ êáé ðáñáðÜíù ãéá íá êÜíïõí devoice ôïí åáõôü ôïõò.
+
+CHAN_HELP_HALFOP
+ Óýíôáîç: HALFOP [#êáíÜëé [øåõäþíõìï]]
+
+ Ç åíôïëÞ áõôÞ êÜíåé halfop ôï æçôïýìåíï øåõäþíõìï ôï ïðïßï åßíáé óôï êáíÜëé.
+ Áí äåí åðéëÝîåôå øåõäþíõìï èá êÜíåé halfop ôïí åáõôü óáò.
+ Áí äåí äþóåôå ôï êáíÜëé êáé ôï øåõäþíõìï, 8á óáò äþóåé halfop
+ óå üëá ôá êáíÜëéá ðïõ åßóáóôå, ìå ôçí ðñïõðüèåóç ïôé Ý÷åôå
+ ôï äéêáßùìá óôá êáíÜëéá (íá Ý÷åôå access).
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü AOPs êáé áðü áõôïýò ðïõ Ý÷ïõí level 5 access
+ êáé ðáñáðÜíù access óôï êáíÜëé, Þ áðü ôïõò HOPs Þ áõôïýò ðïõ Ý÷ïõí level 4
+ êáé ðáñáðÜíù ãéá íá êÜíïõí halfop ôïí åáõôü ôïõò.
+
+CHAN_HELP_DEHALFOP
+ Óýíôáîç: DEHALFOP [#êáíÜëé [øåõäþíõìï]]
+
+ Ç åíôïëÞ áõôÞ êÜíåé dehalfop ôï æçôïýìåíï øåõäþíõìï ôï ïðïßï åßíáé óôï êáíÜëé.
+ Áí äåí åðéëÝîåôå øåõäþíõìï èá êÜíåé dehalfop ôïí åáõôü óáò.
+ Áí äåí äþóåôå ôï êáíÜëé êáé ôï øåõäþíõìï, 8á óáò êÜíåé dehalfop
+ óå üëá ôá êáíÜëéá ðïõ åßóáóôå, ìå ôçí ðñïõðüèåóç ïôé Ý÷åôå
+ ôï äéêáßùìá óôá êáíÜëéá (íá Ý÷åôå access).
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü AOPs êáé áðü áõôïýò ðïõ Ý÷ïõí level 5 access
+ êáé ðáñáðÜíù access óôï êáíÜëé, Þ áðü ôïõò HOPs Þ áõôïýò ðïõ Ý÷ïõí level 4
+ êáé ðáñáðÜíù ãéá íá êÜíïõí dehalfop ôïí åáõôü ôïõò.
+
+CHAN_HELP_PROTECT
+ Óýíôáîç: PROTECT [#êáíÜëé [øåõäþíõìï]]
+
+ Ç åíôïëÞ áõôÞ ðñïóôáôåýåé ôï æçôïýìåíï øåõäþíõìï ôï ïðïßï åßíáé óôï êáíÜëé.
+ Áí äåí åðéëÝîåôå øåõäþíõìï èá ðñïóôáôåýóåé ôïí åáõôü óáò.
+ Áí äåí äþóåôå ôï êáíÜëé êáé ôï øåõäþíõìï, 8á ðñïóôáôåýóåé åóÜò
+ óå üëá ôá êáíÜëéá ðïõ åßóáóôå, ìå ôçí ðñïõðüèåóç ïôé Ý÷åôå
+ ôï äéêáßùìá óôá êáíÜëéá (íá Ý÷åôå access).
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü ôïí founder, Þ ôïõò SOPs Þ áõôïýò ðïõ Ý÷ïõí
+ level (âáèìü) 10 Þ êáé ðáñáðÜíù ãéá íá ðñïóôáôåýïõí ôïí åáõôü ôïõò.
+
+CHAN_HELP_DEPROTECT
+ Óýíôáîç: DEPROTECT [#êáíÜëé [øåõäþíõìï]]
+
+ Ç åíôïëÞ áõôÞ âãÜæåé ôçí ðñïóôáóßá ôï æçôïýìåíï øåõäþíõìï ôï ïðïßï åßíáé óôï
+ êáíÜëé. Áí äåí åðéëÝîåôå øåõäþíõìï èá âãÜëåé ôçí ðñïóôáóßá áðü ôïí åáõôü óáò.
+ Áí äåí äþóåôå ôï êáíÜëé êáé ôï øåõäþíõìï, 8á âãÜëåé ôçí ðñïóôáóßá áðü åóÜ
+ óå üëá ôá êáíÜëéá ðïõ åßóáóôå, ìå ôçí ðñïõðüèåóç ïôé Ý÷åôå
+ ôï äéêáßùìá óôá êáíÜëéá (íá Ý÷åôå access).
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü ôïí founder, Þ ôïõò SOPs Þ áõôïýò ðïõ Ý÷ïõí
+ level (âáèìü) 10 Þ êáé ðáñáðÜíù ãéá íá âãÜëïõí ôçí ðñïóôáóßá áðü ôïí åáõôü ôïõò.
+
+CHAN_HELP_OWNER
+ Óýíôáîç: OWNER [#êáíÜëé]
+
+ Óïõ äßíåé owner status óôï êáíÜëé (êÜôé óáí founder). Áí äåí äßíåôå
+ êáíÜëé, èá óïõ äþóåé owner status óå üëá ôá êáíÜëéá ðïõ åßóáé,
+ ìå ôçí ðñïõðüèåóç ïôé Ý÷åéò äéêáéþìáôá.
+
+ Ìüíï ãéá áõôïýò ðïõ Ý÷ïõí founder access óôï êáíÜëé.
+
+CHAN_HELP_DEOWNER
+ Óýíôáîç: DEOWNER [#êáíÜëé]
+
+ ÊÜíåé ôï áêñéâþò áíôßèåôð ôçò åíôïëÞò owner.
+
+ Ìüíï ãéá áõôïýò ðïõ Ý÷ïõí founder access óôï êáíÜëé.
+
+
+CHAN_HELP_INVITE
+ Óýíôáîç: INVITE êáíÜëé
+
+ ÆçôÜåé áðü ôïí %S íá êáëÝóåé ôï áíÜëïãï øåõäþíõìï íá Ýñèåé óôï êáíÜëé.
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü ôïõò AOPs Þ áðü áõôïýò ðïõ Ý÷ïõí level 5 êáé
+ ðáñáðÜíù óôï êáíÜëé.
+
+CHAN_HELP_UNBAN
+ Óýíôáîç: UNBAN êáíÜëé
+
+ ÆçôÜåé áðü ôïí %S íá áöáéñÝóåé üëá ôá bans áíÜëïãá ãéá ðïéï êáíÜëé ôïõ æçôÜò.
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü ôïõò AOPs Þ áõôïýò ðïõ Ý÷ïõí level 5 êáé
+ ðáñáðÜíù óôï êáíÜëé.
+
+CHAN_HELP_KICK
+ Óýíôáîç: KICK [#êáíÜëé [øåõäþíõìï [ëüãïò]]]
+
+ ÊÜíåé kick ôï øåõäþíõìï ðïõ ôïõ äßíåéò óôï êáíÜëé. Áí äåí äþóåéò øåõäþíõìï,
+ èá êÜíåé kick åóÝíá. Áí äåí äþóåéò êáíÜëé êáé øåõäþíõìï,
+ èá êÜíåé kick åóÝíá óå üëá ôá êáíÜëéá ðïõ åßóáé åöüóïí Ý÷åéò ôï äéêáßùìá
+ (access).
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü ôïõò AOPs Þ áõôïýò ðïõ Ý÷ïõí level 5 access
+ êáé ðáñáðÜíù óôï êáíÜëé.
+
+CHAN_HELP_BAN
+ Óýíôáîç: BAN [#êáíÜëé [øåõäþíõìï [ëüãïò]]]
+
+ ÊÜíåé ban ôï øåõäþíõìï ðïõ ôïõ äßíåéò óôï êáíÜëé. Áí äåí äþóåéò øåõäþíõìï,
+ èá êÜíåé ban åóÝíá. Áí äåí äþóåéò êáíÜëé êáé øåõäþíõìï,
+ èá êÜíåé ban åóÝíá óå üëá ôá êáíÜëéá ðïõ åßóáé åöüóïí Ý÷åéò ôï äéêáßùìá
+ (access).
+
+ Áðü default, ÷ñçóéìïðïéåßôáé áðü ôïõò AOPs Þ áõôïýò ðïõ Ý÷ïõí level 5 access
+ êáé ðáñáðÜíù óôï êáíÜëé.
+
+CHAN_HELP_TOPIC
+ Óýíôáîç: TOPIC êáíÜëé [topic]
+
+ ÆçôÜò áðü ôïí %S íá âÜëåé ôï topic ðïõ ôïõ Ý÷åéò ðåé.
+ Áí ôï topic äåí äßíåôáé, èá âÜëåé Üäåéï topic
+ óôï êáíÜëé. ÁõôÞ ç åíôïëÞ åßíáé ÷ñÞóéìç áí Ý÷åéò êÜíåé óôï êáíÜëé
+ SET TOPICLOCK. Äåò /msg %S HELP SET TOPICLOCK
+ ãéá ðåñéóóüôåñåò ðëçñïöïñßåò.
+
+ Áðü default, ÷ñçóéìïðïåßôáé ìüíï áðü áõôïýò ðïõ Ý÷ïõí founder access óôï
+ êáíÜëé.
+
+CHAN_HELP_CLEAR
+ Óýíôáîç: CLEAR êáíÜëé ôé áêñéâþò
+
+ ÆçôÜò áðü ôïí %S íá êáèáñßóåé ôéò åðéëïãÝò ðïõ Ý÷åé ôï êáíÜëé. ôé áêñéâþò
+ ìðïñåß íá åßíáé ìéá áðü ôéò áêüëïõèåò åðéëïãÝò:
+
+ MODES Êáèáñßæåé üëá ôá modes áðü ôï êáíÜëé (äçë clears
+ modes i,k,l,m,n,p,s,t).
+ BANS Êáèáñßæåé üëá ôá bans áðü ôï êáíÜëé.
+ EXCEPTS Êáèáñßæåé üëá ôá excepts áðü ôï êáíÜëé.
+ OPS Áöáéñåß ôï channel-operator status (mode +o) áðü
+ üëïõò ôïõò channel operators.
+ VOICES Áöáéñåß ôá "voice" status (mode +v) áðü ôïí êáèÝíá.
+ USERS ÐåôÜåé (kicks) üëïõò ôïõò ÷ñÞóôåò áðü ôï êáíÜëé.
+
+ Áðü default, ÷ñçóçìïðïéåßôáé, ìüíï áðü áõôïýò ðïõ Ý÷ïõí founder access óôï
+ êáíÜëé.
+
+CHAN_HELP_GETKEY
+ Óýíôáîç: GETKEY êáíÜëé
+
+ Óáò äåß÷íåé ôï êëåéäß ôïõ óõãêåêñéìÝíïõ êáíáëéïý. ÁõôÞ ç åíôïëÞ
+ ÷ñçóéìïðïéåßôáé êõñßùò áðü ôá bots êáé/Þ scripts.Ìðïñåßôáé íá
+ âÜëåôå êáé åóåßò ìå ôïí åîÞò ôñüðï:
+
+ KEY <êáíÜëé> <êëåéäß>
+
+ êëåéäß åßíáé "ÊÁÍÅÍÁ ÊËÅÉÄÉ" áí äåí õðÜñ÷åé êáíÝíá êëåéäß.
+
+CHAN_HELP_SENDPASS
+ Óýíôáîç: SENDPASS êáíÜëé
+
+ ÓôÝëíåé ôïí êùäéêü ôïõ áíÜëïãïõ êáíáëéïý ìÝóù e-mail address
+ óôïí founder ôïõ. ÁõôÞ ç åíôïëÞ åßíáé ÷ñÞóéìç
+ ãéá üóïõò Ý÷ïõí ÷Üóåé ôïí êùäéêü.
+
+ ×ñçóéìïðïéåßôáé ìüíï áðü IRC operators óå óõãêåêñéìÝíá äßêôõá.
+
+ ÁõôÞ ç åíôïëÞ åßíáé áäýíáôç üôáí åßíáé åíåñãïðïéçìÝíç ç êùäéêïðïßçóç.
+
+CHAN_SERVADMIN_HELP
+
+ Ïé åðüìåíåò åíôïëÝò åßíáé ìüíï ãéá Services admins:
+
+ GETPASS ÂëÝðåéò ôïí êùäéêü ôïõ óõãêåêñéìÝíïõ êáíáëéïý
+ (ìüíï áí ç êùäéêïðïßçóç åßíáé áðåíåñãïðïéçìÝíç)
+ FORBID ÊáôáóôÝëåé ôï êáíÜëé,äåí ìðïñåß íá ôï ÷ñçóéìïðïéÞóç êáíåßò
+ STATUS ÅðéóôñÝöåé ôçí óõãêåêñéìÝíç access level ôïõ ÷ñÞóôç óôï
+ êáíÜëé
+ CLIST Åìöáíßæåé ôá êáíÜëéá ðïõ åßíáé founder Ýíá øåõäþíõìï
+
+ Ïé Services admins ìðïñïýí íá äéáãñÜøïõí ïðïéïäÞðïôå êáíÜëé, ÷ùñßò íá êÜíïõí
+ åíôïëÞ áíáãíþñéóçò ìÝóù êùäéêïý, ìðïñïýí íá äïýí ôçí access, AKICK,
+ êáé ôá level ïðïéïõäÞðïôå êáíáëéïý.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Óýíôáîç: LOGOUT êáíÜëé [øåõäþíõìï]
+
+ Ìå áõôÞ ôçí åíôïëÞ, Ýíáò founder Þ êÜðïéïò ðïõ Ý÷åé âáèìü founder êÜíåé ôï
+ áíôßèåôï áðü ôçí åíôïëÞ áíáãíþñéóçò (no-identify).
+
+ Ìðïñåß Ýíáò founder åíüò êáíáëéïý, íá êÜíåé log out ïðïéïäÞðïôå,
+ áêüìá êáé ôïí åáõôü ôïõ.
+
+ Áí åßóáé Services admin, ìðïñåßò íá êÜíåéò log out
+ ïðïéïäÞðïå áðü ôï êáíÜëé ÷ùñßò íá åßóáé ï founder Þ íá ãßíåéò ï founder
+ ôïõ êáíáëéïý. Åðßóçò, ìðïñåßò íá ÷ñçóéìïðïéÞóåéò áõôÞ ôçí ðáñÜìåôñï ãéá
+ øåõäþíõìï; ìå áõôü èá êÜíåéò log out üëïõò ôïõò áíáãíùñéóìÝíïõò (identified)
+ ÷ñÞóôåò ôïõ êáíáëéïý.
+
+CHAN_SERVADMIN_HELP_DROP
+ Óýíôáîç: DROP êáíÜëé
+
+ Îå-êáôï÷õñþíåé ôï æçôïýìåíï êáíÜëé. Ìüíï ïé Services admins
+ ìðïñïõí íá ôï êÜíïõí áõôü óå Ýíá êáíÜëé, ÷ùñßò íá êÜíïõí åíôïëÞ áíáãíþñéóçò
+ ãéá ôï êáíÜëé.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Ïé Services admins ìðïñïýí íá åðéëÝîïõí ôçí NOEXPIRE åíôïëÞ, óå
+ áõôÜ ðïõ äåí èÝëïõí ðïôÝ íá ëÞîïõí.
+ Åðßóçò, ïé Services admins ìðïñïýí íá áëëÜîïõí ôéò åðéëïãÝò ãéá êÜèå êáíÜëé
+ ÷ùñßò íá êÜíïõí åíôïëÞ áíáãíþñéóçò óå êÜèå êáíÜëé.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Óýíôáîç: SET êáíÜëé NOEXPIRE {ON | OFF}
+
+ Ìå áõôÞ ôçí åíôïëÞ ìðïñåßò íá êÜíåéò Ýíá êáíÜëé íá ìçí ëÞãåé ðïôÝ, ÷ùñéò íá
+ åßóáé õðï÷ñåùìÝíïò íá êÜíåéò åíôïëÞ áíáãíþñéóçò óôï ÷ñïíéêü
+ ðåñéèþñéï ðïõ óïõ äßíåôáé.
+
+ Ìüíï ïé Services admins ìðïñïýí íá ôï êÜíïõí.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Ïé Services admins ìðïñïýí íá ÷ñçóéìïðïéÞóïõí ôçí ðáñÜìåôñï ALL ãéá êÜèå
+ êáíÜëé.
+
+CHAN_SERVADMIN_HELP_LIST
+ Óýíôáîç: LIST pattern [FORBIDDEN] [NOEXPIRE]
+
+ Åìöáíßæåé üëá ôá êáôï÷õñùìÝíá êáíÜëéá óå ó÷Ýóç ìå ôï æçôïýìåíï êáíÜëé.
+ ÊáíÜëéá ðïõ åßíáé PRIVATE èá åìöáíßæïíôáé ìüíï óôïõò Services admins.
+ ÊáíÜëéá ðïõ åßíáé NOEXPIRE èá Ý÷ïõí Ýíá ! äßðëá áðü ôï üíïìá ôïõ
+ êáíáëéïý, ìüíï ãéá ôïõò Services admins.
+
+ Áí ãñÜøåôå ãéá FORBIDDEN Þ NOEXPIRE, èá äåßôå ôá êáíÜëéá áõôÜ ôá
+ ïðïßá åßíáé FORBIDden Þ åßíáé NOEXPIRE.
+ Áí ãñÜøåôå êáé ôá äõï ìáæß èá åìöáíéóôïýí ôá êáíÜëéá ðïõ Ý÷ïõí êáé ôá
+ äýï,äçë áõôá ðïõ åßíáé FORBIDden êáé Üëëá ðïõ åßíáé NOEXPIRE.
+ ÁõôÝò ïé åðéëïãÝò åßíáé ãéá ôïõò Services admins.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Óýíôáîç: GETPASS êáíÜëé
+
+ Äßíåé ôïí êùäéêü ôïõ êáíáëéïý. Óçìåßùóç üðïôå
+ ÷ñçóéìïðïéåßò áõôÞ ôçí åíôïëÞ, èá åìöáíéóôåß ôï ìÞíõìá ôïõ
+ ÷ñÞóôç ðïõ åêôÝëåóå áõôÞ ôçí åíôïëÞ êáé ôï êáíÜëé ãéá ôï ïðïßï
+ ÷ñçóéìïðïéÞèçêå êáé èá óôáëåß ìå WALLOPS/GLOBOPS.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Óýíôáîç: FORBID êáíÜëé [ëüãïò]
+
+ Äåí åðéôñÝðåé óå ïðïéïäÞðïôå íá êÜíåé êáôï÷ýñùóç Þ ÷ñÞóç ôïõ óõãêåêñéìÝíïõ
+ êáíáëéïý. Ìðïñåß íá áêõñùèåß áõôü ìå óâÞóéìï ôïõ êáíáëéïý (drop).
+
+ Ï ëüãïò áðáéôåßôáé óå ïñéóìÝíá äßêôõá.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND channel [reason]
+
+ Disallows anyone from registering or using the given
+ channel. May be cancelled by using the UNSUSPEND
+ command to preserve all previous channel data/settings.
+
+ Reason may be required on certain networks.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Releases a suspended channel. All data and settings
+ are preserved from before the suspension.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Óýíôáîç: STATUS êáíÜëé øåõäþíõìï
+
+ ÅðéóôñÝöåé ôçí óõãêåêñéìÝíç access level ôïõ áíÜëïãïõ øåõäþíõìïõ
+ óôï áíÜëïãï êáíÜëé. Ç áðÜíôçóç èá åßíáé ôçò ìïñöÞò:
+
+ STATUS êáíÜëé øåõäþíõìï access-level
+
+ Áí âñåßôå ëÜèïò, èá äåßôå ôï åîÞò ìÞíõìá:
+
+ STATUS ERROR ëÜèïò-ìÞíõìá
+
+ Ìüíï ãéá ôïõò Services admins.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ Ï %S åßíáé ìéá õðçñåóßá ðïõ åðéôñÝðåé óôïõò ÷ñÞóôåò
+ ôïõ IRC íá óôÝëíïõí ìéêñÜ ãñáðôÜ ìçíýìáôá óå Üëëïõò ÷ñÞóôåò
+ ôïõ äéêôýïõ (åßôå âñßóêïíôáé óõíäåäåìÝíïé åêåßíç ôç óôéãìÞ,
+ åßôå ü÷é) Þ óå êáíÜëéá(*).
+ Ôá øåõäþíõìá ôïõ áðïóôïëÝá êáé ôïõ ðáñáëÞðôç ðñÝðåé íá åßíáé
+ êáôï÷õñùìÝíá ãéá íá ÷ñçóéìïðïéçèåß ç õðçñåóßá.
+
+ Ïé åíôïëÝò ôïõ %S åßíáé:
+
+ SEND ÓôÝëíåé Ýíá ìÞíõìá óå Ýíá øåõäþíõìï Þ Ýíá êáíÜëé
+ CANCEL Áêõñþíåé ôï ôåëåõôáßï ìÞíõìá ðïõ óôÝëíåôå
+ LIST Åìöáíßæåé ëßóôá ìå ôá ìçíýìáôá óáò
+ READ ÄéáâÜæåé Ýíá Þ ðïëëÜ ìçíýìáôá
+ DEL ÄéáãñÜöåé Ýíá Þ ðïëëÜ ìçíýìáôá
+ SET ÁëëÜæåé ôéò åðéëïãÝò ôùí ìçíõìÜôùí
+
+MEMO_HELP_ADMIN
+ SENDALL Send a memo to all registered users
+
+MEMO_HELP_OPER
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_FOOTER
+
+ ÃñÜøôå /msg %S HELP åíôïëÞ ãéá âïÞèåéá óå
+ ïðïéáäÞðïôå áðü ôéò ðáñáðÜíù åíôïëÝò.
+
+ (*) Åî'ïñéóìïý, êÜèå ÷ñÞóôçò ìå åëÜ÷éóôï åðßðåäï ðñüóâáóçò
+ 10 óå Ýíá êáíÜëé, ìðïñåß íá äéáâÜóåé ôá ìçíýìáôá ôïõ
+ êáíáëéïý. Áõôü ìðïñåß íá áëëÜîåé ìå ôçí åíôïëÞ
+ LEVELS ôïõ %s.
+
+MEMO_HELP_SEND
+ Óýíôáîç: SEND {øåõäþíõìï | êáíÜëé} êåßìåíï ìçíýìáôïò
+
+ ÓôÝëíåé óôï øåõäþíõìï Þ óôï êáíÜëé ðïõ äßíåôáé, Ýíá ìÞíõìá ðïõ
+ ðåñéÝ÷åé ôï êåßìåíï-ìçíýìáôïò. ¼ôáí ôï ìÞíõìá óôÝëíåôáé óå Ýíá øåõäþíõìï,
+ memo-text. When sending to a nickname, the recipient will
+ ï ðáñáëåßðôçò èá ëÜâåé ìéá åéäïðïßçóç ïôé Ý÷åé Ýíá íÝï ìÞíõìá.
+ Ôï øåõäþíõìï Þ ôï êáíÜëé ðïõ äßíåôáé, ðñÝðåé íá åßíáé êáôï÷õñùìÝíï.
+
+MEMO_HELP_CANCEL
+ Óýíôáîç: CANCEL {øåõäþíõìï | êáíÜëé}
+
+ Áêõñþíåé ôï ôåëåõôáßï ìÞíõìá ðïõ óôåßëáôå óôïí ðáñáëåßðôç Þ ôï êáíÜëé,
+ ìå ôçí ðñïõðüèåóç ïôé äåí Ý÷åé äéáâáóôåß,ãéáôß ç åíôïëÞ ôüôå èá åßíáé óáí íá
+ ìçí Ýãéíå.
+
+MEMO_HELP_LIST
+ Óýíôáîç: LIST [êáíÜëé] [list | NEW]
+
+ ÐáñïõóéÜæåé ôçí ëßóôá ôùí ìçíõìÜôùí. Ìå ôçí NEW, äåß÷íåé
+ ìüíï ôá íÝá ìçíýìáôá (ôá ìç-äéáâáóìÝíá). Ôá ìç äéáâáóìÝíá ìçíýìáôá
+ óçìåéþíïíôáé ìå Ýíá "*" óôá áñéóôåñÜ ðïõ áíáãñÜöåôáé ï áñéèìüò ôïõ
+ ìçíýìáôïò. Ìðïñåßò íá äåéò ìéá ëßóôá ìå íïýìåñá,
+ óáí ôï ðáñáêÜôù ðáñÜäåéãìá:
+
+ LIST 2-5,7-9
+ Ëßóôá ìçíõìÜôùí íïýìåñï 2 ðåñíÜ 5 êáé 7 ðåñíÜ 9.
+
+MEMO_HELP_READ
+ Óýíôáîç: READ [êáíÜëé] {íïõ | list | LAST | NEW}
+
+ Ìå ôçí åíôïëÞ áõôÞ äéáâÜæåôáé ôá ìçíýìáôá ðïõ óáò Ýñ÷ïíôáé. Áí äþóåôå LAST
+ èá äéáâÜóåôå ôï ôåëåõôáßï ìÞíõìá ðïõ äå÷èÞêáôå. Áí ãñÜøåôå
+ NEW èá äéáâÜóåôå üëá ôá íÝá ìçíýìáôá ðïõ óáò Þñèáí. Áëëéþò,
+ èá äåßôå ôá íïýìåñá ôùí ìçíõìÜôùí. Ìðïñåßôá íá äåßôå ôçí ëßóôá ìå ôá
+ íïýìåñá, ãéá ðáñÜäåéãìá:
+
+ ÄéÜâáóå 2-5,7-9
+ Åìöáíßæåé ôá ìçíýìáôá ìå ôá íïýìåñá 2 Ýùò êáé 5 êáé 7 Ýùò êáé 9.
+
+MEMO_HELP_DEL
+ Óýíôáîç: DEL [êáíÜëé] {íïõ | list | LAST | ALL}
+
+ ÓâÞíåé ôï ìÞíõìá Þ ôá ìçíýìáôá. ÓâÞíïíôáé ìÝóù ôçò ëßóôáò
+ áíÜëïãá ìå ôá íïýìåñá.Ãéá ðáñÜäåéãìá:
+
+ If LAST is given, the last memo will be deleted.
+ Áí åðéëÝîåôå ALL, èá óâÞóåôå üëá ôá ìçíýìáôÜ óáò.
+
+ ÐáñÜäåéãìá:
+
+ DEL 1
+ ÄéáãñÜöåôáé ôï ðñþôï ìÞíõìá.(íïýìåñï 1).
+
+ DEL 2-5,7-9
+ ÄéáãñÜöïíôáé ôá ìçíýìáôá ìå íïýìåñá 2 Ýùò 5 êáé 7 Ýùò 9.
+
+MEMO_HELP_SET
+ Óýíôáîç: SET åðéëïãÞ ðáñÜìåôñïé
+
+ ÁëëÜæåé äéÜöïñåò åðéëïãÝò ãéá ôá ìçíýìáôá.
+ Ç åðéëïãÞ ìðïñåß íá åßíáé ìéá áðü:
+
+ NOTIFY ÁëëÜæåé ôï ðüôå èá åíçìåñþíåóôå ãéá ôá
+ íÝá óáò ìçíýìáôá (ìüíï ãéá øåõäþíõìá)
+ LIMIT ÁëëÜæåé ôï ìÝãéóôï áñéèìü ìçíõìÜôùí ðïõ
+ ìðïñåßôå íá äå÷ôåßôå
+
+ ÃñÜøôå /msg %S HELP SET åðéëïãÞ ãéá ðåñéóóüôåñåò ðëçñïöïñßåò
+ óå ìéá óõãêåêñéìÝíç åðéëïãÞ.
+
+MEMO_HELP_SET_NOTIFY
+ Óýíôáîç: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ ÁëëáãÝò ãéá ôï ðùò èÝëåôå íá åíçìåñþíåóôå ãéá íÝá ìçíýìáôá:
+
+ ON Èá åíçìåñþíåóôå ãéá ôá ìçíýìáôá óáò üôáí èá êÜíåôå log on,
+ üôáí èá åðáíÝñ÷åóôå áðü /AWAY, êáé üôáí èá óáò óôÝëíïõí
+ ìçíýìáôá.
+ LOGON Èá åíçìåñþíåóôå ãéá ôá ìçíýìáôá óáò ìüíï üôáí èá êÜíåôå log
+ on Þ üôáí èá åðáíÝñ÷åóôå áðü /AWAY.
+ NEW Èá åíçìåñþíåóôå ãéá ôá ìçíýìáôá óáò ìüíï üôáí èá óáò
+ ôá óôÝëíïõí.
+ OFF Äåí èá åíçìåñþíåóôå ðïôÝ ãéá íÝá ìçíýìáôá Þ ðáëéÜ.
+
+ Ç åðéëïãÞ ON ðéï ïõóéþäçò,ç LOGON êáé ç NEW óõíäéáóôéêÞ.
+
+MEMO_HELP_SET_LIMIT
+ Óýíôáîç: SET LIMIT [êáíÜëé] üñéï
+
+ Ïñßæåé ôïí ìÝãéóôï áñéèìü ìçíõìÜôùí ðïõ ìðïñåßôå íá Ý÷åôå
+ åóåßò Þ ôï êáíÜëé ðïõ äßíåôáé. Áí ïñéóôåß óôï 0, êáíåßò
+ äå èá ìðïñåß íá óáò óôåßëåé ìçíýìáôá. ÐÜíôùò äå ìðïñåßôå
+ íá ïñßóåôå ôïí áñéèìü ðÜíù áðü %d.
+
+MEMO_HELP_INFO
+ Óýíôáîç: INFO [êáíÜëé]
+
+ Åìöáíßæåé ðëçñïöïñßåò óôá íïýìåñá ôùí ìçíõìÜôùí ðïõ Ý÷åôå, ðüóá
+ áðü áõôÜ äåí Ý÷ïõí äéáâáóôåß, êáé ðüóá ìçíýìáôá ìðïñåßôå íá ëÜâåôå.
+ Ìå ôçí ðáñÜìåôñï, åìöáíßæïíôáé ïé ßäéåò ðëçñïöïñßåò êáé ãéá Ýíá êáíÜëé.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Óýíôáîç: SET LIMIT [÷ñÞóôçò | êáíÜëé] {üñéï | NONE} [HARD]
+
+ Ñõèìßæåéò ôï ìÝãéóôï íïýìåñï ìçíõìÜôùí ðïõ èåò íá ëÜâåéò åßôå ãéá
+ øåõäþíõìï Þ ãéá êáíÜëé. Áí âÜëåôå üñéï ôï 0 áðáëëÜóåóôå áðü
+ ôçí õðçñåóßá áõôÞ êáé äåí ëáìâÜíåôáé êáíÝíá ìÞíõìá. Áí åðéëÝîåôå NONE
+ åðéôñÝðåé óôï ÷ñÞóôç íá ëÜâåé üóá èÝëåé áõôüò. Áí äåí äþóåôå
+ øåõäþíìï Þ êáíÜëé, ñõèìßæåôå ôï äéêü óáò üñéï.
+
+ ÅðéëÝãïíôáò HARD åìðïäßæåôáé ôï ÷ñÞóôç íá áëëÜîåé ôï üñéï. Áí äåí
+ åðéëÝîåôå HARD èá Ý÷åé ôï áíôßèåôï áðïôÝëåóìá, åðéôñÝðïíôáò óôï
+ ÷ñÞóôç íá áëëÜîåé ôï üñéï
+ (áêüìá êáé áí ç åðéëïãÞ ç ðñïçãïýìåíç Þôáí HARD).
+
+ ÁõôÞ ç ÷ñÞóç ôçò åíôïëÞò SET LIMIT åßíáé ìüíï ãéá
+ ôïõò Services admins. Ïé Üëëïé ÷ñÞóôåò ìðïñïýí íá áëëÜîïõí ôï üñéï
+ ìüíï ãéá ôïí åáõôü ôïõò Þ ãéá ôá êáíÜëéá ðïõ Ý÷ïõí êÜðïéá äéêáéþìáôá.
+ Äåí ìðïñïýí íá îåðåñÜóïõí ôï üñéï ôùí %d ìçíõìÜôùí, êáé äåí ìðïñïýí íá
+ åðéëÝîïõí hard limit.
+
+MEMO_SERVADMIN_HELP_INFO
+ Óýíôáîç: INFO [øåõäþíõìï | êáíÜëé]
+
+ ×ùñßò ôçí ðáñÜìåôñï, åìöáíßæåé ðëçñïöïñßåò ãéá ôá íïõìåñá ôùí
+ ìçíõìÜôùí ðïõ Ý÷åôå, ðüóá áðü áõôÜ äåí Ý÷ïõí äéáâáóôåß, êáé ðüóá
+ ôåëéêÜ ìçíýìáôá ìðïñåßôå íá ëÜâåôå.
+
+ Ìå ôçí ðáñÜìåôñï êáíÜëé,åìöáíßæåé ôéò ßäéåò ðëçñïöïñßåò ãéá ôï
+ áíÜëïãï êáíÜëé.
+
+ Ìå ôçí ðáñÜìåôñï øåõäþíõìï, åìöáíßæåé ôéò ßäéåò ðëçñïöïñßåò ãéá ôï
+ áíÜëïãï øåõäþíõìï. ÁõôÞ ç åíôïëÞ åßíáé ìüíï ãéá ôïõò Services
+ admins.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Syntax: STAFF memo-text
+
+ Sends all services staff a memo containing memo-text.
+ Note: If you have opers on both the oper list and the
+ admin list they will recive the memo twice. The same
+ applies for oper's on the Root list as well as other
+ lists.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL memo-text
+
+ Sends all registered users a memo containing memo-text.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ Ïé åíôïëÝò ôïõ %S åßíáé::
+ GLOBAL ÓôÝëíåé ìÞíõìá óå üëïõò ôïõò ÷ñÞóôåò
+ STATS Äåß÷íåé óôáôéóôéêÜ ó÷åôéêÜ ìå ôá Services êáé ôï äßêôõï
+ OPER LIST Åìöáíßæåé üëïõò ôïõò Services operators
+ ADMIN LIST Åìöáíßæåé üëïõò ôïõò Services admins
+ STAFF Display Services staff and online status
+
+OPER_HELP_OPER_CMD
+ ÄéáèÝóéìåò åíôïëÝò ãéá ôïõò Services operators êáé admins ìüíï:
+ MODE ÁëëÜæåé modes óå êáíÜëé êáé Üëëá
+ KICK Áðïìáêñýíåé ôï ÷ñÞóôç áðü ôï êáíÜëé
+ CLEARMODES Êáèáñßæåé ôá modes áðü ôï êáíÜëé
+ KILLCLONES Óêïôþíåé üëïõò ôïõò ÷ñÞóôåò ðïõ Ý÷ïõí ôï ßäéï host
+ AKILL ÐñïóèÝôåé ip êëð óôçí ëßóôá AKILL
+ SGLINE ÐñïóèÝôåé ip óôçí ëßóôá SGLINE
+ SQLINE ÐñïóèÝôåé ip óôçí ëßóôá SQLINE
+ SZLINE ÐñïóèÝôåé ip óôçí ëßóôá SZLINE
+
+OPER_HELP_ADMIN_CMD
+ ÄéáèÝóéìåò åíôïëÝò ãéá ôïõò Services admins ìüíï:
+ OPER ÁëëÜæåé ôçí ëßóôá ôùí Services operator
+ CHANLIST Åìöáíßæåé üëá ôá êáíÜëéá
+ USERLIST Åìöáíßæåé üëïõò ôïõò ÷ñÞóôåò
+ LOGONNEWS ÁëëÜæåéò ôá ìçíýìáôá ðïõ èá åìöáíßæïíôáé üôáí áõôïß èá ìðÝíïõí
+ óôï äßêôõï
+ RANDOMNEWS ÁëëÜæåéò ôá ôõ÷áßá åðéëåãüìåíá ìçíýìáôá ðïõ èá åìöáíßæïíôáé
+ üôáí áõôïß èá ìðÝíïõí óôï äßêôõï
+ OPERNEWS ÁëëÜæåéò ôá ìçíýìáôá ðïõ èá åìöáíßæïíôáé óôïõò ÷ñÞóôåò ðïõ
+ ãßíïíôáé oper
+ SESSION ÂëÝðåéò ôçí ëßóôá ìå ôá host sessions
+ EXCEPTION ÁëëÜæåéò ôçí ëßóôá ôïõ session-limit exception
+ CACHE ÂëÝðåéò ôçí ëßóôá ìå ôï hostname cache ðïõ ÷ñçóéìïðïéïýíôáé
+ áðü ôïí proxy detector
+ NOOP Áöáéñåß ðñïóùñéíÜ üëåò ôéò O:ãñáììÝò áðü ôïí server
+ áõôüìáôá
+ JUPE "Jupiter" óå server
+ SET Ñõèìßæåéò äéÜöïñåò åðéëïãÝò ôùí Services
+ RELOAD Îáíáöïñôþíåé ôï services' configuration áñ÷åßï
+ UPDATE Åíåñãïýí ôá Services (âÜóåéò äåäïìÝíùí) ãéá
+ íá ãßíïõí update óôï äßóêï áìÝóùò
+ RESTART Óþæåé ôéò âÜóåéò äåäïìÝíùí êáé åðáíåêêéíåß ôá Services
+ QUIT Ôåñìáôßæåé ôï ðñüãñáììá ôùí Services ÷ùñßò íá óþóåé ôéò áëëáãÝò
+ SHUTDOWN Ôåñìáôßæåé ôï ðñüãñáììá ôùí Services ìå ôáõôü÷ñïíï ãñÜøéìï ôùí
+ áëëáãþí
+
+ ÅíôïëÝò äéáèÝóéìåò ãéá ôïõò Services super-÷ñÞóôç ìüíï:
+ ADMIN ÁëëÜæåé ôçí ëßóôá ôùí Services admin
+
+OPER_HELP_ROOT_CMD
+ Commands available to Serivces Roots only:
+ MODLOAD Load a module
+ MODUNLOAD Un-Load a module
+ MODLIST List loaded modules
+ MODINFO Info about a loaded module
+
+OPER_HELP_LOGGED
+ Óçìåßùóç: ¼ëåò ïé åíôïëÝò óôÝëíïíôáé óôïí %S êáé êáôáãñÜöïíôáé!
+
+OPER_HELP_GLOBAL
+ Óýíôáîç: GLOBAL ìÞíõìá
+
+ ÅðéôñÝðåé óôïõò IRCops íá óôÝëíïõí ìõíÞìáôá óå üëïõò ôïõò ÷ñÞóôåò ôïõ
+ äéêôýïõ. Ôï ìÞíõìá èá óôÝëíåôáé áðü ôï øåõäþíõìï õðçñåóßáò %s.
+
+OPER_HELP_STATS
+ Óýíôáîç: STATS [AKILL | ALL | RESET]
+
+ ×ùñßò ôçí åðéëïãÞ, åìöáíßæåé ôï íïýìåñï ôùí ÷ñçóôþí êáé ôùí
+ IRCops ðïõ åßíáé óôï äßêôõï (ìáæß êáé ôùí Services), ôï ìåãáëýôåñï íïýìåñï
+ ôùí ÷ñçóôþí ðïõ åßíáé óôï äßêôõï üôáí ôá Services îåêéíÜíå, êáé ôçí
+ äéÜñêåéá ðïõ ôá Services åßíáé óôï äßêôõï.
+
+
+ Ìå ôçí åðéëïãÞ AKILL, åìöáíßæåé ôçí óõãêåêñéìÝíç ëßóôá.
+
+ AKILL êáé ôïí default ÷ñüíï ëÞîçò.
+
+ The RESET option currently resets the maximum user count
+ to the number of users currently present on the network.
+
+ UPTIME may be used as a synonym for STATS.
+
+OPER_HELP_OPER
+ Óýíôáîç: OPER ADD øåõäþíõìï
+ OPER DEL {øåõäþíõìï | èÝóç-íïýìåñï | ëßóôá}
+ OPER LIST [ìÜóêá | ëßóôá]
+ OPER CLEAR
+
+ Ç åíôïëÞ áõôÞ åðéôñÝðåé óôïõò Services admins íá ðñïóèÝóïõí Þ íá áöáéñÝóïõí
+ øåõäþíõìá áðü ôçí ëßóôá Services operator. Ï ÷ñÞóôçò ï ïðïßïò åßíáé óôçí ëßóôá
+ Services operator êáé ï ïðïßïò Ý÷åé êÜíåé åíôïëÞ áíáãíþñéóçò ìå ôïí %s
+ Ý÷åé ðñüóâáóç óôéò åíôïëÝò ôùí Services operator.
+
+ Ç åíôïëÞ OPER ADD ðñïóèÝôåé ôï áíÜëïãï øåõäþíõìï óôç
+ ëßóôá Services operator.
+
+ Ç åíôïëÞ OPER DEL áöáéñåß ôï áíÜëïãï øåõäþíõìï áðü ôçí ëßóôá
+ ôùí Services operator. Áí ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá äßíåôå,
+ áõôÝò ïé èÝóåéò äéáãñÜöçêáí. (Äåò ôï ðáñÜäåéãìá ìå ôçí åíôïëÞ LIST.)
+
+ Ç åíôïëÞ OPER LIST åìöáíßæåé ôçí ëßóôá ôùí Services operator.
+ Áí äßíåôå êÜôé óõãêåêñéìÝíï, èá åìöáíéóôïýí ìüíï ïé èÝóåéò ðïõ ôáéñéÜæïõí
+ ìå ôï áíÜëïãï èá äåßôå ìüíï ôéò èÝóåéò áõôÝò; ãéá ðáñÜäåéãìá:
+
+
+ OPER LIST 2-5,7-9
+ Åìöáíßæåé ôçí ëßóôá ôùí Services operator ìå èÝóåéò
+ ðïõ Ý÷ïõí áíôéóôïé÷ïýí óôá íïýìåñá 2 Ýùò 5 êáé 7 Ýùò 9.
+
+ Ç åíôïëÞ OPER CLEAR êáèáñßæåé üëåò ôéò èÝóåéò ôçò ëßóôáò
+ Services operator.
+
+ ÊÜèå IRC operator ìðïñåß íá ÷ñçóéìïðïéÞóåé ôçí åíôïëÞ OPER LIST.
+ ¼ëåò ôéò Üëëåò åðéëïãÝò ìüíï ïé Services admins.
+
+OPER_HELP_ADMIN
+ Óýíôáîç: ADMIN ADD øåõäþíõìï
+ ADMIN DEL {øåõäþíõìï | èÝóåéò-íïýìåñá | ëßóôá}
+ ADMIN LIST [ìÜóêá | ëßóôá]
+ ADMIN CLEAR
+
+ ÅðéôñÝðåé óôïí Services root íá ðñïóèÝóåé Þ íá äéáãñÜøåé øåõäþíõìá
+ áðü ôçí ëßóôá Services admin. Ï ÷ñÞóôçò ðïõ ôï øåõäþíõìï ôïõ åßíáé
+ óôçí ëßóôá ôùí Services admin êáé ï ïðïßïò Ý÷åé êÜíåé åíôïëÞ áíáãíþñéóçò ìå ôïí
+ %s ìðïñåß íá ÷ñçóéìïðïéÞóåé ôéò åíôïëÝò ôùí Services admin.
+
+ Ç åíôïëÞ ADMIN ADD ðñïóèÝôåé Ýíá øåõäëùíõìï óôçí ëßóôá ôùí
+ Services admin.
+
+ Ç åíôïëÞ ADMIN DEL äéáãñÜöåé Ýíá øåõäþíõìï áðü ôçí ëßóôá ôùí
+ Services admin. Áí ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá äßíåôå,
+ áõôÝò ïé èÝóåéò äéáãñÜöçêáí. (Äåò ôï ðáñÜäåéãìá ìå ôçí åíôïëÞ LIST.)
+
+ Ç åíôïëÞ ADMIN LIST åìöáíßæåé ôçí ëßóôá ôùí Services operator.
+ Áí äßíåôå êÜôé óõãêåêñéìÝíï, èá åìöáíéóôïýí ìüíï ïé èÝóåéò ðïõ ôáéñéÜæïõí ìå ôï
+ áíÜëïãï æçôïýìåíï. Áí äßíåôå ç ëßóôá èÝóåéò-íïýìåñá,èá äåßôå ìüíï ôéò èÝóåéò
+ áõôÝò; ãéá ðáñÜäåéãìá:
+
+ ADMIN LIST 2-5,7-9
+ Åìöáíßæåé ôçí ëßóôá ôùí Services operator ìå èÝóåéò ðïõ Ý÷ïõí
+ áíôéóôïé÷ïýí óôá íïýìåñá 2 Ýùò 5 êáé 7 Ýùò 9..
+
+ Ç åíôïëÞ ADMIN CELAR êáèáñßæåé üëåò ôéò èÝóåéò ôçò ëßóôáò
+ Services admin.
+
+ KÜèå IRC operator ìðïñåß íá ÷ñçóéìïðïéÞóåé ôçí åíôïëÞ ADMIN LIST.
+ ¼ëåò ôéò Üëëåò åðéëïãÝò ìüíï ï Services root.
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST} [time] [nick]
+
+ Allows Services Admins to make Services ignore an user for
+ a certain time or until the next restart. The default time
+ format is seconds. You can specify it by using units. Valid
+ units are: s for seconds, m for minutes, h for hours and
+ d for days. Combinations of these units are not permitted. To
+ make Services permanently ignore the user type 0 as time.
+
+OPER_HELP_MODE
+ Óýíôáîç: MODE êáíÜëé modes
+
+ ÅðéôñÝðåé óôïõò Services operators íá áëëÜæïõí ôá modes êÜèå êáíáëéïý.
+ Ïé ðáñÜìåôñïé åßíáé ßäéïé óáí ôçò åíôïëÞò /MODE.
+
+ Ìüíï ãéá ôïõò Services operators.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user modes
+
+ Allows Services admins to set user modes for any user.
+ Parameters are the same as for the standard /MODE
+ command.
+
+ Limited to Services admins.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Allows Services admins to give Operflags to any user.
+ Flags have to be prefixed with a "+" or a "-". To
+ remove all flags simply type a "-" instead of any flags.
+
+ Limited to Services admins.
+
+OPER_HELP_CLEARMODES
+ Óýíôáîç: CLEARMODES êáíÜëé [ALL]
+
+ Êáèáñßæåé üëá ôá binary modes (i,k,l,m,n,p,s,t) êáé êÜíåé bans áðü ôï
+ êáíÜëé. Áí ç ðáñÜìåôñïò ALL äßíåôáé, êáèáñßæåé üëïõò üóïé åßíáé ops êáé
+ voices (+o êáé +v modes) óôï êáíÜëé.
+
+ Ìüíï ãéá ôïõò Services operators.
+
+OPER_HELP_KICK
+ Óýíôáîç: KICK êáíÜëé ÷ñÞóôç ëüãï
+
+ ÅðéôñÝðåé óôïõò IRCops íá êÜíïõí kick å´íá ÷ñÞóôç áðü ôï êáíÜëé.
+ Ïé ðáñÜìåôñïé åßíáé ßäéïé ìå ôçí åíôïëÞ /KICK.
+ Ôï ìÞíõìá ôïõ kick èá Ý÷åé ôï øåõäþíõìï ôïõ
+ IRCop óáí ìéá ðñïåéäïðïßçóç; Ãéá ðáñÜäåéãìá:
+
+ *** SpamMan has been kicked off channel #my_channel by %S (Alcan (Flood))
+
+ Ìüíï ãéá ôïõò Services operators.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick newnick
+
+ Forcefully changes a user's nickname from nick to newnick.
+
+ Limited to Services admins
+
+OPER_HELP_AKILL
+ Óýíôáîç: AKILL ADD [+expiry] ìÜóêá ëüãïò
+ AKILL DEL {ìÜóêá | èÝóåéò-íïýìåñá | ëßóôá}
+ AKILL LIST [ìÜóêá | ëßóôá]
+ AKILL VIEW [ìÜóêá | ëßóôá]
+ AKILL CLEAR
+
+ Ìðïñïýí ïé Services operators íá áëëÜîïõí ôçí ëßóôá AKILL. Áí
+ ç ìÜóêá ôïõ ÷ñÞóôç ôáéñéÜîåé ìå ìéá áðü áõôÝò ðïõ ðåñéÝ÷ïíôáé óôçí ëßóôá AKILL,
+ ôá Services äåí èá åðéôñÝøïõí óôï ÷ñÞóôç íá óõíäåèåß ìå ôï äßêôõï (server) êáé
+ èá Ý÷åé KILL, óå üëïõò ôïõò servers ðïõ åßíáé ìáæß.Äçë ãßíåôáé ðñïóèÞêç
+ ban (K-line) ãéá ôçí ìÜóêá ðïõ ôáéñéÜæåé óôï ÷ñÞóôç.
+
+ Ç åíôïëÞ AKILL ADD ðñïóèÝôåé ôï áíÜëïãï user@host ìÜóêá óôçí ëßóôá AKILL
+ ìå Ýíáí ëüãï ðïõ ðñÝðåé íá äþóåôå ùóôå ï ÷ñÞóôçò íá êáôáëÜâåé ãéáôß åßíáé AKILL.
+ Ôï expiry åßíáé óõãêåêñéìÝíï êáé åðéëÝãåôáé áðü ôá åðüìåíá, d
+ (ìÝñåò), h (þñåò), Þ m (ëåðôÜ). Óõíäéáóìïß (üðùò
+ 1h30m) äåí åðéôñÝðïíôáé . Áí äåí äþóåôå ôï ÷ñüíï
+ áðü default èá åßíáé óå ìÝñåò (èá åßíáé +30 ðïõ óçìáßíåé 30
+ ìÝñåò). Ãéá íá ðñïóèÝóåôå Ýíá AKILL ðïõ íá ìçí ëÞãåé, ÷ñçóéìïðïéåßóôå +0.
+ Áí ç usermask îåêéíÜåé ìå +, ï ÷ñüíïò ëÞîçò èá ðñÝðåé íá äßíåôå
+ áêüìá êáé áí åßíáé ßäéïò ìå ôïí default. Ï
+ óõãêåêñéìÝíïò ÷ñüíïò ëÞîçò ôçò åíôïëÞò AKILL ìðïñåß íá âñåèåß ìå ôçí åíôïëÞ
+ STATS AKILL.
+
+ Ç åíôïëÞ AKILL DEL äéáãñÜöåé ôç óõãêåêñéìÝíç ìÜóêá áðü ôçí ëßóôá.
+ AKILL áí õðÜñ÷åé. Áí óáò äùèåß ëßóôá ìå ôéò èÝóåéò-íïýìåñá
+ áõôÝò ïé èÝóåéò èá äéáãñáöïýí. (Êïßôá ôï ðáñÜäåéãìá ìå ôçí åíôïëÞ LIST.)
+
+ Ç åíôïëÞ AKILL LIST åìöáíßæåé ôçí ëßóôá ìå ôá AKILL.
+ Áí äßíåôáé ìéá óõãêåêñéìÝíç ìÜóêá, èá åìöáíéóôïýí ïé èÝóåéò ðïõ áíôéóôïé÷ïýí óå
+ áõôÞ ôç ìÜóêá. Áí äßíåôå ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá ìðïñåßôå íá ôéò äåßôå êáé
+ áëëéþò,
+ ðáñÜäåéãìá:
+
+ AKILL LIST 2-5,7-9
+ Åìöáíßæåé ôéò èÝóåéò ìå ôá íïýìåñá 2 åùò 5 êáé 7
+ åùò 9 ôçò ëßóôáò AKILL.
+
+ Ç åíôïëÞ AKILL VIEW åßíáé ðéï êáëýôåñç áðü ôçí AKILL LIST, êáé
+ åìöáíßæåé ðïéïò óõãêåêñéìÝíá Ýâáëå êÜðïéïí AKILL, ôçí çìåñïìçíßá ðïõ Ýãéíå, êáé
+ ðüôå èá ëÞîåé, üðùò êáé ôï user@host êáé ôïí ëüãï.
+
+ Ç åíôïëÞ _AKILL CLEAR_ êáèáñßæåé üëåò ôéò èÝóåéò ôçò ëßóôáò AKILL.
+
+ Ìüíï ãéá ôïõò Services operators.
+
+OPER_HELP_SGLINE
+ Óýíôáîç: SGLINE ADD [+expiry] ìÜóêá:ëüãïò
+ SGLINE DEL {ìÜóêá | èÝóåéò-íïýìåñá | ëßóôá}
+ SGLINE LIST [ìÜóêá | ëßóôá]
+ SGLINE VIEW [ìÜóêá | ëßóôá]
+ SGLINE CLEAR
+
+ Ïé Services operators ìðïñïýí íá áëëÜîïõí ôçí ëßóôá SGLINE. Áí
+ ï ÷ñÞóôçò ìå ôï ðñáãìáôéêü üíïìá ôáéñéÜæåé ìå ôçí SGLINE ìÜóêá,ôá
+ Services äåí èá ôïí áöÞóïõí íá óõíäåèåß.
+
+ Ç åíôïëÞ SGLINE ADD ðñïóèÝôåé ìéá ðñáãìáôéêÞ ìÜóêá óôçí ëßóôá SGLINE
+ ìå êÜðïéïí ëüãï ôïí ïðïßï ðñÝðåé íá ôïí äþóåôå.
+ Ôï expiry åßíáé óõãêåêñéìÝíï êáé åðéëÝãåôáé áðü ôá åðüìåíá, d
+ (ìÝñåò), h (þñåò), Þ m (ëåðôÜ). Óõíäéáóìïß (üðùò
+ 1h30m) äåí åðéôñÝðïíôáé . Áí äåí äþóåôå ôï ÷ñüíï
+ áðü default èá åßíáé óå ìÝñåò (èá åßíáé +30 ðïõ óçìáßíåé 30
+ ìÝñåò). Ãéá íá ðñïóèÝóåôå Ýíá SGLINE ðïõ íá ìçí ëÞãåé, ÷ñçóéìïðïéåßóôå +0.
+ usermask îåêéíÜåé ìå +, ï ÷ñüíïò ëÞîçò èá ðñÝðåé íá äßíåôå
+ áêüìá êáé áí åßíáé ßäéïò ìå ôïí default. Ï
+ óõãêåêñéìÝíïò ÷ñüíïò ëÞîçò ôçò åíôïëÞò SGLINE ìðïñåß íá âñåèåß ìå ôçí åíôïëÞ
+ STATS AKILL.
+ Óçìåßùóç: åðåéäÞ ôï ðñáãìáôéêü üíïìá-ìÜóêá ìðïñåß íá ðåñéÝ÷åé êåíÜ,
+ äéá÷ùñéóôéêÜ ìåôáîý ôïõò íá åßóôå ðñïóåêôéêïß óôï ëüãï.
+
+ Ç åíôïëÞ SGLINE DEL áöáéñåß ìßá ìÜóêá áðü ôçí ëßóôá
+ SGLINE list áí õðÜñ÷åé. Áí ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá äßíåôå,
+ áõôÝò äéáãñÜöïíôáé. (ÄÝò ôï ðáñÜäåéãìá LIST.)
+
+ Ç åíôïëÞ SGLINE LIST åìöáíßæåé ôçí ëßóôá ìå ôá SGLINE.
+ Áí äßíåôáé ìéá óõãêåêñéìÝíç ìÜóêá, èá åìöáíéóôïýí ïé èÝóåéò ðïõ áíôéóôïé÷ïýí óå
+ áõôÞ ôç ìÜóêá
+ Áí äßíåôå ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá ìðïñåßôå íá ôéò äåßôå êáé áëëéþò,
+ ðáñÜäåéãìá:
+
+ SGLINE LIST 2-5,7-9
+ Åìöáíßæåé ôéò èÝóåéò ìå ôá íïýìåñá 2 åùò 5 êáé 7
+ åùò 9 ôçò ëßóôáò SGLINE.
+
+ Ç åíôïëÞ SGLINE VIEW åßíáé ðéï âåëôéùìÝíç áðü ôçí SGLINE LIST, êáé
+ åìöáíßæåé ðïéïò Ýâáëå ôï êÜèå SGLINE, ôçí çìåñïìçíßá ðïõ ìðÞêå, êáé ðüôå
+ ëÞãåé, êáé öõóéêÜ ôç realname ìÜóêá êáé ôïí ëüãï.
+
+ Ç åíôïëÞ SGLINE CLEAR êáèáñßæåé üëåò ôéò èÝóåéò áðü ôçí ëßóôá SGLINE.
+
+ Ìüíï ãéá ôïõò Services operators.
+
+OPER_HELP_SQLINE
+ Óýíôáîç: SQLINE ADD [+expiry] ìÜóêá ëüãïò
+ SQLINE DEL {ìÜóêá | èÝóç-íïõìåñï | ëßóôá}
+ SQLINE LIST [ìÜóêá | ëßóôá]
+ SQLINE VIEW [ìÜóêá | ëßóôá]
+ SQLINE CLEAR
+
+ Ïé Services operators ìðïñïýí íá áëëÜîïõí ôçí ëßóôá SQLINE. Áí
+ ï ÷ñÞóôçò ìðåé ìå Ýíá øåõäþíõìï ðïõ åßíáé óôçí ëßóôá SQLINE
+ ôá Services äåí èá ôïí áöÞóïõí íá óõíäåèåß Þ èá ôïõ áëëÜîïõí ôï
+ øåõäþíõìï ôïõ(óå ìåñéêïýò servers).
+
+ Áí ï ðñþôïò ÷áñáêôÞñáò ôçò ìÜóêáò åßíáé #, ôá services èá
+ åìðïäßóïõí ôçí ÷ñÞóç ãéáôß áíôéóïé÷ïýí óå êáíÜëéá áõôïß ïé ÷áñáêôÞñåò.(óå IRCds
+ ïé ïðïßïé ôï õðïóôçñßæïõí).
+
+ Ç åíôïëÞ SQLINE ADD ðñïóèÝôåé Ýíá øåõäþíõìï óôçí ëßóôá SQLINE
+ ìå ôïí áíÜëïãï ëüãï (ï ïðïßïò ðñÝðåé íá äßíåôå).
+ Ôï expiry åßíáé óõãêåêñéìÝíï êáé åðéëÝãåôáé áðü ôá åðüìåíá, d
+ (ìÝñåò), h (þñåò), Þ m (ëåðôÜ). Óõíäéáóìïß (üðùò
+ 1h30m) äåí åðéôñÝðïíôáé . Áí äåí äþóåôå ôï ÷ñüíï
+ áðü default èá åßíáé óå ìÝñåò (èá åßíáé +30 ðïõ óçìáßíåé 30
+ ìÝñåò). Ãéá íá ðñïóèÝóåôå Ýíá SQLINE ðïõ íá ìçí ëÞãåé, ÷ñçóéìïðïéåßóôå +0.
+ usermask îåêéíÜåé ìå +, ï ÷ñüíïò ëÞîçò èá ðñÝðåé íá äßíåôå
+ áêüìá êáé áí åßíáé ßäéïò ìå ôïí default. Ï
+ óõãêåêñéìÝíïò ÷ñüíïò ëÞîçò ôçò åíôïëÞò SQLINE ìðïñåß íá âñåèåß ìå ôçí åíôïëÞ
+ STATS AKILL.
+
+ Ç åíôïëÞ SQLINE DEL áöáéñåß ìßá ìÜóêá áðü ôçí ëßóôá
+ SQLINE list áí õðÜñ÷åé. Áí ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá äßíåôå,
+ áõôÝò äéáãñÜöïíôáé. (ÄÝò ôï ðáñÜäåéãìá LIST.)
+
+ Ç åíôïëÞ SQLINE LIST åìöáíßæåé ôçí ëßóôá ìå ôá SQLINE.
+ Áí äßíåôáé ìéá óõãêåêñéìÝíç ìÜóêá, èá åìöáíéóôïýí ïé èÝóåéò ðïõ áíôéóôïé÷ïýí óå
+ áõôÞ ôç ìÜóêá Áí äßíåôå ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá ìðïñåßôå íá ôéò äåßôå êáé
+ áëëéþò.
+ ðáñÜäåéãìá:
+
+ SQLINE LIST 2-5,7-9
+ Åìöáíßæåé ôéò èÝóåéò ìå ôá íïýìåñá 2 åùò 5 êáé 7
+ åùò 9 ôçò ëßóôáò SQLINE.
+
+ Ç åíôïëÞ SQLINE VIEW åßíáé ðéï âåëôéùìÝíç áðü ôçí SQLINE LIST, êáé
+ åìöáíßæåé ðïéïò Ýâáëå ôï êÜèå SQLINE, ôçí çìåñïìçíßá ðïõ ìðÞêå, êáé ðüôå
+ ëÞãåé, êáé öõóéêÜ ôç realname ìÜóêá êáé ôïí ëüãï.
+
+ Ç åíôïëÞ SQLINE CLEAR êáèáñßæåé ôéò èÝóåéò ôçò ëßóôáò SQLINE.
+
+ Ìüíï ãéá ôïõò Services operators.
+
+OPER_HELP_SZLINE
+ Óýíôáîç: SZLINE ADD [+expiry] ìÜóêá ëüãïò
+ SZLINE DEL {ìÜóêá | èÝóç-íïõìåñï | ëßóôá}
+ SZLINE LIST [ìÜóêá | ëßóôá]
+ SZLINE VIEW [ìÜóêá | ëßóôá]
+ SZLINE CLEAR
+
+ Ïé Services operators ìðïñïýí íá áëëÜîïõí ôçí ëßóôá SZLINE. Áí
+ ï ÷ñÞóôçò ìå êÜðïéï IP áíôéóôïé÷åß ìå Ýíá áðü áõôÜ ðïõ Ý÷åé ç ëßóôá SZLINE
+ ôá Services äåí ôïí áöÞíïõí íá óõíäåèïýí óôï äßêôõï.
+ (êáé áõôü, åßôå ôï IP Ý÷åé PTR RR Þ ü÷é).
+
+ Ç åíôïëÞ SZLINE ADD ðñïóèÝôåé Ýíá IP óôçí ëßóôá SZLINE
+ ìå Ýíáí ëüãï (ï ïðïßïò ðñÝðåé íá äßíåôå).
+ Ôï expiry åßíáé óõãêåêñéìÝíï êáé åðéëÝãåôáé áðü ôá åðüìåíá, d
+ (ìÝñåò), h (þñåò), Þ m (ëåðôÜ). Óõíäéáóìïß (üðùò
+ 1h30m) äåí åðéôñÝðïíôáé . Áí äåí äþóåôå ôï ÷ñüíï
+ áðü default èá åßíáé óå ìÝñåò (èá åßíáé +30 ðïõ óçìáßíåé 30
+ ìÝñåò). Ãéá íá ðñïóèÝóåôå Ýíá SZLINE ðïõ íá ìçí ëÞãåé, ÷ñçóéìïðïéåßóôå +0.
+ usermask îåêéíÜåé ìå +, ï ÷ñüíïò ëÞîçò èá ðñÝðåé íá äßíåôå
+ áêüìá êáé áí åßíáé ßäéïò ìå ôïí default. Ï
+ óõãêåêñéìÝíïò ÷ñüíïò ëÞîçò ôçò åíôïëÞò SZLINE ìðïñåß íá âñåèåß ìå ôçí åíôïëÞe
+ STATS AKILL.
+
+ Ç åíôïëÞ SZLINE DEL áöáéñåß ìßá ìÜóêá áðü ôçí ëßóôá
+ SZLINE list áí õðÜñ÷åé. Áí ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá äßíåôå,
+ áõôÝò äéáãñÜöïíôáé. (ÄÝò ôï ðáñÜäåéãìá LIST.)
+
+ Ç åíôïëÞ SZLINE LIST åìöáíßæåé ôçí ëßóôá ìå ôá SZLINE.
+ Áí äßíåôáé ìéá óõãêåêñéìÝíç ìÜóêá, èá åìöáíéóôïýí ïé èÝóåéò ðïõ áíôéóôïé÷ïýí óå
+ áõôÞ ôç ìÜóêá. Áí äßíåôå ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá ìðïñåßôå
+ íá ôéò äåßôå êáé áëëéþò,
+ ðáñÜäåéãìá::
+
+ SZLINE LIST 2-5,7-9
+ Åìöáíßæåé ôéò èÝóåéò ìå ôá íïýìåñá 2 åùò 5 êáé 7
+ åùò 9 ôçò ëßóôáò SZLINE.
+
+ Ç åíôïëÞ SZLINE VIEW åßíáé ðéï âåëôéùìÝíç áðü ôçí SZLINE LIST, êáé
+ åìöáíßæåé ðïéïò Ýâáëå ôï êÜèå SZLINE, ôçí çìåñïìçíßá ðïõ ìðÞêå, êáé ðüôå
+ ëÞãåé, êáé öõóéêÜ ôç realname ìÜóêá êáé ôïí ëüãï.
+
+ Ç åíôïëÞ SZLINE CLEAR êáèáñßæåé üëåò ôéò èÝóåéò ôçò ëßóôáò SZLINE.
+
+ Ìüíï ãéá ôïõò Services operators.
+
+OPER_HELP_SET
+ Óýíôáîç: SET option setting
+
+ Ñõèìßóåéò ó÷åôéêÜ ìå ôéò åðéëïãÝò ôùí Services. ÏíïìáóôéêÜ
+ ïé åðéëïãÝò åßíáé:
+ READONLY ÁëëÜæåôå óå äéáäéêáóßá read-only Þ read-write mode
+ LOGCHAN Report log messages to a channel
+ DEBUG Åíåñãïðïéåßôå Þ áðåíåñãïðïéåßôå óå debug mode
+ NOEXPIRE Åíåñãïðïéåßôå Þ áðåíåñãïðïéåßôå óå no expire mode
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_SET_READONLY
+ Óýíôáîç: SET READONLY {ON | OFF}
+
+ ÁëëÜæåôå óå read-only mode on Þ off. Ç read-only mode, normal
+ users äåí èá åðéôñÝøåé íá áëëÜîåé ç âÜóç äåäïìÝíùí ôùí Services,
+ óõìðåñéëáìâáíïìÝíïõ êáíáëéïý êáé øåõäþíõìïõ access lists, klp. IRCops
+ me åðáñêÞ äéêáéþìáôá óôá Services èá ìðïñïýí íá áëëÜæïõí ôá
+ Services' ôçí ëßóôá AKILL íá êÜíïõí drop (äéáãñáöåß øåõäùíýìùí) Þ êáôáóôïëÞ
+ øåõäùíýìùí êáé êáíáëéþí, áëëÜ üðïéåò áëëáãÝò êáé íá ãßíïíôáé
+ äåí èá ãñáöïýí åêôüò êáé áí ç read-only mode åßíáé áðåíåñãïðïçìÝíç ðñéí ôá
+ Services ôåñìáôéóôïýí Þ åðáíåêêéíçèïýí.
+
+ ÁõôÞ ç åðéëïãÞ åßíáé áíôßóôïé÷ç ìå ôçí åíôïëÞ-line åðéëïãÞ
+ -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Syntax: SET LOGCHAN {ON | OFF}
+
+ With this setting on, Services will send its logs to a specified
+ channel as well as the log file. LogChannel must also be defined
+ in the Services configuration file for this setting to be of any
+ use.
+
+ Note: This can have strong security implications if your log
+ channel is not properly secured.
+
+OPER_HELP_SET_DEBUG
+ Óýíôáîç: SET DEBUG {ON | OFF | num}
+
+ ÁëëÜæåé óå debug mode on Þ off. Óå debug mode, üëç ç data óôÝëíåôå
+ êáé áðü ôá Services ìÝóù Üëëùí debugging
+ ìçíõìÜôùí ãñÜöïíôáé óå log áñ÷åßï. Áí ôï _num_ äßíåôáé
+ ôï debug mode åíåñãïðïéåßôáé, ìå debugging level ñõèìéóìÝíï
+ óôï num.
+
+ ÁõôÞ ç åðéëïãÞ åßíáé áíôßóôïé÷ç ìå ôçí åíôïëÞ-line åðéëïãÞ
+ -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Óýíôáîç: SET NOEXPIRE {ON | OFF}
+
+ ÁëëÜæåé óå no expire mode on Þ off. Óå no expire mode, øåõäþíõìá,
+ êáíÜëéá, akills êáé exceptions äåí èá ëÞãïõí åêôüò êáé áí
+ áõôÞ ç åðéëïãÞ äåí ñõèìéóôåß.
+
+ ÁõôÞ ç åðéëïãÞ åßíáé áíôßóôïé÷ç ìå ôçí åíôïëÞ-line åðéëïãÞ
+ -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Syntax: SET SUPERADMIN {ON | OFF}
+
+ Setting this will grant you extra privlages such as the
+ ability to be "founder" on all channel's etc...
+
+ This opion is _NOT_ persistant, and should only be used when
+ needed, and set back to OFF when no longer needed.
+
+
+OPER_HELP_NOOP
+ Óýíôáîç: NOOP SET server
+ NOOP REVOKE server
+
+ Ç åíôïëÞ NOOP SET áöáéñåß üëá ôá O:ãñáììÝò ôïõ áíÜëïãïõ
+ server êáé êÜíåé kill üëïõò ôïõò IRCops ðïõ åßíáé åêåßíç ôçí þñá
+ ãéá ëüãïõò rehashing ôïõ server.
+
+ Ç åíôïëÞ NOOP REVOKE êÜíåé üëá ôá O:ãñáììÝò ðïõ åß÷áí áöáéñåèåß íá
+ åßíáé äéáèÝóéìá êáé ðÜëé óôï óõãêåêñéìÝíï server.
+
+ Óçìåßùóç: Ï server äåí åëÝã÷åôáé áðü ôá
+ Services.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_JUPE
+ Óýíôáîç: JUPE server [ëüãïò]
+
+ ÊÜíåéò ôá Services jupiter óå Ýíáí server -- ðïõ åßíáé, íá äçìéïõñãÞóåé
+ Ýíá øåýôéêï "server" óõíäåäåìÝíï ìå ôá Services ï ïðïßïò ðåñéÝ÷åé
+ ôïí ðñáãìáôéêü server ðïõ åßíáé óõíäåäåìÝíá. Ôï jupe
+ ìðïñåß íá áöáéñåèåß ÷ñçóéìïðïéþíôáò ôçí åíôïëÞ SQUIT. Áí ï ëüãïò äßíåôáé
+ èá ãñáöôåß óôïõ server ôéò ðëçñïöïñßåò;
+ áëëéþò, ïé ðëçñïöïñßåò èá ðåñéÝ÷ïõí Ýíá
+ text "Juped by <øåõäþíõìï>", äåß÷íïíôáò ôï øåõäþíõìï ôïõ
+ ÷ñÞóôç ðïõ Ýêáíå jupitered ôïí server.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_RAW
+ Óýíôáîç: RAW ìÞíõìá
+
+ ÓôÝëíåéò ìçíýìáôá ìÝóù ôïõ server ìå ôïí ïðïßï ôá
+ Services åßíáé óõíäåäåìÝíá. ÁõôÞ ç åíôïëÞ Ý÷åé ðåñéïñéóìÝíç ÷ñÞóç
+ êáé ìðïñåß íá êáôáóôñÝøåé ôï äßêôõï áí ÷ñçóéìïðïéåßôáé
+ áêáôÜëëçëá. ÌÇÍ ×ÑÇÓÉÌÏÐÏÉÅÉÔÁÉ ÁÕÔÇ ÔÇÍ ÅÍÔÏËÇ åêôüò êáé áí åßóôå
+ óßãïõñïé ãéá ôï ôé êÜíåôå!
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_UPDATE
+ Óýíôáîç: UPDATE
+
+ ¸xei ùò áðïôÝëåóìá ôá Services íá êÜíïõí update óå üëåò ôéò âÜóåéò äåäïìÝíùí
+ ôï óõíôïìüôåñï ðïõ êÜíåôå áõôÞ ôçí åíôïëÞ.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_RELOAD
+ Óýíôáîç: RELOAD
+
+ ¸÷åé ùò áðïôÝëåóìá ôá Services íá åðáíáöïñôþíïõí ôï configuration áñ÷åßï.
+ Óçìåßùóç ïôé ìåñéêÝò åðéëïãÝò ãéá íá Ý÷ïõí áðïôÝëåóìá ÷ñåéÜæïíôáé åðáíåêêßíçóç
+ ôùí Services (üðùò Services' øåõäþíõìá, åíåñãïðïßçóç ôçò session
+ limitation, êëð.)
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_QUIT
+ Óýíôáîç: QUIT
+
+ ¸÷åé ùò áðïôÝëåóìá ôá Services íá êëåßóïõí áìÝóùò(íá ôåñìáôéóôïýí); ïé âÜóåéò
+ äåäïìÝíùí äåí ãñÜöïíôáé(äåí óþæïíôáé). ÁõôÞ ç åíôïëÞ äåí ðñÝðåé íá
+ ÷ñçóéìïðïéåßôáé åêôüò êáé áí õðÜñ÷åé âëÜâç óôçí ìíÞìç ôùí databases
+ êáé äåí ãßíåôáé íá ãñáöôïýí(äåí ãßíåôáé íá ãßíïõí save).
+ Ãéá êáíïíéêü ôåñìáôéóìü, êÜíôå ôçí åíôïëÞ SHUTDOWN.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_SHUTDOWN
+ Óýíôáîç: SHUTDOWN
+
+ ¸÷åé ùò áðïôÝëåóìá ôá Services íá ãñÜøïõí üëç ôçí âÜóç äåäïìÝíùí êáé íá
+ ôåñìáôéóôïýí.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_RESTART
+ Óýíôáîç: RESTART
+
+ ¸÷åé ùò áðïôÝëåóìá ôá Services íá ãñÜøïõí üëç ôçí âÜóç äåäïìÝíùí êáé íá
+ åðáíåêêéíçèïýí (äçë íá êëåßóïõí êáé áìÝóùò íá
+ îáíáôñå÷ôåß ôï åêôåëÝóéìï áñ÷åßï).
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_KILLCLONES
+ Óýíôáîç: KILLCLONES øåõäþíõìï
+
+ ÊÜíåé Kills üëïõò ôïõò øåõôï-÷ñÞóôåò ðïõ Ý÷ïõí ôçí ßäéá ìÜóêá. Ç
+ åíôïëÞ AKILL, óå ìïñöÞ *@host, ðñïóôßèåôáé
+ áìÝóùò. Ïé wallops âëÝðïõí ðïéïé ÷ñçóéìïðïéïýí ôçí åíôïëÞ áõôÞ,
+ ðïéï host åßíáé êáé ðüóïé ÷ñÞóôåò óêïôþíïíôáé (killed).
+ Åßíáé ÷ñÞóéìï íá áðïìáêñýíïíôáé ïé êëþíïé áðü ôï äßêôõï.
+
+ Ìüíï ãéá ôïõò Services operators.
+
+OPER_HELP_CHANLIST
+ Óýíôáîç: CHANLIST [{åðéëïãÞ | øåõäþíõìï} [SECRET]]
+
+ Åìöáíßæåé ôéò ëßóôåò üëùí ôùí êáíáëéþí ðïõ õðÜñ÷ïõí óõãêåêñéìÝíá åêåßíç ôç
+ óôéãìÞ óôï IRC äßêôõï, åßôå åßíáé êáôï÷õñùìÝíá åßôå ü÷é.
+
+ Áí äßíåôå åðéëïãÞ, åìöáíßæåé ôçí ëßóôá ìüíï ìå ôá êáíÜëéá ðïõ ôáéñéÜæïõí.
+ Áí äßíåôå øåõäþíõìï åìöáíßæåé ìüíï ôá êáíÜëéá ðïõ ôá ÷ñçóéìïðïéåß ï æçôïýìåíïò
+ ÷ñÞóôçò. Áí äßíåôå SECRET åìöáíßæåé ìüíï ôá êáíÜëéá ðïõ ôáéñéÜæïõí ìå ôçí
+ åðéëïãÞ ðïõ Ý÷ïõí +s Þ +p mode.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_USERLIST
+ Óýíôáîç: USERLIST [{åðéëïãÞ | êáíÜëé} [INVISIBLE]]
+
+ Åìöáíßæåé ôéò ëßóôåò üëùí ôùí ÷ñçóôþí ðïõ åßíáé ôçí óõãêåêñéìÝíç óôéãìÞ
+ online óôï IRC äßêôõï, åßôå ôï øåõäþíõìï åßíáé êáôï÷õñùìÝíï åßôå ü÷é.
+
+ Áí ç åðéëïãÞ äßíåôå, åìöáíßæïíôáé ïé ëßóôåò ìå ôïõò ÷ñÞóôåò ðïõ
+ ôáéñéÜæïõí ìå ôçí åðéëïãÞ óáò (ðñÝðåé íá åßíáé ôçò ìïñöÞò øåõäþíõìï!user@host).
+ Áí äßíåôå ôï êáíÜëé, åìöáíßæïíôáé ëßóôåò ôùí ÷ñçóôþí ðïõ åßíáé óôï êáíÜëé
+ áõôü. Áí äßíåôå INVISIBLE, ìüíï ÷ñÞóôåò ìå +i flag èá åìöáíßæïíôáé.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+OPER_HELP_CACHE
+ Óýíôáîç: CACHE DEL hostname
+ CACHE LIST åðéëïãÞ [QUEUED | ALL]
+
+ Ç åíôïëÞ CACHE DEL äéáãñÜöåé ôá óõãêåêñéìÝíá hostname áðü
+ ôçí cache.
+
+ Ç åíôïëÞ CACHE LIST åìöáíßæåé ôçí ëßóôá ìå üëá ôá proxies ðïõ
+ âñÝèçêáí êáé ôáéñéÜæïõí ìå ôçí åðéëïãÞ ðïõ äþóáôå. Áí äþóåôå QUEUED
+ åðéëïãÞ, èá åìöáíßóåé ëßóôá ìå ôá queued Þ ôá scans, êáé ìå ôçí
+ ALL åðéëïãÞ èá åìöáíßóåé üëá ôá cached hostnames.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD FileName
+
+ This command loads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ This command unloads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO FileName
+
+ This command lists information about the specified loaded module
+
+ Limited to Services Roots.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ Ï %S óïõ åðéôñÝðåé íá Ý÷åéò bot óôï äéêü óïõ êáíÜëé.
+ ÁõôÞ ç õðçñåóéá Ý÷åé äçìéïõñãçèåß ãéá ôïõò ÷ñÞóôåò ðïõ äåí ìðïñïýí
+ íá ñõèìßóïõí bots Þ ãéá äßêôõá ðïõ äåí åðéôñÝðïõí ïé ÷ñÞóôåò íá Ý÷ïõí
+ éêÜ ôïõò bots ãéá áóöÜëåéá.
+ ÄéáèÝóçìåò åíôïëÝò åßíáé ïé åðüìåíåò, ãéá íá ôéò äåßôå ãñÜøôå
+ /msg %S command.Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò óå óõãêåêñéìÝíåò
+ åíôïëÝò ãñÜøôå /msg %S HELP command.
+
+ BOTLIST Ëßóôá ìå äéáèÝóéìá bots
+ ASSIGN ÆçôÜôå áðü ôï bot íá Ýñèåé óôï êáíÜëé óáò
+ SET ÁëëÜæåôå ôéò åðéëïãÝò ôïõ bot
+ KICK Ñõèìßæåôáé ôé íá êÜíåé óôïõò "Üôáêôïõò ÷ñÞóôåò"
+ BADWORDS ÁëëÜæåôå ôçí ëßóôá êáêþí ëÝîåùí
+
+ ¢ëëåò åíôïëÝò: ACT INFO SAY UNASSIGN
+
+ Ôï Bot èá ìðåß óôï êáíÜëé üôáí åßíáé ôïõëÜ÷éóôïí ìÝóá
+ %d ÷ñÞóôç(åò).
+
+BOT_HELP_BOTLIST
+ Óýíôáîç: BOTLIST
+
+ Åìöáíßæåé ôçí ëßóôá ìå ôá äéáèÝóéìá bots áõôïý ôïõ äéêôýïõ.
+
+BOT_HELP_ASSIGN
+ Óýíôáîç: ASSIGN êáíÜëé øåõäþíõìï
+
+ Ìå ôçí åíôïëÞ áõôÞ æçôÜò áðü ôï bot íá ìðåß óôï êáíÜëé óïõ. Ìðïñåßò
+ ìåôÜ íá ôï ñõèìßóåéò ãéá ôéò áíÜãêåò ôïõ êáíáëéïý óïõ.
+
+BOT_HELP_UNASSIGN
+ Óýíôáîç: UNASSIGN êáíÜëé
+
+ Ìå ôçí åíôïëÞ áõôÞ æçôÜò áðü ôï bot íá âãåß áðü ôï êáíÜëé óïõ.
+ ÐÜíôùò,ïé ñõèìßóåéò ôïõ bot ãéá ôï êáíÜëé ðïõ Þôáí åßíáé áðïèçêåõìÝíåò,
+ ãéá ôçí ðåñßðôùóç ðïõ èåò íá ôï âÜëåéò áñãüôåñá.
+
+BOT_HELP_INFO
+ Óýíôáîç: INFO {êáíÜëé | øåõäþíõìï}
+
+ Óïõ åðéôñÝðåé íá äåéò áðü ôï %S ðëçñïöïñßåò ó÷åôéêÜ ìå ôï êáíÜëé Þ ôï bot.
+ Áí ç ðáñÜìåôñïò åßíáé ôï êáíÜëé, èá äåßò ðëçñïöïñßåò ìüíï áí Ý÷åéò
+ åíåñãïðïéç´óåé ôçí åðéëïãÞ kickers. Áí ç ðáñÜìåôñïò åßíáé ôï øåõäþíõìï,
+ èá äåéò ðëçñïöïñßåò ó÷åôéêÜ ìå ôï bot.
+
+BOT_HELP_SET
+ Óýíôáîç: SET êáíÜëé åðéëïãÞ ðáñÜìåôñïé
+
+ Ñõèìßæåé ôéò åðéëïãÝò ôïõ bot. Ïé åðéëïãÝò ìðïñåß íá åßíáé:
+
+ DONTKICKOPS Ðñïóôáóßá óôïõò ops ùóôå íá ìçí ãßíïõí kick áðü ôï bot
+ DONTKICKVOICES Ðñïóôáóßá óôïõò voices ùóôå íá ìçí ãßíïõí kick áðü ôï bot
+ GREET Åíåñãïðïßçóç ìçíõìÜôùí ÷áéñåôéóìïý
+ FANTASY Åíåñãïðïßçóç åíôïëþí fantaisist
+ SYMBIOSIS ÅðéôñÝðåôáé óôï bot íá óõìðåñéöÝñåôáé óáí ðñáãìáôéêü bot
+
+ ÃñÜøå /msg %S HELP SET åðéëïãÞ ãéá ðåñéóóüôåñåò ðëçñïöïñßåò
+ ãéá ìéá óõãêåêñéìÝíç åðéëïãÞ.
+
+ Óçìåßùóç: ç access óå áõôÞ ôçí åíôïëÞ äéåõèýíåôáé áðü ôçí
+ level SET.
+
+BOT_HELP_SET_DONTKICKOPS
+ Óýíôáîç: SET êáíÜëé DONTKICKOPS {ON|OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ op ðñïóôáóßá óôï êáíÜëé.
+ ¼ôáí åßíáé åíåñãïðïéçìÝíç, ïé ops äåí èá ôñþíå kick áðü ôï bot
+ áêüìá êáé áí äåí ôáéñéÜæïôí ìå ôçí NOKICK level.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Óýíôáîç: SET êáíÜëé DONTKICKVOICES {ON|OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ voices ðñïóôáóßá óôï êáíÜëé.
+ ¼ôáí åßíáé åíåñãïðïéçìÝíç, ïé voices äåí èá ôñþíå kick áðü ôï bot
+ áêüìá êáé áí äåí ôáéñéÜæïôí ìå ôçí NOKICK level.
+
+BOT_HELP_SET_FANTASY
+ Óýíôáîç: SET êáíÜëé FANTASY {ON|OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ fantasy óôï êáíÜëé.
+ ¼ôáí åßíáé åíåñãïðïéçìÝíç, ïé ÷ñÞóôåò ìðïñïýí íá ÷ñçóéìïðïéÞóïõí åíôïëÝò
+ !op, !deop, !voice, !devoice,!kick, !kb, !unban, !seen
+ óôï êáíÜëé (øÜ÷íåôå íá äåßôå ðùò äïõëåýïõí
+ ðñïóðáèÞóôå ìå Þ ÷ùñßò øåõäþíõìï ãéá êÜèå ìéá,êáé ìå ëüãï ãéá êÜðïéåò)
+
+ Óçìåéþíåôáé ïôé üóïé ÷ñÞóôåò èÝëïõí íá ÷ñçóéìïðïéÞóïõí ôéò fantaisist
+ åíôïëÝò èá ÐÑÅÐÅÉ íá Ý÷ïõí áñêåôü level êáé ãéá ôçí
+ FANTASIA êáé Üëëï level ãéá ôéò åíôïëÝò
+ (ãéá ðáñÜäåéãìá, ãéá íá ÷ñçóéìïðïéÞóåéò !op, èá ðñÝðåé íá Ý÷åéò áñêåôÞ
+ access ãéá ôçí OPDEOP level).
+
+BOT_HELP_SET_GREET
+ Óýíôáîç: SET êáíÜëé GREET {ON|OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ greet óôï êáíÜëé.
+ ¼ôáí åßíáé åíåñãïðïéçìÝíç, ôï bot èá åìöáíßæåé ôï ìÞíõìá ÷áéñåôéóìïý
+ óôïõò ÷ñÞóôåò ðïõ èá ìðÝíïõí óôï êáíÜëé, ìå ôçí ðñïõðüèåóç ïôé
+ Ý÷ïõí áñêåôÞ access óôï êáíÜëé.
+
+BOT_HELP_SET_SYMBIOSIS
+ Óýíôáîç: SET êáíÜëé SYMBIOSIS {ON|OFF}
+
+ Åíåñãïðïéåß Þ áðåíåñãïðïéåß ôçí åðéëïãÞ symbiosis óôï êáíÜëé.
+ ¼ôáí åßíáé åíåñãïðïéçìÝíç, ôï bot èá êÜíåé ôá ðÜíôá
+ normal áðü ôï %s óôá êáíÜëéá, üëá ôá MODEs,
+ KICKs, êáé èá åìöáíßæåé ôï ìÞíõìá åéóáãùãÞò.
+
+BOT_HELP_KICK
+ Óýíôáîç: KICK êáíÜëé åðéëïãÞ ðáñÜìåôñïé
+
+ Ñõèìßæåé ôï bot ìå ôéò åðéëïãÝò ôïõ íá êÜíåé kick ôïõò "êáêïýò ÷ñÞóôåò".
+ Ïé åðéëïãÝò ìðïñåß íá åßíáé:
+
+ BOLDS Ñõèìßæåé ôï bot áí èá êÜíåé kick áõôïýò ðïõ
+ ÷ñçóéìïðïéïýí Ýíôïíïõò ÷áñáêôÞñåò
+ BADWORDS Ñõèìßæåé ôï bot áí èá êÜíåé kick áõôïýò ðïõ
+ ëÝíå êáêÝò ëÝîåéò
+ CAPS Ñõèìßæåé ôï bot áí èá êÜíåé kick áõôïýò ðïõ
+ ãñÜöïõí ìå êåöáëáßïõò ÷áñáêôÞñåò
+ COLORS Ñõèìßæåé ôï bot áí èá êÜíåé kick áõôïýò ðïõ
+ ãñÜöïõí ìå Ýã÷ñùìïõò ÷áñáêôÞñåò
+ FLOOD Ñõèìßæåé ôï bot áí èá êÜíåé kick áõôïýò ðïõ
+ ãñÜöïõí ðïëëÝò óåéñÝò óå ëßãá äåõôåñüëåðôá
+ REPEAT Ñõèìßæåé ôï bot áí èá êÜíåé kick áõôïýò ðïõ
+ åðáíáëáìâÜíïõí ôá ßäéá ðñÜãìáôá
+ REVERSES Ñõèìßæåé ôï bot áí èá êÜíåé kick áõôïýò ðïõ
+ åßíáé áíôßèåôïé(ð÷ áëëÜæïõí ôá modes)
+ UNDERLINES Ñõèìßæåé ôï bot áí èá êÜíåé kick áõôïýò ðïõ
+ ãñÜöïõí ìå õðïãñáììéóìÝíïõò ÷áñáêôÞñåò
+
+ ÃñÜøå /msg %S HELP KICK åðéëïãÞ ãéá ðåñéóóüôåñåò ðëçñïöïñßåò
+ óå óõãêåêñéìÝíåò åíôïëÝò.
+
+ Óçìåßùóç: ç access óå áõôÞ ôçí åíôïëÞ åëÝã÷åôáé áðü ôçí
+ level SET.
+
+BOT_HELP_KICK_BOLDS
+ Óýíôáîç: KICK êáíÜëé BOLDS {ON|OFF} [ttb]
+
+ Åíåñãïðïéåß ôçí åíôïëÞ kick Ýíôïíùí ÷áñáêôÞñùí. Áí ôçí
+ åíåñãïðïéÞóåôå, èá êÜíåé kick üóïõò ÷ñçóéìïðïéïýí bolds (Ýíôïíïõò
+ ÷áñáêôÞñåò).
+
+ Ôï ttb åßíáé ôï íïýìåñï ìå ôï ïðïßï èá ãßíåôáé ï ÷ñÞóôçò áñ÷éêÜ kick
+ êáé ìåôÜ ban. Ìçí ðñïóðáèÞóåôå íá áðåíåñãïðïéÞóåôå ôï ttb
+ ãéáôß ôï óýóôçìá èá ôï åíåñãïðïéÞóåé îáíÜ.
+
+BOT_HELP_KICK_COLORS
+ Óýíôáîç: KICK êáíÜëé COLORS {ON|OFF} [ttb]
+
+ Åíåñãïðïéåß ôçí åíôïëÞ kick ãéá Ýã÷ñùìïõò ÷áñáêôÞñåò.Áí ôçí åíåñãïðïéÞóåôå,
+ áõôÞ ç åðéëïãÞ èá êÜíåé kick üóïõò ÷ñçóéìïðïéïýí Ýã÷ñùìïõò ÷áñáêôÞñåò.
+
+ Ôï ttb åßíáé ôï íïýìåñï ìå ôï ïðïßï èá ãßíåôáé ï ÷ñÞóôçò áñ÷éêÜ kick
+ êáé ìåôÜ ban. Ìçí ðñïóðáèÞóåôå íá áðåíåñãïðïéÞóåôå ôï ttb
+ ãéáôß ôï óýóôçìá èá ôï åíåñãïðïéÞóåé îáíÜ.
+
+BOT_HELP_KICK_REVERSES
+ Óýíôáîç: KICK êáíÜëé REVERSES {ON|OFF} [ttb]
+
+ Åíåñãïðïéåß ôçí åíôïëÞ kick ãéá ôïõò áíôßèåôïõò ìå ôéò åðéëïãÝò ðïõ
+ Ý÷åé Ýíá êáíÜëé.
+
+ Ôï ttb åßíáé ôï íïýìåñï ìå ôï ïðïßï èá ãßíåôáé ï ÷ñÞóôçò áñ÷éêÜ kick
+ êáé ìåôÜ ban. Ìçí ðñïóðáèÞóåôå íá áðåíåñãïðïéÞóåôå ôï ttb
+ ãéáôß ôï óýóôçìá èá ôï åíåñãïðïéÞóåé îáíÜ.
+
+BOT_HELP_KICK_UNDERLINES
+ Óýíôáîç: KICK êáíÜëé UNDERLINES {ON|OFF} [ttb]
+
+ Åíåñãïðïéåß ôçí åíôïëÞ kick ãéá õðïãñáììéóìÝíïõò ÷áñáêôÞñåò.Áí ôçí
+ åíåñãïðïéÞóåôå, áõôÞ ç åðéëïãÞ èá êÜíåé kick üóïõò ÷ñçóéìïðïéïýí
+ õðïãñáììéóìÝíïõò ÷áñáêôÞñåò.
+
+ Ôï ttb åßíáé ôï íïýìåñï ìå ôï ïðïßï èá ãßíåôáé ï ÷ñÞóôçò áñ÷éêÜ kick
+ êáé ìåôÜ ban. Ìçí ðñïóðáèÞóåôå íá áðåíåñãïðïéÞóåôå ôï ttb
+ ãéáôß ôï óýóôçìá èá ôï åíåñãïðïéÞóåé îáíÜ.
+
+BOT_HELP_KICK_CAPS
+ Óýíôáîç: KICK êáíÜëé CAPS {ON|OFF} [ttb [min [ðïóïóôü]]]
+
+ Åíåñãïðïéåß ôçí åíôïëÞ kick ãéá êåöáëáßïõò ÷áñáêôÞñåò.Áí ôçí
+ åíåñãïðïéÞóåôå, áõôÞ ç åðéëïãÞ èá êÜíåé kick üóïõò ÷ñçóéìïðïéïýí
+ êåöáëáßïõò ÷áñáêôÞñåò.
+
+ Ôï bot èá êÜíåé kick ìüíï áí åßíáé ôï ëéãüôåñï min êåöáëáßá
+ êáé åßíáé óõíïëéêÜ óôï ðïóïóôü%% ôïõ óõíïëéêïý ìçíýìáôïò
+ ôçò ãñáììÞò (áí äåí äùèåß, áðü default åßíáé óôïõò 10 ÷áñáêôÞñåò
+ êáé 25%%).
+
+ Ôï ttb åßíáé ôï íïýìåñï ìå ôï ïðïßï èá ãßíåôáé ï ÷ñÞóôçò áñ÷éêÜ kick
+ êáé ìåôÜ ban. Ìçí ðñïóðáèÞóåôå íá áðåíåñãïðïéÞóåôå ôï ttb
+ ãéáôß ôï óýóôçìá èá ôï åíåñãïðïéÞóåé îáíÜ.
+
+BOT_HELP_KICK_FLOOD
+ Óýíôáîç: KICK êáíÜëé FLOOD {ON|OFF} [ttb [ln [secs]]]
+
+ Åíåñãïðïéåß ôçí åíôïëÞ kick ãéá óõíå÷üìåíá ìçíýìáôá.Áí ôçí
+ åíåñãïðïéÞóåôå, áõôÞ ç åðéëïãÞ èá êÜíåé kick üóïõò ãñÜöïõí
+ áñêåôÜ áðü üóï ðñÝðåé.Ïé åðéëïãÝò ãéá Ýíá êáíÜëé åßíáé
+ ôï ëéãüôåñï íá Ý÷åé ln ãñáììÝò óå secs äåõôåñüëåðôá
+ (áí äåí äßíåôå, áðü default åßíáé 6 ãñáììÝò óå 10 äåõôåñüëåðôá).
+
+ Ôï ttb åßíáé ôï íïýìåñï ìå ôï ïðïßï èá ãßíåôáé ï ÷ñÞóôçò áñ÷éêÜ kick
+ êáé ìåôÜ ban. Ìçí ðñïóðáèÞóåôå íá áðåíåñãïðïéÞóåôå ôï ttb
+ ãéáôß ôï óýóôçìá èá ôï åíåñãïðïéÞóåé îáíÜ.
+
+BOT_HELP_KICK_REPEAT
+ Óýíôáîç: KICK #êáíÜëé REPEAT {ON|OFF} [ttb [num]]
+
+ Åíåñãïðïéåß ôçí åíôïëÞ kick ãéá åðáíáëáìâáíüìåíá ìçíýìáôá.Áí ôçí
+ åíåñãïðïéÞóåôå, áõôÞ ç åðéëïãÞ èá êÜíåé kick üóïõò ãñÜöïõí
+ ôá ßäéá ðñÜãìáôá,åðéëÝãåôáé åóåßò ôï num,ôéò öïñÝò ðïõ äåí èÝëåôå
+ íá ãßíåôáé (áí äåí äþóåôå num, áðü defaults èá åßíáé 3).
+
+ Ôï ttb åßíáé ôï íïýìåñï ìå ôï ïðïßï èá ãßíåôáé ï ÷ñÞóôçò áñ÷éêÜ kick
+ êáé ìåôÜ ban. Ìçí ðñïóðáèÞóåôå íá áðåíåñãïðïéÞóåôå ôï ttb
+ ãéáôß ôï óýóôçìá èá ôï åíåñãïðïéÞóåé îáíÜ.
+
+BOT_HELP_KICK_BADWORDS
+ Óýíôáîç: KICK #êáíÜëé BADWORDS {ON|OFF} [ttb]
+
+ Åíåñãïðïéåß ôçí åíôïëÞ kick ãéá êáêÝò ëÝîåéò. ¼ôáí åíåñãïðïéçèåß,
+ ôï bot èá êÜíåé kick ôïõò ÷ñÞóôåò ðïõ ëÝíå áõôÝò ôéò êáêÝò ëÝîåéò óôá êáíÜëéá.
+
+ Ìðïñåßò íá âÜëåéò ìéá ëßóôá ìå ôéò êáêÝò ëÝîåéò êÜíïíôáò ôçí åíôïëÞ
+ BADWORDS. ÃñÜøå /msg %S HELP BADWORDS ãéá
+ ðåñéóóüôåñåò ðëçñïöïñßåò.
+
+ Ôï ttb åßíáé ôï íïýìåñï ìå ôï ïðïßï èá ãßíåôáé ï ÷ñÞóôçò áñ÷éêÜ kick
+ êáé ìåôÜ ban. Ìçí ðñïóðáèÞóåôå íá áðåíåñãïðïéÞóåôå ôï ttb
+ ãéáôß ôï óýóôçìá èá ôï åíåñãïðïéÞóåé îáíÜ.
+
+BOT_HELP_BADWORDS
+ Óýíôáîç: BADWORDS êáíÜëé ADD ëÝîç [SINGLE | START | END]
+ BADWORDS êáíÜëé DEL {ëÝîç | èÝóç-íïõ | list}
+ BADWORDS êáíÜëé LIST [ìÜóêá | list]
+ BADWORDS êáíÜëé CLEAR
+
+ ÁëëÜæåé ôçí bad words ëßóôá ôïõ êáíáëéïý. Ç ëßóôá bad
+ words äåß÷íåé ðïéÝò ëÝîåéò åßíáé íá ãßíåôáé ôï kick,
+ üôáí ôï bad words kick åßíáé åíåñãïðïéçìÝíï. Ãéá ðåñéóóüôåñåò ðëçñïöïñßåò,
+ ãñÜöôå /msg %S HELP KICK BADWORDS.
+
+ Ç åíôïëÞ BADWORDS ADD ðñïóèÝôåé ìéá êáêéÜ ëÝîç óôçí ëßóôá
+ badword. Áí ðåß áõôç ôç ëÝîç (SINGLE), ôüôå èá ãßíåôáé
+ kick. Áí îåêéíÜåé ìå áõôÞ ôç ëÝîç (START) ôüôå èá ãßíåôáé
+ kick ï ÷ñÞóôçò åðåéäÞ îåêßíçóå ìå áõôç ôç ëÝîç. Áí óôï ôÝëïò ôçò ëÝîçò
+ ðñïóèÝóåé ôçí êáêéÜ ëÝîç (END) èá ãßíåôáé kick åðåéäÞ ôçí åßðå óôï ôÝëïò
+ ôçò öñÜóçò/ëÝîçò. Áí äåí åßóôå óõãêåêñéìÝíïò ôüôå èá ãßíåôáé kick
+ üðïôå èá ëÝåé óõãêåêñéìÝíá áõôÞ ôç ëÝîç.
+
+ Ç åíôïëÞ BADWORDS DEL áöáéñåß ôçí ëÝîç áõôÞ áðü ôçí ëßóôá badwords.
+ Áí óáò äßíåôå ç ëßóôá ìå ôéò èÝóåéò-íïýìåñá, áõôÝò ïé èÝóåéò èá äéáãñáöïýí
+ (Äåò ôï ðáñÜäåéãìá ìå ôçí åíôïëÞ LIST.)
+
+ Ç åíôïëÞ BADWORDS LIST åìöáíßæåé ôçí ëßóôá ìå ôéò êáêÝò ëÝîåéò. Áí äþóåôå
+ óõãêåêñéìÝíç ëÝîç, èá åìöáíéóôïýí ïé èÝóåéò ðïõ ôáéñéÜæïõí ìå áõôÞí.
+ ÐáñÜäåéãìá:
+
+ BADWORDS #êáíÜëé LIST 2-5,7-9
+ Åìöáíßæåé áðü ôçí ëßóôá ôéò èÝóåéò ìå ôá íïýìåñá 2 Ýùò 5 êáé
+ 7 Ýùò 9.
+
+ Ç åíôïëÞ BADWORDS CLEAR êáèáñßæåé üëåò ôéò èÝóåéò áðü ôçí ëßóôá
+ badword.
+
+BOT_HELP_SAY
+ Óýíôáîç: SAY êáíÜëé ìÞíõìá
+
+ ÊÜíåé ôï bot íá ëÝåé ôï ìÞíõìá ðïõ ôïõ äþóáôå íá ôï åìöáíßóåé óôï áíÜëïãï
+ êáíÜëé.
+
+BOT_HELP_ACT
+ Óýíôáîç: ACT êáíÜëé ìÞíõìá
+
+ ÊÜíåé ôï bot íá åíåñãåß,äçë íá åêôåëåß åíôïëÞ "/me"
+ åìöáíßæïíôáò ôï ìÞíõìá óôï áíÜëïãï êáíÜëé.
+
+BOT_SERVADMIN_HELP
+
+ Ç áêüëïõèç åíôïëÞ åßíáé ìüíï ãéá ôïõò Services admins:
+
+ BOT ÁëëÜæåé ôçí ëßóôá ôùí bot ôïõ äéêôýïõ
+
+BOT_SERVADMIN_HELP_BOT
+ Óýíôáîç: BOT ADD øåõäþíõìï ID host ðñáãìáôéêü üíïìá
+ BOT CHANGE ðáëéü-øåõäþíõìïick íÝï-øåõäþíõìï [ID [host [ðñáãìáôéêü üíïìá]]]
+ BOT DEL øåõäþíõìï
+ BOT LIST
+
+ ÅðéôñÝðåé ìüíï óôïõò Services admins íá äçìéïõñãÞóïõí, áëëÜîïõí, êáé
+ íá óâÞóïõí ôá bots óôá ïðïßá ïé ÷ñÞóôåò èá ìðïñïýí íá ÷ñçóéìïðïéÞóïõí
+ óôá äéêÜ ôïõò ôá êáíÜëéá.
+
+ Ç åíôïëÞ BOT ADD ðñïóèÝôåé Ýíá botìå ôï øåõäþíõìï, ID,
+ hostname êáé ðñáãìáôéêü üíïìá. Áí äåí ãßíïõí ïé êáôÜëëçëïé Ýëåã÷ïé
+ ìå ôéò åðéëïãÝò, íá åßóôå ðñïóåêôéêïß.
+ Ç åíôïëÞ BOT CHANGE óáò åðéôñÝðåé íá áëëÜîåôå ôï øåõäþíõìï, ID, hostname
+ Þ ðñáãìáôéêü üíïìá ôïõ bot ÷ùñßò íá ÷ñåéÜæåôáé íá ôï óâÞóåôå (êáé üëåò
+ ïé ñõèìßóåéò èá ìåßíïõí).
+ Ç åíôïëÞ BOT DEL áöáéñåß ôï bot áðü ôçí ëßóôá bot.
+ Ç åíôïëÞ BOT LIST åßíáé ßäéï ìå ôçí BOTLIST êáé áðëÜ äåß÷íåé üëç ôçí
+ ëßóôá ôùí bots ðïõ õðÜñ÷ïõí óôï äßêôõï.
+
+ Óçìåßùóç: áí öôéÜîåéò Ýíá bot ðïõ Ý÷åé øåõäþíõìï êáôï÷õñùìÝíï
+ èá äéáãñáöåß. Åðßóçò, áí Ýíáò ÷ñÞóôçò ÷ñçóéìïðïéåß Þäç ôï øåõäþíõìï
+ ôçí þñá ðïõ öôéÜ÷íåéò ôï bot, èá ãßíåé kill.
+
+BOT_SERVADMIN_HELP_SET
+
+ ÁõôÝò ïé åðéëïãÝò åßíáé ìüíï ãéá ôïõò Services admins:
+
+ NOBOT Äåß÷íåé ôï bot ðïõ Ýãéíå assign áðü ôï êáíÜëé
+ PRIVATE Äåëé÷íåé ôï bot ðïõ Ýãéíå assigned áðü ìç IRC operators
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Óýíôáîç: SET êáíÜëé NOBOT {ON|OFF}
+
+ ÁõôÞ ç åðéëïãÞ êÜíåé ôï êáíÜëé íá åßíáé unassignable (íá ìç ìðåé bot). Áí
+ ôï bot åßíáé Þäç assigned óôï êáíÜëé, èá ãßíåé unassigned
+ áõôüìáôá, üôáí èá åíåñãïðïéÞóåéò áõôÞ ôçí åðéëïãÞ.
+
+ Ìüíï ãéá ôïõò Services admins.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Óýíôáîç: SET øåõäþíõìï-bot PRIVATE {ON|OFF}
+
+ ÁõôÞ ç åðéëïãÞ êÜíåé ôï bot áðü assigned óå êáíÜëéá
+ ôùí ÷ñçóôùí ðïõ äåí åßíáé IRC operators.
+
+ Ìüíï ãéá ôïõò Services admins.
+HOST_EMPTY
+ The vhost list is empty.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ vhost for %s set to %s.
+HOST_IDENT_SET
+ vhost for %s set to %s@%s.
+HOST_SETALL
+ vhost for group %s set to %s.
+HOST_DELALL
+ vhosts for group %s have been removed.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost for group %s set to %s@%s.
+HOST_SET_ERROR
+ Error! A vhost can only contain A-Z, a-z, 0-9, '.' and '-'.
+HOST_SET_IDENT_ERROR
+ A vhost ident must be in the format of a valid ident
+HOST_SET_TOOLONG
+ Error! The vhost is too long, please use a host shorter than %d characters.
+HOST_SET_IDENTTOOLONG
+ Error! The Ident is too long, please use an ident shorter than %d characters.
+HOST_NOREG
+ User %s not found in the nickserv db.
+HOST_SET_SYNTAX
+ Syntax /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Access Denied.
+HOST_NOT_ASSIGNED
+ Please contact an Operator to get a vhost assigned to this nick.
+HOST_ACTIVATED
+ Your vhost of %s is now activated.
+HOST_IDENT_ACTIVATED
+ Your vhost of %s@%s is now activated.
+HOST_ID
+ Please identify to services first.
+HOST_NOT_REGED
+ You need to register before a vhost can be assigned to you.
+HOST_DEL
+ vhost for %s removed.
+HOST_DEL_SYNTAX
+ Syntax: /msg %s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Your vhost was removed. To re-enable the standard host cloaking, type /mode %s +x
+HOST_NO_VIDENT
+ Your IRCD does not support vIdent's, if this is incorrect, please report this as a possible bug
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_GROUP
+ All vhost's in the group %s have been set to %s
+HOST_IDENT_GROUP
+ All vhost's in the group %s have been set to %s@%s
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_LIST_FOOTER
+ Displayed all records (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Displayed records from %d to %d
+HOST_LIST_KEY_FOOTER
+ Displayed records matching key %s (Count: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ %S commands:
+ ON Activates your assigned vhost
+ OFF Deactivates your assigned vhost
+
+HOST_OPER_HELP
+ Commands available to services operators only:
+ SET Set the vhost of another user
+ SETALL Set the vhost for all nicks in a group
+ DEL Delete the vhost of another user
+ LIST Displays one or more vhost entries.
+
+HOST_ADMIN_HELP
+ Commands available to services admins only:
+
+HOST_HELP_ON
+ Syntax: ON
+
+ Activates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see the vhost instead of your real IP address.
+
+HOST_HELP_SET
+ Syntax: SET <nick> <hostmask>.
+
+ Sets the vhost for the given nick to that of the given
+ hostmask. If your IRCD supports vIdents, then using
+ SET <nick> <ident>@<hostmask> set idents for users as
+ well as vhosts.
+
+ Limited to Services operators.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Deletes the vhost for all nick's in the same group as
+ that of the given nick.
+
+ Limited to Host Removers.
+
+
+HOST_HELP_SETALL
+ Syntax: SETALL <nick> <hostmask>.
+
+ Sets the vhost for all nicks in the same group as that
+ of the given nick. If your IRCD supports vIdents, then
+ using SETALL <nick> <ident>@<hostmask> will set idents
+ for users as well as vhosts.
+
+ * NOTE, this will not update the vhost for any nick's
+ added to the group after this command was used.
+
+ Limited to Services operators.
+
+HOST_HELP_OFF
+ Syntax: OFF
+
+ Deactivates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see your real IP address.
+
+HOST_HELP_DEL
+ Syntax: DEL <nick>
+
+ Deletes the vhost assigned to the given nick from the
+ database.
+
+ Limited to Services operators.
+
+HOST_HELP_LIST
+ Syntax: LIST [<key>|<#X-Y>]
+
+ This command lists registered vhosts to the operator
+ if a Key is specified, only entries whos nick or vhost match
+ the pattern given in <key> are displayed e.g. Rob* for all
+ entries beginning with "Rob"
+
+ If a #X-Y style is used, only entries between the range of X
+ and Y will be displayed, e.g. #1-3 will display the first 3
+ nick/vhost entries.
+
+ The list uses the value of NSListMax as a hard limit for the
+ number of items to display to a operator at any 1 time.
+
+ Limited to Services operators.
+
+HOST_HELP_GROUP
+ Syntax: GROUP
+
+ This command allows users to set the vhost of thier
+ CURRENT nick to be the vhost for all nicks in the same
+ group.
diff --git a/lang/index b/lang/index
new file mode 100644
index 000000000..652888670
--- /dev/null
+++ b/lang/index
@@ -0,0 +1,1410 @@
+LANG_NAME
+STRFTIME_DATE_TIME_FORMAT
+STRFTIME_LONG_DATE_FORMAT
+STRFTIME_SHORT_DATE_FORMAT
+STRFTIME_DAYS_SHORT
+STRFTIME_DAYS_LONG
+STRFTIME_MONTHS_SHORT
+STRFTIME_MONTHS_LONG
+COMMA_SPACE
+USER_RECORD_NOT_FOUND
+UNKNOWN_COMMAND
+UNKNOWN_COMMAND_HELP
+SYNTAX_ERROR
+MORE_INFO
+NO_HELP_AVAILABLE
+OBSOLETE_COMMAND
+BAD_USERHOST_MASK
+BAD_EXPIRY_TIME
+USERHOST_MASK_TOO_WIDE
+SERVICE_OFFLINE
+READ_ONLY_MODE
+PASSWORD_INCORRECT
+ACCESS_DENIED
+PERMISSION_DENIED
+RAW_DISABLED
+MORE_OBSCURE_PASSWORD
+PASSWORD_TRUNCATED
+NICK_NOT_REGISTERED
+NICK_NOT_REGISTERED_HELP
+NICK_X_NOT_REGISTERED
+NICK_X_IN_USE
+NICK_X_NOT_IN_USE
+NICK_X_NOT_ON_CHAN
+NICK_X_FORBIDDEN
+NICK_X_FORBIDDEN_OPER
+NICK_X_ILLEGAL
+NICK_X_TRUNCATED
+CHAN_X_NOT_REGISTERED
+CHAN_X_NOT_IN_USE
+CHAN_X_FORBIDDEN
+CHAN_X_FORBIDDEN_OPER
+CHAN_X_SUSPENDED
+NICK_IDENTIFY_REQUIRED
+CHAN_IDENTIFY_REQUIRED
+MAIL_DISABLED
+MAIL_INVALID
+MAIL_X_INVALID
+MAIL_LATER
+MAIL_DELAYED
+NO_REASON
+UNKNOWN
+DURATION_DAY
+DURATION_DAYS
+DURATION_HOUR
+DURATION_HOURS
+DURATION_MINUTE
+DURATION_MINUTES
+DURATION_SECOND
+DURATION_SECONDS
+NO_EXPIRE
+EXPIRES_SOON
+EXPIRES_M
+EXPIRES_1M
+EXPIRES_HM
+EXPIRES_H1M
+EXPIRES_1HM
+EXPIRES_1H1M
+EXPIRES_D
+EXPIRES_1D
+END_OF_ANY_LIST
+NICK_IS_REGISTERED
+NICK_IS_SECURE
+NICK_MAY_NOT_BE_USED
+FORCENICKCHANGE_IN_1_MINUTE
+FORCENICKCHANGE_IN_20_SECONDS
+FORCENICKCHANGE_NOW
+FORCENICKCHANGE_CHANGING
+NICK_REGISTER_SYNTAX
+NICK_REGISTER_SYNTAX_EMAIL
+NICK_REGISTRATION_DISABLED
+NICK_REGISTRATION_FAILED
+NICK_REG_PLEASE_WAIT
+NICK_CANNOT_BE_REGISTERED
+NICK_ALREADY_REGISTERED
+NICK_REGISTERED
+NICK_PASSWORD_IS
+NICK_GROUP_SYNTAX
+NICK_GROUP_DISABLED
+NICK_GROUP_FAILED
+NICK_GROUP_PLEASE_WAIT
+NICK_GROUP_CHANGE_DISABLED
+NICK_GROUP_SAME
+NICK_GROUP_TOO_MANY
+NICK_GROUP_JOINED
+NICK_IDENTIFY_SYNTAX
+NICK_IDENTIFY_FAILED
+NICK_IDENTIFY_SUCCEEDED
+NICK_IDENTIFY_EMAIL_REQUIRED
+NICK_IDENTIFY_EMAIL_HOWTO
+NICK_ALREADY_IDENTIFIED
+NICK_UPDATE_SUCCESS
+NICK_LOGOUT_SYNTAX
+NICK_LOGOUT_SUCCEEDED
+NICK_LOGOUT_X_SUCCEEDED
+NICK_LOGOUT_SERVICESADMIN
+NICK_DROP_DISABLED
+NICK_DROPPED
+NICK_X_DROPPED
+NICK_SET_SYNTAX
+NICK_SET_SERVADMIN_SYNTAX
+NICK_SET_DISABLED
+NICK_SET_UNKNOWN_OPTION
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+NICK_SET_OPTION_DISABLED
+NICK_SET_DISPLAY_INVALID
+NICK_SET_DISPLAY_CHANGED
+NICK_SET_PASSWORD_FAILED
+NICK_SET_PASSWORD_CHANGED
+NICK_SET_PASSWORD_CHANGED_TO
+NICK_SET_LANGUAGE_SYNTAX
+NICK_SET_LANGUAGE_UNKNOWN
+NICK_SET_LANGUAGE_CHANGED
+NICK_SET_URL_CHANGED
+NICK_SET_URL_UNSET
+NICK_SET_EMAIL_CHANGED
+NICK_SET_EMAIL_UNSET
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+NICK_SET_ICQ_CHANGED
+NICK_SET_ICQ_UNSET
+NICK_SET_ICQ_INVALID
+NICK_SET_GREET_CHANGED
+NICK_SET_GREET_UNSET
+NICK_SET_KILL_SYNTAX
+NICK_SET_KILL_IMMED_SYNTAX
+NICK_SET_KILL_ON
+NICK_SET_KILL_QUICK
+NICK_SET_KILL_IMMED
+NICK_SET_KILL_IMMED_DISABLED
+NICK_SET_KILL_OFF
+NICK_SET_SECURE_SYNTAX
+NICK_SET_SECURE_ON
+NICK_SET_SECURE_OFF
+NICK_SET_PRIVATE_SYNTAX
+NICK_SET_PRIVATE_ON
+NICK_SET_PRIVATE_OFF
+NICK_SET_HIDE_SYNTAX
+NICK_SET_HIDE_EMAIL_ON
+NICK_SET_HIDE_EMAIL_OFF
+NICK_SET_HIDE_MASK_ON
+NICK_SET_HIDE_MASK_OFF
+NICK_SET_HIDE_QUIT_ON
+NICK_SET_HIDE_QUIT_OFF
+NICK_SET_MSG_SYNTAX
+NICK_SET_MSG_ON
+NICK_SET_MSG_OFF
+NICK_SET_NOEXPIRE_SYNTAX
+NICK_SET_NOEXPIRE_ON
+NICK_SET_NOEXPIRE_OFF
+NICK_ACCESS_SYNTAX
+NICK_ACCESS_ALREADY_PRESENT
+NICK_ACCESS_REACHED_LIMIT
+NICK_ACCESS_ADDED
+NICK_ACCESS_NOT_FOUND
+NICK_ACCESS_DELETED
+NICK_ACCESS_LIST
+NICK_ACCESS_LIST_X
+NICK_INFO_SYNTAX
+NICK_INFO_REALNAME
+NICK_INFO_SERVICES_OPER
+NICK_INFO_SERVICES_ADMIN
+NICK_INFO_ADDRESS
+NICK_INFO_ADDRESS_ONLINE
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+NICK_INFO_TIME_REGGED
+NICK_INFO_LAST_SEEN
+NICK_INFO_LAST_QUIT
+NICK_INFO_URL
+NICK_INFO_EMAIL
+NICK_INFO_VHOST
+NICK_INFO_ICQ
+NICK_INFO_GREET
+NICK_INFO_OPTIONS
+NICK_INFO_OPT_KILL
+NICK_INFO_OPT_SECURE
+NICK_INFO_OPT_PRIVATE
+NICK_INFO_OPT_MSG
+NICK_INFO_OPT_NONE
+NICK_INFO_NO_EXPIRE
+NICK_INFO_FOR_MORE
+NICK_LIST_SYNTAX
+NICK_LIST_SERVADMIN_SYNTAX
+NICK_LIST_HEADER
+NICK_LIST_RESULTS
+NICK_ALIST_SYNTAX
+NICK_ALIST_HEADER
+NICK_ALIST_HEADER_X
+NICK_ALIST_XOP_FORMAT
+NICK_ALIST_ACCESS_FORMAT
+NICK_ALIST_FOOTER
+NICK_GLIST_HEADER
+NICK_GLIST_HEADER_X
+NICK_GLIST_FOOTER
+NICK_RECOVER_SYNTAX
+NICK_NO_RECOVER_SELF
+NICK_RECOVERED
+NICK_RELEASE_SYNTAX
+NICK_RELEASE_NOT_HELD
+NICK_RELEASED
+NICK_GHOST_SYNTAX
+NICK_NO_GHOST_SELF
+NICK_GHOST_KILLED
+NICK_GETPASS_SYNTAX
+NICK_GETPASS_UNAVAILABLE
+NICK_GETPASS_PASSWORD_IS
+NICK_GETEMAIL_SYNTAX
+NICK_GETEMAIL_EMAILS_ARE
+NICK_GETEMAIL_NOT_USED
+NICK_SENDPASS_SYNTAX
+NICK_SENDPASS_UNAVAILABLE
+NICK_SENDPASS_SUBJECT
+NICK_SENDPASS_HEAD
+NICK_SENDPASS_LINE_1
+NICK_SENDPASS_LINE_2
+NICK_SENDPASS_LINE_3
+NICK_SENDPASS_LINE_4
+NICK_SENDPASS_LINE_5
+NICK_SENDPASS_OK
+NICK_FORBID_SYNTAX
+NICK_FORBID_SYNTAX_REASON
+NICK_FORBID_SUCCEEDED
+NICK_FORBID_FAILED
+NICK_REQUESTED
+NICK_REG_RESENT
+NICK_REG_UNABLE
+NICK_IS_PREREG
+NICK_ENTER_REG_CODE
+NICK_CONFIRM_NOT_FOUND
+NICK_CONFIRM_INVALID
+NICK_REG_MAIL_SUBJECT
+NICK_REG_MAIL_HEAD
+NICK_REG_MAIL_LINE_1
+NICK_REG_MAIL_LINE_2
+NICK_REG_MAIL_LINE_3
+NICK_REG_MAIL_LINE_4
+NICK_REG_MAIL_LINE_5
+NICK_GETPASS_PASSCODE_IS
+NICK_FORCE_REG
+CHAN_LEVEL_AUTOOP
+CHAN_LEVEL_AUTOVOICE
+CHAN_LEVEL_AUTOHALFOP
+CHAN_LEVEL_AUTOPROTECT
+CHAN_LEVEL_AUTODEOP
+CHAN_LEVEL_NOJOIN
+CHAN_LEVEL_INVITE
+CHAN_LEVEL_AKICK
+CHAN_LEVEL_SET
+CHAN_LEVEL_CLEAR
+CHAN_LEVEL_UNBAN
+CHAN_LEVEL_OPDEOP
+CHAN_LEVEL_ACCESS_LIST
+CHAN_LEVEL_ACCESS_CHANGE
+CHAN_LEVEL_MEMO
+CHAN_LEVEL_ASSIGN
+CHAN_LEVEL_BADWORDS
+CHAN_LEVEL_NOKICK
+CHAN_LEVEL_FANTASIA
+CHAN_LEVEL_SAY
+CHAN_LEVEL_GREET
+CHAN_LEVEL_VOICEME
+CHAN_LEVEL_VOICE
+CHAN_LEVEL_GETKEY
+CHAN_LEVEL_OPDEOPME
+CHAN_LEVEL_HALFOPME
+CHAN_LEVEL_HALFOP
+CHAN_LEVEL_PROTECTME
+CHAN_LEVEL_PROTECT
+CHAN_LEVEL_KICKME
+CHAN_LEVEL_KICK
+CHAN_LEVEL_SIGNKICK
+CHAN_LEVEL_BANME
+CHAN_LEVEL_BAN
+CHAN_LEVEL_TOPIC
+CHAN_LEVEL_INFO
+CHAN_IS_REGISTERED
+CHAN_NOT_ALLOWED_OP
+CHAN_MAY_NOT_BE_USED
+CHAN_NOT_ALLOWED_TO_JOIN
+CHAN_REGISTER_SYNTAX
+CHAN_REGISTER_DISABLED
+CHAN_REGISTER_NOT_LOCAL
+CHAN_MUST_REGISTER_NICK
+CHAN_MUST_IDENTIFY_NICK
+CHAN_MAY_NOT_BE_REGISTERED
+CHAN_ALREADY_REGISTERED
+CHAN_MUST_BE_CHANOP
+CHAN_REACHED_CHANNEL_LIMIT
+CHAN_EXCEEDED_CHANNEL_LIMIT
+CHAN_REGISTRATION_FAILED
+CHAN_REGISTERED
+CHAN_PASSWORD_IS
+CHAN_IDENTIFY_SYNTAX
+CHAN_IDENTIFY_FAILED
+CHAN_IDENTIFY_SUCCEEDED
+CHAN_LOGOUT_SYNTAX
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+CHAN_LOGOUT_SUCCEEDED
+CHAN_LOGOUT_ALL_SUCCEEDED
+CHAN_DROP_SYNTAX
+CHAN_DROP_DISABLED
+CHAN_DROPPED
+CHAN_SET_SYNTAX
+CHAN_SET_DISABLED
+CHAN_SET_UNKNOWN_OPTION
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+CHAN_FOUNDER_CHANGED
+CHAN_SUCCESSOR_CHANGED
+CHAN_SUCCESSOR_UNSET
+CHAN_SUCCESSOR_IS_FOUNDER
+CHAN_SET_PASSWORD_FAILED
+CHAN_PASSWORD_CHANGED
+CHAN_PASSWORD_CHANGED_TO
+CHAN_DESC_CHANGED
+CHAN_URL_CHANGED
+CHAN_URL_UNSET
+CHAN_EMAIL_CHANGED
+CHAN_EMAIL_UNSET
+CHAN_ENTRY_MSG_CHANGED
+CHAN_ENTRY_MSG_UNSET
+CHAN_SET_BANTYPE_INVALID
+CHAN_SET_BANTYPE_CHANGED
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+CHAN_SET_MLOCK_L_REQUIRED
+CHAN_SET_MLOCK_K_REQUIRED
+CHAN_MLOCK_CHANGED
+CHAN_SET_KEEPTOPIC_SYNTAX
+CHAN_SET_KEEPTOPIC_ON
+CHAN_SET_KEEPTOPIC_OFF
+CHAN_SET_TOPICLOCK_SYNTAX
+CHAN_SET_TOPICLOCK_ON
+CHAN_SET_TOPICLOCK_OFF
+CHAN_SET_PEACE_SYNTAX
+CHAN_SET_PEACE_ON
+CHAN_SET_PEACE_OFF
+CHAN_SET_PRIVATE_SYNTAX
+CHAN_SET_PRIVATE_ON
+CHAN_SET_PRIVATE_OFF
+CHAN_SET_SECUREOPS_SYNTAX
+CHAN_SET_SECUREOPS_ON
+CHAN_SET_SECUREOPS_OFF
+CHAN_SET_SECUREFOUNDER_SYNTAX
+CHAN_SET_SECUREFOUNDER_ON
+CHAN_SET_SECUREFOUNDER_OFF
+CHAN_SET_RESTRICTED_SYNTAX
+CHAN_SET_RESTRICTED_ON
+CHAN_SET_RESTRICTED_OFF
+CHAN_SET_SECURE_SYNTAX
+CHAN_SET_SECURE_ON
+CHAN_SET_SECURE_OFF
+CHAN_SET_SIGNKICK_SYNTAX
+CHAN_SET_SIGNKICK_ON
+CHAN_SET_SIGNKICK_LEVEL
+CHAN_SET_SIGNKICK_OFF
+CHAN_SET_OPNOTICE_SYNTAX
+CHAN_SET_OPNOTICE_ON
+CHAN_SET_OPNOTICE_OFF
+CHAN_SET_XOP_SYNTAX
+CHAN_SET_XOP_ON
+CHAN_SET_XOP_OFF
+CHAN_SET_NOEXPIRE_SYNTAX
+CHAN_SET_NOEXPIRE_ON
+CHAN_SET_NOEXPIRE_OFF
+CHAN_XOP_REACHED_LIMIT
+CHAN_XOP_LIST_FORMAT
+CHAN_XOP_ACCESS
+CHAN_AOP_SYNTAX
+CHAN_AOP_DISABLED
+CHAN_AOP_NICKS_ONLY
+CHAN_AOP_ADDED
+CHAN_AOP_MOVED
+CHAN_AOP_NO_SUCH_ENTRY
+CHAN_AOP_NOT_FOUND
+CHAN_AOP_NO_MATCH
+CHAN_AOP_DELETED
+CHAN_AOP_DELETED_ONE
+CHAN_AOP_DELETED_SEVERAL
+CHAN_AOP_LIST_EMPTY
+CHAN_AOP_LIST_HEADER
+CHAN_AOP_CLEAR
+CHAN_HOP_SYNTAX
+CHAN_HOP_DISABLED
+CHAN_HOP_NICKS_ONLY
+CHAN_HOP_ADDED
+CHAN_HOP_MOVED
+CHAN_HOP_NO_SUCH_ENTRY
+CHAN_HOP_NOT_FOUND
+CHAN_HOP_NO_MATCH
+CHAN_HOP_DELETED
+CHAN_HOP_DELETED_ONE
+CHAN_HOP_DELETED_SEVERAL
+CHAN_HOP_LIST_EMPTY
+CHAN_HOP_LIST_HEADER
+CHAN_HOP_CLEAR
+CHAN_SOP_SYNTAX
+CHAN_SOP_DISABLED
+CHAN_SOP_NICKS_ONLY
+CHAN_SOP_ADDED
+CHAN_SOP_MOVED
+CHAN_SOP_NO_SUCH_ENTRY
+CHAN_SOP_NOT_FOUND
+CHAN_SOP_NO_MATCH
+CHAN_SOP_DELETED
+CHAN_SOP_DELETED_ONE
+CHAN_SOP_DELETED_SEVERAL
+CHAN_SOP_LIST_EMPTY
+CHAN_SOP_LIST_HEADER
+CHAN_SOP_CLEAR
+CHAN_VOP_SYNTAX
+CHAN_VOP_DISABLED
+CHAN_VOP_NICKS_ONLY
+CHAN_VOP_ADDED
+CHAN_VOP_MOVED
+CHAN_VOP_NO_SUCH_ENTRY
+CHAN_VOP_NOT_FOUND
+CHAN_VOP_NO_MATCH
+CHAN_VOP_DELETED
+CHAN_VOP_DELETED_ONE
+CHAN_VOP_DELETED_SEVERAL
+CHAN_VOP_LIST_EMPTY
+CHAN_VOP_LIST_HEADER
+CHAN_VOP_CLEAR
+CHAN_ACCESS_SYNTAX
+CHAN_ACCESS_XOP
+CHAN_ACCESS_DISABLED
+CHAN_ACCESS_LEVEL_NONZERO
+CHAN_ACCESS_LEVEL_RANGE
+CHAN_ACCESS_NICKS_ONLY
+CHAN_ACCESS_REACHED_LIMIT
+CHAN_ACCESS_LEVEL_UNCHANGED
+CHAN_ACCESS_LEVEL_CHANGED
+CHAN_ACCESS_ADDED
+CHAN_ACCESS_NO_SUCH_ENTRY
+CHAN_ACCESS_NOT_FOUND
+CHAN_ACCESS_NO_MATCH
+CHAN_ACCESS_DELETED
+CHAN_ACCESS_DELETED_ONE
+CHAN_ACCESS_DELETED_SEVERAL
+CHAN_ACCESS_LIST_EMPTY
+CHAN_ACCESS_LIST_HEADER
+CHAN_ACCESS_LIST_FOOTER
+CHAN_ACCESS_LIST_XOP_FORMAT
+CHAN_ACCESS_LIST_AXS_FORMAT
+CHAN_ACCESS_CLEAR
+CHAN_AKICK_SYNTAX
+CHAN_AKICK_DISABLED
+CHAN_AKICK_ALREADY_EXISTS
+CHAN_AKICK_REACHED_LIMIT
+CHAN_AKICK_ADDED
+CHAN_AKICK_NO_SUCH_ENTRY
+CHAN_AKICK_NOT_FOUND
+CHAN_AKICK_NO_MATCH
+CHAN_AKICK_STUCK
+CHAN_AKICK_UNSTUCK
+CHAN_AKICK_DELETED
+CHAN_AKICK_DELETED_ONE
+CHAN_AKICK_DELETED_SEVERAL
+CHAN_AKICK_LIST_EMPTY
+CHAN_AKICK_LIST_HEADER
+CHAN_AKICK_LIST_FORMAT
+CHAN_AKICK_VIEW_FORMAT
+CHAN_AKICK_VIEW_FORMAT_STUCK
+CHAN_AKICK_ENFORCE_DONE
+CHAN_AKICK_CLEAR
+CHAN_LEVELS_SYNTAX
+CHAN_LEVELS_XOP
+CHAN_LEVELS_RANGE
+CHAN_LEVELS_CHANGED
+CHAN_LEVELS_UNKNOWN
+CHAN_LEVELS_DISABLED
+CHAN_LEVELS_LIST_HEADER
+CHAN_LEVELS_LIST_DISABLED
+CHAN_LEVELS_LIST_FOUNDER
+CHAN_LEVELS_LIST_NORMAL
+CHAN_LEVELS_RESET
+CHAN_INFO_SYNTAX
+CHAN_INFO_HEADER
+CHAN_INFO_FOUNDER
+CHAN_INFO_NO_FOUNDER
+CHAN_INFO_SUCCESSOR
+CHAN_INFO_NO_SUCCESSOR
+CHAN_INFO_DESCRIPTION
+CHAN_INFO_ENTRYMSG
+CHAN_INFO_TIME_REGGED
+CHAN_INFO_LAST_USED
+CHAN_INFO_LAST_TOPIC
+CHAN_INFO_TOPIC_SET_BY
+CHAN_INFO_URL
+CHAN_INFO_EMAIL
+CHAN_INFO_BANTYPE
+CHAN_INFO_OPTIONS
+CHAN_INFO_OPT_KEEPTOPIC
+CHAN_INFO_OPT_OPNOTICE
+CHAN_INFO_OPT_PEACE
+CHAN_INFO_OPT_PRIVATE
+CHAN_INFO_OPT_RESTRICTED
+CHAN_INFO_OPT_SECURE
+CHAN_INFO_OPT_SECUREOPS
+CHAN_INFO_OPT_SECUREFOUNDER
+CHAN_INFO_OPT_SIGNKICK
+CHAN_INFO_OPT_TOPICLOCK
+CHAN_INFO_OPT_XOP
+CHAN_INFO_OPT_NONE
+CHAN_INFO_MODE_LOCK
+CHAN_INFO_NO_EXPIRE
+CHAN_LIST_SYNTAX
+CHAN_LIST_SERVADMIN_SYNTAX
+CHAN_LIST_HEADER
+CHAN_LIST_FORMAT
+CHAN_LIST_END
+CHAN_INVITE_SYNTAX
+CHAN_UNBAN_SYNTAX
+CHAN_UNBANNED
+CHAN_TOPIC_SYNTAX
+CHAN_CLEAR_SYNTAX
+CHAN_CLEARED_BANS
+CHAN_CLEARED_EXCEPTS
+CHAN_CLEARED_MODES
+CHAN_CLEARED_OPS
+CHAN_CLEARED_VOICES
+CHAN_CLEARED_USERS
+CHAN_GETPASS_SYNTAX
+CHAN_GETPASS_UNAVAILABLE
+CHAN_GETPASS_PASSWORD_IS
+CHAN_SENDPASS_SYNTAX
+CHAN_SENDPASS_UNAVAILABLE
+CHAN_SENDPASS_SUBJECT
+CHAN_SENDPASS_HEAD
+CHAN_SENDPASS_LINE_1
+CHAN_SENDPASS_LINE_2
+CHAN_SENDPASS_LINE_3
+CHAN_SENDPASS_LINE_4
+CHAN_SENDPASS_LINE_5
+CHAN_SENDPASS_OK
+CHAN_FORBID_SYNTAX
+CHAN_FORBID_SYNTAX_REASON
+CHAN_FORBID_SUCCEEDED
+CHAN_FORBID_FAILED
+CHAN_FORBID_REASON
+CHAN_SUSPEND_SYNTAX
+CHAN_SUSPEND_SYNTAX_REASON
+CHAN_SUSPEND_SUCCEEDED
+CHAN_SUSPEND_FAILED
+CHAN_SUSPEND_REASON
+CHAN_UNSUSPEND_SYNTAX
+CHAN_UNSUSPEND_ERROR
+CHAN_UNSUSPEND_SUCCEEDED
+CHAN_UNSUSPEND_FAILED
+CHAN_EXCEPTED
+MEMO_HAVE_NEW_MEMO
+MEMO_HAVE_NEW_MEMOS
+MEMO_TYPE_READ_LAST
+MEMO_TYPE_READ_NUM
+MEMO_TYPE_LIST_NEW
+MEMO_AT_LIMIT
+MEMO_OVER_LIMIT
+MEMO_X_MANY_NOTICE
+MEMO_X_ONE_NOTICE
+MEMO_NEW_X_MEMO_ARRIVED
+MEMO_NEW_MEMO_ARRIVED
+MEMO_HAVE_NO_MEMOS
+MEMO_X_HAS_NO_MEMOS
+MEMO_DOES_NOT_EXIST
+MEMO_LIST_NOT_FOUND
+MEMO_SEND_SYNTAX
+MEMO_SEND_DISABLED
+MEMO_SEND_PLEASE_WAIT
+MEMO_X_GETS_NO_MEMOS
+MEMO_X_HAS_TOO_MANY_MEMOS
+MEMO_SENT
+MEMO_MASS_SENT
+MEMO_CANCEL_SYNTAX
+MEMO_CANCEL_DISABLED
+MEMO_CANCEL_NONE
+MEMO_CANCELLED
+MEMO_LIST_SYNTAX
+MEMO_HAVE_NO_NEW_MEMOS
+MEMO_X_HAS_NO_NEW_MEMOS
+MEMO_LIST_MEMOS
+MEMO_LIST_NEW_MEMOS
+MEMO_LIST_CHAN_MEMOS
+MEMO_LIST_CHAN_NEW_MEMOS
+MEMO_LIST_HEADER
+MEMO_LIST_FORMAT
+MEMO_READ_SYNTAX
+MEMO_HEADER
+MEMO_CHAN_HEADER
+MEMO_TEXT
+MEMO_DEL_SYNTAX
+MEMO_DELETED_NONE
+MEMO_DELETED_ONE
+MEMO_DELETED_SEVERAL
+MEMO_DELETED_ALL
+MEMO_CHAN_DELETED_ALL
+MEMO_SET_SYNTAX
+MEMO_SET_DISABLED
+MEMO_SET_UNKNOWN_OPTION
+MEMO_SET_NOTIFY_SYNTAX
+MEMO_SET_NOTIFY_ON
+MEMO_SET_NOTIFY_LOGON
+MEMO_SET_NOTIFY_NEW
+MEMO_SET_NOTIFY_OFF
+MEMO_SET_LIMIT_SYNTAX
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+MEMO_SET_LIMIT_FORBIDDEN
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+MEMO_SET_LIMIT_TOO_HIGH
+MEMO_SET_LIMIT_OVERFLOW
+MEMO_SET_YOUR_LIMIT
+MEMO_SET_YOUR_LIMIT_ZERO
+MEMO_UNSET_YOUR_LIMIT
+MEMO_SET_LIMIT
+MEMO_SET_LIMIT_ZERO
+MEMO_UNSET_LIMIT
+MEMO_INFO_SYNTAX
+MEMO_INFO_SERVADMIN_SYNTAX
+MEMO_INFO_NO_MEMOS
+MEMO_INFO_MEMO
+MEMO_INFO_MEMO_UNREAD
+MEMO_INFO_MEMOS
+MEMO_INFO_MEMOS_ONE_UNREAD
+MEMO_INFO_MEMOS_SOME_UNREAD
+MEMO_INFO_MEMOS_ALL_UNREAD
+MEMO_INFO_LIMIT
+MEMO_INFO_HARD_LIMIT
+MEMO_INFO_LIMIT_ZERO
+MEMO_INFO_HARD_LIMIT_ZERO
+MEMO_INFO_NO_LIMIT
+MEMO_INFO_NOTIFY_OFF
+MEMO_INFO_NOTIFY_ON
+MEMO_INFO_NOTIFY_RECEIVE
+MEMO_INFO_NOTIFY_SIGNON
+MEMO_INFO_X_NO_MEMOS
+MEMO_INFO_X_MEMO
+MEMO_INFO_X_MEMO_UNREAD
+MEMO_INFO_X_MEMOS
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+MEMO_INFO_X_LIMIT
+MEMO_INFO_X_HARD_LIMIT
+MEMO_INFO_X_NO_LIMIT
+MEMO_INFO_X_NOTIFY_OFF
+MEMO_INFO_X_NOTIFY_ON
+MEMO_INFO_X_NOTIFY_RECEIVE
+MEMO_INFO_X_NOTIFY_SIGNON
+BOT_DOES_NOT_EXIST
+BOT_NOT_ASSIGNED
+BOT_NOT_ON_CHANNEL
+BOT_REASON_BADWORD
+BOT_REASON_BADWORD_GENTLE
+BOT_REASON_BOLD
+BOT_REASON_CAPS
+BOT_REASON_COLOR
+BOT_REASON_FLOOD
+BOT_REASON_REPEAT
+BOT_REASON_REVERSE
+BOT_REASON_UNDERLINE
+BOT_SEEN_BOT
+BOT_SEEN_YOU
+BOT_SEEN_ON_CHANNEL
+BOT_SEEN_ON_CHANNEL_AS
+BOT_SEEN_ON
+BOT_SEEN_NEVER
+BOT_SEEN_UNKNOWN
+BOT_BOT_SYNTAX
+BOT_BOT_ALREADY_EXISTS
+BOT_BOT_CREATION_FAILED
+BOT_BOT_READONLY
+BOT_BOT_ADDED
+BOT_BOT_ANY_CHANGES
+BOT_BOT_CHANGED
+BOT_BOT_DELETED
+BOT_BOTLIST_HEADER
+BOT_BOTLIST_PRIVATE_HEADER
+BOT_BOTLIST_FOOTER
+BOT_BOTLIST_EMPTY
+BOT_ASSIGN_SYNTAX
+BOT_ASSIGN_READONLY
+BOT_ASSIGN_ALREADY
+BOT_ASSIGN_ASSIGNED
+BOT_UNASSIGN_SYNTAX
+BOT_UNASSIGN_UNASSIGNED
+BOT_INFO_SYNTAX
+BOT_INFO_NOT_FOUND
+BOT_INFO_BOT_HEADER
+BOT_INFO_BOT_MASK
+BOT_INFO_BOT_REALNAME
+BOT_INFO_BOT_CREATED
+BOT_INFO_BOT_USAGE
+BOT_INFO_BOT_OPTIONS
+BOT_INFO_OPT_PRIVATE
+BOT_INFO_CHAN_HEADER
+BOT_INFO_CHAN_BOT
+BOT_INFO_CHAN_BOT_NONE
+BOT_INFO_CHAN_KICK_BADWORDS
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+BOT_INFO_CHAN_KICK_BOLDS
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+BOT_INFO_CHAN_KICK_CAPS_ON
+BOT_INFO_CHAN_KICK_CAPS_BAN
+BOT_INFO_CHAN_KICK_CAPS_OFF
+BOT_INFO_CHAN_KICK_COLORS
+BOT_INFO_CHAN_KICK_COLORS_BAN
+BOT_INFO_CHAN_KICK_FLOOD_ON
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+BOT_INFO_CHAN_KICK_REPEAT_ON
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+BOT_INFO_CHAN_KICK_REVERSES
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+BOT_INFO_CHAN_KICK_UNDERLINES
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+BOT_INFO_ACTIVE
+BOT_INFO_INACTIVE
+BOT_INFO_CHAN_OPTIONS
+BOT_INFO_OPT_DONTKICKOPS
+BOT_INFO_OPT_DONTKICKVOICES
+BOT_INFO_OPT_FANTASY
+BOT_INFO_OPT_GREET
+BOT_INFO_OPT_NOBOT
+BOT_INFO_OPT_SYMBIOSIS
+BOT_INFO_OPT_NONE
+BOT_SET_SYNTAX
+BOT_SET_DISABLED
+BOT_SET_UNKNOWN
+BOT_SET_DONTKICKOPS_SYNTAX
+BOT_SET_DONTKICKOPS_ON
+BOT_SET_DONTKICKOPS_OFF
+BOT_SET_DONTKICKVOICES_SYNTAX
+BOT_SET_DONTKICKVOICES_ON
+BOT_SET_DONTKICKVOICES_OFF
+BOT_SET_FANTASY_SYNTAX
+BOT_SET_FANTASY_ON
+BOT_SET_FANTASY_OFF
+BOT_SET_GREET_SYNTAX
+BOT_SET_GREET_ON
+BOT_SET_GREET_OFF
+BOT_SET_NOBOT_SYNTAX
+BOT_SET_NOBOT_ON
+BOT_SET_NOBOT_OFF
+BOT_SET_PRIVATE_SYNTAX
+BOT_SET_PRIVATE_ON
+BOT_SET_PRIVATE_OFF
+BOT_SET_SYMBIOSIS_SYNTAX
+BOT_SET_SYMBIOSIS_ON
+BOT_SET_SYMBIOSIS_OFF
+BOT_KICK_SYNTAX
+BOT_KICK_DISABLED
+BOT_KICK_UNKNOWN
+BOT_KICK_BAD_TTB
+BOT_KICK_BADWORDS_ON
+BOT_KICK_BADWORDS_ON_BAN
+BOT_KICK_BADWORDS_OFF
+BOT_KICK_BOLDS_ON
+BOT_KICK_BOLDS_ON_BAN
+BOT_KICK_BOLDS_OFF
+BOT_KICK_CAPS_ON
+BOT_KICK_CAPS_ON_BAN
+BOT_KICK_CAPS_OFF
+BOT_KICK_COLORS_ON
+BOT_KICK_COLORS_ON_BAN
+BOT_KICK_COLORS_OFF
+BOT_KICK_FLOOD_ON
+BOT_KICK_FLOOD_ON_BAN
+BOT_KICK_FLOOD_OFF
+BOT_KICK_REPEAT_ON
+BOT_KICK_REPEAT_ON_BAN
+BOT_KICK_REPEAT_OFF
+BOT_KICK_REVERSES_ON
+BOT_KICK_REVERSES_ON_BAN
+BOT_KICK_REVERSES_OFF
+BOT_KICK_UNDERLINES_ON
+BOT_KICK_UNDERLINES_ON_BAN
+BOT_KICK_UNDERLINES_OFF
+BOT_BADWORDS_SYNTAX
+BOT_BADWORDS_DISABLED
+BOT_BADWORDS_REACHED_LIMIT
+BOT_BADWORDS_ALREADY_EXISTS
+BOT_BADWORDS_ADDED
+BOT_BADWORDS_NO_SUCH_ENTRY
+BOT_BADWORDS_NOT_FOUND
+BOT_BADWORDS_NO_MATCH
+BOT_BADWORDS_DELETED
+BOT_BADWORDS_DELETED_ONE
+BOT_BADWORDS_DELETED_SEVERAL
+BOT_BADWORDS_LIST_EMPTY
+BOT_BADWORDS_LIST_HEADER
+BOT_BADWORDS_LIST_FORMAT
+BOT_BADWORDS_CLEAR
+BOT_SAY_SYNTAX
+BOT_ACT_SYNTAX
+BOT_EXCEPT
+BOT_BAD_NICK
+BOT_BAD_HOST
+BOT_BAD_IDENT
+OPER_BOUNCY_MODES
+OPER_BOUNCY_MODES_U_LINE
+OPER_GLOBAL_SYNTAX
+OPER_STATS_UNKNOWN_OPTION
+OPER_STATS_CURRENT_USERS
+OPER_STATS_MAX_USERS
+OPER_STATS_UPTIME_DHMS
+OPER_STATS_UPTIME_1DHMS
+OPER_STATS_UPTIME_HMS
+OPER_STATS_UPTIME_HM1S
+OPER_STATS_UPTIME_H1MS
+OPER_STATS_UPTIME_H1M1S
+OPER_STATS_UPTIME_1HMS
+OPER_STATS_UPTIME_1HM1S
+OPER_STATS_UPTIME_1H1MS
+OPER_STATS_UPTIME_1H1M1S
+OPER_STATS_UPTIME_MS
+OPER_STATS_UPTIME_M1S
+OPER_STATS_UPTIME_1MS
+OPER_STATS_UPTIME_1M1S
+OPER_STATS_BYTES_READ
+OPER_STATS_BYTES_WRITTEN
+OPER_STATS_USER_MEM
+OPER_STATS_CHANNEL_MEM
+OPER_STATS_GROUPS_MEM
+OPER_STATS_ALIASES_MEM
+OPER_STATS_CHANSERV_MEM
+OPER_STATS_BOTSERV_MEM
+OPER_STATS_OPERSERV_MEM
+OPER_STATS_SESSIONS_MEM
+OPER_STATS_PROXY_MEM
+OPER_STATS_AKILL_COUNT
+OPER_STATS_AKILL_EXPIRE_DAYS
+OPER_STATS_AKILL_EXPIRE_DAY
+OPER_STATS_AKILL_EXPIRE_HOURS
+OPER_STATS_AKILL_EXPIRE_HOUR
+OPER_STATS_AKILL_EXPIRE_MINS
+OPER_STATS_AKILL_EXPIRE_MIN
+OPER_STATS_AKILL_EXPIRE_NONE
+OPER_STATS_SGLINE_COUNT
+OPER_STATS_SGLINE_EXPIRE_DAYS
+OPER_STATS_SGLINE_EXPIRE_DAY
+OPER_STATS_SGLINE_EXPIRE_HOURS
+OPER_STATS_SGLINE_EXPIRE_HOUR
+OPER_STATS_SGLINE_EXPIRE_MINS
+OPER_STATS_SGLINE_EXPIRE_MIN
+OPER_STATS_SGLINE_EXPIRE_NONE
+OPER_STATS_SQLINE_COUNT
+OPER_STATS_SQLINE_EXPIRE_DAYS
+OPER_STATS_SQLINE_EXPIRE_DAY
+OPER_STATS_SQLINE_EXPIRE_HOURS
+OPER_STATS_SQLINE_EXPIRE_HOUR
+OPER_STATS_SQLINE_EXPIRE_MINS
+OPER_STATS_SQLINE_EXPIRE_MIN
+OPER_STATS_SQLINE_EXPIRE_NONE
+OPER_STATS_SZLINE_COUNT
+OPER_STATS_SZLINE_EXPIRE_DAYS
+OPER_STATS_SZLINE_EXPIRE_DAY
+OPER_STATS_SZLINE_EXPIRE_HOURS
+OPER_STATS_SZLINE_EXPIRE_HOUR
+OPER_STATS_SZLINE_EXPIRE_MINS
+OPER_STATS_SZLINE_EXPIRE_MIN
+OPER_STATS_SZLINE_EXPIRE_NONE
+OPER_STATS_RESET
+OPER_MODE_SYNTAX
+OPER_UMODE_SYNTAX
+OPER_UMODE_SUCCESS
+OPER_UMODE_CHANGED
+OPER_OLINE_SYNTAX
+OPER_OLINE_SUCCESS
+OPER_OLINE_IRCOP
+OPER_CLEARMODES_SYNTAX
+OPER_CLEARMODES_DONE
+OPER_CLEARMODES_ALL_DONE
+OPER_KICK_SYNTAX
+OPER_SVSNICK_SYNTAX
+OPER_SVSNICK_NEWNICK
+OPER_ADMIN_SYNTAX
+OPER_ADMIN_SKELETON
+OPER_ADMIN_EXISTS
+OPER_ADMIN_REACHED_LIMIT
+OPER_ADMIN_ADDED
+OPER_ADMIN_NOT_FOUND
+OPER_ADMIN_NO_MATCH
+OPER_ADMIN_DELETED
+OPER_ADMIN_DELETED_ONE
+OPER_ADMIN_DELETED_SEVERAL
+OPER_ADMIN_LIST_EMPTY
+OPER_ADMIN_LIST_HEADER
+OPER_ADMIN_LIST_FORMAT
+OPER_ADMIN_CLEAR
+OPER_OPER_SYNTAX
+OPER_OPER_SKELETON
+OPER_OPER_EXISTS
+OPER_OPER_REACHED_LIMIT
+OPER_OPER_ADDED
+OPER_OPER_NOT_FOUND
+OPER_OPER_NO_MATCH
+OPER_OPER_DELETED
+OPER_OPER_DELETED_ONE
+OPER_OPER_DELETED_SEVERAL
+OPER_OPER_LIST_EMPTY
+OPER_OPER_LIST_HEADER
+OPER_OPER_LIST_FORMAT
+OPER_OPER_CLEAR
+OPER_AKILL_SYNTAX
+OPER_AKILL_EXISTS
+OPER_AKILL_ALREADY_COVERED
+OPER_AKILL_REACHED_LIMIT
+OPER_AKILL_NO_NICK
+OPER_AKILL_ADDED
+OPER_AKILL_CHANGED
+OPER_AKILL_NOT_FOUND
+OPER_AKILL_NO_MATCH
+OPER_AKILL_DELETED
+OPER_AKILL_DELETED_ONE
+OPER_AKILL_DELETED_SEVERAL
+OPER_AKILL_LIST_EMPTY
+OPER_AKILL_LIST_HEADER
+OPER_AKILL_LIST_FORMAT
+OPER_AKILL_VIEW_HEADER
+OPER_AKILL_VIEW_FORMAT
+OPER_AKILL_CLEAR
+OPER_CHANKILL_SYNTAX
+OPER_SGLINE_SYNTAX
+OPER_SGLINE_UNSUPPORTED
+OPER_SGLINE_EXISTS
+OPER_SGLINE_ALREADY_COVERED
+OPER_SGLINE_REACHED_LIMIT
+OPER_SGLINE_ADDED
+OPER_SGLINE_CHANGED
+OPER_SGLINE_NOT_FOUND
+OPER_SGLINE_NO_MATCH
+OPER_SGLINE_DELETED
+OPER_SGLINE_DELETED_ONE
+OPER_SGLINE_DELETED_SEVERAL
+OPER_SGLINE_LIST_EMPTY
+OPER_SGLINE_LIST_HEADER
+OPER_SGLINE_LIST_FORMAT
+OPER_SGLINE_VIEW_HEADER
+OPER_SGLINE_VIEW_FORMAT
+OPER_SGLINE_CLEAR
+OPER_SQLINE_SYNTAX
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+OPER_SQLINE_EXISTS
+OPER_SQLINE_ALREADY_COVERED
+OPER_SQLINE_REACHED_LIMIT
+OPER_SQLINE_ADDED
+OPER_SQLINE_CHANGED
+OPER_SQLINE_NOT_FOUND
+OPER_SQLINE_NO_MATCH
+OPER_SQLINE_DELETED
+OPER_SQLINE_DELETED_ONE
+OPER_SQLINE_DELETED_SEVERAL
+OPER_SQLINE_LIST_EMPTY
+OPER_SQLINE_LIST_HEADER
+OPER_SQLINE_LIST_FORMAT
+OPER_SQLINE_VIEW_HEADER
+OPER_SQLINE_VIEW_FORMAT
+OPER_SQLINE_CLEAR
+OPER_SZLINE_SYNTAX
+OPER_SZLINE_UNSUPPORTED
+OPER_SZLINE_EXISTS
+OPER_SZLINE_ALREADY_COVERED
+OPER_SZLINE_REACHED_LIMIT
+OPER_SZLINE_ONLY_IPS
+OPER_SZLINE_ADDED
+OPER_SZLINE_CHANGED
+OPER_SZLINE_NOT_FOUND
+OPER_SZLINE_NO_MATCH
+OPER_SZLINE_DELETED
+OPER_SZLINE_DELETED_ONE
+OPER_SZLINE_DELETED_SEVERAL
+OPER_SZLINE_LIST_EMPTY
+OPER_SZLINE_LIST_HEADER
+OPER_SZLINE_LIST_FORMAT
+OPER_SZLINE_VIEW_HEADER
+OPER_SZLINE_VIEW_FORMAT
+OPER_SZLINE_CLEAR
+OPER_SET_SYNTAX
+OPER_SET_IGNORE_ON
+OPER_SET_IGNORE_OFF
+OPER_SET_IGNORE_ERROR
+OPER_SET_READONLY_ON
+OPER_SET_READONLY_OFF
+OPER_SET_READONLY_ERROR
+OPER_SET_LOGCHAN_ON
+OPER_SET_LOGCHAN_OFF
+OPER_SET_LOGCHAN_ERROR
+OPER_SET_DEBUG_ON
+OPER_SET_DEBUG_OFF
+OPER_SET_DEBUG_LEVEL
+OPER_SET_DEBUG_ERROR
+OPER_SET_NOEXPIRE_ON
+OPER_SET_NOEXPIRE_OFF
+OPER_SET_NOEXPIRE_ERROR
+OPER_SET_UNKNOWN_OPTION
+OPER_NOOP_SYNTAX
+OPER_NOOP_SET
+OPER_NOOP_REVOKE
+OPER_JUPE_SYNTAX
+OPER_JUPE_HOST_ERROR
+OPER_RAW_SYNTAX
+OPER_UPDATING
+OPER_RELOAD
+OPER_CANNOT_RESTART
+OPER_IGNORE_SYNTAX
+OPER_IGNORE_VALID_TIME
+OPER_IGNORE_TIME_DONE
+OPER_IGNORE_PERM_DONE
+OPER_IGNORE_DEL_DONE
+OPER_IGNORE_LIST
+OPER_IGNORE_LIST_NOMATCH
+OPER_IGNORE_LIST_EMPTY
+OPER_IGNORE_LIST_CLEARED
+OPER_KILLCLONES_SYNTAX
+OPER_KILLCLONES_UNKNOWN_NICK
+OPER_CHANLIST_HEADER
+OPER_CHANLIST_HEADER_USER
+OPER_CHANLIST_RECORD
+OPER_CHANLIST_END
+OPER_USERLIST_HEADER
+OPER_USERLIST_HEADER_CHAN
+OPER_USERLIST_RECORD
+OPER_USERLIST_END
+OPER_CACHE_SYNTAX
+OPER_CACHE_DISABLED
+OPER_CACHE_NOT_FOUND
+OPER_CACHE_REMOVED
+OPER_CACHE_HEADER
+OPER_CACHE_LIST
+OPER_CACHE_FOOTER
+OPER_CACHE_QUEUED
+OPER_CACHE_PROGRESS
+OPER_CACHE_NORMAL
+OPER_CACHE_WINGATE
+OPER_CACHE_SOCKS4
+OPER_CACHE_SOCKS5
+OPER_CACHE_HTTP
+OPER_SUPER_ADMIN_ON
+OPER_SUPER_ADMIN_OFF
+OPER_SUPER_ADMIN_SYNTAX
+OPER_SUPER_ADMIN_WALL_ON
+OPER_SUPER_ADMIN_WALL_OFF
+OPER_SUPER_ADMIN_ONLY
+OPER_STAFF_LIST_HEADER
+OPER_STAFF_FORMAT
+OPER_STAFF_AFORMAT
+OPER_DEFCON_SYNTAX
+OPER_DEFCON_DENIED
+OPER_DEFCON_NO_CONF
+OPER_DEFCON_CHANGED
+OPER_DEFCON_WALL
+DEFCON_GLOBAL
+OPER_MODULE_LOADED
+OPER_MODULE_UNLOADED
+OPER_MODULE_LOAD_FAIL
+OPER_MODULE_REMOVE_FAIL
+OPER_MODULE_LOAD_SYNTAX
+OPER_MODULE_UNLOAD_SYNTAX
+OPER_MODULE_LIST
+OPER_MODULE_INFO_LIST
+OPER_MODULE_CMD_LIST
+OPER_MODULE_MSG_LIST
+OPER_MODULE_NO_LIST
+OPER_MODULE_NO_INFO
+OPER_MODULE_INFO_SYNTAX
+MODULE_HELP_HEADER
+OPER_EXCEPTION_SYNTAX
+OPER_EXCEPTION_ADD_SYNTAX
+OPER_EXCEPTION_DEL_SYNTAX
+OPER_EXCEPTION_MOVE_SYNTAX
+OPER_EXCEPTION_DISABLED
+OPER_EXCEPTION_ALREADY_PRESENT
+OPER_EXCEPTION_TOO_MANY
+OPER_EXCEPTION_ADDED
+OPER_EXCEPTION_MOVED
+OPER_EXCEPTION_NO_SUCH_ENTRY
+OPER_EXCEPTION_NOT_FOUND
+OPER_EXCEPTION_NO_MATCH
+OPER_EXCEPTION_DELETED
+OPER_EXCEPTION_DELETED_ONE
+OPER_EXCEPTION_DELETED_SEVERAL
+OPER_EXCEPTION_LIST_HEADER
+OPER_EXCEPTION_LIST_FORMAT
+OPER_EXCEPTION_LIST_COLHEAD
+OPER_EXCEPTION_VIEW_FORMAT
+OPER_EXCEPTION_INVALID_LIMIT
+OPER_EXCEPTION_INVALID_HOSTMASK
+OPER_SESSION_SYNTAX
+OPER_SESSION_LIST_SYNTAX
+OPER_SESSION_VIEW_SYNTAX
+OPER_SESSION_DISABLED
+OPER_SESSION_INVALID_THRESHOLD
+OPER_SESSION_NOT_FOUND
+OPER_SESSION_LIST_HEADER
+OPER_SESSION_LIST_COLHEAD
+OPER_SESSION_LIST_FORMAT
+OPER_SESSION_VIEW_FORMAT
+OPER_HELP_EXCEPTION
+OPER_HELP_SESSION
+OPER_HELP_STAFF
+OPER_HELP_DEFCON
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+OPER_HELP_DEFCON_NO_NEW_NICKS
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+OPER_HELP_DEFCON_REDUCE_SESSION
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+OPER_HELP_DEFCON_OPER_ONLY
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+OPER_HELP_CHANKILL
+NEWS_LOGON_TEXT
+NEWS_OPER_TEXT
+NEWS_RANDOM_TEXT
+NEWS_LOGON_SYNTAX
+NEWS_LOGON_LIST_HEADER
+NEWS_LOGON_LIST_ENTRY
+NEWS_LOGON_LIST_NONE
+NEWS_LOGON_ADD_SYNTAX
+NEWS_LOGON_ADD_FULL
+NEWS_LOGON_ADDED
+NEWS_LOGON_DEL_SYNTAX
+NEWS_LOGON_DEL_NOT_FOUND
+NEWS_LOGON_DELETED
+NEWS_LOGON_DEL_NONE
+NEWS_LOGON_DELETED_ALL
+NEWS_OPER_SYNTAX
+NEWS_OPER_LIST_HEADER
+NEWS_OPER_LIST_ENTRY
+NEWS_OPER_LIST_NONE
+NEWS_OPER_ADD_SYNTAX
+NEWS_OPER_ADD_FULL
+NEWS_OPER_ADDED
+NEWS_OPER_DEL_SYNTAX
+NEWS_OPER_DEL_NOT_FOUND
+NEWS_OPER_DELETED
+NEWS_OPER_DEL_NONE
+NEWS_OPER_DELETED_ALL
+NEWS_RANDOM_SYNTAX
+NEWS_RANDOM_LIST_HEADER
+NEWS_RANDOM_LIST_ENTRY
+NEWS_RANDOM_LIST_NONE
+NEWS_RANDOM_ADD_SYNTAX
+NEWS_RANDOM_ADD_FULL
+NEWS_RANDOM_ADDED
+NEWS_RANDOM_DEL_SYNTAX
+NEWS_RANDOM_DEL_NOT_FOUND
+NEWS_RANDOM_DELETED
+NEWS_RANDOM_DEL_NONE
+NEWS_RANDOM_DELETED_ALL
+NEWS_HELP_LOGON
+NEWS_HELP_OPER
+NEWS_HELP_RANDOM
+HELP_HELP
+HELP_HELP_BOT
+HELP_HELP_HOST
+NICK_HELP
+NICK_HELP_EXPIRES
+NICK_HELP_REGISTER
+NICK_HELP_GROUP
+NICK_HELP_IDENTIFY
+NICK_HELP_UPDATE
+NICK_HELP_LOGOUT
+NICK_HELP_DROP
+NICK_HELP_ACCESS
+NICK_HELP_SET
+NICK_HELP_SET_DISPLAY
+NICK_HELP_SET_PASSWORD
+NICK_HELP_SET_LANGUAGE
+NICK_HELP_SET_URL
+NICK_HELP_SET_EMAIL
+NICK_HELP_SET_ICQ
+NICK_HELP_SET_GREET
+NICK_HELP_SET_KILL
+NICK_HELP_SET_SECURE
+NICK_HELP_SET_PRIVATE
+NICK_HELP_SET_HIDE
+NICK_HELP_SET_MSG
+NICK_HELP_RECOVER
+NICK_HELP_RELEASE
+NICK_HELP_GHOST
+NICK_HELP_INFO
+NICK_HELP_LIST
+NICK_HELP_ALIST
+NICK_HELP_GLIST
+NICK_HELP_STATUS
+NICK_HELP_SENDPASS
+NICK_SERVADMIN_HELP
+NICK_SERVADMIN_HELP_LOGOUT
+NICK_SERVADMIN_HELP_DROP
+NICK_SERVADMIN_HELP_SET
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+NICK_SERVADMIN_HELP_INFO
+NICK_SERVADMIN_HELP_LIST
+NICK_SERVADMIN_HELP_ALIST
+NICK_SERVADMIN_HELP_GLIST
+NICK_SERVADMIN_HELP_GETPASS
+NICK_SERVADMIN_HELP_GETEMAIL
+NICK_SERVADMIN_HELP_FORBID
+CHAN_HELP
+CHAN_HELP_UNREAL
+CHAN_HELP_ULTIMATE
+CHAN_HELP_ULTIMATE3
+CHAN_HELP_EXPIRES
+CHAN_HELP_REGISTER
+CHAN_HELP_IDENTIFY
+CHAN_HELP_LOGOUT
+CHAN_HELP_DROP
+CHAN_HELP_SET
+CHAN_HELP_SET_FOUNDER
+CHAN_HELP_SET_SUCCESSOR
+CHAN_HELP_SET_PASSWORD
+CHAN_HELP_SET_DESC
+CHAN_HELP_SET_URL
+CHAN_HELP_SET_EMAIL
+CHAN_HELP_SET_ENTRYMSG
+CHAN_HELP_SET_BANTYPE
+CHAN_HELP_SET_KEEPTOPIC
+CHAN_HELP_SET_TOPICLOCK
+CHAN_HELP_SET_MLOCK
+CHAN_HELP_SET_PEACE
+CHAN_HELP_SET_PRIVATE
+CHAN_HELP_SET_RESTRICTED
+CHAN_HELP_SET_SECURE
+CHAN_HELP_SET_SECUREOPS
+CHAN_HELP_SET_SECUREFOUNDER
+CHAN_HELP_SET_SIGNKICK
+CHAN_HELP_SET_XOP
+CHAN_HELP_SET_OPNOTICE
+CHAN_HELP_AOP
+CHAN_HELP_HOP
+CHAN_HELP_SOP
+CHAN_HELP_VOP
+CHAN_HELP_ACCESS
+CHAN_HELP_ACCESS_LEVELS
+CHAN_HELP_AKICK
+CHAN_HELP_LEVELS
+CHAN_HELP_LEVELS_DESC
+CHAN_HELP_LEVELS_DESC_FORMAT
+CHAN_HELP_INFO
+CHAN_HELP_LIST
+CHAN_HELP_OP
+CHAN_HELP_DEOP
+CHAN_HELP_VOICE
+CHAN_HELP_DEVOICE
+CHAN_HELP_HALFOP
+CHAN_HELP_DEHALFOP
+CHAN_HELP_PROTECT
+CHAN_HELP_DEPROTECT
+CHAN_HELP_OWNER
+CHAN_HELP_DEOWNER
+CHAN_HELP_INVITE
+CHAN_HELP_UNBAN
+CHAN_HELP_KICK
+CHAN_HELP_BAN
+CHAN_HELP_TOPIC
+CHAN_HELP_CLEAR
+CHAN_HELP_GETKEY
+CHAN_HELP_SENDPASS
+CHAN_SERVADMIN_HELP
+CHAN_SERVADMIN_HELP_LOGOUT
+CHAN_SERVADMIN_HELP_DROP
+CHAN_SERVADMIN_HELP_SET
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+CHAN_SERVADMIN_HELP_INFO
+CHAN_SERVADMIN_HELP_LIST
+CHAN_SERVADMIN_HELP_GETPASS
+CHAN_SERVADMIN_HELP_FORBID
+CHAN_SERVADMIN_HELP_SUSPEND
+CHAN_SERVADMIN_HELP_UNSUSPEND
+CHAN_SERVADMIN_HELP_STATUS
+MEMO_HELP
+MEMO_HELP_ADMIN
+MEMO_HELP_OPER
+MEMO_HELP_FOOTER
+MEMO_HELP_SEND
+MEMO_HELP_CANCEL
+MEMO_HELP_LIST
+MEMO_HELP_READ
+MEMO_HELP_DEL
+MEMO_HELP_SET
+MEMO_HELP_SET_NOTIFY
+MEMO_HELP_SET_LIMIT
+MEMO_HELP_INFO
+MEMO_SERVADMIN_HELP_SET_LIMIT
+MEMO_SERVADMIN_HELP_INFO
+MEMO_HELP_STAFF
+MEMO_HELP_SENDALL
+OPER_HELP
+OPER_HELP_OPER_CMD
+OPER_HELP_ADMIN_CMD
+OPER_HELP_ROOT_CMD
+OPER_HELP_LOGGED
+OPER_HELP_GLOBAL
+OPER_HELP_STATS
+OPER_HELP_OPER
+OPER_HELP_ADMIN
+OPER_HELP_IGNORE
+OPER_HELP_MODE
+OPER_HELP_UMODE
+OPER_HELP_OLINE
+OPER_HELP_CLEARMODES
+OPER_HELP_KICK
+OPER_HELP_SVSNICK
+OPER_HELP_AKILL
+OPER_HELP_SGLINE
+OPER_HELP_SQLINE
+OPER_HELP_SZLINE
+OPER_HELP_SET
+OPER_HELP_SET_READONLY
+OPER_HELP_SET_LOGCHAN
+OPER_HELP_SET_DEBUG
+OPER_HELP_SET_NOEXPIRE
+OPER_HELP_SET_SUPERADMIN
+OPER_HELP_NOOP
+OPER_HELP_JUPE
+OPER_HELP_RAW
+OPER_HELP_UPDATE
+OPER_HELP_RELOAD
+OPER_HELP_QUIT
+OPER_HELP_SHUTDOWN
+OPER_HELP_RESTART
+OPER_HELP_KILLCLONES
+OPER_HELP_CHANLIST
+OPER_HELP_USERLIST
+OPER_HELP_CACHE
+OPER_HELP_MODLOAD
+OPER_HELP_MODUNLOAD
+OPER_HELP_MODINFO
+OPER_HELP_MODLIST
+BOT_HELP
+BOT_HELP_BOTLIST
+BOT_HELP_ASSIGN
+BOT_HELP_UNASSIGN
+BOT_HELP_INFO
+BOT_HELP_SET
+BOT_HELP_SET_DONTKICKOPS
+BOT_HELP_SET_DONTKICKVOICES
+BOT_HELP_SET_FANTASY
+BOT_HELP_SET_GREET
+BOT_HELP_SET_SYMBIOSIS
+BOT_HELP_KICK
+BOT_HELP_KICK_BOLDS
+BOT_HELP_KICK_COLORS
+BOT_HELP_KICK_REVERSES
+BOT_HELP_KICK_UNDERLINES
+BOT_HELP_KICK_CAPS
+BOT_HELP_KICK_FLOOD
+BOT_HELP_KICK_REPEAT
+BOT_HELP_KICK_BADWORDS
+BOT_HELP_BADWORDS
+BOT_HELP_SAY
+BOT_HELP_ACT
+BOT_SERVADMIN_HELP
+BOT_SERVADMIN_HELP_BOT
+BOT_SERVADMIN_HELP_SET
+BOT_SERVADMIN_HELP_SET_NOBOT
+BOT_SERVADMIN_HELP_SET_PRIVATE
+HOST_EMPTY
+HOST_ENTRY
+HOST_IDENT_ENTRY
+HOST_SET
+HOST_IDENT_SET
+HOST_SETALL
+HOST_DELALL
+HOST_DELALL_SYNTAX
+HOST_IDENT_SETALL
+HOST_SET_ERROR
+HOST_SET_IDENT_ERROR
+HOST_SET_TOOLONG
+HOST_SET_IDENTTOOLONG
+HOST_NOREG
+HOST_SET_SYNTAX
+HOST_SETALL_SYNTAX
+HOST_DENIED
+HOST_NOT_ASSIGNED
+HOST_ACTIVATED
+HOST_IDENT_ACTIVATED
+HOST_ID
+HOST_NOT_REGED
+HOST_DEL
+HOST_DEL_SYNTAX
+HOST_OFF_UNREAL
+HOST_NO_VIDENT
+HOST_GROUP
+HOST_IDENT_GROUP
+HOST_LIST_FOOTER
+HOST_LIST_RANGE_FOOTER
+HOST_LIST_KEY_FOOTER
+HOST_HELP
+HOST_OPER_HELP
+HOST_ADMIN_HELP
+HOST_HELP_ON
+HOST_HELP_SET
+HOST_HELP_DELALL
+HOST_HELP_SETALL
+HOST_HELP_OFF
+HOST_HELP_DEL
+HOST_HELP_LIST
+HOST_HELP_GROUP
diff --git a/lang/it.l b/lang/it.l
new file mode 100644
index 000000000..09003f939
--- /dev/null
+++ b/lang/it.l
@@ -0,0 +1,6208 @@
+# Italian language file.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# Translated by Daniele Nicolucci <jollino@discussioni.org>
+#
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ Italiano (Italiano)
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %a %d %b %Y %Z - %H:%M:%S
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %d %b %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %d %b %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Dom
+ Lun
+ Mar
+ Mer
+ Gio
+ Ven
+ Sab
+# %A
+STRFTIME_DAYS_LONG
+ Domenica
+ Lunedì
+ Martedì
+ Mercoledì
+ Giovedì
+ Venerdì
+ Sabato
+# %b
+STRFTIME_MONTHS_SHORT
+ Gen
+ Feb
+ Mar
+ Apr
+ Mag
+ Giu
+ Lug
+ Ago
+ Set
+ Ott
+ Nov
+ Dic
+# %B
+STRFTIME_MONTHS_LONG
+ Gennaio
+ Febbraio
+ Marzo
+ Aprile
+ Maggio
+ Giugno
+ Luglio
+ Agosto
+ Settembre
+ Ottobre
+ Novembre
+ Dicembre
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Errore interno - Impossibile elaborare la richiesta.
+UNKNOWN_COMMAND
+ Comando sconosciuto %s.
+UNKNOWN_COMMAND_HELP
+ Comando sconosciuto %s. "/msg %s HELP" per l'aiuto.
+SYNTAX_ERROR
+ Sintassi: %s
+MORE_INFO
+ /msg %s HELP %s per altre informazioni.
+NO_HELP_AVAILABLE
+ Nessun aiuto disponibile per %s.
+OBSOLETE_COMMAND
+ Questo comando è obsoleto; usa %s invece.
+
+BAD_USERHOST_MASK
+ La maschera dev'essere nel formato user@host.
+BAD_EXPIRY_TIME
+ Tempo di scadenza non valido.
+USERHOST_MASK_TOO_WIDE
+ %s La copertura è troppo ampia; per favore, usa una maschera più specifica.
+
+SERVICE_OFFLINE
+ %s al momento è offline.
+READ_ONLY_MODE
+ Nota: i Services sono in modalità read-only; le modifiche non saranno salvate!
+PASSWORD_INCORRECT
+ Password errata.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Accesso negato.
+PERMISSION_DENIED
+ Permesso negato.
+RAW_DISABLED
+ L'opzione RAW è stata disabilitata. Se devi usarla, attiva la direttiva DisableRaw nella configurazione dei Services.
+
+MORE_OBSCURE_PASSWORD
+ Per favore, prova di nuovo con una password più oscura. Le password devono essere lunghe almeno 5 caratteri, non devono essere indovinate facilmente (ad es. il proprio nome o nick), e non possono contenere i caratteri di spazio e di tabulazione.
+PASSWORD_TRUNCATED
+ Nota: La tua password è stata troncata a %d caratteri.
+
+NICK_NOT_REGISTERED
+ Il tuo nick non è registrato.
+NICK_NOT_REGISTERED_HELP
+ Il tuo nick non è registrato. Digita /msg %s HELP per informazioni sulla registrazione del nick.
+NICK_X_NOT_REGISTERED
+ Il nick %s non è registrato.
+NICK_X_IN_USE
+ Nick %s is currently in use.
+NICK_X_NOT_IN_USE
+ Il nick %s non è attualmente in uso.
+NICK_X_NOT_ON_CHAN
+ %s al momento non è nel canale %s.
+NICK_X_FORBIDDEN
+ Il nick %s non può essere registrato o usato.
+NICK_X_FORBIDDEN_OPER
+ Il nick %s è stato vietato da %s:
+ %s
+NICK_X_ILLEGAL
+ Nick %s is an illegal nickname and cannot be used.
+NICK_X_TRUNCATED
+ Nick %s was truncated to %d characters.
+CHAN_X_NOT_REGISTERED
+ Il canale %s non è registrato.
+CHAN_X_NOT_IN_USE
+ Il canale %s non esiste.
+CHAN_X_FORBIDDEN
+ Il canale %s non può essere registrato o usato.
+CHAN_X_FORBIDDEN_OPER
+ Il canale %s è stato vietato da %s:
+ %s
+CHAN_X_SUSPENDED
+ Sospeso: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Autentificazione richiesta per questo comando.
+ Riprova dopo aver digitato /msg %s IDENTIFY password.
+CHAN_IDENTIFY_REQUIRED
+ Autentificazione richiesta per questo comando.
+ Riprova dopo aver digitato /msg %s IDENTIFY %s password.
+MAIL_DISABLED
+ I servizi sono stati configurati per non inviare e-mail.
+MAIL_INVALID
+ L'e-mail per %s non è valida.
+MAIL_X_INVALID
+ %s non è un indirizzo e-mail valido.
+MAIL_LATER
+ Impossibile inviare e-mail adesso; riprova più tardi.
+MAIL_DELAYED
+ Attendi %d secondi è riprova.
+NO_REASON
+ Nessun motivo
+UNKNOWN
+ <sconosciuto>
+
+# Duration system
+DURATION_DAY
+ 1 giorno
+DURATION_DAYS
+ %d giorni
+DURATION_HOUR
+ 1 ora
+DURATION_HOURS
+ %d ore
+DURATION_MINUTE
+ 1 minuto
+DURATION_MINUTES
+ %d minuti
+DURATION_SECOND
+ 1 secondo
+DURATION_SECONDS
+ %d secondi
+
+# Human readable expiration
+NO_EXPIRE
+ non scade
+EXPIRES_SOON
+ scade con il prossimo aggiornamento dei database
+EXPIRES_M
+ scade tra %d minuti
+EXPIRES_1M
+ scade tra %d minuto
+EXPIRES_HM
+ scade tra %d ore, %d minuti
+EXPIRES_H1M
+ scade tra %d ore, %d minuto
+EXPIRES_1HM
+ scade tra %d ora, %d minuti
+EXPIRES_1H1M
+ scade tra %d ora, %d minuto
+EXPIRES_D
+ scade tra %d giorni
+EXPIRES_1D
+ scade tra %d giorno
+
+# Generic Footer message
+END_OF_ANY_LIST
+ End of %s list.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Questo nick appartiene a qualcun altro. Per favore scegline un altro.
+ (Se questo è il tuo nick, digita /msg %s IDENTIFY password.)
+NICK_IS_SECURE
+ Questo nick è registrato e protetto. Se questo è il tuo
+ nick, digita /msg %s IDENTIFY password. Altrimenti,
+ scegli un nick diverso.
+NICK_MAY_NOT_BE_USED
+ Questo nick non può essere usato. Per favore scegline un altro.
+FORCENICKCHANGE_IN_1_MINUTE
+ Se non cambi il tuo nick entro un minuto, verrà cambiato dal server.
+FORCENICKCHANGE_IN_20_SECONDS
+ Se non cambi il tuo nick entro 20 secondi, verrà cambiato dal server.
+FORCENICKCHANGE_NOW
+ Questo nick è stato registrato; non puoi usarlo.
+FORCENICKCHANGE_CHANGING
+ Il tuo nick sarà cambiato a %s
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER password [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER password email
+NICK_REGISTRATION_DISABLED
+ Spiacente, la registrazione dei nick è temporaneamente disabilitata.
+NICK_REGISTRATION_FAILED
+ Spiacente, non è andata a buon fine.
+NICK_REG_PLEASE_WAIT
+ Per favore attendi %d secondi prima di usare di nuovo il comando REGISTER.
+NICK_CANNOT_BE_REGISTERED
+ Il nick %s non può essere registrato.
+NICK_ALREADY_REGISTERED
+ Il nick %s è già registrato!
+NICK_REGISTERED
+ Il nick %s è stato registrato sotto il tuo account: %s
+NICK_PASSWORD_IS
+ La tua password è %s - non dimenticarla!
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP destinatario password
+NICK_GROUP_DISABLED
+ Spiacente, il raggruppamento dei nick è temporaneamente disabilitato.
+NICK_GROUP_FAILED
+ Spiacente, il raggruppamento non è andato a buon fine.
+NICK_GROUP_PLEASE_WAIT
+ Per favore attendi %d secondi prima di usare di nuovo il comando GROUP.
+NICK_GROUP_CHANGE_DISABLED
+ Il tuo nick è già registrato; digita prima /msg %s DROP.
+NICK_GROUP_SAME
+ Sei già un membro del gruppo di %s.
+NICK_GROUP_TOO_MANY
+ Ci sono troppi nick nel gruppo di %s; controlla la lista e cancellane
+ alcuni. Digita /msg %s HELP GLIST e /msg %s HELP DROP
+ per avere altre informazioni.
+NICK_GROUP_JOINED
+ Adesso sei nel gruppo di %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY password
+NICK_IDENTIFY_FAILED
+ Spiacente, l'identificazione non è andata a buon fine.
+NICK_IDENTIFY_SUCCEEDED
+ Password accettata - adesso sei riconosciuto.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Adesso devi impostare un indirizzo e-mail per il tuo nick.
+ Questa e-mail ti permetterà di recuperare la tua password
+ nel caso tu la dimentichi.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Digita /msg %S SET EMAIL e-mail per inserire la tua e-mail.
+ La tua privacy è rispettata; questa e-mail non sarà data a
+ terzi.
+
+# LOGOUT responses
+NICK_ALREADY_IDENTIFIED
+ You are already identified.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status updated (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Non sei più identificato per il tuo nick.
+NICK_LOGOUT_X_SUCCEEDED
+ Il nick %s è stato deidentificato.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ Can't logout %s because he's a services administrator.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Spiacente, la deregistrazione dei nick è temporaneamente disabilitata.
+NICK_DROPPED
+ Il tuo nick è stato deregistrato.
+NICK_X_DROPPED
+ Il nick %s è stato deregistrato.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET opzione parametri
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] opzione parametri
+NICK_SET_DISABLED
+ Spiacente, l'impostazione delle opzioni dei nick è temporaneamente disabilitata.
+NICK_SET_UNKNOWN_OPTION
+ Opzione SET %s sconosciuta.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ Opzione SET %s sconosciuta, o nick non registrato.
+NICK_SET_OPTION_DISABLED
+ L'opzione %s non può essere impostata su questa rete.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ Il nuovo display DEVE essere un nick nel tuo gruppo di nick!
+NICK_SET_DISPLAY_CHANGED
+ Il nuovo display adesso è %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Spiacente, il cambio di password non è andato a buon fine.
+NICK_SET_PASSWORD_CHANGED
+ La password è stata cambiata.
+NICK_SET_PASSWORD_CHANGED_TO
+ La password è stata impostata a %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE numero
+NICK_SET_LANGUAGE_UNKNOWN
+ Numero sconosciuto di lingua %d.
+ Digita /msg %s HELP SET LANGUAGE per la lista delle lingue.
+NICK_SET_LANGUAGE_CHANGED
+ Lingua cambiata a Italiano.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL cambiato a %s.
+NICK_SET_URL_UNSET
+ Impostazione dell'URL annullata.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ Indirizzo e-mail cambiato a %s.
+NICK_SET_EMAIL_UNSET
+ Impostazione dell'indirizzo e-mail annullata.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ Non puoi annullare l'impostazione dell'e-mail.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ Numero ICQ impostato a %s.
+NICK_SET_ICQ_UNSET
+ Impostazione del numero ICQ annullata.
+NICK_SET_ICQ_INVALID
+ %s non è un numero valido.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Messaggio di benvenuto impostato a %s.
+NICK_SET_GREET_UNSET
+ Messaggio di benvenuto annullato.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ La protezione ora è ATTIVA.
+NICK_SET_KILL_QUICK
+ La protezione ora è ATTIVA, con un ritardo ridotto.
+NICK_SET_KILL_IMMED
+ La protezione ora è ATTIVA, senza ritardo.
+NICK_SET_KILL_IMMED_DISABLED
+ L'opzione IMMED non è disponibile su questa rete.
+NICK_SET_KILL_OFF
+ La protezione ora è DISATTIVA.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ L'opzione Secure ora è ATTIVA.
+NICK_SET_SECURE_OFF
+ L'opzione Secure ora è DISATTIVA.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ L'opzione Private ora è ATTIVA.
+NICK_SET_PRIVATE_OFF
+ L'opzione Private ora è DISATTIVA.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Il tuo indirizzo e-mail sarà nascosto dai messaggi INFO di %s.
+NICK_SET_HIDE_EMAIL_OFF
+ Il tuo indirizzo e-mail sarà visualizzato nei messaggi INFO di %s.
+NICK_SET_HIDE_MASK_ON
+ La tua ultima hostmask sarà nascosta dai messaggi INFO di %s.
+NICK_SET_HIDE_MASK_OFF
+ La tua ultima hostmask sarà visualizzata nei messaggi INFO di %s.
+NICK_SET_HIDE_QUIT_ON
+ Il tuo ultimo messaggio di quit sarà nascosto dai messaggi INFO di %s.
+NICK_SET_HIDE_QUIT_OFF
+ Il tuo ultimo messaggio di quit sarà visualizzato nei messaggi INFO di %s.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ I servizi ora ti risponderanno per mezzo di messaggi.
+NICK_SET_MSG_OFF
+ I servizi ora ti risponderanno per mezzo di notice.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nick] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ Il nick %s non scadrà.
+NICK_SET_NOEXPIRE_OFF
+ Il nick %s scadrà.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mask]
+NICK_ACCESS_ALREADY_PRESENT
+ La maschera %s è già presente nella tua lista di accesso.
+NICK_ACCESS_REACHED_LIMIT
+ Spiacente, puoi avere soltanto %d maschere nella lista di accesso di un nick.
+NICK_ACCESS_ADDED
+ La maschera %s è stata aggiunta alla tua lista di accesso.
+NICK_ACCESS_NOT_FOUND
+ La maschera %s non è stata trovata nella tua lista di accesso.
+NICK_ACCESS_DELETED
+ La maschera %s è stata eliminata dalla tua lista di accesso.
+NICK_ACCESS_LIST
+ Lista di accesso:
+NICK_ACCESS_LIST_X
+ Lista di accesso di %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s è %s
+NICK_INFO_SERVICES_OPER
+ %s è un operatore dei servizi (services oper).
+NICK_INFO_SERVICES_ADMIN
+ %s è un amministratore dei servizi (services admin).
+NICK_INFO_ADDRESS
+ Ultimo indirizzo usato: %s
+NICK_INFO_ADDRESS_ONLINE
+ Connesso da: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s è online in questo momento.
+NICK_INFO_TIME_REGGED
+ Ora di registrazione: %s
+NICK_INFO_LAST_SEEN
+ Ultimo accesso: %s
+NICK_INFO_LAST_QUIT
+ Ultimo messaggio di quit: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ Indirizzo e-mail: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ Numero ICQ: %d
+NICK_INFO_GREET
+ Messaggio di saluto (greet): %s
+NICK_INFO_OPTIONS
+ Opzioni: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Protezione
+NICK_INFO_OPT_SECURE
+ Sicurezza
+NICK_INFO_OPT_PRIVATE
+ Privato
+NICK_INFO_OPT_MSG
+ Modalità messaggio
+NICK_INFO_OPT_NONE
+ Nessuna
+NICK_INFO_NO_EXPIRE
+ Questo nick non scadrà.
+NICK_INFO_FOR_MORE
+ Per ottenere altre informazioni, digita /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST pattern
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [NOEXPIRE] [UNCONFIRMED]
+NICK_LIST_HEADER
+ Lista dei nick che corrispondono a %s:
+NICK_LIST_RESULTS
+ Fine della lista - %d/%d risultati mostrati.
+
+# ALIST responses
+NICK_ALIST_SYNTAX
+ ALIST nick
+NICK_ALIST_HEADER
+ Canali su cui hai accesso:
+ Num Canale Livello Descrizione
+NICK_ALIST_HEADER_X
+ Canali su cui %s ha accesso:
+ Num Canale Livello Descrizione
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ Fine della lista - %d/%d canali mostrati.
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Lista dei nick nel tuo gruppo:
+NICK_GLIST_HEADER_X
+ Lista dei nick nel gruppo di %s:
+NICK_GLIST_FOOTER
+ %d nick nel gruppo.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nick [password]
+NICK_NO_RECOVER_SELF
+ Non puoi recuperare te stesso!
+NICK_RECOVERED
+ L'utente che usava il tuo nick è stato disconnesso.
+ Digita /msg %s RELEASE %s per usarlo prima che termini il blocco di un minuto.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nick [password]
+NICK_RELEASE_NOT_HELD
+ Il nick %s non è bloccato.
+NICK_RELEASED
+ Il blocco dei servizi sul tuo nick è stato rilasciato.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nick [password]
+NICK_NO_GHOST_SELF
+ Non puoi disconnettere te stesso!
+NICK_GHOST_KILLED
+ La connessione fantasma con il tuo nick è stata disconnessa.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nick
+NICK_GETPASS_UNAVAILABLE
+ Il comando GETPASS non è disponibile perché è in uso la criptazione dei dati.
+NICK_GETPASS_PASSWORD_IS
+ La password di %s è %s.
+
+# SENDPASS responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host No WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails Match %s to %s.
+NICK_GETEMAIL_NOT_USED
+ No Emails listed for %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nick
+NICK_SENDPASS_UNAVAILABLE
+ Il comando SENDPASS non è disponibile perché è in uso la criptazione dei dati.
+NICK_SENDPASS_SUBJECT
+ Password del nick (%s)
+NICK_SENDPASS_HEAD
+ Salve,
+NICK_SENDPASS_LINE_1
+ Hai richiesto di ricevere via e-mail la password del nick %s.
+NICK_SENDPASS_LINE_2
+ La password è %s. Per ragioni di sicurezza, ti invitiamo a cambiarla il più presto possibile con il comando "/ns set password".
+NICK_SENDPASS_LINE_3
+ Se non sai perché hai ricevuto questa mail, ignorala.
+NICK_SENDPASS_LINE_4
+ IMPORTANTE! Non rispondere a questa mail!
+NICK_SENDPASS_LINE_5
+ Gli amministratori di %s.
+NICK_SENDPASS_OK
+ La password di %s è stata inviata.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nick [motivo]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nick motivo
+NICK_FORBID_SUCCEEDED
+ Il nick %s ora è vietato.
+NICK_FORBID_FAILED
+ Impossibile vietare il nick %s!
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+NICK_REQUESTED
+ Questo nick è già stato richiesto. Per favore, controlla la tua casella di posta; dovresti aver ricevuto il codice di attivazione.
+NICK_REG_RESENT
+ Il codice di attivazione è stato reinviato a %s.
+NICK_REG_UNABLE
+ Nick NON registrato, prova più tardi.
+NICK_IS_PREREG
+ Questo nick è in attesa di un codice di attivazione via e-mail per completare la registrazione.
+NICK_ENTER_REG_CODE
+ Un codice di attivazione è stato inviato a %s. Digita /msg %s CONFIRM <codice> per completare la registrazione.
+NICK_CONFIRM_NOT_FOUND
+ Il primo passo della registrazione potrebbe essere scaduto. Usa /msg %s REGISTER <password> <e-mail>.
+NICK_CONFIRM_INVALID
+ È stato inserito un codice di attivazione non valido. Controlla di nuovo la tua casella di posta e riprova.
+NICK_REG_MAIL_SUBJECT
+ Registrazione del nick (%s)
+NICK_REG_MAIL_HEAD
+ Salve,
+NICK_REG_MAIL_LINE_1
+ Hai richiesto la registrazione del nick %s.
+NICK_REG_MAIL_LINE_2
+ Digita " /msg %s CONFIRM %s " (senza virgolette) per completare la registrazione.
+NICK_REG_MAIL_LINE_3
+ Se non sai perché hai ricevuto questa e-mail, ignorala.
+NICK_REG_MAIL_LINE_4
+ NON RISPONDERE A QUESTA MAIL!
+NICK_REG_MAIL_LINE_5
+ Gli amministratori di %s.
+NICK_GETPASS_PASSCODE_IS
+ Il codice di attivazione per %s is %s.
+NICK_FORCE_REG
+ Il nick %s è stato confermato.
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Modo di canale +o automatico (op)
+CHAN_LEVEL_AUTOVOICE
+ Modo di canale +v automatico (voice)
+CHAN_LEVEL_AUTOHALFOP
+ Modo di canale +h automatico (halfop)
+CHAN_LEVEL_AUTOPROTECT
+ Modo di canale +a automatico (protect)
+CHAN_LEVEL_AUTODEOP
+ Modo di canale +o non permesso (op)
+CHAN_LEVEL_NOJOIN
+ Non permette l'accesso se il canale è RESTRICTED
+CHAN_LEVEL_INVITE
+ Permette l'uso del comando INVITE
+CHAN_LEVEL_AKICK
+ Permette l'uso del comando AKICK
+CHAN_LEVEL_SET
+ Permette l'uso del comando SET (escluso FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ Permette l'uso del comando CLEAR
+CHAN_LEVEL_UNBAN
+ Permette l'uso del comando UNBAN
+CHAN_LEVEL_OPDEOP
+ Permette l'uso dei comandi OP e DEOP
+CHAN_LEVEL_ACCESS_LIST
+ Permette la visione della lista di accesso
+CHAN_LEVEL_ACCESS_CHANGE
+ Permette le modifiche alla lista di accesso
+CHAN_LEVEL_MEMO
+ Permette la lista e la lettura dei memo di canale
+CHAN_LEVEL_ASSIGN
+ Permette l'assegnazione e la revoca di un bot
+CHAN_LEVEL_BADWORDS
+ Permette l'uso del comando BADWORDS
+CHAN_LEVEL_NOKICK
+ Permette di non venire kickati dal bot
+CHAN_LEVEL_FANTASIA
+ Permette l'uso dei comandi "fantasia" del bot
+CHAN_LEVEL_SAY
+ Permette l'uso dei comandi SAY e ACT del bot
+CHAN_LEVEL_GREET
+ Mostra il messaggio di saluto (greet)
+CHAN_LEVEL_VOICEME
+ Permette di dare/togliere il modo +v (voice) su se stessi
+CHAN_LEVEL_VOICE
+ Permette l'uso dei comandi VOICE e DEVOICE
+CHAN_LEVEL_GETKEY
+ Permette l'uso del comando GETKEY
+CHAN_LEVEL_OPDEOPME
+ Permette di dare/togliere il modo +o (op) su se stessi
+CHAN_LEVEL_HALFOPME
+ Permette di dare/togliere il modo +h (halfop) su se stessi
+CHAN_LEVEL_HALFOP
+ Permette l'uso dei comandi HALFOP e DEHALFOP
+CHAN_LEVEL_PROTECTME
+ Permette di dare/togliere il modo +a (protect) su se stessi
+CHAN_LEVEL_PROTECT
+ Permette l'uso dei comandi PROTECT e DEPROTECT
+CHAN_LEVEL_KICKME
+ Permette l'uso del comando KICK su se stessi
+CHAN_LEVEL_KICK
+ Permette l'uso del comando KICK
+CHAN_LEVEL_SIGNKICK
+ Non invia kick "firmati" quando si usa SIGNKICK LEVEL is used
+CHAN_LEVEL_BANME
+ Permette l'uso del comando BAN su se stessi
+CHAN_LEVEL_BAN
+ Permette l'uso del comando BAN
+CHAN_LEVEL_TOPIC
+ Permette l'uso del comando TOPIC
+CHAN_LEVEL_INFO
+ Permette l'uso del comando INFO con l'opzione ALL
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Questo canale è stato registrato con %s.
+CHAN_NOT_ALLOWED_OP
+ Non hai il permesso di avere lo stato di operatore sul canale %s.
+CHAN_MAY_NOT_BE_USED
+ Questo canale non può essere usato.
+CHAN_NOT_ALLOWED_TO_JOIN
+ Non hai il permesso di stare su questo canale.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER canale password descrizione
+CHAN_REGISTER_DISABLED
+ Spiacente, la registrazione dei canali è temporaneamente disabilitata.
+CHAN_REGISTER_NOT_LOCAL
+ I canali locali non possono essere registrati.
+CHAN_MUST_REGISTER_NICK
+ Devi prima registrare il tuo nick.
+ Digita /msg %s HELP per avere informazioni sulla registrazione dei nick.
+CHAN_MUST_IDENTIFY_NICK
+ Devi prima identificarti con %s, usando il comando:
+ /msg %s IDENTIFY password
+CHAN_MAY_NOT_BE_REGISTERED
+ Il canale %s non può essere registrato.
+CHAN_ALREADY_REGISTERED
+ Il canale %s è già registrato!
+CHAN_MUST_BE_CHANOP
+ Devi essere operatore di canale (+o) per registrare il canale.
+CHAN_REACHED_CHANNEL_LIMIT
+ Spiacente, hai già raggiunto il limite di %d canali registrati.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Spiacente, hai già superato il limite di %d canali registrati.
+CHAN_REGISTRATION_FAILED
+ Spiacente, la registrazione non è andata a buon fine.
+CHAN_REGISTERED
+ Il canale %s è stato registrato sotto il tuo nick: %s.
+CHAN_PASSWORD_IS
+ La tua password di canale è %s - non dimenticarla!
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY canale password
+CHAN_IDENTIFY_FAILED
+ Spiacente, l'identificazione è fallita.
+CHAN_IDENTIFY_SUCCEEDED
+ Password accettata - sei identificato come fondatore di %s.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT canale nick
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT canale [nick]
+CHAN_LOGOUT_SUCCEEDED
+ L'utente %s non è più identificato per il canale %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Tutti gli utenti non sono più identificati per il canale %s.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP canale
+CHAN_DROP_DISABLED
+ Spiacente, la deregistrazione dei canali è temporaneamente disabilitata.
+CHAN_DROPPED
+ Il canale %s è stato deregistrato.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET canale opzione parametri
+CHAN_SET_DISABLED
+ Spiacente, l'impostazione delle opzioni dei canali è temporaneamente disabilitata.
+CHAN_SET_UNKNOWN_OPTION
+ Opzione SET %s sconosciuta.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s ha registrato troppi nick.
+CHAN_FOUNDER_CHANGED
+ Il fondatore del canale %s ora è %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Il successore del canale %s ora è %s.
+CHAN_SUCCESSOR_UNSET
+ Il successore del canale %s è stato annullato.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s non può essere il successore del canale %s perché ne è il fondatore.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Spiacente, il cambio di password non è andato a buon fine.
+CHAN_PASSWORD_CHANGED
+ La password di %s è stata cambiata.
+CHAN_PASSWORD_CHANGED_TO
+ La password di %s è stata impostata a %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ La descrizione di %s è stata impostata a %s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ L'URL di %s è stato impostato a %s.
+CHAN_URL_UNSET
+ L'URL di %s è stato annullato.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ L'indirizzo e-mail di %s è stato impostato a %s.
+CHAN_EMAIL_UNSET
+ L'indirizzo e-mail di %s è stato annullato.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Il messaggio di ingresso di %s è stato cambiato.
+CHAN_ENTRY_MSG_UNSET
+ Il messaggio di ingresso di %s è stato annullato.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s non è un tipo di ban valido.
+CHAN_SET_BANTYPE_CHANGED
+ Il tipo di ban del canale %s ora è #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ %c è stato ignorato perché è un modo di canale sconosciuto.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Il modo %c è stato ignorato perché non è memorizzabile.
+CHAN_SET_MLOCK_L_REQUIRED
+ Per bloccare il modo +L devi bloccare anche il modo +l.
+CHAN_SET_MLOCK_K_REQUIRED
+ Per bloccare il modo +K devi bloccare anche il modo +i.
+CHAN_MLOCK_CHANGED
+ Il blocco dei modi di canale di %s è stato impostato a %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET canale KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Il mantenimento del topic ora è ATTIVO.
+CHAN_SET_KEEPTOPIC_OFF
+ Il mantenimento del topic ora è DISATTIVO.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET canale TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Il blocco del topic ora è ATTIVO.
+CHAN_SET_TOPICLOCK_OFF
+ Il blocco del topic ora è DISATTIVO.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET canale PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ L'opzione Peace ora è ATTIVA.
+CHAN_SET_PEACE_OFF
+ L'opzione Peace ora è DISATTIVA.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET canale PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ L'opzione Private ora è ATTIVA.
+CHAN_SET_PRIVATE_OFF
+ L'opzione Private ora è DISATTIVA.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET canale SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ L'opzione Secure Ops ora è ATTIVA.
+CHAN_SET_SECUREOPS_OFF
+ L'opzione Secure Ops ora è DISATTIVA.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET canale SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ L'opzione Secure Founder ora è ATTIVA.
+CHAN_SET_SECUREFOUNDER_OFF
+ L'opzione Secure Founder ora è DISATTIVA.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET canale RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ L'opzione Restricted ora è ATTIVA.
+CHAN_SET_RESTRICTED_OFF
+ L'opzione Restricted ora è DISATTIVA.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET canale SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ L'opzione Secure ora è ATTIVA.
+CHAN_SET_SECURE_OFF
+ L'opzione Secure ora è DISATTIVA.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET canale SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ L'opzione Signed Kick ora è ATTIVA.
+CHAN_SET_SIGNKICK_LEVEL
+ L'opzione Signed Kick ora è ATTIVA, ma dipende dal livello
+ dell'utente che usa il comando.
+CHAN_SET_SIGNKICK_OFF
+ L'opzione Signed Kick ora è DISATTIVA.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET canale OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ L'opzione Op Notice ora è ATTIVA.
+CHAN_SET_OPNOTICE_OFF
+ L'opzione Op Notice ora è DISATTIVA.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET canale XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ La gestione del canale per mezzo delle liste xOP ora è ATTIVA.
+CHAN_SET_XOP_OFF
+ La gestione del canale per mezzo delle liste xOP ora è DISATTIVA.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET canale NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ Il canale %s non scadrà.
+CHAN_SET_NOEXPIRE_OFF
+ Il canale %s scadrà.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d nick nelle liste SOP/AOP/HOP/VOP di un canale.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Questo comando non è utilizzabile; usa il comando ACCESS.
+ Digita /msg %s HELP ACCESS per avere maggiori informazioni.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP canale {ADD|DEL|LIST|CLEAR} [nick | numero-lista]
+CHAN_AOP_DISABLED
+ Spiacente, la modifica della lista AOP è temporaneamente disabilitata.
+CHAN_AOP_NICKS_ONLY
+ La lista AOP può contenere soltanto nick registrati.
+CHAN_AOP_ADDED
+ %s aggiunto alla lista AOP di %s.
+CHAN_AOP_MOVED
+ %s spostato alla lista AOP di %s.
+CHAN_AOP_NO_SUCH_ENTRY
+ Il record specificato (%d) non è presente nella lista AOP di %s.
+CHAN_AOP_NOT_FOUND
+ %s non trovato nella lista AOP di %s.
+CHAN_AOP_NO_MATCH
+ Nessun record corrispondente nella lista AOP di %s.
+CHAN_AOP_DELETED
+ %s eliminato dalla lista AOP di %s.
+CHAN_AOP_DELETED_ONE
+ Eliminato un record dalla lista AOP di %s.
+CHAN_AOP_DELETED_SEVERAL
+ Eliminati %d record dalla lista AOP di %s.
+CHAN_AOP_LIST_EMPTY
+ La lista AOP di %s è vuota.
+CHAN_AOP_LIST_HEADER
+ Lista AOP di %s:
+ Num Nick
+CHAN_AOP_CLEAR
+ La lista AOP del canale è stata svuotata.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP canale {ADD|DEL|LIST|CLEAR} [nick | numero-lista]
+CHAN_HOP_DISABLED
+ Spiacente, la modifica della lista HOP è temporaneamente disabilitata.
+CHAN_HOP_NICKS_ONLY
+ La lista HOP può contenere soltanto nick registrati.
+CHAN_HOP_ADDED
+ %s aggiunto alla lista HOP di %s.
+CHAN_HOP_MOVED
+ %s spostato alla lista HOP di %s.
+CHAN_HOP_NO_SUCH_ENTRY
+ Il record specificato (%d) non è presente nella lista HOP di %s.
+CHAN_HOP_NOT_FOUND
+ %s non trovato nella lista HOP di %s.
+CHAN_HOP_NO_MATCH
+ Nessun record corrispondente nella lista HOP di %s.
+CHAN_HOP_DELETED
+ %s eliminato dalla lista HOP di %s.
+CHAN_HOP_DELETED_ONE
+ Eliminato un record dalla lista HOP di %s.
+CHAN_HOP_DELETED_SEVERAL
+ Eliminati %d record dalla lista HOP di %s.
+CHAN_HOP_LIST_EMPTY
+ La lista HOP di %s è vuota.
+CHAN_HOP_LIST_HEADER
+ Lista HOP di %s:
+ Num Nick
+CHAN_HOP_CLEAR
+ La lista HOP del canale è stata svuotata.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP canale {ADD|DEL|LIST|CLEAR} [nick | numero-lista]
+CHAN_SOP_DISABLED
+ Spiacente, la modifica della lista SOP è temporaneamente disabilitata.
+CHAN_SOP_NICKS_ONLY
+ La lista SOP può contenere soltanto nick registrati.
+CHAN_SOP_ADDED
+ %s aggiunto alla lista SOP di %s.
+CHAN_SOP_MOVED
+ %s spostato alla lista SOP di %s.
+CHAN_SOP_NO_SUCH_ENTRY
+ Il record specificato (%d) non è presente nella lista SOP di %s.
+CHAN_SOP_NOT_FOUND
+ %s non trovato nella lista SOP di %s.
+CHAN_SOP_NO_MATCH
+ Nessun record corrispondente nella lista SOP di %s.
+CHAN_SOP_DELETED
+ %s eliminato dalla lista SOP di %s.
+CHAN_SOP_DELETED_ONE
+ Eliminato un record dalla lista SOP di %s.
+CHAN_SOP_DELETED_SEVERAL
+ Eliminati %d record dalla lista SOP di %s.
+CHAN_SOP_LIST_EMPTY
+ La lista SOP di %s è vuota.
+CHAN_SOP_LIST_HEADER
+ Lista SOP di %s:
+ Num Nick
+CHAN_SOP_CLEAR
+ La lista SOP del canale è stata svuotata.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP canale {ADD|DEL|LIST|CLEAR} [nick | numero-lista]
+CHAN_VOP_DISABLED
+ Spiacente, la modifica della lista VOP è temporaneamente disabilitata.
+CHAN_VOP_NICKS_ONLY
+ La lista VOP può contenere soltanto nick registrati.
+CHAN_VOP_ADDED
+ %s aggiunto alla lista VOP di %s.
+CHAN_VOP_MOVED
+ %s spostato alla lista VOP di %s.
+CHAN_VOP_NO_SUCH_ENTRY
+ Il record specificato (%d) non è presente nella lista VOP di %s.
+CHAN_VOP_NOT_FOUND
+ %s non trovato nella lista VOP di %s.
+CHAN_VOP_NO_MATCH
+ Nessun record corrispondente nella lista VOP di %s.
+CHAN_VOP_DELETED
+ %s eliminato dalla lista VOP di %s.
+CHAN_VOP_DELETED_ONE
+ Eliminato un record dalla lista VOP di %s.
+CHAN_VOP_DELETED_SEVERAL
+ Eliminati %d record dalla lista VOP di %s.
+CHAN_VOP_LIST_EMPTY
+ La lista VOP di %s è vuota.
+CHAN_VOP_LIST_HEADER
+ Lista VOP di %s:
+ Num Nick
+CHAN_VOP_CLEAR
+ La lista VOP del canale è stata svuotata.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS canale {ADD|DEL|LIST|CLEAR} [nick [livello] | numero-lista]
+CHAN_ACCESS_XOP
+ Questo comando non è utilizzabile; usa i comandi SOP, AOP, HOP e VOP.
+ Digita /msg %s HELP comando per ottenere maggiori informazioni.
+CHAN_ACCESS_DISABLED
+ Spiacente, la modifica della lista di accesso dei canali è temporaneamente disabilitata.
+CHAN_ACCESS_LEVEL_NONZERO
+ Il livello di accesso deve essere diverso da zero.
+CHAN_ACCESS_LEVEL_RANGE
+ Il livello di accesso deve essere compreso tra %d e %d (inclusi).
+CHAN_ACCESS_NICKS_ONLY
+ Le liste di accesso del canale possono contenere soltanto nick registrati.
+CHAN_ACCESS_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d nella lista di accesso.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Il livello di accesso di %s su %s non è stato modificato da %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Il livello di accesso di %s su %s è stato modificato a %d.
+CHAN_ACCESS_ADDED
+ %s aggiunto alla lista di accesso di %s con il livello %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ Il record specificato (%d) non è presente nella lista di accesso di %s.
+CHAN_ACCESS_NOT_FOUND
+ %s non trovato nella lista nella lista di accesso di %s.
+CHAN_ACCESS_NO_MATCH
+ Nessun record corrispondente nella lista di accesso di %s.
+CHAN_ACCESS_DELETED
+ %s è stato eliminato dalla lista di accesso di %s.
+CHAN_ACCESS_DELETED_ONE
+ Eliminato un record dalla lista di accesso di %s.
+CHAN_ACCESS_DELETED_SEVERAL
+ Eliminati %d record dalla lista di accesso di %s.
+CHAN_ACCESS_LIST_EMPTY
+ La lista di accesso di %s è vuota.
+CHAN_ACCESS_LIST_HEADER
+ Lista di accesso di %s:
+ Num Liv Nick
+CHAN_ACCESS_LIST_FOOTER
+ End of access list.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ La lista di accesso del canale è stata svuotata.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK canale {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-o-usermask] [motivo]
+CHAN_AKICK_DISABLED
+ Spiacente, la modifica della lista autokick è temporaneamente disabilitata.
+CHAN_AKICK_ALREADY_EXISTS
+ %s è già presente nella lista autokick di %s.
+CHAN_AKICK_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d maschere autokick.
+CHAN_AKICK_ADDED
+ %s aggiunto alla lista autokick di %s.
+CHAN_AKICK_NO_SUCH_ENTRY
+ Il record specificato (%d) non è presente nella lista autokick di %s.
+CHAN_AKICK_NOT_FOUND
+ %s non trovato nella lista autokick di %s.
+CHAN_AKICK_NO_MATCH
+ Nessun record corrispondente nella lista autokick di %s.
+CHAN_AKICK_STUCK
+ %s da adesso è sempre attivo su %s.
+CHAN_AKICK_UNSTUCK
+ %s da adesso non è più sempre attivo su %s.
+CHAN_AKICK_DELETED
+ %s è stato eliminato dalla lista autokick di %s.
+CHAN_AKICK_DELETED_ONE
+ Eliminato un record dalla lista autokick di %s.
+CHAN_AKICK_DELETED_SEVERAL
+ Eliminati %d record dalla lista autokick di %s.
+CHAN_AKICK_LIST_EMPTY
+ La lista autokick di %s è vuota.
+CHAN_AKICK_LIST_HEADER
+ Lista autokick di %s:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (aggiunto da %s il %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (fisso) (aggiunto da %s il %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE su %s completato; ne sono stati influenzati %d utenti.
+CHAN_AKICK_CLEAR
+ La lista autokick del canale è stata svuotata.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS canale {SET | DIS[ABLE] | LIST | RESET} [numero [livello]]
+CHAN_LEVELS_XOP
+ Questo comando è inutilizzabile in questa modalità.
+CHAN_LEVELS_RANGE
+ Il livello deve essere compreso tra %d e %d (inclusi).
+CHAN_LEVELS_CHANGED
+ Il livello di %s sul canale %s è stato modificato a %d.
+CHAN_LEVELS_UNKNOWN
+ Impostazione %s sconosciuta. Digita /msg %s HELP LEVELS DESC per una lista delle impostazioni valide.
+CHAN_LEVELS_DISABLED
+ %s disabilitato sul canale %s.
+CHAN_LEVELS_LIST_HEADER
+ Impostazioni dei livelli di accesso del canale %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (disabilitato)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (solo per il fondatore)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ I livelli di accesso di %s sono stati ripristinati ai valori originali.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO canale [ALL]
+CHAN_INFO_HEADER
+ Informazioni sul canale %s:
+CHAN_INFO_FOUNDER
+ Fondatore: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Fondatore: %s
+CHAN_INFO_SUCCESSOR
+ Successore: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Successore: %s
+CHAN_INFO_DESCRIPTION
+ Descrizione: %s
+CHAN_INFO_ENTRYMSG
+ Messaggio di ingresso: %s
+CHAN_INFO_TIME_REGGED
+ Data di registrazione: %s
+CHAN_INFO_LAST_USED
+ Ultimo utilizzo: %s
+CHAN_INFO_LAST_TOPIC
+ Ultimo topic: %s
+CHAN_INFO_TOPIC_SET_BY
+ Topic impostato da: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ Indirizzo e-mail: %s
+CHAN_INFO_BANTYPE
+ Tipo di ban: %d
+CHAN_INFO_OPTIONS
+ Opzioni: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Mantenimento del topic
+CHAN_INFO_OPT_OPNOTICE
+ OP Notice
+CHAN_INFO_OPT_PEACE
+ Pace
+CHAN_INFO_OPT_PRIVATE
+ Privato
+CHAN_INFO_OPT_RESTRICTED
+ Restricted
+CHAN_INFO_OPT_SECURE
+ Secure
+CHAN_INFO_OPT_SECUREOPS
+ Secure Ops
+CHAN_INFO_OPT_SECUREFOUNDER
+ Secure Founder
+CHAN_INFO_OPT_SIGNKICK
+ Signed kick
+CHAN_INFO_OPT_TOPICLOCK
+ Blocco del topic
+CHAN_INFO_OPT_XOP
+ Liste xOP
+CHAN_INFO_OPT_NONE
+ Nessno
+CHAN_INFO_MODE_LOCK
+ Modi bloccati: %s
+CHAN_INFO_NO_EXPIRE
+ Questo canale non scadrà.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST pattern
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Lista dei canali che corrispondono a %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Fine della lista - %d/%d risultati mostrati.
+
+# INVITE responses
+CHAN_INVITE_SYNTAX
+ INVITE canale
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN canale
+CHAN_UNBANNED
+ I ban che ti riguardavano sono stati rimossi da %s.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC canale [topic]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR canale cosa
+CHAN_CLEARED_BANS
+ Tutti i ban del canale %s sono stati rimossi.
+CHAN_CLEARED_EXCEPTS
+ Tutte le eccezioni del canale %s sonostate rimosse.
+CHAN_CLEARED_MODES
+ Tutti i modi del canale %s sono stati ripristinati.
+CHAN_CLEARED_OPS
+ Il modo +o è stato rimosso da tutti gli utenti di %s.
+CHAN_CLEARED_VOICES
+ Il modo +v è stato rimosso da tutti gli utenti di %s.
+CHAN_CLEARED_USERS
+ Tutti gli utenti sono stati kickati dal canale %s.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS canale
+CHAN_GETPASS_UNAVAILABLE
+ Il comando GETPASS è inutilizzabile perché è in uso la criptazione dei dati.
+CHAN_GETPASS_PASSWORD_IS
+ La chiave (password) del canale %s è %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS canale
+CHAN_SENDPASS_UNAVAILABLE
+ Il comando SENDPASS è inutilizzabile perché è in uso la criptazione dei dati.
+CHAN_SENDPASS_SUBJECT
+ Password del canale (%s)
+CHAN_SENDPASS_HEAD
+ Salve,
+CHAN_SENDPASS_LINE_1
+ Hai richiesto di ricevere via e-mail la password del canale %s.
+CHAN_SENDPASS_LINE_2
+ La password è %s. Per ragioni di sicurezza, ti invitiamo a cambiarla il più presto possibile con il comando "/cs set canale password".
+CHAN_SENDPASS_LINE_3
+ Se non sai perché hai ricevuto questa mail, ignorala.
+CHAN_SENDPASS_LINE_4
+ IMPORTANTE! Non rispondere a questa mail!
+CHAN_SENDPASS_LINE_5
+ Gli amministratori di %s.
+CHAN_SENDPASS_OK
+ La password di %s è stata inviata.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID canale [motivo]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID canale motivo
+CHAN_FORBID_SUCCEEDED
+ Il canale %s non può più essere registrato o usato.
+CHAN_FORBID_FAILED
+ Impossibile vietare il canale %s!
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+CHAN_FORBID_REASON
+ Questo canale è stato vietato.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND canale [motivo]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND canale motivo
+CHAN_SUSPEND_SUCCEEDED
+ Il canale %s is ora è sospeso.
+CHAN_SUSPEND_FAILED
+ Impossibile sospendere il canale %s!
+CHAN_SUSPEND_REASON
+ Questo canale è stato sospeso.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND canale
+CHAN_UNSUSPEND_ERROR
+ No # found in front of channel name.
+CHAN_UNSUSPEND_SUCCEEDED
+ Il canale %s ora è stato rilasciato.
+CHAN_UNSUSPEND_FAILED
+ Impossibile rilasciare il canale %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s corrisponde a un'eccezione %s e non può essere bannato finché l'eccezione non sarà rimossa.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Hai un nuovo memo.
+MEMO_HAVE_NEW_MEMOS
+ Hai %d nuovi memo.
+MEMO_TYPE_READ_LAST
+ Digita /msg %s READ LAST per leggerlo.
+MEMO_TYPE_READ_NUM
+ Digita /msg %s READ %d per leggerlo.
+MEMO_TYPE_LIST_NEW
+ Digita /msg %s LIST NEW per ottenerne la lista.
+MEMO_AT_LIMIT
+ Attenzione: Hai raggiunto il numero massimo di memo (%d). Non potrai raggiungere nuovi memo finché non ne elimini alcuni.
+MEMO_OVER_LIMIT
+ Attenzione: Hai superato il numero massimo di memo (%d). Non potrai raggiungere nuovi memo finché non ne elimini alcuni.
+MEMO_X_MANY_NOTICE
+ Ci sono %d memo sul canale %s.
+MEMO_X_ONE_NOTICE
+ C'è %d memo sul canale %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ C'è un nuovo memo sul canale %s.
+ Digita /msg %s READ %s %d per leggerlo.
+MEMO_NEW_MEMO_ARRIVED
+ Hai ricevuto un nuovo memo da %s.
+ Digita /msg %s READ %d per leggerlo.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ Non hai nuovi memo.
+MEMO_X_HAS_NO_MEMOS
+ %s non ha nuovi memo.
+MEMO_DOES_NOT_EXIST
+ Il memo %d non esiste!
+MEMO_LIST_NOT_FOUND
+ Non è stato trovato nessun memo corrispondente.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | canale} testo-del-memo
+MEMO_SEND_DISABLED
+ Spiacente, l'invio dei memo è temporaneamente disabilitato.
+MEMO_SEND_PLEASE_WAIT
+ Attendi %d secondi prima di usare di nuovo il comando SEND.
+MEMO_X_GETS_NO_MEMOS
+ %s non può ricevere memo.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s attualmente ha troppi memo e non può riceverne altri.
+MEMO_SENT
+ Memo inviato a %s.
+
+# CANCEL responses
+MEMO_MASS_SENT
+ A massmemo has been sent to all registered users.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | canale}
+MEMO_CANCEL_DISABLED
+ Spiacente, l'annullamento dei memo è temporaneamente disabilitato.
+MEMO_CANCEL_NONE
+ Nessun memo è annullabile.
+MEMO_CANCELLED
+ L'ultimo memo inviato a %s è stato annullato.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [canale] [lista | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ Non hai nuovi memo.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s non ha nuovi memo.
+MEMO_LIST_MEMOS
+ Memo di %s. Per leggerli, digita: /msg %s READ numero
+MEMO_LIST_NEW_MEMOS
+ Nuovi memo di %s. Per leggerli, digita: /msg %s READ numero
+MEMO_LIST_CHAN_MEMOS
+ Memo di %s. Per leggerli, digita: /msg %s READ %s numero
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nuovi memo di %s. Per leggerli, digita: /msg %s READ %s numero
+MEMO_LIST_HEADER
+ Num Mittente Data/Ora
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [canale] {lista | LAST | NEW}
+MEMO_HEADER
+ Memo %d da %s (%s). Per eliminarlo, digita: /msg %s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d da %s (%s). Per eliminarlo, digita: /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [canale] {numero | lista | ALL}
+MEMO_DELETED_NONE
+ Nessun memo è stato cancellato.
+MEMO_DELETED_ONE
+ Il memo %d è stato cancellato.
+MEMO_DELETED_SEVERAL
+ I memo %s sono stati cancellati.
+MEMO_DELETED_ALL
+ Tutti i tuoi memo sono stati cancellati.
+
+# SET responses
+MEMO_CHAN_DELETED_ALL
+ All memos for channel %s have been deleted.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET opzione parametri
+MEMO_SET_DISABLED
+ Spiacente, l'impostazione delle opzioni dei memo è temporaneamente disabilitata.
+MEMO_SET_UNKNOWN_OPTION
+ Opzione SET %s sconosciuta.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s ti informerà dei nuovi memo quando ti connetti e quando li ricevi.
+MEMO_SET_NOTIFY_LOGON
+ %s ti informerà dei nuovi memo quando ti connetti e quando torni dall'/AWAY.
+MEMO_SET_NOTIFY_NEW
+ %s ti informerà dei nuovi memo quando li ricevi.
+MEMO_SET_NOTIFY_OFF
+ %s non ti informerà dei nuovi memo.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [canale] limite
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [utente | canale] {limite | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Non puoi modificare limite dei tuoi memo.
+MEMO_SET_LIMIT_FORBIDDEN
+ Il limite dei memo di %s non può essere modificato.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ Non puoi impostare il limite dei tuoi memo ad un valore superiore a %d.
+MEMO_SET_LIMIT_TOO_HIGH
+ Non puoi impostare il limite dei memo di %s ad un valore superiore a %d.
+MEMO_SET_LIMIT_OVERFLOW
+ Il limite dei memo è troppo alto; sarà utilizzato il valore %d.
+MEMO_SET_YOUR_LIMIT
+ Il limite dei tuoi memo è stato impostato a %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ Non potrai più ricevere memo.
+MEMO_UNSET_YOUR_LIMIT
+ Il limite dei tuoi memo è stato disabilitato.
+MEMO_SET_LIMIT
+ Il limite dei memo di %s è stato impostato a %d.
+MEMO_SET_LIMIT_ZERO
+ Il limite dei memo di %s è stato impostato a 0.
+MEMO_UNSET_LIMIT
+ Il limite dei memo di %s è stato disabilitato.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [canale]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | canale]
+MEMO_INFO_NO_MEMOS
+ Non hai alcun memo.
+MEMO_INFO_MEMO
+ Hai 1 memo.
+MEMO_INFO_MEMO_UNREAD
+ Hai 1 memo, e non l'hai ancora letto.
+MEMO_INFO_MEMOS
+ Hai %d memo.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Hai %d memo, di cui 1 non è stato ancora letto.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Hai %d memo, di cui %d non sono stati ancora letti.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Hai %d memo, nessuno dei quali è stato letto.
+MEMO_INFO_LIMIT
+ Il limite dei tuoi memo è %d.
+MEMO_INFO_HARD_LIMIT
+ Il limite dei tuoi memo è %d, e non può essere modificato.
+MEMO_INFO_LIMIT_ZERO
+ Il limite dei tuoi memo è 0; non riceverai alcun nuovo memo.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Il limite dei tuoi memo è 0; non riceverai alcun nuovo memo. Non puoi modificare questo limite.
+MEMO_INFO_NO_LIMIT
+ Non c'è alcun limite al numero di memo che puoi conservare.
+MEMO_INFO_NOTIFY_OFF
+ Non sarai informato dei nuovi memo.
+MEMO_INFO_NOTIFY_ON
+ Sarai informato dei nuovi memo quando ti connetti e quando li ricevi.
+MEMO_INFO_NOTIFY_RECEIVE
+ Sarai informato dei nuovi memo quando li ricevi.
+MEMO_INFO_NOTIFY_SIGNON
+ Sarai informato dei nuovi memo quando ti connetti.
+MEMO_INFO_X_NO_MEMOS
+ %s non ha alcun memo.
+MEMO_INFO_X_MEMO
+ %s ha 1 memo.
+MEMO_INFO_X_MEMO_UNREAD
+ %s ha 1 memo, e non è stato ancora letto.
+MEMO_INFO_X_MEMOS
+ %s ha %d memo.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s ha %d memo, di cui 1 non è stato ancora letto.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s ha %d memo, di cui %d non sono stati ancora letti.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s ha %d memo, nessuno dei quali è stato letto.
+MEMO_INFO_X_LIMIT
+ Il limite dei memo di %s è %d.
+MEMO_INFO_X_HARD_LIMIT
+ Il limite dei memo di %s è %d, e non può essere modificato.
+MEMO_INFO_X_NO_LIMIT
+ %s non ha alcun limite dei memo.
+MEMO_INFO_X_NOTIFY_OFF
+ %s non viene informato dei nuovi memo.
+MEMO_INFO_X_NOTIFY_ON
+ %s viene informato dei nuovi memo quando si connette e quando li riceve.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s viene informato dei nuovi memo quando li riceve.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s viene informato dei nuovi memo quando si connette.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Il bot %s non esiste.
+BOT_NOT_ASSIGNED
+ Devi assegnare un bot al canale prima di usare questo comando.
+ Digita /msg %S HELP ASSIGN per maggiori informazioni.
+BOT_NOT_ON_CHANNEL
+ Il bot non è sul canale %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ Non usare la parola %s su questo canale!
+BOT_REASON_BADWORD_GENTLE
+ Occhio a come parli!
+BOT_REASON_BOLD
+ Non usare il grassetto su questo canale!
+BOT_REASON_CAPS
+ Disattiva il caps lock!
+BOT_REASON_COLOR
+ Non usare i colori su questo canale!
+BOT_REASON_FLOOD
+ Non floodare!
+BOT_REASON_REPEAT
+ Smettila di ripetere!
+BOT_REASON_REVERSE
+ Non usare il reverse su questo canale!
+BOT_REASON_UNDERLINE
+ Non usare il sottolineato su questo canale!
+
+# !seen replies
+BOT_SEEN_BOT
+ Mi hai trovato, %s!
+BOT_SEEN_YOU
+ Cerchi te stesso, eh %s?
+BOT_SEEN_ON_CHANNEL
+ %s è sul canale in questo momento!
+BOT_SEEN_ON_CHANNEL_AS
+ %s è sul canale in questo momento, travestito da %s!
+BOT_SEEN_ON
+ L'ultima volta che ho visto %s è stato %s fa.
+BOT_SEEN_NEVER
+ Non ho mai visto %s su questo canale.
+BOT_SEEN_UNKNOWN
+ Non so chi sia %s.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick ident host realname
+ BOT CHANGE vecchionick nuovonick [ident [host [realname]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ Il bot %s è già esistente.
+BOT_BOT_CREATION_FAILED
+ Spiacente, la creazione del bot non è andata a buon fine.
+BOT_BOT_READONLY
+ Spiacente, la modifica dei bot è temporaneamente disabilitata.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) aggiunto alla lista dei bot.
+BOT_BOT_ANY_CHANGES
+ Le vecchie informazioni sono identiche a quelle nuove.
+BOT_BOT_CHANGED
+ Il bot %s è stato modificato; ora si presenta come %s!%s@%s (%s)
+BOT_BOT_DELETED
+ Il bot %s è stato eliminato.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Lista dei bot disponibili:
+BOT_BOTLIST_PRIVATE_HEADER
+ Bot riservati agli IrcOp:
+BOT_BOTLIST_FOOTER
+ %d bot disponibili.
+BOT_BOTLIST_EMPTY
+ Non ci sono bot disponibili in questo momento.
+ Chiedi a un Services Admin di crearne uno!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN canale nick-del-bot
+BOT_ASSIGN_READONLY
+ Spiacente, l'assegnazione dei bot è temporaneamente disabilitata.
+BOT_ASSIGN_ALREADY
+ Bot %s is already assigned to channel %s.
+BOT_ASSIGN_ASSIGNED
+ Il bot %s è stato assegnato a %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN canale
+BOT_UNASSIGN_UNASSIGNED
+ Non c'è più nessun bot assegnato a %s.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {canale | nick-del-bot}
+BOT_INFO_NOT_FOUND
+ %s non è un bot valido o un canale registrato.
+BOT_INFO_BOT_HEADER
+ Informazioni sul bot %s:
+BOT_INFO_BOT_MASK
+ Hostmask: %s@%s
+BOT_INFO_BOT_REALNAME
+ Realname: %s
+BOT_INFO_BOT_CREATED
+ Data di crazione: %s
+BOT_INFO_BOT_USAGE
+ Usato su: %d canale/i
+BOT_INFO_BOT_OPTIONS
+ Opzioni: %s
+BOT_INFO_OPT_PRIVATE
+ Privato
+BOT_INFO_CHAN_HEADER
+ Informazioni sul canale %s:
+BOT_INFO_CHAN_BOT
+ Nick del bot: %s
+BOT_INFO_CHAN_BOT_NONE
+ Nick del bot: nessun bot assegnato.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Kick in caso di parolacce: %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Kick in caso di parolacce: %s (%d kick portano al ban)
+BOT_INFO_CHAN_KICK_BOLDS
+ Kick in caso di grassetto: %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Kick in caso di grassetto: %s (%d kick portano al ban)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Kick in caso di maiuscole: %s (minimo %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Kick in caso di maiuscole: %s (%d portano al ban; minimo %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Kick in caso di maiuscole: %s
+BOT_INFO_CHAN_KICK_COLORS
+ Kick in caso di colori: %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Kick in caso di colori: %s (%d portano al ban)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Kick in caso di flood: %s (%d linee in %d secondi)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Kick in caso di flood: %s (%d kick portano al ban; %d linee in %d secondi)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Kick in caso di flood: %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Kick in caso di ripetizioni: %s (%d volte)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Kick in caso di ripetizioni: %s (%d kick portano al ban; %d volte)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Kick in caso di ripetizioni: %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Kick in caso di reverse: %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Kick in caso di reverse: %s (%d kick portano al ban)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Kick in caso di sottolineato: %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Kick in caso di sottolineato: %s (%d portano al ban ban)
+BOT_INFO_ACTIVE
+ attivato
+BOT_INFO_INACTIVE
+ disattivato
+BOT_INFO_CHAN_OPTIONS
+ Opzioni: %s
+BOT_INFO_OPT_DONTKICKOPS
+ Protezione per gli op
+BOT_INFO_OPT_DONTKICKVOICES
+ Protezione per i voice
+BOT_INFO_OPT_FANTASY
+ Fantasy
+BOT_INFO_OPT_GREET
+ Greet
+BOT_INFO_OPT_NOBOT
+ Nessun bot
+BOT_INFO_OPT_SYMBIOSIS
+ Symbiosis
+BOT_INFO_OPT_NONE
+ Nessuna
+
+# SET responses
+BOT_SET_SYNTAX
+ SET canale opzione parametri
+BOT_SET_DISABLED
+ Spiacente, l'impostazione delle opzioni dei bot è temporaneamente disabilitata.
+BOT_SET_UNKNOWN
+ Opzione %s sconosciuta.
+ Digita /msg %S HELP SET per maggiori informazioni.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET canale DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Il bot non kickerà gli operatori sul canale %s.
+BOT_SET_DONTKICKOPS_OFF
+ Il bot kickerà anche gli operatori sul canale %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET canale DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Il bot non kickerà i voice sul canale %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Il bot kickerà anche i voice sul canale %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET canale FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ La modalità fantasy ora è ATTIVA sul canale %s.
+BOT_SET_FANTASY_OFF
+ La modalità fantasy ora è DISATTIVA sul canale %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET canale GREET {ON|OFF}
+BOT_SET_GREET_ON
+ La modalità greet (saluto) ora è ATTIVA sul canale %s.
+BOT_SET_GREET_OFF
+ La modalità greet (saluto) ora è DISATTIVA sul canale %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET canale NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ La modalità No Bot ora è ATTIVA sul canale %s.
+BOT_SET_NOBOT_OFF
+ La modalità No Bot ora è DISATTIVA sul canale %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET canale PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ La modalità Private del bot %s ora è ATTIVA.
+BOT_SET_PRIVATE_OFF
+ La modalità Private del bot %s ora è DISATTIVA.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET canale SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ La modalità symbiosis ora è ATTIVA sul canale %s.
+BOT_SET_SYMBIOSIS_OFF
+ La modalità symbiosis ora è DISATTIVA sul canale %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK canale opzione {ON|OFF} [parametri]
+BOT_KICK_DISABLED
+ Spiacente, la configurazione dei kick è temporaneamente disabilitata.
+BOT_KICK_UNKNOWN
+ Opzione %s sconosciuta.
+ Digita /msg %S HELP KICK per maggiori informazioni.
+BOT_KICK_BAD_TTB
+ %s non può essere utilizzato come il numero di kick che porta al ban.
+
+BOT_KICK_BADWORDS_ON
+ Il bot ora kickerà chi dice le parolacce. Usa il comando BADWORDS
+ per aggiungere o rimuovere le parolacce dalla lista.
+BOT_KICK_BADWORDS_ON_BAN
+ Il bot ora kickerà chi dice le bad words, e piazzerà un ban dopo
+ %d kick nei confronti dello stesso utente. Usa il comando BADWORDS
+ per aggiungere o rimuovere le parolacce dalla lista.
+BOT_KICK_BADWORDS_OFF
+ Il bot non kickerà più chi dice le parolacce.
+BOT_KICK_BOLDS_ON
+ Il bot ora kickerà chi usa il grassetto.
+BOT_KICK_BOLDS_ON_BAN
+ Il bot ora kickerà chi usa il grassetto, e piazzerà un ban dopo
+ %d kick nei confronti dello stesso utente.
+BOT_KICK_BOLDS_OFF
+ Il bot non kickerà più chi usa il grassetto.
+BOT_KICK_CAPS_ON
+ Il bot ora kickerà chi usa le maiuscole (devono costituire almeno
+ %d caratteri e il %d%% dell'intero messaggio).
+BOT_KICK_CAPS_ON_BAN
+ Il bot ora kickerà chi usa le maiuscole (devono costituire almeno
+ %d caratteri e il %d%% dell'intero messaggio), e piazzerà un ban
+ dopo %d kick nei confronti dello stesso utente.
+BOT_KICK_CAPS_OFF
+ Il bot non kickerà più chi usa le maiuscole.
+BOT_KICK_COLORS_ON
+ Il bot ora kickerà chi usa i colori.
+BOT_KICK_COLORS_ON_BAN
+ Il bot ora kickerà chi usa i colors, e piazzerà un ban dopo %d
+ kick nei confronti dello stesso utente.
+BOT_KICK_COLORS_OFF
+ Il bot non kickerà più chi usa i colori.
+BOT_KICK_FLOOD_ON
+ Il bot ora kickerà chi flooda (%d linee in %d secondi).
+BOT_KICK_FLOOD_ON_BAN
+ Il bot ora kickerà chi flooda (%d linee in %d secondi), e
+ piazzerà un ban dopo %d kick nei confronti dello stesso utente.
+BOT_KICK_FLOOD_OFF
+ Il bot non kickerà più chi flooda.
+BOT_KICK_REPEAT_ON
+ Il bot ora kickerà chi ripete (gli utenti che ripetono %d
+ volte la stessa cosa).
+BOT_KICK_REPEAT_ON_BAN
+ Il bot ora kickerà chi ripete (gli utenti che ripetono %d
+ volte la stessa cosa), e piazzerà un ban dopo %d kick
+ nei confronti dello stesso utente.
+BOT_KICK_REPEAT_OFF
+ Il bot non kickerà più chi ripete.
+BOT_KICK_REVERSES_ON
+ Il bot ora kickerà chi usa i reverse.
+BOT_KICK_REVERSES_ON_BAN
+ Il bot ora kickerà chi usa i reverse, e piazzerà un ban dopo %d
+ kick nei confronti dello stesso utente.
+BOT_KICK_REVERSES_OFF
+ Il bot non kickerà più chi usa i reverse.
+BOT_KICK_UNDERLINES_ON
+ Il bot ora kickerà chi usa il sottolineato.
+BOT_KICK_UNDERLINES_ON_BAN
+ Il bot ora kickerà chi usa il sottolineato, e piazzerà un ban dopo %d
+ kick nei confronti dello stesso utente.
+BOT_KICK_UNDERLINES_OFF
+ Il bot non kickerà più chi usa il sottolineato.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS canale {ADD|DEL|LIST|CLEAR} [parola | numero-lista] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Spiacente, la modifica della lista delle parolacce è temporaneamente disabilitata.
+BOT_BADWORDS_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d parolacce nella lista di un canale.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s è già presente nella lista delle parolacce di %s.
+BOT_BADWORDS_ADDED
+ %s aggiunto alla lista delle parolacce di %s.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ Il record specificato (%d) non è presente nella lista delle parolacce di %s.
+BOT_BADWORDS_NOT_FOUND
+ %s non trovato nella lista delle parolacce di %s.
+BOT_BADWORDS_NO_MATCH
+ Nessun record corrispondente nella lista delle parolacce di %s.
+BOT_BADWORDS_DELETED
+ %s è stato eliminato dalla lista delle parolacce di %s.
+BOT_BADWORDS_DELETED_ONE
+ Eliminato un record dalla lista delle parolacce di %s.
+BOT_BADWORDS_DELETED_SEVERAL
+ Eliminati %d record dalla lista delle parolacce di %s.
+BOT_BADWORDS_LIST_EMPTY
+ La lista delle parolacce di %s è vuota.
+BOT_BADWORDS_LIST_HEADER
+ Lista delle parolacce di %s:
+ Num Parola Tipo
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ La lista delle parolacce è stata svuotata.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY canale testo
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT canale testo
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_EXCEPT
+ L'utente corrisponde a una delle eccezioni del canale.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_BAD_NICK
+ Bot Nicks may only contain valid nick characters.
+BOT_BAD_HOST
+ Bot Hosts may only contain valid host characters.
+BOT_BAD_IDENT
+ Bot Idents may only contain valid characters.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ I Services non riescono a cambiare i modi. I server sono configurati correttamente?
+OPER_BOUNCY_MODES_U_LINE
+ I Services non riescono a cambiare i modi. Le U:lines dei server sono configurate correttamente?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL messaggio
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Opzione %s di STATS sconosciuta.
+OPER_STATS_CURRENT_USERS
+ Utenti correnti: %d (%d operatori)
+OPER_STATS_MAX_USERS
+ Utenti massimi: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ I Services sono up da %d giorni, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ I Services sono up da %d giorno, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ I Services sono up da %d ore, %d minuti
+OPER_STATS_UPTIME_HM1S
+ I Services sono up da %d ore, %d minuti
+OPER_STATS_UPTIME_H1MS
+ I Services sono up da %d ore, %d minuto
+OPER_STATS_UPTIME_H1M1S
+ I Services sono up da %d ore, %d minuto
+OPER_STATS_UPTIME_1HMS
+ I Services sono up da %d ora, %d minuti
+OPER_STATS_UPTIME_1HM1S
+ I Services sono up da %d ora, %d minuti
+OPER_STATS_UPTIME_1H1MS
+ I Services sono up da %d ora, %d minuto
+OPER_STATS_UPTIME_1H1M1S
+ I Services sono up da %d ora, %d minuto
+OPER_STATS_UPTIME_MS
+ I Services sono up da %d minuti, %d secondi
+OPER_STATS_UPTIME_M1S
+ I Services sono up da %d minuti, %d secondo
+OPER_STATS_UPTIME_1MS
+ I Services sono up da %d minuto, %d secondi
+OPER_STATS_UPTIME_1M1S
+ I Services sono up da %d minuto, %d secondo
+OPER_STATS_BYTES_READ
+ Bytes letti: %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Bytes scritti: %5d kB
+OPER_STATS_USER_MEM
+ Utenti: %6d records, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Canali: %6d records, %5d kB
+OPER_STATS_GROUPS_MEM
+ Gruppi (NS): %6d records, %5d kB
+OPER_STATS_ALIASES_MEM
+ Alias (NS): %6d records, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ: %6d records, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ: %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ: %6d records, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessioni: %6d records, %5d kB
+OPER_STATS_PROXY_MEM
+ Proxy: %6d records, %5d kB
+OPER_STATS_AKILL_COUNT
+ Numero attuale di AKILL: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Durata di default delle AKILL: %d giorni
+OPER_STATS_AKILL_EXPIRE_DAY
+ Durata di default delle AKILL: 1 giorno
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Durata di default delle AKILL: %d ore
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Durata di default delle AKILL: 1 ora
+OPER_STATS_AKILL_EXPIRE_MINS
+ Durata di default delle AKILL: %d minuti
+OPER_STATS_AKILL_EXPIRE_MIN
+ Durata di default delle AKILL: 1 minuto
+OPER_STATS_AKILL_EXPIRE_NONE
+ Durata di default delle AKILL: infinita
+OPER_STATS_SGLINE_COUNT
+ Numero attuale di SGLINE: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Durata di default delle SGLINE: %d giorni
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Durata di default delle SGLINE: 1 giorno
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Durata di default delle SGLINE: %d ore
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Durata di default delle SGLINE: 1 ora
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Durata di default delle SGLINE: %d minuti
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Durata di default delle SGLINE: 1 minuto
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Durata di default delle SGLINE: infinita
+OPER_STATS_SQLINE_COUNT
+ Numero attuale di SQLINE: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Durata di default delle SQLINE: %d giorni
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Durata di default delle SQLINE: 1 giorno
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Durata di default delle SQLINE: %d ore
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Durata di default delle SQLINE: 1 ora
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Durata di default delle SQLINE: %d minuti
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Durata di default delle SQLINE: 1 minuto
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Durata di default delle SQLINE: infinita
+OPER_STATS_SZLINE_COUNT
+ Numero attuale di SZLINE: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Durata di default delle SZLINE: %d giorni
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Durata di default delle SZLINE: 1 giorno
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Durata di default delle SZLINE: %d ore
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Durata di default delle SZLINE: 1 ora
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Durata di default delle SZLINE: %d minuti
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Durata di default delle SZLINE: 1 minuto
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Durata di default delle SZLINE: infinita
+OPER_STATS_RESET
+ Le statistiche sono state azzerate.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE canale modi
+
+# CLEARMODES responses
+OPER_UMODE_SYNTAX
+ UMODE nick modi
+
+# OLINE responses
+OPER_UMODE_SUCCESS
+ Modi utente di %s modificati.
+OPER_UMODE_CHANGED
+ %s ha modificato i tuoi modi utente.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flag
+OPER_OLINE_SUCCESS
+ Una O:Line con le flag %s è stata aggiunta per %s.
+
+# CLEARMODES responses
+OPER_OLINE_IRCOP
+ Ora sei un IRC Operator.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES canale [ALL]
+OPER_CLEARMODES_DONE
+ I Modi binari i ban sono stati annullati sul canale %s.
+OPER_CLEARMODES_ALL_DONE
+ Tutti i modi sono stat annullati sul canale %s.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK canale utente motivo
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick newnick
+OPER_SVSNICK_NEWNICK
+ The nick %s is now being changed to %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | numero-lista]
+OPER_ADMIN_SKELETON
+ I Services sono in modalità "scheletro"; il comando ADMIN non è disponibile.
+OPER_ADMIN_EXISTS
+ %s è già presente nella lista dei Services admin.
+OPER_ADMIN_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d Services admin.
+OPER_ADMIN_ADDED
+ %s aggiunto alla lista dei Services admin.
+OPER_ADMIN_NOT_FOUND
+ %s non trovato nella lista dei Services admin.
+OPER_ADMIN_NO_MATCH
+ Nessun record corrispondente nella lista dei Services admin.
+OPER_ADMIN_DELETED
+ %s eliminato dalla lista dei Services admin.
+OPER_ADMIN_DELETED_ONE
+ Eliminato 1 record dalla lista dei Services admin.
+OPER_ADMIN_DELETED_SEVERAL
+ Eliminati %d record dalla lista dei Services admin.
+OPER_ADMIN_LIST_EMPTY
+ La lista dei Services admin è vuota.
+OPER_ADMIN_LIST_HEADER
+ Lista dei Services admin:
+ Num Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ La lista dei Services admin è stata svuotata.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | numero-lista]
+OPER_OPER_SKELETON
+ I Services sono in modalità "scheletro"; il comando ADMIN non è disponibile.
+OPER_OPER_EXISTS
+ %s è già presente nella lista dei Services oper.
+OPER_OPER_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d Services oper.
+OPER_OPER_ADDED
+ %s aggiunto alla lista dei Services oper.
+OPER_OPER_NOT_FOUND
+ %s non trovato nella lista dei Services oper.
+OPER_OPER_NO_MATCH
+ Nessun record corrispondente nella lista dei Services oper.
+OPER_OPER_DELETED
+ %s eliminato dalla lista dei Services oper.
+OPER_OPER_DELETED_ONE
+ Eliminato 1 record dalla lista dei Services oper.
+OPER_OPER_DELETED_SEVERAL
+ Eliminati %d record dalla lista dei Services oper.
+OPER_OPER_LIST_EMPTY
+ La lista dei Services oper è vuota.
+OPER_OPER_LIST_HEADER
+ Lista dei Services oper:
+ Num Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ La lista dei Services oper è stata svuotata.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+durata] {mask | numero-lista} [motivo]]
+OPER_AKILL_EXISTS
+ %s è già presente nella lista AKILL.
+OPER_AKILL_ALREADY_COVERED
+ %s è già coperto da %s.
+OPER_AKILL_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d AKILL.
+OPER_AKILL_NO_NICK
+ Nota: le mask delle AKILL non possono contenere nick; assicurati di non aver incluso una porzione di nick nella mask.
+OPER_AKILL_ADDED
+ %s aggiunto alla lista AKILL.
+OPER_AKILL_CHANGED
+ Durata di %s modificata.
+OPER_AKILL_NOT_FOUND
+ %s non trovato nella lista AKILL.
+OPER_AKILL_NO_MATCH
+ Nessun record corrispondente nella lista AKILL.
+OPER_AKILL_DELETED
+ %s eliminato dalla lista AKILL.
+OPER_AKILL_DELETED_ONE
+ Eliminato 1 record dalla lista AKILL.
+OPER_AKILL_DELETED_SEVERAL
+ Eliminati %d record dalla lista AKILL.
+OPER_AKILL_LIST_EMPTY
+ La lista AKILL è vuota.
+OPER_AKILL_LIST_HEADER
+ Lista AKILL attuale:
+ Num Mask Motivo
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Lista AKILL attuale:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ La lista AKILL è stata svuotata.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+durata] {mask | numero-lista}[:motivo]]
+OPER_SGLINE_UNSUPPORTED
+ Spiacente, SGLINE non è disponibile su questa rete.
+OPER_SGLINE_EXISTS
+ %s è già presente nella lista SGLINE.
+OPER_SGLINE_ALREADY_COVERED
+ %s è già coperto da %s.
+OPER_SGLINE_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d SGLINE.
+OPER_SGLINE_ADDED
+ %s added to the SGLINE list.
+OPER_SGLINE_CHANGED
+ Durata di %s modificata.
+OPER_SGLINE_NOT_FOUND
+ %s non trovato nella lista SGLINE.
+OPER_SGLINE_NO_MATCH
+ Nessun record corrispondente nella lista SGLINE.
+OPER_SGLINE_DELETED
+ %s eliminato dalla lista SGLINE.
+OPER_SGLINE_DELETED_ONE
+ Eliminato 1 record dalla lista SGLINE.
+OPER_SGLINE_DELETED_SEVERAL
+ Eliminati %d record dalla lista SGLINE.
+OPER_SGLINE_LIST_EMPTY
+ La lista SGLINE è vuota.
+OPER_SGLINE_LIST_HEADER
+ Lista SGLINE attuale:
+ Num Mask Motivo
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Lista SGLINE attuale:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ La lista SGLINE è stata svuotata.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+durata] {mask | numero-lista} [motivo]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Le SQLINE di canale non sono supportate da questo IRCd e sono pertanto inutilizzabili.
+OPER_SQLINE_EXISTS
+ %s è già prsente nella lista SQLINE.
+OPER_SQLINE_ALREADY_COVERED
+ %s è già coperto da %s.
+OPER_SQLINE_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d SQLINE.
+OPER_SQLINE_ADDED
+ %s aggiunto alla lista SQLINE.
+OPER_SQLINE_CHANGED
+ Durata di %s modificata.
+OPER_SQLINE_NOT_FOUND
+ %s non trovato nella lista SQLINE.
+OPER_SQLINE_NO_MATCH
+ Nessun record corrispondente nella lista SQLINE.
+OPER_SQLINE_DELETED
+ %s eliminato dalla lista SQLINE.
+OPER_SQLINE_DELETED_ONE
+ Eliminato 1 record dalla lista SQLINE.
+OPER_SQLINE_DELETED_SEVERAL
+ Eliminati %d record dalla lista SQLINE.
+OPER_SQLINE_LIST_EMPTY
+ La lista SQLINE è vuota.
+OPER_SQLINE_LIST_HEADER
+ Lista SQLINE attuale:
+ Num Mask Motivo
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Lista SQLINE attuale:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (da %s su %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ La lista SQLINE è stata annullata.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+durata] {mask | numero-lista} [motivo]]
+OPER_SZLINE_UNSUPPORTED
+ Spiacente, SZLINE non è disponibile su questa rete.
+OPER_SZLINE_EXISTS
+ %s è già presente sulla lista SZLINE.
+OPER_SZLINE_ALREADY_COVERED
+ %s è già coperto da %s.
+OPER_SZLINE_REACHED_LIMIT
+ Spiacente, puoi avere un massimo di %d SZLINE.
+OPER_SZLINE_ONLY_IPS
+ Nota: puoi aggiungere solo mask dell'ip alla lista SZLINE.
+OPER_SZLINE_ADDED
+ %s aggiunto alla lista SZLINE.
+OPER_SZLINE_CHANGED
+ Durata di %s modificata.
+OPER_SZLINE_NOT_FOUND
+ %s non trovato nella lista SZLINE.
+OPER_SZLINE_NO_MATCH
+ Nessun record corrispondente nella lista SZLINE.
+OPER_SZLINE_DELETED
+ %s eliminato dalla lista SZLINE.
+OPER_SZLINE_DELETED_ONE
+ Eliminato 1 record dalla lista SZLINE.
+OPER_SZLINE_DELETED_SEVERAL
+ Eliminati %d record dalla lista SZLINE.
+OPER_SZLINE_LIST_EMPTY
+ La lista SZLINE è vuota.
+OPER_SZLINE_LIST_HEADER
+ Lista SZLINE attuale:
+ Num Mask Motivo
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Lista SZLINE attuale:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ La lista SZLINE è stata svuotata.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET opzione parametri
+OPER_SET_IGNORE_ON
+ Il codice di ignore sarà usato.
+OPER_SET_IGNORE_OFF
+ Il codice di ignore non sarà usato.
+OPER_SET_IGNORE_ERROR
+ Il parametro dell'opzione IGNORE deve essere ON o OFF.
+OPER_SET_READONLY_ON
+ I Services ora sono in modalità read-only.
+OPER_SET_READONLY_OFF
+ I Services ora sono in modalità read-write.
+OPER_SET_READONLY_ERROR
+ Il parametro dell'opzione READONLY deve essere ON o OFF.
+OPER_SET_LOGCHAN_ON
+ Services is now reporting log messages to %s.
+OPER_SET_LOGCHAN_OFF
+ Services is no longer reporting log messages to a channel.
+OPER_SET_LOGCHAN_ERROR
+ Setting for LOGCHAN must be ON or OFF and LogChannel must be defined.
+OPER_SET_DEBUG_ON
+ I Services ora sono in modalità debug.
+OPER_SET_DEBUG_OFF
+ I Services ora non sono in modalità debug.
+OPER_SET_DEBUG_LEVEL
+ I Services ora sono in modalità debug (livello %d).
+OPER_SET_DEBUG_ERROR
+ Il parametro dell'opzione DEBUG deve essere ON, OFF, o un numero positivo.
+OPER_SET_NOEXPIRE_ON
+ I Services ora sono in modalità no expire.
+OPER_SET_NOEXPIRE_OFF
+ I Services ora sono in modalità expire.
+OPER_SET_NOEXPIRE_ERROR
+ Il parametro dell'opzione NOEXPIRE deve essere ON o OFF.
+OPER_SET_UNKNOWN_OPTION
+ Opzione %s sconosciuta.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} server
+OPER_NOOP_SET
+ Tutte le O:lines di %s sono state rimosse.
+OPER_NOOP_REVOKE
+ Tutte le O:lines di %s sono state ripristinate.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE nomeserver [motivo]
+
+# RAW responses
+OPER_JUPE_HOST_ERROR
+ Please use a valid server name when juping
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW testo
+
+# UPDATE responses
+OPER_UPDATING
+ Aggiornamento dei database.
+
+# RELOAD responses
+OPER_RELOAD
+ Il file di configurazione dei Services' è stato ricaricato in memoria.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN non è definito; impossibile riavviare. Riesegui lo script \2configure\2 e ricompila i Services per attivare il comando RESTART.
+
+# IGNORE responses
+OPER_IGNORE_SYNTAX
+ Sintassi: IGNORE {ADD|DEL|LIST|CLEAR} [tempo] [nick]
+OPER_IGNORE_VALID_TIME
+ Devi inserire un numero valido per indicare il tempo.
+OPER_IGNORE_TIME_DONE
+ %s sarà ignorato per %s.
+OPER_IGNORE_PERM_DONE
+ %s sarà ignorato permanentemente.
+OPER_IGNORE_DEL_DONE
+ %s non è più ignorato.
+OPER_IGNORE_LIST
+ Lista ignore dei Services:
+OPER_IGNORE_LIST_NOMATCH
+ %s non trovato nella lista ignore.
+OPER_IGNORE_LIST_EMPTY
+ La lista ignore è vuota.
+OPER_IGNORE_LIST_CLEARED
+ La lista ignore è stata annullata.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Impossibile trovare l'utente %s.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Lista dei canali:
+ Nome Utenti Modi Topic
+OPER_CHANLIST_HEADER_USER
+ %s channel list:
+ Nome Utenti Modi Topic
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ Fine della lista dei canali.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Lista dei nick:
+ Nick Mask
+OPER_USERLIST_HEADER_CHAN
+ Lista dei nick di %s:
+ Nick Mask
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Fine della lista dei nick.
+
+# CACHE responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {hostname | pattern} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Il riconoscimento dei proxy è disabilitato.
+OPER_CACHE_NOT_FOUND
+ Impossibile trovare %s nella cache.
+OPER_CACHE_REMOVED
+ %s è stato rimosso dalla cache.
+OPER_CACHE_HEADER
+ Hostname Stato
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ Fine della lista - %d/%d risultati mostrati
+OPER_CACHE_QUEUED
+ In coda
+OPER_CACHE_PROGRESS
+ In corso
+OPER_CACHE_NORMAL
+ Normale
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ Proxy HTTP
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+OPER_SUPER_ADMIN_ON
+ Ora sei un SuperAdmin.
+OPER_SUPER_ADMIN_OFF
+ Non sei più un SuperAdmin.
+OPER_SUPER_ADMIN_SYNTAX
+ L'impostazione di SuperAdmin deve essere ON o OFF (deve essere attivato in services.conf).
+OPER_SUPER_ADMIN_WALL_ON
+ %s ora è un SuperAdmin.
+OPER_SUPER_ADMIN_WALL_OFF
+ %s non è più un SuperAdmin.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ONLY
+ Solo i SuperAdmin possono usare questo comando.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ This service is temporarly disabled, please try again later
+OPER_DEFCON_NO_CONF
+ The Defcon system must be enabled in the services.conf file
+OPER_DEFCON_CHANGED
+ Services are now at DEFCON %d
+OPER_DEFCON_WALL
+ %s Changed the DEFCON level to %d
+DEFCON_GLOBAL
+ The Defcon Level is now at Level: %d
+
+# Modules strings
+
+OPER_MODULE_LOADED
+ Module %s loaded
+OPER_MODULE_UNLOADED
+ Module %s unloaded
+OPER_MODULE_LOAD_FAIL
+ Unable to load module %s
+OPER_MODULE_REMOVE_FAIL
+ Unable to remove module %s
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST
+ Module: %s
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Providing IRCD handler for: %s
+OPER_MODULE_NO_LIST
+ No modules currently loaded
+OPER_MODULE_NO_INFO
+ No information about module %s is available
+OPER_MODULE_INFO_SYNTAX
+ MODINFO FileName
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ The following commands have been loaded by a module:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [parametri]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+durata] mask limite motivo
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {mask | lista}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE num posizione
+OPER_EXCEPTION_DISABLED
+ Il limite delle sessioni è disabilitato.
+OPER_EXCEPTION_ALREADY_PRESENT
+ La mask %s è già presente sulla lista delle eccezioni.
+OPER_EXCEPTION_TOO_MANY
+ La lista delle eccezioni è piena!
+OPER_EXCEPTION_ADDED
+ Il limite di sessioni per %s è stato impostato a %d.
+OPER_EXCEPTION_MOVED
+ L'eccezione per %s (numero %d) è stata spostata alla posizione %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ Il record specificato (%d) non esiste nella lista delle eccezioni.
+OPER_EXCEPTION_NOT_FOUND
+ Impossibile trovare %s nella lista delle eccezioni.
+OPER_EXCEPTION_NO_MATCH
+ Nessun record corrispondente nella lista delle eccezioni.
+OPER_EXCEPTION_DELETED
+ %s eliminato dalla lista delle eccezioni.
+OPER_EXCEPTION_DELETED_ONE
+ Eliminato 1 record dalla lista delle eccezioni.
+OPER_EXCEPTION_DELETED_SEVERAL
+ Eliminati %d record dalla lista delle eccezioni.
+OPER_EXCEPTION_LIST_HEADER
+ Lista delle eccezioni attuale:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Num Limite Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (by %s on %s; %s)
+ Limite: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Limite delle sessioni non valido. Deve essere un numero intero maggiore o uguale a zero e minore di %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Hostmask non valida. Solo le hostmask reali sono valide; le eccezioni non vengono confrontate con i nick o con gli username (ident).
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST limite | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST limite
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ La limitazione delle sessioni non è attiva.
+OPER_SESSION_INVALID_THRESHOLD
+ Valore di soglia non valido. Deve essere un numero intero maggiore di 1.
+OPER_SESSION_NOT_FOUND
+ %s non trovato nella lista delle sessioni.
+OPER_SESSION_LIST_HEADER
+ Lista degli host con almeno %d sessioni:
+OPER_SESSION_LIST_COLHEAD
+ Sessioni Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ L'host %s ha %d sessioni, con un limite di %d.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Sintassi: EXCEPTION ADD [+durata] mask limite motivo
+ EXCEPTION DEL {mask | lista}
+ EXCEPTION MOVE num posizione
+ EXCEPTION LIST [mask | lista]
+ EXCEPTION VIEW [mask | lista]
+
+ Permette ai Services admin di manipolare la lista degli host
+ che hanno limiti di sessione specifici, in modo da permettere
+ ad alcune macchine, come ad esempio ai server di shell, di
+ avere un numero di client maggiore di quello di default.
+ Quando un host raggiunge il suo limite di sessioni, tutti i
+ client che cercano di connettersi da quell'host verranno
+ disconnessi (killati). Prima che l'utente venga killato,
+ viene inviato un /NOTICE da %S per fornire delle informazioni
+ sulla limitazione delle sessioni. Il contenuto di questo notice
+ è impostato nel file di configurazione.
+
+ EXCEPTION ADD aggiunge la hostmask specificata alla lista delle
+ eccezioni. Bisogna tenere presente che le mask nick!user@host
+ e and user@host non sono valide. Soltanto le vere mask di host,
+ come ad esempio box.host.dom e *.host.dom, sono permesse,
+ poiché la limitazione delle sessioni non tiene conto del nick e
+ degli username (ident). limite deve essere un numero maggiore o
+ uguale a zero. Questo valore indica quante sessioni contemporanee
+ sono permesse a quell'host. Se viene indicato il limite 0, l'host
+ non ha limite di sessioni. Guarda l'help del comando AKILL per
+ i dettagli sul formato del parametro opzionale durata.
+ EXCEPTION DEL rimuove la mask specificata dalla lista delle
+ eccezioni.
+ EXCEPTION MOVE sposta l'eccezione num alla posizione posizione.
+ Le eccezioni che si trovano in mezzo saranno spostate in alto o in
+ basso per riempire il vuoto.
+ EXCEPTION LIST e EXCEPTION VIEW mostrano tutte le eccezioni
+ attuali; se viene specificata la mask opzionale, la lista è limitata
+ alle eccezioni che corrispondono alla maschera. La differenza è
+ che EXCEPTION VIEW fornisce maggiori informazioni, visualizzando
+ il nome della persona che ha aggiunto l'eccezione, il suo limite di
+ sessioni, il motivo, la host mask e la data di scadenza.
+
+ Bisogna tener conto che un client che si connette "userà" la prima
+ eccezione che corrisponde al loro host. Liste di eccezioni molto
+ grandi ed mask generiche possono degradare la funzionalità dei
+ Services.
+
+ Limitato ai Services admin.
+
+OPER_HELP_SESSION
+ Sintassi: SESSION LIST soglia
+ SESSION VIEW host
+
+ Permette ai Services admins di visualizzare la lista delle sessioni.
+
+ SESSION LIST mostra gli host con almeno threshold sessioni.
+ La soglia deve essere un numero maggiore di 1, in modo da evitare
+ la visualizzazione accidentale di un gran numero di host con una
+ sola sessione.
+ SESSION VIEW mostra informazioni dettagliate su un host specifico,
+ incluso il conteggio attuale delle sessioni e del limite delle stesse.
+ Il valore host non può includere wildcards.
+
+ Guarda l'help del comando EXCEPTION per maggiori informazioni
+ sulla limitazione delle sessioni e come configurare limiti specifici
+ per determinati host o gruppi di host.
+
+ Limitato ai Services admin.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Displays all Services Staff nicks along with level
+ and on-line status.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ The defcon system can be used to implement a pre-defined
+ set of restrictions to services useful during an attemtped
+ attack on the network.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * No new channel registrations
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * No new nick registrations
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * No MLOCK changes
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Force Chan Modes (%s) to be set on all channels
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Use the reduced session limit of %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill any NEW clients connecting
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignore any non-opers with message
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Silently ignore non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL any new clients connecting
+
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * No new memos sent
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+expiry] channel reason
+
+ Puts an AKILL for every nick on the specified channel. It
+ uses the entire and complete real ident@host for every nick,
+ then enforces the AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Messaggio di ingresso - %s] %s
+NEWS_OPER_TEXT
+ [Messaggio per gli operatori - %s] %s
+NEWS_RANDOM_TEXT
+ [Messaggio del giorno - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Sintassi: LOGONNEWS {ADD|DEL|LIST} [testo|numero]
+NEWS_LOGON_LIST_HEADER
+ Lista delle Logon News:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s, aggiunto da %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ Non c'è nessuna Logon News.
+NEWS_LOGON_ADD_SYNTAX
+ Sintassi: LOGONNEWS ADD testo
+NEWS_LOGON_ADD_FULL
+ La lista delle news è piena!
+NEWS_LOGON_ADDED
+ Aggiunta una nuova Logon News (numero %d).
+NEWS_LOGON_DEL_SYNTAX
+ Sintassi: LOGONNEWS DEL {numero | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Impossibile trovare la Logon News numero %d!
+NEWS_LOGON_DELETED
+ La Logon News numero %d è stata eliminata.
+NEWS_LOGON_DEL_NONE
+ Nessuna Logon News da eliminare!
+NEWS_LOGON_DELETED_ALL
+ Tutte le Logon News sono state eliminate.
+
+NEWS_OPER_SYNTAX
+ Sintassi: OPERNEWS {ADD|DEL|LIST} [testo|numero]
+NEWS_OPER_LIST_HEADER
+ Lista delle Oper News:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s, aggiunto da %s)
+ %s
+NEWS_OPER_LIST_NONE
+ Non c'è nessuna Oper News.
+NEWS_OPER_ADD_SYNTAX
+ Sintassi: OPERNEWS ADD testo
+NEWS_OPER_ADD_FULL
+ La lista delle news è piena!
+NEWS_OPER_ADDED
+ Aggiunta una nuova Oper News (numero %d).
+NEWS_OPER_DEL_SYNTAX
+ Sintassi: OPERNEWS DEL {numero | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Impossibile trovare la Oper News numero %d!
+NEWS_OPER_DELETED
+ La Oper News numero %d è stata eliminata.
+NEWS_OPER_DEL_NONE
+ Nessuna Oper News da eliminare!
+NEWS_OPER_DELETED_ALL
+ Tutte le Oper News sono state eliminate.
+
+NEWS_RANDOM_SYNTAX
+ Sintassi: RANDOMNEWS {ADD|DEL|LIST} [testo|numero]
+NEWS_RANDOM_LIST_HEADER
+ Lista delle Random News:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s, aggiunto da %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Non c'è nessuna Random News.
+NEWS_RANDOM_ADD_SYNTAX
+ Sintassi: RANDOMNEWS ADD testo
+NEWS_RANDOM_ADD_FULL
+ La lista delle news è piena!
+NEWS_RANDOM_ADDED
+ Aggiunta una nuova Random News (numero %d).
+NEWS_RANDOM_DEL_SYNTAX
+ Sintassi: RANDOMNEWS DEL {numero | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Impossibile trovare la Random News numero %d!
+NEWS_RANDOM_DELETED
+ La Random News numero %d è stata eliminata.
+NEWS_RANDOM_DEL_NONE
+ Nessuna Random News da eliminare!
+NEWS_RANDOM_DELETED_ALL
+ Tutte le Random News sono state eliminate.
+
+NEWS_HELP_LOGON
+ Sintassi: LOGONNEWS ADD testo
+ LOGONNEWS DEL {numero | ALL}
+ LOGONNEWS LIST
+
+ Modifica o visualizza la lista dei messaggi di ingresso.
+ Quando un utente si connette alla rete, gli saranno inviati
+ questi messaggi. (In ogni caso, non saranno inviati più di
+ tre messaggi per evitare di floodare l'utente. Se ci sono
+ più di tre messaggi di ingresso, solo i tre più recenti gli
+ saranno inviati).
+
+ LOGONNEWS LIST può essere usato da qualsiasi IrcOp per
+ visualizzare i messaggi correnti. ADD e DEL possono essere
+ utilizzati soltanto dai Services admin.
+
+NEWS_HELP_OPER
+ Sintassi: OPERNEWS ADD testo
+ OPERNEWS DEL {numero | ALL}
+ OPERNEWS LIST
+
+ Modifica o visualizza la lista dei messaggi per gli operatori.
+ Quando un utente diventa operatore (con il comando /OPER), gli
+ saranno inviati questi messaggi. (In ogni caso, non saranno
+ inviati più di tre messaggi per evitare di floodare l'utente.
+ Se ci sono più di tre messaggi, solo i tre più recenti gli
+ saranno inviati).
+
+ OPERNEWS LIST può essere usato da qualsiasi IrcOp per
+ visualizzare i messaggi correnti. ADD e DEL possono essere
+ utilizzati soltanto dai Services admin.
+
+NEWS_HELP_RANDOM
+ Sintassi: RANDOMNEWS ADD testo
+ RANDOMNEWS DEL {numero | ALL}
+ RANDOMNEWS LIST
+
+ Modifica o visualizza la lista delle informazioni del giorno.
+ Quando un utente si connette alla rete, una (e una soltanto)
+ delle informazioni del giorno sarà scelta casualmente e gli
+ sarà inviata.
+
+ RANDOMNEWS LIST può essere usato da qualsiasi IrcOp per
+ visualizzare i messaggi correnti. ADD e DEL possono essere
+ utilizzati soltanto dai Services admin.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S è un servizio pensato per fornire informazioni sui
+ Services. Gli argomenti di aiuto sono accessibili con il
+ comando HELP degli altri Services:
+
+ /msg %s HELP
+ per informazioni sulla registrazione dei nick
+
+ /msg %s HELP
+ per informazioni sulla registrazione e il controllo
+ dei canali
+
+ /msg %s HELP
+ per informazioni sull'invio dei messaggi ad utenti
+ non connessi
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ per informazioni sulla configurazione di un bot
+ per il proprio canale
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ %S ti permette di "registrare" un nick e di
+ evitare che gli altri lo usino. I seguenti
+ comandi permettono la registrazione e il mantenimento
+ dei nick; per usarli, digita /msg %S comando.
+ Per maggiori informazioni su un comando specifico,
+ digita /msg %S HELP comando.
+
+ ACCESS Modifica la lista degli indirizzi autorizzati
+ ALIST Mostra i canali in cui si ha accesso
+ DROP Annulla la registrazione del nick
+ GHOST Disconnette un nick fantasma che non è ancora caduto
+ GLIST Mostra la lista di tutti i nick nel proprio gruppo
+ GROUP Entra in un gruppo
+ IDENTIFY Ti identifica per il tuo nick
+ INFO Mostra le informazioni su un nick
+ LIST Mostra l'elenco dei nick registrati
+ LOGOUT Deidentifica dal proprio nick
+ RECOVER Disconnette un altro utente che usa il tuo nick
+ REGISTER Registra un nick
+ RELEASE Permette di usare di nuovo il proprio nick dopo un RECOVER
+ SENDPASS Invia la password del proprio nick via e-mail
+ SET Imposta le opzioni, inclusa la protezione
+ STATUS Indica lo stato di identificazione di un nick
+
+ NOTA: Questo servizio è pensato per fornire agli
+ utenti un modo per assicurarsi che loro identità non
+ sia compromessa.
+ NON è pensato per facilitare il "furto" dei nick
+ o per altre azioni maliziose. L'abuso di %S
+ risulterà, come minimo, nella perdita del proprio nick.
+
+NICK_HELP_EXPIRES
+
+ I nick che non sono più usati sono soggetti a
+ cancellazione automatica; saranno cioè eliminati
+ dopo %d giorni di inutilizzo.
+
+NICK_HELP_REGISTER
+ Sintassi: REGISTER password [e-mail]
+
+ Registra il tuo nick nel database di %S. Quando il
+ nick è registrato, puoi usare i comandi SET e ACCESS
+ per modificare a tuo piacimento le impostazioni del tuo
+ nick. Assicurati di non dimenticare la password che usi
+ per la registrazione - ne avrai bisogno per effettuare
+ modifiche sul tuo nick.
+ Tieni conto che le maiuscole e le minuscole sono
+ differenti! PIPPO, Pippo, pippo e PiPpO sono
+ tutte password diverse!
+
+ Suggerimenti sulla scelta della password:
+
+ Le password non devono essere facili da indovinare. Ad
+ esempio, usare il tuo vero nome come password è una
+ cattiva idea. Utilizzare il tuo nick come password è
+ un'idea anche peggiore ;), infatti %S non ti permetterà
+ di farlo. Inoltre, le password brevi sono facili da
+ indovinare con meno tentativi, pertanto è meglio usare
+ una password di almeno 5 caratteri. Inoltre, lo spazio
+ non può essere usato all'interno di una password.
+
+ Il parametro e-mail è necessario e serve a memorizzare
+ il tuo indirizzo nei parametri del tuo nick.
+ Il tuo indirizzo non sarà ceduto a terzi, e sarà usato
+ per inviarti la password nel caso tu la dimentichi.
+
+ Questo comando crea anche un nuovo gruppo per il tuo nick,
+ che ti permetterà di registrare altri nick condividendo
+ la stessa configurazione, gli stessi memo e gli stessi
+ privilegi sui canali. Per maggiori informazioni su questo
+ servizio, digita /msg %S HELP GROUP.
+
+NICK_HELP_GROUP
+ Sintassi: GROUP destinazione password
+
+ Questo comando fa sì che il tuo nick entri nel gruppo del
+ nick destinazione. password è la password del nick di
+ destinazione.
+
+ Entrare in un gruppo ti permetterà di condividere la tua
+ configurazione, i tuoi memo e i privilegi sui canali con
+ tutti i nick nel tuo gruppo.
+
+ Un gruppo esiste fino a quando è utile. Questo significa
+ che anche se uno dei nick del gruppo viene deregistrato,
+ non perderai le condivisioni descritte sopra, fino a quando
+ nel gruppo resta almeno un nick.
+
+ Puoi usare questo comando anche se non hai ancora registrato
+ il tuo nick. Se il tuo nick è già registrato, dovrai
+ identificarti prima di usare questo comando. Digita
+ /msg %S HELP IDENTIFY per maggiori informazioni.
+
+ E' consigliato l'uso di questo comando con un nick non
+ registrato, in quanto verrà registrato automaticamente
+ con l'uso stesso di questo comando.
+
+ E' possibile stare in un solo nick per volta. L'unione dei
+ gruppi non è possibile
+
+ Nota: tutti i nick di un gruppo hanno la stessa password.
+
+NICK_HELP_IDENTIFY
+ Sintassi: IDENTIFY password
+
+ Indica a %S che sei davvero il proprietario del nick.
+ Molti comandi richiedono che tu ti sia autentificato
+ con questo comando prima di poterli usare. La password
+ deve essere la stessa che è stata utilizzata con il
+ comando REGISTER.
+
+NICK_HELP_UPDATE
+ Syntax: UPDATE
+
+ Updates your current status, i.e. it checks for new memos,
+ sets needed chanmodes (ModeonID) and updates your vhost and
+ your userflags (lastseentime, etc).
+
+NICK_HELP_LOGOUT
+ Sintassi: LOGOUT
+
+ Annulla l'effetto del comando IDENTIFY, cioè fa in modo
+ che tu non sia più riconosciuto come il vero proprietario
+ del nick. Tieni presente, però, che non dovrai identificarti
+ di nuovo.
+
+NICK_HELP_DROP
+ Sintassi: DROP [nick]
+
+ Cancella (deregistra) il tuo nick dal database di %S database.
+ Un nick deregistrato è a disposizione di chiunque per venire
+ registrato nuovamente.
+
+ Puoi deregistrare un nick all'interno del tuo gruppo indicandolo
+ nel parametro nick.
+
+ Per usare questo comando, devi prima identificarti con la tua
+ password (digita /msg %S HELP IDENTIFY per avere maggiori
+ informazioni).
+
+NICK_HELP_ACCESS
+ Sintassi: ACCESS ADD mask
+ ACCESS DEL mask
+ ACCESS LIST
+
+ Visualizza o modifica la lista di accesso per il tuo nick.
+ Si tratta della lista degli indirizzi che saranno riconosciuti
+ automaticamente da %S e che ti permetteranno di utilizzare
+ il tuo nick. Se vuoi usare il nick da indirizzi diversi, dovrai
+ utilizzare il comando IDENTIFY per farti riconoscere
+ da %S.
+
+ Esempi:
+
+ ACCESS ADD pippo@*.disney.it
+ Permette l'accesso all'utente con ident pippo da
+ qualsiasi macchina all'interno del dominio disney.it.
+
+ ACCESS DEL pippo@*.disney.it
+ Annulla l'effetto del comando precedente.
+
+ ACCESS LIST
+ Visualizza la lista di accesso attuale.
+
+NICK_HELP_SET
+ Sintassi: SET opzione parametri
+
+ Imposta varie opzioni del nick. opzione può essere una delle
+ seguenti:
+
+ DISPLAY Imposta il nome del tuo gruppo
+ EMAIL Associa un indirizzo e-mail al tuo nick
+ GREET Associa un messaggio di saluto al tuo nick
+ HIDE Nasconde alcune informazioni sul tuo nick
+ ICQ Associa un numero ICQ al tuo nick
+ KILL Attiva o disattiva la protezione
+ LANGUAGE Imposta la lingua utilizzata dai Services
+ MSG Cambia il metodo di comunicazione usato dai Services
+ PASSWORD Imposta la password del tuo nick
+ PRIVATE Nasconde il nick dalla lista (/msg %S LIST)
+ SECURE Attiva o disattiva la sicurezza
+ URL Associa un URL al tuo nick
+
+ Per usare questo comando, devi prima identificarti con
+ la tua password (digita /msg %S HELP IDENTIFY per
+ ottenere maggiori informazioni).
+
+ Digita /msg %S HELP SET opzione per avere maggiori
+ informazioni su una opzione specifica.
+
+NICK_HELP_SET_DISPLAY
+ Sintassi: SET DISPLAY nuovo-nome
+
+ Imposta il nome con cui i Services si riferiscono al tuo
+ gruppo. Il nuovo nome DEVE essere un nick del gruppo.
+
+NICK_HELP_SET_PASSWORD
+ Sintassi: SET PASSWORD nuova-password
+
+ Cambia la password utilizzata per identificarti come
+ proprietario del nick.
+
+NICK_HELP_SET_LANGUAGE
+ Sintassi: SET LANGUAGE numero
+
+ Cambia la lingua utilizzata dai Services per inviarti
+ i messaggi, ad esempio per rispondere a un comando che
+ tu invii.
+ numero deve essere scelto dalla lista seguente, che
+ elenca le lingue supportate:
+
+
+NICK_HELP_SET_URL
+ Sintassi: SET URL url
+
+ Associa l'URL indicato al proprio nick. Questo URL
+ sarà mostrato quando qualcuno richiede informazioni
+ sul proprio nick con il comando INFO.
+
+NICK_HELP_SET_EMAIL
+ Sintassi: SET EMAIL indirizzo
+
+ Associa l'indirizzo e-mail specificato al proprio nick.
+ Questo indirizzo sarà mostrato quando qualcuno richiede
+ informazioni sul proprio nick con il comando INFO.
+
+NICK_HELP_SET_ICQ
+ Sintassi: SET ICQ numero
+
+ Associa il numero ICQ specificato al proprio nick.
+ Questo indirizzo sarà mostrato quando qualcuno richiede
+ informazioni sul proprio nick con il comando INFO.
+
+NICK_HELP_SET_GREET
+ Sintassi: SET GREET messaggio
+
+ Imposta come saluto del tuo nick il messaggio specificato,
+ che sarà mostrato quando si entra in un canale che ha
+ l'opzione GREET attiva, se si ha un livello di accesso
+ al canale sufficiente.
+
+NICK_HELP_SET_KILL
+ Sintassi: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Attiva o disattiva l'opzione di protezione automatica per
+ il tuo nick. Quando la protezione è attiva, se un altro
+ utente cerca di usare il tuo nick, avrà un minuto per
+ cambiarlo, dopo del quale %S gli assegnerà un nick casuale.
+
+ Se scegli QUICK, l'utente avrà soltanto 20 secondi per
+ cambiare nick invece di 60. Se scegli IMMED, il nick
+ sarà cambiato immediatamente, senza essere prima avvisato
+ per dargli la possibilità di cambiare nick; non usare questa
+ opzione se non è strettamente necessario. L'opzione IMMED,
+ inoltre, potrebbe non essere disponibile.
+
+NICK_HELP_SET_SECURE
+ Sintassi: SET SECURE {ON | OFF}
+
+ Attiva o disattiva sul tuo nick le funzionalità di sicurezza
+ di %S. Quando SECURE è attivo, devi identificarti come
+ proprietario del nick, anche se il tuo indirizzo compare
+ nella lista di accesso. Comunque, se sei nella lista di
+ accesso, %S non cambierà il tuo nick, anche se l'opzione KILL
+ è attiva.
+
+NICK_HELP_SET_PRIVATE
+ Sintassi: SET PRIVATE {ON | OFF}
+
+ Attiva o disattiva l'opzione privacy di %S per il tuo
+ nick. Quando PRIVATE è attivo, il tuo nick non comparirà nelle
+ liste dei nick generate con %S comando LIST. In ogni caso, però,
+ chiunque sappia il tuo nick può leggerne le informazioni con il
+ comando INFO.
+
+NICK_HELP_SET_HIDE
+ Sintassi: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Ti permette di nascondere alcune informazioni quando qualcuno
+ effettua un %S INFO sul tuo nick. Puoi nascondere il tuo
+ indirizzo e-mail (EMAIL), l'ultima hostmask di accesso
+ (USERMASK) e l'ultimo messaggio di quit (QUIT). Il secondo
+ parametro specifica se l'informazione indicata debba essere
+ mostrata (OFF) o nascosta (ON).
+
+NICK_HELP_SET_MSG
+ Sintassi: SET MSG {ON | OFF}
+
+ Ti permette di scegliere il modo in cui i Services comunicano
+ con te. Se MSG è attivo, i Services usano i messaggi (query),
+ altrimenti usano i notices.
+
+NICK_HELP_RECOVER
+ Sintassi: RECOVER nick [password]
+
+ Ti permette di recuperare il tuo nick se qualcun altro
+ lo sta usando; si tratta della stessa cosa che %S
+ fa automaticamente se qualcuno cerca di usare un nick
+ con la protezione (kill) attivata.
+
+ Quando usi questo comando, %S farà connettere un utente
+ fittizio il nick specificato, in modo da disconnettere
+ l'altro utente. Questo utente fittizio resterà online per
+ un minuto, in modo che che l'altro utente non si riappropri
+ immediatamente del tuo nick; dopo quel minuto, puoi tornare
+ ad usare il tuo nick. In alternativa, puoi usare il comando
+ RELEASE (/msg %S HELP RELEASE) per recuperare il tuo
+ nick prima che passi un minuto.
+
+ Per usare il comando RECOVER su un nick, il tuo indirizzo
+ attuale (così come compare nel /WHOIS) deve trovarsi nella
+ lista di accesso di quel nick, devi essere identificato e
+ nello stesso gruppo di quel nick, o devi fornire la password
+ corretta per quel nick.
+
+NICK_HELP_RELEASE
+ Sintassi: RELEASE nick [password]
+
+ Indica a %S di rimuovere il blocco sul tuo nick causato
+ dalla protezione automatica (kill) o dall'uso del comando
+ RECOVER. Questi blocchi durano un minuto; questo comando
+ ti permette di rimuoverli prima.
+
+ Per usare il comando RELEASE su un nick, il tuo indirizzo
+ attuale (così come compare nel /WHOIS) deve trovarsi nella
+ lista di accesso di quel nick, devi essere identificato e
+ nello stesso gruppo di quel nick, o devi fornire la password
+ corretta per quel nick.
+
+NICK_HELP_GHOST
+ Sintassi: GHOST nick [password]
+
+ Disconnette un nick "fantasma" con il tuo nick. Un nick
+ "fantasma" è un nick che non è più connesso realmente,
+ ma che è ancora su IRC. Questo succede, di solito, se
+ il tuo computer ha problemi o se vieni disconnesso mentre
+ sei su IRC. Con questo comando, si può fare in modo che
+ il nick venga disconnesso senza dover attendere che il
+ server lo disconnetta per "ping timeout".
+
+ Per usare il comando GHOST su un nick, il tuo indirizzo
+ attuale (così come compare nel /WHOIS) deve trovarsi nella
+ lista di accesso di quel nick, devi essere identificato e
+ nello stesso gruppo di quel nick, o devi fornire la password
+ corretta per quel nick.
+
+NICK_HELP_INFO
+ Sintassi: INFO nick [ALL]
+
+ Mostra varie informazioni sul nick specificato, come ad
+ esempio il proprietario del nick, la data dell'ultimo
+ accesso, l'ultimo indirizzo utilizzato e le opzioni stesse
+ del nick. Se sei identificato per il nick di cui stai
+ richiedendo le informazioni, e specifichi il parametro
+ ALL, vedrai tutte le informazioni, che siano nascoste
+ o meno.
+
+NICK_HELP_LIST
+ Sintassi: LIST pattern
+
+ Mostra tutti i nick registrati che corrispondono al
+ pattern specificato, nel formato nick!user@host.
+ I nick che hanno attivato l'opzione PRIVATE non
+ saranno mostrati.
+
+ Esempi:
+
+ LIST *!pluto@topolino.disney.it
+ Mostra tutti i nick che appartengono a
+ pluto@topolino.disney.it.
+
+ LIST *bot*!*@*
+ Mostra tutti i nick registrati che contengono bot
+ (maiuscole e minuscole non fanno differenza).
+
+ LIST *!*@*.azienda.it
+ Mostra tutti i nick registrati da utenti del dominio
+ bar.org.
+
+NICK_HELP_ALIST
+ Sintassi: ALIST [livello]
+
+ Mostra tutti i canali su cui hai accesso. Opzionalmente,
+ puoi specificare un livello nel formato XOP o numerico.
+ La lista risultante includerà soltanto i canali su cui
+ hai il livello di accesso indicato o superiore.
+
+ Esempi:
+ ALIST Founder
+ Mostra tutti i canali in cui hai livello di
+ fondatore.
+
+ ALIST AOP
+ Mostra tutti i canali in cui hai livello di
+ AOP o superiore.
+
+ ALIST 10
+ Mostra tutti i canali in cui hai livello 10
+ o superiore.
+
+ I canali che hanno l'opzione NOEXPIRE impostata verranno
+ mostrati con un punto esclamativo.
+
+NICK_HELP_GLIST
+ Sintassi: GLIST
+
+ Mostra tutti i nick del tuo gruppo.
+
+NICK_HELP_STATUS
+ Sintassi: STATUS nick...
+
+ Indica se l'utente che usa il nick specificato è riconosciuto
+ come proprietario del nick. La risposta ha questo formato:
+
+ nick codice-di-stato
+
+ dove nick è il nick inviato con il comando, e codice-di-stato
+ può essere:
+
+ 0 - l'utente non è online o il nick non è registrato
+ 1 - l'utente non è riconosciuto come proprietario del nick
+ 2 - l'utente è riconosciuto come proprietario solo attraverso
+ la lista di accesso
+ 3 - l'utente è riconosciuto come proprietario attravrso
+ l'identificazione per mezzo della password
+
+ Con ogni comando possono essere inviati fino a 16 nick; il
+ resto sarà ignorato. Non è generato alcun messaggio di errore
+ se non viene specificato alcun nick.
+
+NICK_HELP_SENDPASS
+ Sintassi: SENDPASS nick
+
+ Invia la password del nick specificato all'indirizzo e-mail
+ impostato nelle opzioni del nick stesso. Questo comando è
+ utile quando un utente ha dimenticato la password.
+
+ Potrebbe essere disponibile soltanto per gli IrcOp.
+
+ Questo comando non è utilizzabile quando la criptazione è attiva.
+
+NICK_SERVADMIN_HELP
+
+ I seguenti comandi sono disponibili per i Services admin:
+
+ GETPASS Recupera la password di un nick
+ (solo se la criptazione è disattivata)
+ FORBID Blocca un nick in modo che non venga usato
+
+ I Services admin possono inoltre deregistrare qualsiasi nick
+ senza doversi identificare per quel nick, e possono visualizzare
+ le liste di accesso per qualunque nick (/msg %S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Sintassi: LOGOUT [nick [REVALIDATE]]
+
+ Senza nessun parametro, annulla l'effetto del comando IDENTIFY,
+ rendendoti non più identificato come proprietario del nick.
+ Da notare, comunque, che non ti sarà richiesto di identificarti
+ di nuovo.
+
+ Con un parametro, il funzionamento è identico ma viene applicato
+ al nick specificato. Se si indica anche REVALIDATE, i Services
+ chiederanno al nick specificato di reidentificarsi. Questo
+ modo di utilizzo è limitato ai Services admin.
+
+NICK_SERVADMIN_HELP_DROP
+ Sintassi: DROP [nick]
+
+ Senza parametro, annulla (deregistra) il tuo nick dal
+ database di %S.
+
+ Con un parametro, deregistra il nick specificato dal
+ database. Puoi deregistrare qualsiasi nick del tuo
+ gruppo senza aver bisogno di privilegi speciali.
+ La deregistrazione di qualsiasi nick è limitata ai
+ Services admin.
+
+NICK_SERVADMIN_HELP_SET
+
+ I Services admin possono inoltre impostare l'opzione
+ NOEXPIRE, con cui i nick non scadono. Inoltre, i
+ Services admin possono impostare le opzioni per qualsiasi
+ nick senza specificarne la password, usando il formato
+ SET nick opzione parametri.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Sintassi: SET [nick] NOEXPIRE {ON | OFF}
+
+ Imposta se il nick specificato scadrà. Se l'opzione è
+ impostata a ON, il nick non scadrà. Se non è specificato
+ alcun nick, l'opzione viene applicata al proprio.
+
+ Limitato ai Services admin.
+
+NICK_SERVADMIN_HELP_INFO
+
+ I Services admin possono usare il parametro ALL con tutti i nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Sintassi: LIST pattern [FORBIDDEN] [NOEXPIRE]
+
+ Mostra tutti i nick registrati che corrispondono al
+ pattern specificato, nel formato nick!user@host.
+ I nick con l'opzione PRIVATE attiva saranno mostrati
+ solo ai Services admin. I nick con l'opzione NOEXPIRE
+ attiva avranno un ! prima del nick stesso (solo per i
+ Services admin).
+
+ Se sono specificate le opzioni FORBIDDEN o NOEXPIRE,
+ soltanto i nick che, rispettivamente, sono vietati o
+ hanno l'opzione NOEXPIRE attiva verranno mostrati. Se
+ vengono specificate entrambe le opzioni, entrambi i
+ tipi di nick saranno visualizzati. Queste opzioni sono
+ limitate ai Services admin.
+
+ Esempi:
+
+ LIST *!joeuser@foo.com
+ Mostra tutti i nick che appartengono a
+ joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Mostra tutti i nick registrati che contengono
+ Bot (case insensitive).
+
+ LIST * NOEXPIRE
+ Mostra tutti i nick registrati che non
+ scadono.
+
+NICK_SERVADMIN_HELP_ALIST
+ Sintassi: ALIST [nick] [livello]
+
+ Senza parametri, mostra i canali su cui hai accesso.
+ Con un parametro, mostra i canali su cui ha accesso
+ l'utente nick. Con due parametri, mostra i canali
+ su cui nick ha livello di accesso livello o
+ superiore.
+
+ Questo modo d'uso è limitato ai Services admin.
+
+NICK_SERVADMIN_HELP_GLIST
+ Sintassi: GLIST [nick]
+
+ Senza parametro, mostra tutti i nick del tuo gruppo.
+
+ Con un parametro, mostra tutti i nick del gruppo del
+ nick specificato.
+ Questo modo d'uso è riservato ai Services admin.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Sintassi: GETPASS nick
+
+ Restituisce la password del nick specificato.
+ Da notare che quando questo comando viene usato,
+ verrà inviato un WALLOPS o GLOBOPS ad indicare la
+ persona che l'ha utilizzato e su quale nick è stato
+ utilizzato.
+
+ Limitato ai Services admin.
+
+ Questo comando non è disponibile quando è attiva la
+ criptazione dei database.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Returns the matching nicks that used given email. Note that
+ you can not use wildcards for either user or emailhost. Whenever
+ this command is used, a message including the person who issued
+ the command and the email it was used on will be logged.
+
+ Limited to Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Sintassi: FORBID nick [motivo]
+
+ Fa sì che un nick non possa venire registrato o usato
+ da nessuno. Può essere annullato deregistrando il nick
+ con il comando DROP.
+
+ Su alcune reti può essere necessario specificare il motivo.
+
+ Limitato ai Services admin.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ %S permette di registrare i canali e di controllarne
+ vari aspetti. %S può spesso evitare che utenti non
+ autorizzati prendano il controllo dei canali ("take over")
+ limitandone l'accesso agli utenti. I comandi disponibili
+ sono indicati in basso; per usarli, puoi digitare
+ /msg %S comando. Per avere maggiori informazioni su
+ un comando specifico, digita /msg %S HELP comando.
+
+ ACCESS Modifica la lista degli utenti con privilegi
+ AKICK Modifica la lista AutoKick
+ AOP Modifica la lista degli utenti AOP
+ BAN Permette di bannare un utente
+ CLEAR Annulla varie impostazioni del canale
+ DEOP Toglie lo stato di operatore a un utente (-o)
+ DEVOICE Toglie lo stato di voice a un utente (-v)
+ DROP Annulla la registrazione di un canale
+ GETKEY Recupera la password (chiave) di un canale
+ IDENTIFY Ti identifica come fondatore di un canale
+ INFO Mostra le informazioni su un canale
+ INVITE Richiede un invito per un canale
+ KICK Espelle un utente da un canale (kick)
+ LEVELS Ridefinisce i privilegi dei livelli di accesso
+ LIST Mostra la lista dei canali
+ LOGOUT Deidentifica dal canale specificato
+ OP Assegna lo stato di operatore a un utente (+o)
+ REGISTER Registra un canale
+ SENDPASS Invia la password del proprio canale via e-mail
+ SET Imposta le opzioni e le informazioni di canale
+ SOP Modifica la lista degli utenti SOP
+ TOPIC Cambia il topic di un canale
+ UNBAN Rimuove i ban che impediscono l'accesso a un canale
+ VOICE Assegna lo stato di voice a un utente (+v)
+ VOP Modifica la lista degli utenti VOP
+
+CHAN_HELP_UNREAL
+
+ Su questa rete sono inoltre disponibili questi comandi:
+ DEHALFOP Toglie lo stato di mezzo operatore a un utente (-h)
+ DEOWNER Toglie lo stato di owner a un utente (-q)
+ DEPROTECT Toglie lo stato di protezione a un utente (-a)
+ HALFOP Assegna lo stato di mezzo operatore a un utente (+h)
+ HOP Modifica la lista degli utenti HOP
+ OWNER Assegna lo stato di owner a un utente (+q)
+ PROTECT Assegna lo stato di protezione a un utente (+a)
+
+CHAN_HELP_ULTIMATE
+
+ Su questa rete sono inoltre disponibili questi comandi:
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ Su questa rete sono inoltre disponibili questi comandi:
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Tieni conto che i canali che non vengono utilizzati per %d
+ giorni (cioè in quei canali in cui non entra nessun utente
+ che si trova nella relativa lista di accesso) saranno
+ automaticamente deregistrati.
+
+CHAN_HELP_REGISTER
+ Sintassi: REGISTER canale password descrizione
+
+ Registra un canale nel database di %S. Per poter usare
+ questo comando, devi essere operatore di canale (op) sul
+ canale che intendi registrare. La password è usata con
+ il comando IDENTIFY per permettere agli altri di
+ effettuare in seguito dei cambiamenti sulle varie
+ impostazioni di canale. L'ultimo parametro, che deve
+ essere incluso, è una descrizione generica del canale
+ stesso.
+
+ Quando registri un canale, vieni registrato come il
+ "fondatore" (founder) del canale. Il fondatore di un
+ canale può cambiare tutte le impostazioni del canale
+ stesso; inoltre, %S gli assegnerà automaticamente i
+ privilegi di operatore di canale (+o) quando entra nel
+ canale.
+ Per assegnare alcuni di questi privilegi ad altri
+ utenti, vedi il comando ACCESS (/msg %S HELP ACCESS).
+
+ NOTA: Per registrare un canale, devi aver prima
+ registrato il tuo nick. Se non l'hai fatto, digita
+ /msg %s HELP per avere informazioni su come farlo.
+
+ ATTENZIONE! Il nome del canale deve includere il
+ cancelletto (#) all'inizio!
+
+CHAN_HELP_IDENTIFY
+ Sintassi: IDENTIFY canale password
+
+ Ti identifica con %S come fondatore del canale specificato.
+ Molti comandi richiedono che tu sia identificato per
+ poter essere eseguiti. La password deve essere la stessa
+ utilizzata con il comando REGISTER.
+
+CHAN_HELP_LOGOUT
+ Sintassi: LOGOUT canale nick
+
+ Annulla l'effetto del comando IDENTIFY per il canale
+ specificato, cioè fa in modo che tu non sia più riconosciuto
+ per quel canale.
+
+ Se sei il fondatore del canale puoi deidentificare chiunque,
+ altrimenti puoi deidentificare solo te stesso.
+
+CHAN_HELP_DROP
+ Sintassi: DROP canale
+
+ Deregistra il canale specificato. Può essere usato soltanto
+ da un fondatore di canale, che deve prima usare il comando
+ IDENTIFY.
+
+CHAN_HELP_SET
+ Sintassi: SET canale opzione parametri
+
+ Permette al fondatore di un canale di impostare varie
+ opzioni e informazioni del canale stesso.
+
+ Opzioni disponibili:
+
+ FOUNDER Imposta il fondatore del canale
+ SUCCESSOR Imposta il successore del fondatore del canale
+ PASSWORD Imposta la password del canale
+ DESC Imposta la descrizione del canale
+ URL Associa un URL al canale
+ EMAIL Associa un indirizzo e-mail al canale
+ ENTRYMSG Imposta un messaggio che sarà inviato agli utenti
+ che entrano nel canale
+ BANTYPE Imposta il tipo di ban che sarà usato dai Services
+ MLOCK Imposta il blocco dei modi di canale
+ KEEPTOPIC Mantiene il topic quando il canale non è in uso
+ OPNOTICE Invia una notifica quando vengono usati i comandi
+ OP/DEOP
+ PEACE Regola l'uso dei comandi critici
+ PRIVATE Nasconde il canale dall'output del comando LIST
+ RESTRICTED Limita l'accesso al canale
+ SECURE Attiva le funzionalità di sicurezza di %S
+ SECUREOPS Abilita un controllo più severo dello stato di
+ operatore
+ SECUREFOUNDER Abilita un controllo più severo dello stato di
+ fondatore
+ SIGNKICK "Firma" i kick effettuati con il comando KICK
+ TOPICLOCK Imposta il blocco del topic (modificabile solo
+ attraverso il comando TOPIC)
+ XOP Seleziona il sistema di privilegi utilizzato
+
+ Digita /msg %S HELP option per ottenere maggiori
+ informazioni su un comando specifico.
+
+CHAN_HELP_SET_FOUNDER
+ Sintassi: SET canale FOUNDER nick
+
+ Imposta il nuovo fondatore del canale. Il nick specificato
+ deve essere registrato.
+
+CHAN_HELP_SET_SUCCESSOR
+ Sintassi: SET canale SUCCESSOR nick
+
+ Imposta il successore del fondatore del canale. Se il nick
+ del fondatore scade, o viene deregistrato mentre il canale
+ è ancora registrato, il successore diventerà il nuovo
+ fondatore del canale. In ogni caso, se il succsesore ha già
+ troppi canali registrati (il massimo è %d), il canale verrà
+ invece deregistrato, come se non ci fosse stato nessun
+ successore.
+ Il nick specificato deve essere registrato.
+
+CHAN_HELP_SET_PASSWORD
+ Sintassi: SET canale PASSWORD password
+
+ Imposta la password del canale, utilizzata per essere
+ identificati come fondatori del canale stesso.
+
+CHAN_HELP_SET_DESC
+ Sintassi: SET canale DESC descrizione
+
+ Imposta la descrizione del canale, che viene mostrata
+ con i comandi LIST e INFO.
+
+CHAN_HELP_SET_URL
+ Sintassi: SET canale URL [url]
+
+ Associa l'URL specificato al canale. Questo URL sarà
+ mostrato quando qualcuno richiede informazioni relative
+ al canale con il comando INFO. Se non viene specificato
+ nessun URL, l'URL attuale del canale viene eliminato.
+
+CHAN_HELP_SET_EMAIL
+ Sintassi: SET canale EMAIL [indirizzo]
+
+ Associa l'indirizzo e-mail specificato al canale. Questo
+ indirizzo sarà mostrato quando qualcuno richiede
+ informazioni relative al canale con il comando INFO. Se
+ non viene specificato nessun indirizzo, l'indirizzo attuale
+ del canale viene eliminato.
+
+CHAN_HELP_SET_ENTRYMSG
+ Sintassi: SET canale ENTRYMSG [messaggio]
+
+ Imposta il messaggio che sarà inviato con un /notice
+ agli utenti che entrano nel canale. Se non viene
+ specificato nessun messaggio, il messaggio attuale
+ viene eliminato, e gli utenti che entrano non
+ riceveranno alcun messaggio.
+
+CHAN_HELP_SET_BANTYPE
+ Sintassi: SET canale BANTYPE tipo
+
+ Imposta il tipo di can che sarà usato dai Services
+ in tutte le occasioni in cui dovranno bannare
+ qualcuno dal canale.
+
+ tipo è un numero tra 0 e 3 che indica:
+
+ 0: ban nella forma *!user@host
+ 1: ban nella forma *!*user@host
+ 2: ban nella forma *!*@host
+ 3: ban nella forma *!*user@*.dominio
+
+CHAN_HELP_SET_KEEPTOPIC
+ Sintassi: SET canale KEEPTOPIC {ON | OFF}
+
+ Attiva o disattiva il mantenimento del topic per
+ il canale. Quando il mantenimento del topic è
+ attivo, il topic sarà memorizzato da %S anche quando
+ l'ultimo utente esce dal canale, e sarà reimpostato
+ la volta successiva che entra qualcuno.
+
+CHAN_HELP_SET_TOPICLOCK
+ Sintassi: SET canale TOPICLOCK {ON | OFF}
+
+ Attiva o disattiva il blocco del topic per il
+ canale. Quando il blocco del topic è attivo,
+ %S non permetterà che il topic venga cambiato, se
+ non attraverso il comando TOPIC.
+
+CHAN_HELP_SET_MLOCK
+ Sintassi: SET canale MLOCK modi
+
+ Imposta il blocco dei modi per il canale. %S
+ permette di definire vari modi di canale che saranno
+ sempre attivi, sempre disattivi, o non bloccati.
+
+ Il parametro modi è costituito esattamente nella
+ stessa maniera di un comando /MODE; vale a dire
+ che i modi che seguono un + sono sempre attivi, e
+ i modi che seguono un - sono sempre disattivi.
+ Diversamente dal comando /MODE, però, ogni uso del
+ comando SET MLOCK rimuove tutti i modi bloccati
+ precedentemente!
+
+ Attenzione: Se imposti una password (chiave) bloccata,
+ come nel secondo esempio in basso, dovresti anche impostare
+ l'opzione RESTRICTED per il canale (per maggiori
+ informazioni, digita HELP SET RESTRICTED),
+ altrimenti chiunque entra nel canale quando è vuoto potrà
+ vedere la chiave!
+
+ Esempi:
+
+ SET #canale MLOCK +nt-iklps
+ Blocca come attivi i modi n e t, e come disattivi i
+ modi i, k, l, p e s. Il modo m può essere cambiato
+ dagli utenti.
+
+ SET #canale MLOCK +knst-ilmp miachiave
+ Blocca come attivi i modi k, n, s e t, e come
+ disattivi i modi i, l, m e p. Inoltre, blocca la
+ chiave del canale impostandola a "miachiave".
+
+ SET #canale MLOCK +
+ Rimuove il blocco dei modi; tutti i modi del canale
+ possono essere attivati o disattivati dagli utenti.
+
+CHAN_HELP_SET_PEACE
+ Sintassi: SET canale PEACE {ON | OFF}
+
+ Attiva o disattiva l'opzione "pace" per il canale.
+ Quando l'opzione è attiva, gli utenti non potranno
+ kickare, bannare o rimuovere uno stato di canale
+ (op, mezzo op, ecc.) di un utente con livello
+ superiore, attraverso i comandi di %S.
+
+CHAN_HELP_SET_PRIVATE
+ Sintassi: SET canale PRIVATE {ON | OFF}
+
+ Attiva o disattiva l'opzione di privacy per il canale.
+ Quando questa opzione è attiva, il canale non sarà
+ incluso nella lista restituita da /msg %S LIST.
+
+CHAN_HELP_SET_RESTRICTED
+ Sintassi: SET canale RESTRICTED {ON | OFF}
+
+ Attiva o disattiva l'accesso limitato (restricted)
+ per il canale. Quando questa opzione è attiva, gli
+ utenti che non potrebbero avere i privilegi di operatore
+ di canale (gli utenti con livelli di accesso negativi e,
+ se l'opzione secure ops è attiva, tutti gli utenti che
+ non si trovano in alcuna lista di accesso) verrano invece
+ kickati e bannati dal canale.
+
+CHAN_HELP_SET_SECURE
+ Sintassi: SET canale SECURE {ON | OFF}
+
+ Attiva o disattiva le funzionalità di sicurezza di
+ %S per il canale. Quando SECURE è attivo,
+ solo gli utenti che hanno registrato il proprio nick
+ con %s e che si sono identificati con la loro password
+ avranno l'accesso sul canale secondo le liste di accesso.
+
+CHAN_HELP_SET_SECUREOPS
+ Sintassi: SET canale SECUREOPS {ON | OFF}
+
+ Attiva o disattiva l'opzione secure ops per il canale.
+ Quando l'opzione è attiva, gli utenti che non sono nella
+ lista di accesso non potranno avere lo stato di operatore
+ di canale.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Sintassi: SET canale SECUREFOUNDER {ON | OFF}
+
+ Attiva o disattiva l'opzione secure founder per il
+ canale. Quando l'opzione è attiva, solo il vero fondatore
+ potrà deregistrare il canale (drop), cambiarne la password,
+ il fondatore e il successore, mentre gli utenti identificati
+ su %S per il canale non potranno.
+
+CHAN_HELP_SET_SIGNKICK
+ Sintassi: SET canale SIGNKICK {ON | LEVEL | OFF}
+
+ Attiva o disattiva i nick "firmati" per il canale. Quando
+ l'opzione è attiva, i kick effettuati con il comando KICK
+ di %S indicheranno anche il nick della persona che ha
+ utilizzato il comando.
+
+ Se usi LEVEL, il nick non sarà comunque mostrato se il
+ kick è effettuato da qualcuno il cui livello di accesso
+ è uguale o maggiore al livello SIGNKICK del canale.
+ Per maggiori informazioni, digita /msg %S HELP LEVELS.
+
+CHAN_HELP_SET_XOP
+ Sintassi: SET canale XOP {ON | OFF}
+
+ Attiva o disattiva il sistema di liste xOP per il canale.
+ Quando XOP è attivo, sarà necessario usare i comandi
+ SOP/AOP/HOP/VOP per dare i privilegi sul canale
+ agli utenti, altrimenti si dovrà usare il comando ACCESS.
+
+ Nota tecnica: quando passi dalle liste di accesso al
+ sistema di liste xOP, le definizioni dei livelli e i livelli
+ personalizzati saranno cambiati, quindi non troverai gli
+ stessi valori se poi torni di nuovo alle liste di accesso!
+
+ Dopo essere passato dalle liste di accesso alle liste xOP,
+ devi controllare che gli utenti siano nelle liste giuste,
+ perché la conversione non sempre è perfetta, in particolare
+ nel caso in cui si abbiano livelli personalizzati.
+
+ Al contrario, passare dalle liste xOP alle liste di accesso
+ non causa nessun problema.
+
+CHAN_HELP_SET_OPNOTICE
+ Sintassi: SET canale OPNOTICE {ON | OFF}
+
+ Attiva o disattiva l'opzione op-notice per il canale.
+ Quando l'opzione è attiva, %S invierà un notice al
+ canale quando vengono usati i comandi OP e DEOP.
+
+CHAN_HELP_AOP
+ Sintassi: AOP canale ADD nick
+ AOP canale DEL {nick | numero | lista}
+ AOP canale LIST [mask | lista]
+ AOP canale CLEAR
+
+ Gestisce la lista AOP (AutoOP) del canale.
+ La lista AOP dà agli utenti il diritto di essere auto-oppati,
+ di richiedere l'invito, di rimuovere i ban su se stessi, di
+ far mostrare il messaggio di saluto (greet) quando entrano,
+ e così via.
+
+ Il comando AOP ADD aggiunge il nick specificato alla
+ lista AOP.
+
+ Il comando AOP DEL rimuove il nick specificato dalla
+ lista AOP. Se viene specificata una lista, i record
+ corrispondenti vengono rimossi. (Guarda l'esempio di
+ LIST)
+
+ Il comando AOP LIST mostra la lista AOP. Se viene
+ utilizzata una wildcard per la mask, solo i record che
+ corrispondono alla mask vengono mostrati. Se viene
+ specificata una lista, i record corrispondenti vengono
+ mostrati.
+ Ad esempio:
+
+ AOP #canale LIST 2-5,7-9
+ Mostra i record AOP che hanno numero da 2
+ a 5 e da 7 a 9 (il 6 è quindi escluso).
+
+ Il comando AOP CLEAR svuota la lista AOP.
+
+ I comandi AOP ADD e AOP DEL sono limitati ai SOP
+ e superiori, mentre il comando AOP CLEAR può essere
+ utilizzato soltanto dal fondatore del canale. Comunque,
+ tutti gli utenti nella lista AOP possono usare il comando
+ AOP LIST.
+
+ Questo comando potrebbe essere stato disabilitato per
+ il tuo canale; in questo caso dovrai usare la lista di
+ accesso. Digita /msg %S HELP ACCESS per
+ maggiori informazioni, e /msg %S HELP SET XOP
+ per scoprire come passare da un sistema all'altro.
+
+CHAN_HELP_HOP
+ Sintassi: HOP channel ADD nick
+ HOP channel DEL {nick | numero | lista}
+ HOP channel LIST [mask | lista]
+ HOP channel CLEAR
+
+ Gestisce la lista HOP (HalfOP) del canale.
+ La lista HOP dà agli utenti il diritto di essere
+ "half-oppati" sul tuo canale.
+
+ Il comando HOP ADD aggiunge il nick specificato alla
+ lista HOP.
+
+ Il comando HOP DEL rimuove il nick specificato dalla
+ lista HOP. Se viene specificata una lista, i record
+ corrispondenti vengono rimossi. (Guarda l'esempio di
+ LIST)
+
+ Il comando HOP LIST mostra la lista HOP. Se viene
+ utilizzata una wildcard per la mask, solo i record che
+ corrispondono alla mask vengono mostrati. Se viene
+ specificata una lista, i record corrispondenti vengono
+ mostrati.
+ Ad esempio:
+
+ HOP #canale LIST 2-5,7-9
+ Mostra i record HOP che hanno numero da 2
+ a 5 e da 7 a 9 (il 6 è quindi escluso).
+
+ Il comando HOP CLEAR svuota la lista HOP.
+
+ I comandi HOP ADD, HOP DEL e HOP LIST sono limitati
+ agli AOP e superiori, mentre il comando HOP CLEAR può
+ essere utilizzato soltanto dal fondatore del canale.
+
+ Questo comando potrebbe essere stato disabilitato per
+ il tuo canale; in questo caso dovrai usare la lista di
+ accesso. Digita /msg %S HELP ACCESS per
+ maggiori informazioni, e /msg %S HELP SET XOP
+ per scoprire come passare da un sistema all'altro.
+
+CHAN_HELP_SOP
+ Sintassi: SOP canale ADD nick
+ SOP canale DEL {nick | numero | lista}
+ SOP canale LIST [mask | lista]
+ SOP canale CLEAR
+
+ Gestisce la lista SOP (SuperOP) del canale.
+ La lista SOP dà agli utenti il diritto di essere auto-oppati
+ e protetti (+a), di modificare la lista AutoKick e quella
+ delle parolacce (badwords), di leggere le memo di canale,
+ e così via.
+
+ Il comando SOP ADD aggiunge il nick specificato alla
+ lista SOP.
+
+ Il comando SOP DEL rimuove il nick specificato dalla
+ lista SOP. Se viene specificata una lista, i record
+ corrispondenti vengono rimossi. (Guarda l'esempio di
+ LIST)
+
+ Il comando SOP LIST mostra la lista SOP. Se viene
+ utilizzata una wildcard per la mask, solo i record che
+ corrispondono alla mask vengono mostrati. Se viene
+ specificata una lista, i record corrispondenti vengono
+ mostrati.
+ Ad esempio:
+
+ SOP #canale LIST 2-5,7-9
+ Mostra i record SOP che hanno numero da 2
+ a 5 e da 7 a 9 (il 6 è quindi escluso).
+
+ Il comando SOP CLEAR svuota la lista SOP.
+
+ I comandi SOP ADD, SOP DEL e SOP CLEAR sono limitati
+ al fondatore del canale. Comunque, tutti gli utenti nella
+ lista SOP possono usare il comando SOP LIST.
+
+ Questo comando potrebbe essere stato disabilitato per
+ il tuo canale; in questo caso dovrai usare la lista di
+ accesso. Digita /msg %S HELP ACCESS per
+ maggiori informazioni, e /msg %S HELP SET XOP
+ per scoprire come passare da un sistema all'altro.
+
+CHAN_HELP_VOP
+ Sintassi: VOP canale ADD nick
+ VOP canale DEL {nick | numero | lista}
+ VOP canale LIST [mask | lists]
+ VOP canale CLEAR
+
+ Gestisce la lista VOP (VOicePeople) del canale.
+ La lista VOP dà agli utenti il diritto di essere
+ voice sul tuo canale, e di ottenere il +v se non
+ lo sono.
+
+ Il comando VOP ADD aggiunge il nick specificato alla
+ lista VOP.
+
+ Il comando VOP DEL rimuove il nick specificato dalla
+ lista VOP. Se viene specificata una lista, i record
+ corrispondenti vengono rimossi. (Guarda l'esempio di
+ LIST)
+
+ Il comando VOP LIST mostra la lista VOP. Se viene
+ utilizzata una wildcard per la mask, solo i record che
+ corrispondono alla mask vengono mostrati. Se viene
+ specificata una lista, i record corrispondenti vengono
+ mostrati.
+ Ad esempio:
+
+ VOP #canale LIST 2-5,7-9
+ Mostra i record VOP che hanno numero da 2
+ a 5 e da 7 a 9 (il 6 è quindi escluso).
+
+ Il comando VOP CLEAR svuota la lista VOP.
+
+ I comandi VOP ADD, VOP DEL e VOP LIST sono limitati
+ agli HOP e superiori, mentre il comando VOP CLEAR può
+ essere utilizzato soltanto dal fondatore del canale.
+
+ Questo comando potrebbe essere stato disabilitato per
+ il tuo canale; in questo caso dovrai usare la lista di
+ accesso. Digita /msg %S HELP ACCESS per
+ maggiori informazioni, e /msg %S HELP SET XOP
+ per scoprire come passare da un sistema all'altro.
+
+CHAN_HELP_ACCESS
+ Sintassi: ACCESS canale ADD nick livello
+ ACCESS canale DEL {nick | numero | lista}
+ ACCESS canale LIST [mask | lista]
+ ACCESS canale CLEAR
+
+ Gestisce la lista di accesso del canale.
+ La lista di accesso specifica quali utenti hanno diritto
+ allo stato di operatore di canale e ai vari comandi di
+ %S sul canale. Utenti in diversi livelli avranno a
+ disposizione diversi privilegi; per avere informazioni
+ specifiche, puoi digitare /msg %S HELP ACCESS LEVELS.
+ I nick che non si trovano nella lista di accesso hanno
+ livello 0.
+
+ Il comando ACCESS ADD aggiunge il nick specificato alla
+ lista di accesso con il livello specificato; se il nick è
+ già presente nella lista, il suo livello viene modificato,
+ impostandolo a quello specificato nel comando. Il livello
+ del nick specificato deve essere minore di quello del nick
+ che invia il comando, e se il nick è già presente nella
+ lista, il livello attuale di quel nick deve essere minore di
+ quello del nick che invia il comando.
+
+ Il comando ACCESS DEL rimuove il nick specificato dalla
+ lista di accesso. Se viene specificata una lista, i record
+ corrispondenti vengono rimossi. (Guarda l'esempio di
+ LIST)
+
+ Il comando ACCESS LIST mostra la lista di accesso. Se viene
+ utilizzata una wildcard per la mask, solo i record che
+ corrispondono alla mask vengono mostrati. Se viene specificata
+ una lista, i record corrispondenti vengono mostrati.
+ Ad esempio:
+
+ ACCESS #canale LIST 2-5,7-9
+ Mostra i record della lista che hanno numero da 2
+ a 5 e da 7 a 9 (il 6 è quindi escluso).
+
+ Il comando ACCESS CLEAR svuota completamente la lista di
+ accesso.
+
+CHAN_HELP_ACCESS_LEVELS
+ Livelli di accesso degli utenti
+
+ Di default, sono definiti i seguenti livelli di accesso:
+
+ Fondatore Accesso completo alle funzioni di %S;
+ op automatico in entrata nel canale.
+ Soltanto una persona può avere lo
+ stato di fondatore (non può essere
+ assegnato con il comando ACCESS).
+  10 Accesso al comando AKICK; op e protezione
+ automatici (+o e +a).
+  5 Op automatico (+o).
+  3 Voice automatico (+v).
+  0 Nessun privilegio speciale; può essere
+ oppato dagli altri op (a meno che
+ non sia attiva l'opzione secure-ops).
+  <0 Non può essere oppato.
+
+ Questi livelli possono essere cambiati, e se ne possono
+ aggiungere altri, usando il comando LEVELS. Digita
+ /msg %S HELP LEVELS per maggiori informazioni.
+
+CHAN_HELP_AKICK
+ Sintassi: AKICK canale ADD nick-mask [motivo]
+ AKICK canale STICK mask
+ AKICK canale UNSTICK mask
+ AKICK canale DEL nick-mask
+ AKICK canale LIST [mask]
+ AKICK canale VIEW [mask]
+ AKICK canale ENFORCE
+ AKICK canale CLEAR
+
+ Gestice la lista AutoKick. Se un utente che si trova nella
+ lista AutoKick cerca di entrare nel canale, %S lo
+ bannerà dal canale e poi lo espellerà (kick).
+
+ Il comando AKICK ADD aggiunge il nick specificato alla
+ lista AutoKick. Se viene specificato un motivo, quella frase
+ sarà utilizzato quando l'utente viene kickato; altrimenti,
+ verrà utilizzata la frase standard ""You have been banned from
+ the channel". In alternativa al nick può essere usata una
+ hostmask.
+
+ Il comando AKICK STICK mantiene permanentemente il ban
+ sulla mask specificata. Se qualcuno cerca di rimuovere il ban,
+ %S lo imposterà di nuovo. Questo comando non può essere
+ usato contro i nick registrati.
+
+ Il comando AKICK UNSTICK annulla l'effetto del comando
+ AKICK STICK, permettendo di rimuovere il ban dal canale.
+
+ Il comando AKICK DEL rimuove il nick o la mask specificata
+ dalla lista AutoKick. Non rimuove, però, i ban piazzati da
+ un AutoKick, che devono quindi essere rimossi manualmente.
+
+ Il comando AKICK LIST mostra la lista AutoKick, o, se
+ specificata, solo i record che corrispondono alla mask
+ indicata.
+
+ Il comando AKICK VIEW mostra la lista Autokick, fornendo
+ più informazioni del comando AKICK LIST.
+
+ Il comando AKICK ENFORCE fa sì che %S forzi la
+ lista AutoKick attuale, rimuovendo dal canale tutti gli
+ utenti che corrispondono alle varie mask presenti nella
+ lista.
+
+ Il comando AKICK CLEAR svuota la lista AutoKick.
+
+CHAN_HELP_LEVELS
+ Sintassi: LEVELS canale SET tipo livello
+ LEVELS canale {DIS | DISABLE} tipo
+ LEVELS canale LIST
+ LEVELS canale RESET
+
+ Il comando LEVELS permette un controllo preciso dei
+ significati dei livelli di accesso numerici usati nei
+ canali. Con questo comando, è possibile definire il
+ livello di accesso richiesto per la maggior parte delle
+ funzioni di %S.
+ (I comandi SET FOUNDER e SET PASSWORD, nonché questo
+ comando, sono sempre riservati al fondatore del canale).
+
+ LEVELS SET permette di definire il livello di accesso
+ necessario per una funzione o per un gruppo di funzioni.
+ LEVELS DISABLE (o, abbreviato, DIS) disattiva una
+ funzione automatica o non permette più l'accesso a una
+ funzione se non al fondatore del canale.
+ LEVELS LIST mostra i livelli di accesso attuali per
+ ogni funzione e per i gruppi di funzioni.
+ LEVELS RESET reimposta i livelli ai valori di default
+ di un canale appena creato (per maggiori informazioni,
+ digita HELP ACCESS LEVELS).
+
+ Per una lista delle funzioni di cui puoi cambiare i
+ livelli, digita HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ La seguente lista mostra le funzioni disponibile. Tieni
+ conto del fatto che i livelli AUTODEOP e NOJOIN sono i
+ livelli massimi per i quali la funzione sarà attiva,
+ mentre tutti gli altri sono livelli minimi.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Sintassi: INFO canale [ALL]
+
+ Mostra varie informazioni a proposito del canale
+ specificato (a patto che sia registrato), tra cui il
+ fondatore, il giorno di registrazione, l'ultimo utilizzo,
+ la descrizione e il blocco dei modi, se presente. Se
+ viene specificata l'opzione ALL, verranno mostrati
+ anche il successore e il messaggio di ingresso.
+
+ Di default, l'opzione ALL è limitata a coloro che hanno
+ l'accesso come fondatore sul canale.
+
+CHAN_HELP_LIST
+ Sintassi: LIST pattern
+
+ Mostra tutti i canali registrati che corrispondono al
+ pattern specificato. I canali con l'opzione PRIVATE
+ attiva non saranno mostrati.
+
+CHAN_HELP_OP
+ Sintassi: OP [canale [nick]]
+
+ Assegna lo stato di operatore (op, +o) a un utente sul
+ canale specificato. Se non viene indicato alcun nick,
+ "oppa" l'utente che invia il comando. Se non viene
+ indicato né canale né nick, opperà l'utente che invia
+ il comando su tutti i canali in cui si trova e in cui
+ ha abbastanza privilegi.
+
+ Di default, il comando è limitato agli AOP o agli utenti
+ con livello di accesso 5 o superiori.
+
+CHAN_HELP_DEOP
+ Sintassi: DEOP [canale [nick]]
+
+ Rimuove lo stato di operatore (op, -o) a un utente sul
+ canale specificato. Se non viene indicato alcun nick,
+ "deoppa" l'utente che invia il comando. Se non viene
+ indicato né canale né nick, deopperà l'utente che invia
+ il comando su tutti i canali in cui si trova e in cui
+ ha abbastanza privilegi.
+
+ Di default, il comando è limitato agli AOP o agli utenti
+ con livello di accesso 5 o superiori.
+
+CHAN_HELP_VOICE
+ Sintassi: VOICE [canale [nick]]
+
+ Assegna lo stato di voice (+v) a un utente sul canale
+ specificato. Se non viene indicato alcun nick, dà il
+ voice all'utente che invia il comando. Se non viene
+ indicato né canale né nick, dà il voice all'utente che
+ invia il comando su tutti i canali in cui si trova e in
+ cui ha abbastanza privilegi.
+
+ Di default, il comando è limitato agli AOP o agli utenti
+ con livello di accesso 5 o superiori, oppure ai VOP o agli
+ utenti con livello 3 o superiori per il voice su se stessi.
+
+CHAN_HELP_DEVOICE
+ Sintassi: DEVOICE [canale [nick]]
+
+ Rimuove lo stato di voice (-v) da un utente sul canale
+ specificato. Se non viene indicato alcun nick, toglie il
+ voice all'utente che invia il comando. Se non viene
+ indicato né canale né nick, toglie il voice all'utente che
+ invia il comando su tutti i canali in cui si trova e in
+ cui ha abbastanza privilegi.
+
+ Di default, il comando è limitato agli AOP o agli utenti
+ con livello di accesso 5 o superiori, oppure ai VOP o agli
+ utenti con livello 3 o superiori per il devoice su se stessi.
+
+CHAN_HELP_HALFOP
+ Sintassi: HALFOP [canale [nick]]
+
+ Assegna lo stato di mezzo operatore (halfop, +h) a un utente
+ sul canale specificato. Se non viene indicato alcun nick,
+ dà l'halfop all'utente che invia il comando. Se non viene
+ indicato né canale né nick, dà l'halfop all'utente che invia
+ il comando su tutti i canali in cui si trova e in cui ha
+ abbastanza privilegi.
+
+ Di default, il comando è limitato agli AOP o agli utenti
+ con livello di accesso 5 o superiori, oppure ai HOP o agli
+ utenti con livello 4 o superiori per l'halfop su se stessi.
+
+CHAN_HELP_DEHALFOP
+ Sintassi: DEHALFOP [canale [nick]]
+
+ Rimuove lo stato di mezzo operatore (halfop, -h) da un utente
+ sul canale specificato. Se non viene indicato alcun nick,
+ toglie l'halfop all'utente che invia il comando. Se non viene
+ indicato né canale né nick, toglie l'halfop all'utente che
+ invia il comando su tutti i canali in cui si trova e in cui ha
+ abbastanza privilegi.
+
+ Di default, il comando è limitato agli AOP o agli utenti
+ con livello di accesso 5 o superiori, oppure ai HOP o agli
+ utenti con livello 4 o superiori per il dehalfop su se stessi.
+
+CHAN_HELP_PROTECT
+ Sintassi: PROTECT [canale [nick]]
+
+ Assegna lo stato di protezione (+a) a un utente sul canale
+ specificato. Se non viene indicato alcun nick, dà la
+ protezione all'utente che invia il comando. Se non viene
+ indicato né canale né nick, dà la protezione all'utente che
+ invia il comando su tutti i canali in cui si trova e in
+ cui ha abbastanza privilegi.
+
+ Di default, il comando è limitato al fondatore del canale,
+ oppure ai SOP o agli utenti con livello 10 o superiori per
+ la protezione su se stessi.
+
+CHAN_HELP_DEPROTECT
+ Sintassi: DEPROTECT [canale [nick]]
+
+ Rimuove lo stato di protezione (-a) da un utente sul canale
+ specificato. Se non viene indicato alcun nick, toglie la
+ protezione all'utente che invia il comando. Se non viene
+ indicato né canale né nick, toglie la protezione all'utente
+ che invia il comando su tutti i canali in cui si trova e in
+ cui ha abbastanza privilegi.
+
+ Di default, il comando è limitato al fondatore del canale,
+ oppure ai SOP o agli utenti con livello 10 o superiori per
+ la rimozione della protezione su se stessi.
+
+CHAN_HELP_OWNER
+ Sintassi: OWNER [canale]
+
+ Ti assegna lo stato di proprietario (owner, +q) sul canale
+ che specifichi. Se non indichi nessun canale, lo stato di
+ proprietario ti sarà assegnato su tutti i canali su cui ti
+ trovi e in cui hai abbastanza privilegi.
+
+ Il comando è limitato agli utenti che hanno accesso di
+ fondatore.
+
+CHAN_HELP_DEOWNER
+ Sintassi: DEOWNER [canale]
+
+ Ti toglie lo stato di proprietario (owner, -q) sul canale
+ che specifichi. Se non indichi nessun canale, lo stato di
+ proprietario ti sarà rimosso su tutti i canali su cui ti
+ trovi e in cui hai abbastanza privilegi.
+
+ Il comando è limitato agli utenti che hanno accesso di
+ fondatore.
+
+CHAN_HELP_INVITE
+ Sintassi: INVITE canale
+
+ Chiede a %S di invitarti nel canale specificato.
+
+ Di default, il comando è limitato agli AOP o agli utenti con
+ livello di accesso 5 o superiori sul canale.
+
+CHAN_HELP_UNBAN
+ Sintassi: UNBAN canale
+
+ Chiede a %S di rimuovere tutti i ban che non ti
+ permettono di entrare sul canale specificato.
+
+ Di default, il comando è limitato agli AOP o agli utenti con
+ livello di accesso 5 o superiori sul canale.
+
+CHAN_HELP_KICK
+ Sintassi: KICK [canale [nick [motivo]]]
+
+ Espelle (kick) il nick specificato dal canale. Se non viene
+ indicato alcun nick, kicka l'utente che ha inviato il comando.
+ Se non viene indicato né il nick né il canale, l'utente che
+ ha inviato il comando verrà kickato da tutti i canali in cui
+ si trova e in cui ha abbastanza privilegi.
+
+ Di default, il comando è limitato agli AOP o agli utenti con
+ livello di accesso 5 o superiori sul canale.
+
+CHAN_HELP_BAN
+ Sintassi: BAN [canale [nick [motivo]]]
+
+ Banna (non permette l'accesso) il nick specificato sul
+ canale. Se non viene indicato alcun nick, banna l'utente
+ che ha inviato il comando. Se non viene indicato né il
+ nick né il canale, l'utente che ha inviato il comando verrà
+ bannato su tutti i canali in cui si trova e in cui ha
+ abbastanza privilegi.
+
+ Di default, il comando è limitato agli AOP o agli utenti con
+ livello di accesso 5 o superiori sul canale.
+
+CHAN_HELP_TOPIC
+ Sintassi: TOPIC canale [topic]
+
+ Fa cambiare il topic a %S. Se il nuovo topic
+ non viene specificato, il topic attuale sarà rimosso.
+ Questo comando è utile soprattutto quando l'opzione
+ SET TOPICLOCK è attiva. Per maggiori informazioni,
+ digita /msg %S HELP SET TOPICLOCK.
+
+ Di default, il comando è limitato agli utenti con
+ accesso di fondatore sul canale.
+
+CHAN_HELP_CLEAR
+ Sintassi: CLEAR canale cosa
+
+ Fa in modo che %S "pulisca" vari settaggi di un
+ canale. cosa può essere una delle opzioni seguenti:
+
+ MODES Annulla tutti i modi di canale (cioè elimina
+ i modi i,k,l,m,n,p,s,t).
+ BANS Annulla tutti i ban del canale.
+ OPS Rimuove lo stato di operatore (modo +o) da
+ tutti gli operatori del canale.
+ VOICES Rimuove lo stato di voice (modo +v) da tutti
+ gli utenti voice sul canale.
+ USERS Rimuove (con un kick) tutti gli utenti del canale.
+
+ Di default, il comando è limitato agli utenti con
+ accesso di fondatore sul canale.
+
+CHAN_HELP_GETKEY
+ Sintassi: GETKEY canale
+
+ Restituisce la chiave (password) del canale specificato.
+ Questo comando è pensato per essere usato dai bot e dagli
+ script, e il suo output ha questo formato:
+
+ KEY <canale> <chiave>
+
+ chiave corrisponde a "NO KEY" se il canale non richiede
+ una chiave.
+
+CHAN_HELP_SENDPASS
+ Sintassi: SENDPASS canale
+
+ Invia la password del canale specificato all'indirizzo e-mail
+ del fondatore (specificato nelle opzioni del nick del fondatore
+ stesso). Questo comando è utile quando un utente ha dimenticato
+ la password del canale.
+
+ Potrebbe essere disponibile soltanto per gli IrcOp.
+
+ Questo comando non è utilizzabile quando la criptazione è attiva.
+
+CHAN_SERVADMIN_HELP
+
+ I seguenti comandi sono disponibili soltanto ai Services admin:
+
+ GETPASS Recupera la password di fondatore di un canale
+ (solo se la criptazione è disattivata)
+ FORBID Blocca un canale in modo che non venga usato
+ STATUS Restituisce il livello di accesso corrente di
+ un utente su un canale
+
+ I Services admin possono inoltre deregistrare qualsiasi canale
+ senza che siano identificati con la password, e possono vedere
+ la lista di accesso, la lista AKICK e le liste di configurazione
+ dei livelli per qualsiasi canale.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Sintassi: LOGOUT canale [nick]
+
+ Questo comando fa si' che il nick specificato non sia più
+ identificato sul canale indicato.
+
+ Se sei il fondatore del canale, puoi deidentificare chiunque,
+ altrimenti puoi deidentificare solo te stesso.
+
+ Se sei un Services admin, puoi deidentificare chiunque da
+ qualsiasi canale senza dover essere il fondatore del canale.
+ Inoltre puoi omettere il parametro nick; questo farà in modo
+ che tutti gli utenti siano deidentificati dal canale.
+
+CHAN_SERVADMIN_HELP_DROP
+ Sintassi: DROP canale
+
+ Deregistra il canale indicato. Solo i Services admin
+ possono deregistrare un canale per il quale non si siano
+ identificati.
+
+CHAN_SERVADMIN_HELP_SET
+
+ I services admin possono anche impostare l'opzione NOEXPIRE,
+ in modo da non far scadere i canali anche in caso di inutilizzo.
+ Inoltre, i Services admin possono impostare le opzioni per
+ qualsiasi canale senza aver bisogno di identificarsi sui canali
+ stessi.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Sintassi: SET canale NOEXPIRE {ON | OFF}
+
+ Imposta se il canale scadrà o meno in caso di inutilizzo. Se
+ l'opzione è impostata a ON, il canale non scadrà.
+
+ Limitato ai Services admin.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ I Services admin possono usare il parametro ALL con qualsiasi
+ canale.
+
+CHAN_SERVADMIN_HELP_LIST
+ Sintassi: LIST pattern [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+ Mostra tutti i canali registrati che corrispondono al
+ pattern specificato. I canali con l'opzione PRIVATE
+ attiva saranno mostrati solo ai Services admin. I canali
+ con l'opzione NOEXPIRE attiva avranno un ! prima del
+ nick stesso (solo per i Services admin).
+
+ Se sono specificate le opzioni FORBIDDEN, SUSPENDED o NOEXPIRE, solo
+ i canali che, rispettivamente, sono vietati, sospesi o hanno l'opzione
+ NOEXPIRE attiva verranno mostrati. Se vengono specificate
+ entrambe le opzioni, entrambi i tipi di canale saranno
+ visualizzati. Queste opzioni sono limitate ai Services admin.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Sintassi: GETPASS canale
+
+ Restituisce la password del canale specificato.
+
+ Da notare che quando questo comando viene usato,
+ verrà inviato un WALLOPS o GLOBOPS ad indicare la
+ persona che l'ha utilizzato e su quale canale è stato
+ utilizzato.
+
+ Limitato ai Services admin.
+
+ Questo comando non è disponibile quando è attiva la
+ criptazione dei database.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Sintassi: FORBID canale [motivo]
+
+ Fa in modo che nessuno possa registrare o usare
+ il canale indicato. Può essere annullato con
+ una deregistrazione (drop) del canale.
+
+ Limitato ai to Services admins.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND channel [reason]
+
+ Disallows anyone from registering or using the given
+ channel. May be cancelled by using the UNSUSPEND
+ command to preserve all previous channel data/settings.
+
+ Reason may be required on certain networks.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Releases a suspended channel. All data and settings
+ are preserved from before the suspension.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Sintassi: STATUS canale nick
+
+ Restituisce il livello di accesso attuale del nick specificato
+ sul canale indicato. La risposta usa il formato:
+
+ STATUS canale nick livello-di-accesso
+
+ Se si verifica un errore, la risposta avrà il formato
+
+ STATUS ERROR messaggio-di-errore
+
+ Limitato ai Services admin.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S è un servizio che permette agli utenti della rete di
+ scambiarsi brevi messaggi (memo), anche se i destinatari non
+ sono connessi; permette inoltre di inviare messaggi ai canali(*).
+ Il nick del mittente e quello del destinatario (o il canale
+ di destinazione) devono essere registrati.
+
+ I comandi di %S sono:
+
+ SEND Invia un memo a un nick o a un canale
+ CANCEL Annulla l'ultimo memo inviato
+ LIST Mostra la lista dei propri memo
+ READ Legge uno o più memo
+ DEL Cancella uno o più memo
+ SET Imposta le opzioni relative ai memo
+
+MEMO_HELP_ADMIN
+ SENDALL Send a memo to all registered users
+
+MEMO_HELP_OPER
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_FOOTER
+
+ Digita /msg %S HELP comando per maggiori informazioni
+ sull'uso dei comandi sopraelencati.
+
+ (*) Di default, qualsiasi utente con almeno livello 10 (SOP) su
+ un canale può leggere i memo di quel canale. Questo livello
+ minimo può essere impostato con il comando LEVELS di
+ %s.
+
+MEMO_HELP_SEND
+ Sintassi: SEND {nick | canale} testo-del-memo
+
+ Invia un memo che contiene il testo-del-memo al nick
+ o al canale specificato. Quando si invia un memo a un
+ nick, il destinatario riceverà un messaggio che lo notifica
+ che ha un nuovo memo. Il nick/canale di destinazione deve
+ esser registrato.
+
+MEMO_HELP_CANCEL
+ Sintassi: CANCEL {nick | canale}
+
+ Annulla l'ultimo memo inviato al nick o al canale specificato,
+ sempre che non sia già stato letto prima dell'uso di questo
+ comando.
+
+MEMO_HELP_LIST
+ Sintassi: LIST [canale] [list | NEW]
+
+ Mostra le proprie memo. Quando viene specificato NEW, mostra
+ soltanto i nuovi memo (non letti). I memo non letti sono segnati
+ con un "*" a sinistra del numero d'ordine. Si può anche indicare
+ una lista di numeri, come in quest'esempio:
+
+ LIST 2-5,7-9
+ Mostra i memo che hanno numeri tra 2 e 5 e tra 7 e 9,
+ escludendo quindi il 6.
+
+MEMO_HELP_READ
+ Sintassi: READ [canale] {numero | lista | LAST | NEW}
+
+ Mostra il testo dei propri memo specificati. Se viene indicato
+ LAST, mostra l'ultimo memo ricevuto. Se viene indicato NEW,
+ mostra tutti i nuovi memo. Altrimenti, mostra il memo che ha
+ numero numero. Si può anche specificare una lista di numeri,
+ come nell'esempio:
+
+ READ 2-5,7-9
+ Mostra i memo che hanno numeri tra 2 e 5 e tra 7 e 9,
+ escludendo quindi il 6.
+
+MEMO_HELP_DEL
+ Sintassi: DEL [canale] {numero | lista | LAST | ALL}
+
+ Elimina il memo o i memo specificati. Si possono indicare
+ numei multipli di memo o intervalli di numeri invece di
+ un numero singolo, come nel secondo esempio.
+
+ If LAST is given, the last memo will be deleted.
+ Se viene usato ALL elimina tutti i memo.
+
+ Esempi:
+
+ DEL 1
+ Elimina il primo memo.
+
+ DEL 2-5,7-9
+ Elimina i memo che hanno numero numeri tra 2 e 5 e
+ tra 7 e 9, conservando quindi il 6.
+
+MEMO_HELP_SET
+ Sintassi: SET opzione parametri
+
+ Imposta varie opzioni dei memo. opzione può essere:
+
+ NOTIFY Cambia il modo in cui si verrà notificati
+ della ricezione di nuovi memo (solo
+ per i nick)
+ LIMIT Imposta il numero massimo di memo che si
+ possono ricevere
+
+ Digita /msg %S HELP SET opzione per ottenere
+ maggiori informazioni su un'opzione specifica.
+
+MEMO_HELP_SET_NOTIFY
+ Sintassi: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Cambia il modo in cui si verrà informati della ricezione
+ di nuovi memo:
+
+ ON Si verrà informati dei nuovi memo quando ci si
+ connette, quando si torna dall'/AWAY, e quando
+ vengono inviati (se si è online).
+ LOGON Si verrà informati dei nuovi memo quando ci si
+ connette o quando si torna dall'/AWAY.
+ NEW Si verrà informati dei nuovi memo solo quando
+ vengono inviati (se si è online).
+ OFF Non si verrà informati in nessun caso della
+ ricezione dei nuovi memo.
+
+ ON è sostanzialmente la combinazione di LOGON e NEW.
+
+MEMO_HELP_SET_LIMIT
+ Sintassi: SET LIMIT [canale] limite
+
+ Imposta il numero massimo di memo che si possono tenere
+ (o che può tenere il canale indicato). Se il limite è
+ impostato a 0, nessuno potrà inviare memo. In ogni caso,
+ non è possibile impostare il limite a un valore maggiore
+ di %d.
+
+MEMO_HELP_INFO
+ Sintassi: INFO [canale]
+
+ Mostra le informazioni sul numero di memo che hai, quanti
+ memo non sono ancora stati letti e quanti memo puoi avere
+ in totale. Se viene specificato un canale, mostra le stesse
+ informazioni, ma relative al canale indicato.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Sintassi: SET LIMIT [utente | canale] {limite | NONE} [HARD]
+
+ Imposta il numero massimo di memo che un utente (nick) o
+ canale può avere. Impostare il limite a 0 fa in modo che
+ l'utente (o il canale) non possa ricevere alcun memo;
+ impostarlo a NONE fa sì che l'utente (o il canale) possa
+ ricevere e conservare un numero indefinito di memo. Se non
+ viene specificato nessun nick o canale, viene impostato il
+ proprio limite.
+
+ Aggiungere il parametro HARD fa in modo che l'utente non
+ possa cambiare il limite. Non aggiungerlo ha il livello
+ opposto, e permette all'utente di cambiarlo, anche se un
+ limite precedente era stato impostato con HARD.
+
+ Questo uso di SET LIMIT è limitato ai Services admin.
+ Gli altri utenti possono impostare il limite soltanto per
+ se stessi o per i canali sui quali hanno abbastanza
+ privilegi, e potrebbero non essere in grado di rimuovere
+ il limite o di impostarlo a un valore maggiore di %d.
+
+MEMO_SERVADMIN_HELP_INFO
+ Sintassi: INFO [nick | canale]
+
+ Senza parametro, mostra le informazioni sul numero di memo
+ che hai, quanti memo non sono ancora stati letti e quanti
+ memo puoi ricevere in totale.
+
+ Se viene indicato un canale, mostra le stesse informazioni
+ ma relative al canale; se viene indicato un nick, mostra
+ le stesse informazioni ma relative al nick.
+ Questo modo d'uso è limitato ai Services admin.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Syntax: STAFF memo-text
+
+ Sends all services staff a memo containing memo-text.
+ Note: If you have opers on both the oper list and the
+ admin list they will recive the memo twice. The same
+ applies for oper's on the Root list as well as other
+ lists.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL memo-text
+
+ Sends all registered users a memo containing memo-text.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ Comandi di %S:
+ GLOBAL Invia un messaggio a tutti gli utenti
+ STATS Mostra lo stato dei Services e della rete
+ OPER LIST Mostra tutti i Services operator
+ ADMIN LIST Mostra tutti i Services admin
+ STAFF Display Services staff and online status
+
+OPER_HELP_OPER_CMD
+ Comandi disponibili solo ai Services operator e admin:
+ MODE Cambia dei modi di un canale
+ KICK Kicka un utente da un canale
+ CLEARMODES "Pulisce" i modi di un canale
+ KILLCLONES Killa tutti gli utenti da un certo host
+ AKILL Manipola la lista AKILL
+ SGLINE Manipola la lista SGLINE
+ SQLINE Manipola la lista SQLINE
+ SZLINE Manipola la lista SZLINE
+
+OPER_HELP_ADMIN_CMD
+ Comandi disponibili solo ai Services admin:
+ OPER Modifica la lista dei Services operator
+ CHANLIST Mostra tutti i canali
+ USERLIST Mostra tutti gli utenti
+ LOGONNEWS Definisce i messaggi da mostrare agli utenti
+ quando si connettono
+ RANDOMNEWS Definisce i messaggi da mostrare casualmente
+ agli utenti quando si connettono
+ OPERNEWS Definisce i messaggi da mostrare agli operatori
+ SESSION Mostra la lista delle sessioni degli host
+ EXCEPTION Modifica la lista delle eccezioni al limite delle
+ sessioni
+ CACHE Mostra gli host nella cache del proxy detector
+ NOOP Rimuove temporaneamente tutte le O:line di un server
+ JUPE Disabilita ("jupiter") un server
+ IGNORE Modifica la lista ignore dei Services
+ UMODE Cambia i modi utente di un utente
+ OLINE Imposta le operflag di un utente
+ SET Imposta varie opzioni globali dei Services
+ RELOAD Rilegge il file di configurazione dei Services
+ UPDATE Forza la scrittura su disco immediata dei database
+ dei Services
+ RESTART Salva i database e riavvia i Services
+ QUIT Termina i Services senza salvare i database
+ SHUTDOWN Termina i Services salvando i database
+
+ Comandi disponibili solo al super-user dei Services:
+ ADMIN Modifica la lista dei Services admin
+
+OPER_HELP_ROOT_CMD
+ Commands available to Serivces Roots only:
+ MODLOAD Load a module
+ MODUNLOAD Un-Load a module
+ MODLIST List loaded modules
+ MODINFO Info about a loaded module
+
+OPER_HELP_LOGGED
+ Nota: Tutti i comandi inviati a %S sono loggati!
+
+OPER_HELP_GLOBAL
+ Sintassi: GLOBAL messaggio
+
+ Permette agli IrcOp di inviare un messaggio a tutti
+ gli utenti della rete. Il messaggio sarà inviato
+ dal nick %s.
+
+OPER_HELP_STATS
+ Sintassi: STATS [AKILL | ALL | RESET]
+
+ Senza nessuna opzione, mostra il numero attuale di utenti
+ e di IrcOp online (Services esclusi), il numero massimo
+ di utenti online da quando i Services sono up, e il tempo
+ passato da quando i Services sono stati avviati.
+
+ Con l'opzione AKILL, mostra la dimensione attuale della
+ lista AKILL e la durata di default delle nuove AKILL.
+
+ L'opzione ALL è disponibile solo ai Services admin, e
+ mostra informazioni sull'utilizzo di memoria dei Services.
+ Usare questa opzione può bloccare i Services per un breve
+ periodo di tempo sulle grandi reti.
+
+ L'opzione RESET imposta il numero massimo di utenti
+ registrato al numero degli utenti connessi attualmente
+ alla rete.
+
+ UPTIME può essere usato come sinonimo di STATS.
+
+OPER_HELP_OPER
+ Sintassi: OPER ADD nick
+ OPER DEL {nick | numero | lista}
+ OPER LIST [mask | lista]
+ OPER CLEAR
+
+ Permette ai Services admin di aggiungere o rimuovere dei nick
+ alla/dalla lista dei Services operator. Un utente il cui nick
+ è nella lista dei Services operator e che si è identificato
+ con %s avrà accesso ai comandi utilizzabili dai Services
+ operator.
+
+ Il comando OPER ADD aggiunge il nick specificato alla lista
+ dei Services operator.
+
+ Il comando OPER DEL rimuove il nick specificato dalla lista
+ dei Services operator. Se viene indicata un numero o una lista,
+ vengono rimossi i record corrispondenti (si veda l'esempio di
+ LIST).
+
+ Il comando OPER LIST mostra la lista dei Services operator.
+ Se viene usata una wildcard per la mask, solo i record che
+ corrispondono alla mask vengono mostrati. Se viene specificata
+ una lista di numeri, solo quei record vengono mostrati.
+ Ad esempio:
+
+ OPER LIST 2-5,7-9
+ Mostra i record relativi ai Services operator che hanno
+ numeri da 2 a 5 e da 7 a 9 (escluso il 6).
+
+ Il comando OPER CLEAR svuota la lista dei Services operator.
+
+ Qualsiasi IrcOp può usare il comando OPER LIST.
+ Tutte le altre opzioni sono limitate ai Services admin.
+
+OPER_HELP_ADMIN
+ Sintassi: ADMIN ADD nick
+ ADMIN DEL {nick | numero | lista}
+ ADMIN LIST [mask | lista]
+ ADMIN CLEAR
+
+ Permette al super-user (root) dei Services di aggiungere o
+ rimuovere dei nick dalla/alla lista dei Services admin. Un
+ utente il cui nick è nella lista dei Services operator e che
+ si è identificato con %s avrà accesso ai comandi utilizzabili
+ dai Services admin.
+
+ Il comando ADMIN ADD aggiunge il nick specificato alla lista
+ dei Services admin.
+
+ Il comando ADMIN DEL rimuove il nick specificato dalla lista
+ dei Services admin. Se viene indicata un numero o una lista,
+ vengono rimossi i record corrispondenti (si veda l'esempio di
+ LIST).
+
+ Il comando ADMIN LIST mostra la lista dei Services admin.
+ Se viene usata una wildcard per la mask, solo i record che
+ corrispondono alla mask vengono mostrati. Se viene specificata
+ una lista di numeri, solo quei record vengono mostrati.
+ Ad esempio:
+
+ ADMIN LIST 2-5,7-9
+ Mostra i record relativi ai Services admin che hanno
+ numeri da 2 a 5 e da 7 a 9 (escluso il 6).
+
+ Il comando ADMIN CLEAR svuota la lista dei Services admin.
+
+ Qualsiasi IrcOp può usare il comando ADMIN LIST.
+ Tutte le altre opzioni sono limitate al Services root.
+
+OPER_HELP_IGNORE
+ Sintassi: IGNORE {ADD|DEL|LIST} [tempo] [nick]
+
+ Permette ai Services Admin di impostare i Services affinché
+ ignorino un utente per un certo tempo o fino al prossimo
+ riavvio. Il tempo, di default, è in secondi; si possono
+ specificare differenti unità. Unità valide sono:
+ s per secondi, m per minuti, h per ore e
+ d per giorni. Le combinazioni di queste unità non sono
+ permesse. Per far sì che i Services ignorino l'utente in
+ maniera permanente, è possibile usare 0 come tempo.
+
+OPER_HELP_MODE
+ Sintassi: MODE canale modi
+
+ Permette ai Services operator di impostare modi di canale
+ per qualsiasi canale. I parametri sono gli stessi utilizzati
+ con il comando /MODE standard.
+
+ Limitato ai Services operator.
+
+OPER_HELP_UMODE
+ Sintassi: UMODE nick modi
+
+ Permette ai Services Admin di impostare i modi per
+ qualsiasi utente. I parametri sono gli stessi del
+ comando /MODE standard.
+
+ Limitato ai Services admin.
+
+OPER_HELP_OLINE
+ Sintassi: OLINE nick flag
+
+ Permette ai Services admin di impostare le Operflag
+ per qualsiasi utente. Le flag devono essere introdotte
+ da "+" o "-". Per rimuovere tutte le flag, è sufficiente
+ usare "-" senza altri parametri.
+
+ Limitato ai Services admin.
+
+OPER_HELP_CLEARMODES
+ Sintassi: CLEARMODES canale [ALL]
+
+ Annulla tutti i modi binari (i,k,l,m,n,p,s,t) e i ban
+ dal canale specificato. Se viene indicato ALL, verranno
+ rimossi anche gli op e i voice (modi +o e +v).
+
+ Limitato ai Services operator.
+
+OPER_HELP_KICK
+ Sintassi: KICK canale utente motivo
+
+ Permette agli IrcOp di kickare un utente da qualsiasi
+ canale. I parametri sono gli stessi del comando /KICK
+ standard. Il messaggio di kick conterrà all'inizio il
+ il nick dell'IrcOp che invia il comando, ad esempio:
+
+ *** Spammer has been kicked off channel #canale by %S (OperNick (motivo))
+
+ Limitato ai Services operator.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick newnick
+
+ Forcefully changes a user's nickname from nick to newnick.
+
+ Limited to Services admins
+
+OPER_HELP_AKILL
+ Sintassi: AKILL ADD [+durata] mask motivo
+ AKILL DEL {mask | numero | lista}
+ AKILL LIST [mask | lista]
+ AKILL VIEW [mask | lista]
+ AKILL CLEAR
+
+ Permette ai Services operator di manipolare la lista AKILL.
+ Se un utente che si trova nella lista AKILL cerca di connettersi,
+ i Services manderanno un KILL per quell'utente e, se supportato,
+ indicheranno a tutti i server di aggiugnere una K:line per la
+ mask che corrispondeva all'utente.
+
+ AKILL ADD aggiunge la mask user@host specificata alla lista
+ AKILL per il motivo specificato (che deve essere indicato).
+ durata è specifcato come un intero seguito da una lettera,
+ che può essere d (giorni), h (ore), o m (minuti). Le
+ combinazioni (ad esempio 1h30m) non sono permesse. Se non
+ viene specificata una unità, il valore viene inteso in giorni
+ (quindi +30 significa 30 giorni). Per aggiungere una AKILL
+ senza scadenza, bisogna usare +0. Se la usermask indicata
+ inizia con un +, la durata deve essere indicata esplicitamente,
+ anche se è la stessa di default. La durata di default per le
+ AKILL può essere trovata con il comando STATS AKILL.
+
+ Il comando AKILL DEL rimuove la mask specificata dalla lista
+ AKILL, se è presente. Se viene indicata una lista di numeri,
+ verrano rimossi i record corrispondenti (vedi l'esempio di
+ LIST).
+
+ Il comando AKILL LIST mostra la lista AKILL. Se viene usata
+ una wildcard nella mask, solo i record che corrispondono alla
+ mask vengono mostrati. Se viene indicata una lista di numeri,
+ soltanto quei record vengono mostrati, ad esempio:
+
+ AKILL LIST 2-5,7-9
+ Mostra i record della lista AKILL che hanno numeri da 2
+ a 5 e da 7 a 9.
+
+ AKILL VIEW mostra più informazioni di AKILL LIST, e indica
+ chi ha aggiunto una AKILL, quando è stata aggiunta, e quando
+ scade, oltre alla mask user@host e al motivo.
+
+ AKILL CLEAR svuota la lista AKILL.
+
+ Limitato ai Services operator.
+
+OPER_HELP_SGLINE
+ Sintassi: SGLINE ADD [+durata] mask:motivo
+ SGLINE DEL {mask | numero | lista}
+ SGLINE LIST [mask | lista]
+ SGLINE VIEW [mask | lista]
+ SGLINE CLEAR
+
+ Permette ai Services operator di manipolare la lista SGLINE.
+ Se un utente che si trova nella lista SGLINE cerca di connettersi,
+ i Services non gli permetterano di proseguire la sua sessione
+ su IRC.
+
+ SGLINE ADD aggiunge la mask di realname specificata alla lista
+ sgline per il motivo specificato (che deve essere indicato).
+ durata è specifcato come un intero seguito da una lettera,
+ che può essere d (giorni), h (ore), o m (minuti). Le
+ combinazioni (ad esempio 1h30m) non sono permesse. Se non
+ viene specificata una unità, il valore viene inteso in giorni
+ (quindi +30 significa 30 giorni). Per aggiungere una SGLINE
+ senza scadenza, bisogna usare +0. Se la usermask indicata
+ inizia con un +, la durata deve essere indicata esplicitamente,
+ anche se è la stessa di default. La durata di default per le
+ SGLINE può essere trovata con il comando STATS AKILL.
+ Nota: poiché la mask di realname può contenere spazi, il
+ separatore tra la mask e il motivo è un duepunti.
+
+ Il comando SGLINE DEL rimuove la mask specificata dalla lista
+ SGLINE, se è presente. Se viene indicata una lista di numeri,
+ verrano rimossi i record corrispondenti (vedi l'esempio di
+ LIST).
+
+ Il comando SGLINE LIST mostra la lista SGLINE. Se viene usata
+ una wildcard nella mask, solo i record che corrispondono alla
+ mask vengono mostrati. Se viene indicata una lista di numeri,
+ soltanto quei record vengono mostrati, ad esempio:
+
+ SGLINE LIST 2-5,7-9
+ Mostra i record della lista SGLINE che hanno numeri da 2
+ a 5 e da 7 a 9.
+
+ SGLINE VIEW mostra più informazioni di SGLINE LIST, e indica
+ chi ha aggiunto una SGLINE, quando è stata aggiunta, e quando
+ scade, oltre alla mask di realname e al motivo.
+
+ SGLINE CLEAR svuota la lista SGLINE.
+
+ Limitato ai Services operator.
+
+OPER_HELP_SQLINE
+ Sintassi: SQLINE ADD [+durata] mask motivo
+ SQLINE DEL {mask | numero | lista}
+ SQLINE LIST [mask | lista]
+ SQLINE VIEW [mask | lista]
+ SQLINE CLEAR
+
+ Permette ai Services operator di manipolare la lista SQLINE.
+ Se un utente il cui nick si trova nella lista SQLINE cerca di,
+ connettersi, i Services non gli permetterano di proseguire la
+ sua sessione su IRC.
+
+ Se il primo carattere della mask è #, i Services bloccheranno
+ l'uso dei canali corrispondenti (sugli IRCd che supportano
+ questa funzione).
+
+ SQLINE ADD aggiunge la mask di realname specificata alla lista
+ sgline per il motivo specificato (che deve essere indicato).
+ durata è specifcato come un intero seguito da una lettera,
+ che può essere d (giorni), h (ore), o m (minuti). Le
+ combinazioni (ad esempio 1h30m) non sono permesse. Se non
+ viene specificata una unità, il valore viene inteso in giorni
+ (quindi +30 significa 30 giorni). Per aggiungere una SQLINE
+ senza scadenza, bisogna usare +0. Se la usermask indicata
+ inizia con un +, la durata deve essere indicata esplicitamente,
+ anche se è la stessa di default. La durata di default per le
+ SQLINE può essere trovata con il comando STATS AKILL.
+
+ Il comando SqLINE DEL rimuove la mask specificata dalla lista
+ SqLINE, se è presente. Se viene indicata una lista di numeri,
+ verrano rimossi i record corrispondenti (vedi l'esempio di
+ LIST).
+
+ Il comando SQLINE LIST mostra la lista SQLINE. Se viene usata
+ una wildcard nella mask, solo i record che corrispondono alla
+ mask vengono mostrati. Se viene indicata una lista di numeri,
+ soltanto quei record vengono mostrati, ad esempio:
+
+ SQLINE LIST 2-5,7-9
+ Mostra i record della lista SQLINE che hanno numeri da 2
+ a 5 e da 7 a 9.
+
+ SQLINE VIEW mostra più informazioni di SQLINE LIST, e indica
+ chi ha aggiunto una SQLINE, quando è stata aggiunta, e quando
+ scade, oltre alla mask e al motivo.
+
+ SQLINE CLEAR svuota la lista SQLINE.
+
+ Limitato ai Services operator.
+
+OPER_HELP_SZLINE
+ Sintassi: SZLINE ADD [+durata] mask motivo
+ SZLINE DEL {mask | numero | lista}
+ SZLINE LIST [mask | lista]
+ SZLINE VIEW [mask | lista]
+ SZLINE CLEAR
+
+ Permette ai Services operator di manipolare la lista SZLINE.
+ Se un utente il cui IP si trova nella lista SGLINE cerca di
+ connettersi, i Services non gli permetterano di proseguire
+ la sua sessione su IRC (sia che l'IP abbia un host alfa-
+ numerico corrispondente o meno).
+
+ SZLINE ADD aggiunge la mask di IP specificata alla lista
+ sgline per il motivo specificato (che deve essere indicato).
+ durata è specifcato come un intero seguito da una lettera,
+ che può essere d (giorni), h (ore), o m (minuti). Le
+ combinazioni (ad esempio 1h30m) non sono permesse. Se non
+ viene specificata una unità, il valore viene inteso in giorni
+ (quindi +30 significa 30 giorni). Per aggiungere una SZLINE
+ senza scadenza, bisogna usare +0. Se la usermask indicata
+ inizia con un +, la durata deve essere indicata esplicitamente,
+ anche se è la stessa di default. La durata di default per le
+ SZLINE può essere trovata con il comando STATS AKILL.
+
+ Il comando SZLINE DEL rimuove la mask specificata dalla lista
+ SZLINE, se è presente. Se viene indicata una lista di numeri,
+ verrano rimossi i record corrispondenti (vedi l'esempio di
+ LIST).
+
+ Il comando SZLINE LIST mostra la lista SZLINE. Se viene usata
+ una wildcard nella mask, solo i record che corrispondono alla
+ mask vengono mostrati. Se viene indicata una lista di numeri,
+ soltanto quei record vengono mostrati, ad esempio:
+
+ SZLINE LIST 2-5,7-9
+ Mostra i record della lista SZLINE che hanno numeri da 2
+ a 5 e da 7 a 9.
+
+ SZLINE VIEW mostra più informazioni di SZLINE LIST, e indica
+ chi ha aggiunto una SZLINE, quando è stata aggiunta, e quando
+ scade, oltre alla mask di realname e al motivo.
+
+ SZLINE CLEAR svuota la lista SZLINE.
+
+ Limitato ai Services operator.
+
+OPER_HELP_SET
+ Sintassi: SET opzione impostazione
+
+ Imposta varie opzioni globali dei Services. Le opzioni
+ configurabili sono:
+ READONLY Imposta la modalità read-only o read-write
+ LOGCHAN Report log messages to a channel
+ DEBUG Attiva o disattiva la modalità di debug
+ NOEXPIRE Attiva o disattiva la modalità no expire
+ SUPERADMIN Attiva o disattiva la modalità SuperAdmin
+
+ Limitato ai Services admin.
+
+OPER_HELP_SET_READONLY
+ Sintassi: SET READONLY {ON | OFF}
+
+ Attiva o disattiva la modalità read-only. In modalità
+ read-only, gli utenti normali non potranno modificare
+ nessuna informazione nei database dei Services, incluse
+ le liste di accesso dei nick e dei canali, eccetera.
+ Gli IrcOp con sufficienti privilegi sui Services potranno
+ modificare le liste AKILL e deregistrare (drop) o bloccare
+ (forbid) i nick e i canali, ma questi cambiamenti non
+ verrano salvati, a meno che la modalità read-only non sia
+ disattivata prima che i Services vengano terminati oppure
+ riavviati.
+
+ Questa opzione è equivalente all'opzione di riga di comando
+ -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Syntax: SET LOGCHAN {ON | OFF}
+
+ With this setting on, Services will send its logs to a specified
+ channel as well as the log file. LogChannel must also be defined
+ in the Services configuration file for this setting to be of any
+ use.
+
+ Note: This can have strong security implications if your log
+ channel is not properly secured.
+
+OPER_HELP_SET_DEBUG
+ Sintassi: SET DEBUG {ON | OFF | numero}
+
+ Attiva o disattiva la modalità di debug. In modalità di
+ debug, tutti i dati inviati e ricevuti dai Services,
+ nonché altri messaggi di debug, saranno scritti nel file
+ di log. Se viene specificato un numero, la modalità
+ di debug sarà attivata, e il livello di debug sarà
+ impostato a numero.
+
+ Questa opzione è equivalente all'opzione di riga di comando
+ -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Sintassi: SET NOEXPIRE {ON | OFF}
+
+ Attiva o disattiva la modalità no expire. In modalità
+ no expire, i nick, i canali, le akill e le eccezioni
+ non scadranno fino a quando l'opzione non viene disattivata.
+
+ Questa opzione è equivalente all'opzione di riga di comando
+ -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Sintassi: SET SUPERADMIN {ON | OFF}
+
+ Questa impostazione aumenterà i privilegi dell'admin che
+ la richiede, e permetterà ad esempio di essere fondatore
+ su tutti i canali, ecc.
+
+ Questa opzione NON è persistente, e dovrebbe essere usata
+ solo quando necessario, e reimpostata a OFF al più presto.
+
+OPER_HELP_NOOP
+ Sintassi: NOOP SET server
+ NOOP REVOKE server
+
+ NOOP SET rimuove tutte le O:line del server specificato
+ e killa tutti gli IrcOp presenti su quel server, in modo che
+ non possano effettuare un rehash del server, in quanto questo
+ ne annullerebbe l'effetto.
+
+ NOOP REVOKE ripristina tutte le O:line presenti sul
+ server specificato.
+
+ Nota: il formato del server specificato non è controllato
+ dai Services prima dell'esecuzione del comando.
+
+ Limitato ai Services admin.
+
+OPER_HELP_JUPE
+ Sintassi: JUPE server [motivo]
+
+ Fa sì che i Services blocchino un server, creando un server
+ "fasullo" connesso ai Services per evitare che il server reale
+ possa connettersi alla rete. Questo blocco può essere rimosso
+ utilizzando il comando standard SQUIT. Se viene indicato
+ un motivo, questo sarà utilizzato nel campo delle informazioni
+ del server; altrimenti, le informazioni conterranno il testo
+ "Juped by <nick>", indicando il nick della persona che ha
+ bloccato il server.
+
+ Limitato ai Services admin.
+
+OPER_HELP_RAW
+ Sintassi: RAW testo
+
+ Invia una stringa di testo direttamente al server a cui sono
+ connessi i Services. Questo comando è utilizzabile in maniera
+ limitata, e può causare danni enormi alla struttura della
+ rete se usato in maniera impropria.
+ L'USO DI QUESTO COMANDO DEVE ESSERE EVITATO a meno che non
+ si sappia esattamente cosa si sta facendo!
+
+ Limitato ai Services admins.
+
+OPER_HELP_UPDATE
+ Sintassi: UPDATE
+
+ Forza la scrittura su disco immediata dei database dei
+ Services nello stesso istante in cui il comando viene
+ inviato.
+
+ Limitato ai Services admins.
+
+OPER_HELP_RELOAD
+ Sintassi: RELOAD
+
+ Rilegge il file di configurazione dei Services. Alcune
+ impostazioni contenute nel file richiedono il riavvio
+ effettivo dei Services per essere attivate (ad esempio
+ il cambio dei nick dei Services, l'attivazione della
+ limitazione delle sessioni, eccetera).
+
+ Limitato ai Services admin.
+
+OPER_HELP_QUIT
+ Sintassi: QUIT
+
+ Termina immediatamente i Services senza salvarne i
+ databaase. Questo comando non deve mai essere usato,
+ se non in caso di danni alla copia in memoria dei
+ database, per evitare che la copia danneggiata venga
+ salvata.
+ Per terminare normalmente i Services, deve essere
+ usato il comando SHUTDOWN.
+
+ Limitato ai Services admin.
+
+OPER_HELP_SHUTDOWN
+ Sintassi: SHUTDOWN
+
+ Salva i database su disco e termina i Services.
+
+ Limitato ai Services admins.
+
+OPER_HELP_RESTART
+ Sintassi: RESTART
+
+ Salva i database su disco e riavvia i Services.
+
+ Limitato ai Services admin.
+
+OPER_HELP_KILLCLONES
+ Sintassi: KILLCLONES nick
+
+ Killa tutti gli utenti che hanno lo stesso host di nick.
+ Una AKILL temporanea, nel formato *@host, viene aggiunta
+ in modo da evitare che i client killati si riconnettano
+ immediatamente. Viene inoltre inviato un wallop per indicare
+ chi ha usato il comando, a quale host era rivolto e quanti
+ utenti sono stati killati. Questo comando è utile per
+ rimuovere numerosi cloni dalla rete.
+
+ Limitato ai Services operator.
+
+OPER_HELP_CHANLIST
+ Sintassi: CHANLIST [{pattern | nick} [SECRET]]
+
+ Mostra tutti i canali attivi sulla rete, che siano registrati
+ o meno.
+
+ Se viene indicato un pattern mostra solo i canali corrispondenti.
+ Se viene indicato un nick, mostra solo i canali in cui si trova
+ l'utente specificato.
+ Se viene indicato SECRET, mostra solo i canali che corrisponodno a
+ pattern e che hanno il modo di canale +s o +p attivo.
+
+ Limitato ai Services admin.
+
+OPER_HELP_USERLIST
+ Sintassi: USERLIST [{pattern | canale} [INVISIBLE]]
+
+ Mostra tutti gli utenti connessi alla rete, che siano registrati
+ o meno.
+
+ Se viene indicato un pattern mostra solo gli utenti corrispondenti
+ (il pattern deve essere nel formato nick!user@host).
+ Se viene indicato un canale, mostra solo gli utenti che si trovano
+ su quel canale.
+ Se viene indicato INVISIBLE, mostra solo gli utenti con il modo
+ utente +i attivo.
+
+ Limitato ai Services admin.
+
+OPER_HELP_CACHE
+ Sintsasi: CACHE DEL hostname
+ CACHE LIST pattern [QUEUED | ALL]
+
+ Il comando CACHE DEL rimuove l'hostname specificato dalla
+ cache. Questo comando va usato solo a scopo di debug.
+
+ Il comando CACHE LIST mostra tutti i proxy che corrispondono
+ al pattern specificato. Se viene indicata l'opzione QUEUED,
+ mostra invece gli scan in coda e in corso, e se viene indicata
+ l'opzione ALL, mostrerà tutti gli hostname nella cache.
+
+ Limitato ai Services admin.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD FileName
+
+ This command loads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ This command unloads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO FileName
+
+ This command lists information about the specified loaded module
+
+ Limited to Services Roots.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S ti permette di avere un bot nel tuo canale.
+ E' un servizio pensato per gli utenti che non possono
+ mantenere un bot. I comandi disponibili sono i seguenti;
+ per usarli, digita /msg %S comando.
+ Per maggiori informazioni sull'uso di un comando
+ specifico, digita /msg %S HELP comando.
+
+ ACT Invia un /me in canale
+ ASSIGN Assegna un bot a un canale
+ BADWORDS Gestisce la lista delle parolacce
+ BOTLIST Mostra la lista dei bot disponibili
+ INFO Mostra informazioni su un bot o su un canale
+ KICK Configura i kick
+ SAY Fa sì che il bot dica qualcosa in canale
+ SET Imposta le opzioni del bot
+ UNASSIGN Rimuove il bot da un canale
+
+ Il bot entrerà in canale quando c'è almeno
+ %d persona.
+
+BOT_HELP_BOTLIST
+ Sintassi: BOTLIST
+
+ Mostra la lista di tutti i bot disponibili.
+
+BOT_HELP_ASSIGN
+ Sintassi: ASSIGN canale nick-del-bot
+
+ Assegna il bot con il nick specificato al canale
+ indicato. Dopo averlo assegnato, il bot può essere
+ configurato in base alle necessità.
+
+BOT_HELP_UNASSIGN
+ Sintassi: UNASSIGN canale
+
+ Rimuove il bot da un canale. Dopo aver usato questo
+ comando, il bot non entrerà più nel canale, ma la sua
+ configurazione resterà salvata, in modo da non dover
+ riconfigurare tutto di nuovo nel caso se ne assegni
+ uno di nuovo.
+
+BOT_HELP_INFO
+ Sintassi: INFO {canale | nick-del-bot}
+
+ Permette di vedere le informazioni di %S relative
+ a un canale o a un bot. Se il parametro è un canale,
+ mostrerà le informazioni sui kick attivi. Se il
+ parametro è il nick di un bot, mostrerà le informazioni
+ relative alla data di creazione e al numero di canali
+ a cui è assegnato.
+
+BOT_HELP_SET
+ Sintassi: SET canale opzione parametri
+
+ Configura le opzioni del bot. opzione può essere:
+
+ DONTKICKOPS Protegge gli op dai kick del bot
+ DONTKICKVOICES Protegge i voice dai kick del bot
+ FANTASY Attiva i comandi "di fantasia"
+ GREET Attiva i messaggi di saluto (greet)
+ SYMBIOSIS Fa in modo che il bot si comporti come
+ un bot reale
+
+ Digita /msg %S HELP SET opzione per avere maggiori
+ informazioni su una opzione specifica.
+
+ Nota: l'accesso a questo comando dipende dall'impostazione
+ del livello SET.
+
+BOT_HELP_SET_DONTKICKOPS
+ Sintassi: SET canale DONTKICKOPS {ON|OFF}
+
+ Attiva o disattiva la protezione degli op sul
+ canale. Quando è attiva, gli op non saranno
+ kickati dal bot, anche se non hanno accesso di
+ livello NOKICK.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Sintassi: SET canale DONTKICKVOICES {ON|OFF}
+
+ Attiva o disattiva la protezione dei voice sul
+ canale. Quando è attiva, i voice non saranno
+ kickati dal bot, anche se non hanno accesso di
+ livello NOKICK.
+
+BOT_HELP_SET_FANTASY
+ Sintassi: SET canale FANTASY {ON|OFF}
+
+ Attiva o disattiva l'uso dei comandi di fantasia
+ sul canale. Quando è attivo, gli utenti potranno
+ usare sul canale i comandi !op, !deop, !voice,
+ !devoice, !kick, !kb, !unban, !seen, eccetera.
+ Divertiti a scoprire gli altri comandi; provali
+ sia specificando un nick che da soli, e aggiungi
+ un motivo ad alcuni.
+
+ Gli utenti che vogliono usare i comandi di fantasia
+ DEVONO avere privilegi sufficienti sia per il livello
+ FANTASIA che per il livello del comando richiesto
+ (ad esempio, per usare !op, l'utente deve avere
+ privilegi sufficienti anche per il livello OPDEOP).
+
+BOT_HELP_SET_GREET
+ Sintassi: SET canale GREET {ON|OFF}
+
+ Attiva o disattiva il saluto (greet) sul canale.
+ Quando è attivo, il bot mostrerà la riga di saluto
+ degli utenti che entrano, se hanno privilegi
+ sufficienti. Per impostare il messaggio di saluto,
+ è necessario usare l'opzione SET GREET di NickServ.
+
+BOT_HELP_SET_SYMBIOSIS
+ Sintassi: SET canale SYMBIOSIS {ON|OFF}
+
+ Attiva o disattiva la modalità symbiosis sul
+ canale. Quando è attiva, il bot farà tutto quello
+ che normalmente sarebbe fatto da %s sui canali,
+ come l'impostazione dei MODI, l'invio dei KICK,
+ la visualizzazione del messaggio di ingresso,
+ eccetera.
+
+BOT_HELP_KICK
+ Sintassi: KICK canale opzione parametri
+
+ Configura i kick del bot. opzione può essere:
+
+ BOLDS Imposta se il bot kicka chi usa il grassetto
+ BADWORDS Imposta se il bot kicka chi dice le parolacce
+ CAPS Imposta se il bot kicka chi scrive maiuscolo
+ COLORS Imposta se il bot kicka chi usa i colori
+ FLOOD Imposta se il bot kicka chi flooda
+ REPEAT Imposta se il bot kicka chi ripete la stessa cosa
+ REVERSES Imposta se il bot kicka chi usa il reverse
+ UNDERLINES Imposta se il bot kicka chi usa il sottolineato
+
+ Digita /msg %S HELP KICK opzione per avere maggiori
+ informazioni su una opzione specifica.
+
+ Nota: l'accesso a questo comando dipende dall'impostazione
+ del livello SET.
+
+BOT_HELP_KICK_BOLDS
+ Sintassi: KICK canale BOLDS {ON|OFF} [kick-prima-del-ban]
+
+ Attiva o disattiva il kick per chi scrive in grassetto.
+
+ kick-prima-del-ban è il numero di volte che un utente può
+ essere kickato prima di venire bannato. Se il parametro
+ non è specificato, l'utente non verrà bannato.
+
+BOT_HELP_KICK_COLORS
+ Sintassi: KICK canale COLORS {ON|OFF} [kick-prima-del-ban]
+
+ Attiva o disattiva il kick per chi usa i colori.
+
+ kick-prima-del-ban è il numero di volte che un utente può
+ essere kickato prima di venire bannato. Se il parametro
+ non è specificato, l'utente non verrà bannato.
+
+BOT_HELP_KICK_REVERSES
+ Sintassi: KICK canale REVERSES {ON|OFF} [kick-prima-del-ban]
+
+ Attiva o disattiva il kick per chi usa il reverse.
+
+ kick-prima-del-ban è il numero di volte che un utente può
+ essere kickato prima di venire bannato. Se il parametro
+ non è specificato, l'utente non verrà bannato.
+
+BOT_HELP_KICK_UNDERLINES
+ Sintassi: KICK canale UNDERLINES {ON|OFF} [kick-prima-del-ban]
+
+ Attiva o disattiva il kick per chi usa il sottolineato.
+
+ kick-prima-del-ban è il numero di volte che un utente può
+ essere kickato prima di venire bannato. Se il parametro
+ non è specificato, l'utente non verrà bannato.
+
+BOT_HELP_KICK_CAPS
+ Sintassi: KICK canale CAPS {ON|OFF} [kick-prima-del-ban [minimo [percentuale]]]
+
+ Attiva o disattiva il kick per chi scrive maiuscolo.
+
+ Il bot kicka soltanto se ci sono almeno minimo lettere
+ maiuscole e se costituiscono almeno il percentuale%%
+ del totale della linea. I valori di default per questi
+ parametri sono 10 caratteri e 25%%.
+
+ kick-prima-del-ban è il numero di volte che un utente può
+ essere kickato prima di venire bannato. Se il parametro
+ non è specificato, l'utente non verrà bannato.
+
+BOT_HELP_KICK_FLOOD
+ Sintassi: KICK canale FLOOD {ON|OFF} [kick-prima-del-ban [linee [secondi]]]
+
+ Attiva o disattiva il kick per chi flooda.
+ Quando è attiva, questa opzione fa sì che il bot kicki
+ gli utenti che floodano il canale scrivendo almeno
+ linee linee in secondi secondi. I valori di default
+ per questi parametri sono 6 linee e 10 secondi.
+
+ kick-prima-del-ban è il numero di volte che un utente può
+ essere kickato prima di venire bannato. Se il parametro
+ non è specificato, l'utente non verrà bannato.
+
+BOT_HELP_KICK_REPEAT
+ Sintassi: KICK canale REPEAT {ON|OFF} [kick-prima-del-ban [numero]]
+
+ Attiva o disattiva il kick per chi ripete la stessa cosa.
+ Quando è attiva, questa opzione fa sì che il bot kicki
+ gli utenti che ripetono la stessa cosa almeno numero
+ volte. Il valore di default per questo parametro è 3.
+
+ kick-prima-del-ban è il numero di volte che un utente può
+ essere kickato prima di venire bannato. Se il parametro
+ non è specificato, l'utente non verrà bannato.
+
+BOT_HELP_KICK_BADWORDS
+ Sintassi: KICK canale BADWORDS {ON|OFF} [kick-prima-del-ban]
+
+ Attiva o disattiva il kick per chi dice le parolacce.
+ Quando è attiva, questa opzione fa sì che il bot kicki
+ chi dice certe parole sul canale.
+
+ Le parolacce possono essere definite usando il comando
+ BADWORDS. Digita /msg %S HELP BADWORDS per
+ ottenere maggiori informazioni.
+
+ kick-prima-del-ban è il numero di volte che un utente può
+ essere kickato prima di venire bannato. Se il parametro
+ non è specificato, l'utente non verrà bannato.
+
+BOT_HELP_BADWORDS
+ Sintassi: BADWORDS canale ADD parola [SINGLE | START | END]
+ BADWORDS canale DEL {parola | numero | lista}
+ BADWORDS canale LIST [mask | list]
+ BADWORDS canale CLEAR
+
+ Gestisce la lista delle parolacce di un canale.
+ La lista delle parolacce indica quali parole devono
+ attivare un kick se i kick per chi dice le parolacce
+ sono attivi. Per maggiori informazioni, digita
+ /msg %S HELP KICK BADWORDS.
+
+ Il comando BADWORDS ADD aggiunge la parola specificata
+ alla lista delle parolacce. Se viene specificato SINGLE,
+ il kick sarà effettuato solo se un utente dice la parola
+ integralmente. Se viene specificato START, il kick sarà
+ effettuato se un utente dice una parola che inizia con
+ parola. Se viene specificato END, il kick sarà effettuato
+ se un utente dice una parola che termina con parola.
+ Se non viene specificata nessuna opzione, il kick sarà
+ effettuato ogni volta che un utente dice la parola
+ parola.
+
+ Il comando BADWORDS DEL rimuove la parola specificata
+ dalla lista delle parolacce. Se viene indicata una lista
+ di numeri, saranno rimosse le parole corrispondenti.
+ Per maggiori informazioni, guarda l'esempio di LIST.
+
+ Il comando BADWORDS LIST mostra la lista delle parolacce.
+ Se viene usata una wildcard, solo le parolacce che
+ corrispondono alla mask verranno mostrate. Se viene indicata
+ una lista di numeri, solo le parolacce corrispondenti
+ verranno mostrate.
+ Ad esempio:
+
+ BADWORDS canale LIST 2-5,7-9
+ Mostra le parolacce con numero da 2 a 5 e da
+ 7 a 9 (escludendo quindi il 6)
+
+ Il comando BADWORDS CLEAR svuota la lista delle parolacce.
+
+BOT_HELP_SAY
+ Sintassi: SAY canale testo
+
+ Fa sì che il bot dica in canale il testo specificato.
+
+BOT_HELP_ACT
+ Sintassi: ACT canale testo
+
+ Fa sì che il bot faccia in canale l'equivalente di un
+ "/me" utilizzando il testo specificato.
+
+BOT_SERVADMIN_HELP
+
+ Il seguente comando è disponibile ai Services admin:
+
+ BOT Gestisce la lista dei bot disponibili
+
+BOT_SERVADMIN_HELP_BOT
+ Sintassi: BOT ADD nick ident host realname
+ BOT CHANGE vecchionick nuovonick [ident [host [realname]]]
+ BOT DEL nick
+ BOT LIST
+
+ Permette ai Services admin di creare, modificare
+ ed eliminare i bot che potranno essere usati
+ dagli utenti sui loro canali.
+
+ Il comando BOT ADD aggiunge un bot con il nick, l'ident,
+ l'host e il realname specificati. Poiché non viene effettuato
+ nessun controllo sui valori indicati, è necessario inviare
+ il comando con attenzione.
+ Il comando BOT CHANGE permette di cambiare il nick,
+ l'ident, l'host e il realname del bot specificato, senza
+ cancellarlo realmente (e senza perderne i dati associati).
+ Il comando BOT DEL rimuove il bot indicato dalla lista dei
+ bot disponibili.
+ Il bot BOT LIST è un alias di BOTLIST e serve semplicemente
+ a mostrare la lista dei bot disponibili sulla rete.
+
+ Nota: se crei un bot con un nick che è già registrato,
+ il nick sarà deregistrato; inoltre, se un utente lo sta
+ usando, verrà killato.
+
+BOT_SERVADMIN_HELP_SET
+
+ Queste opzioni sono riservate ai Services admin:
+
+ NOBOT Fa in modo che non sia possibile
+ assegnare un bot al canale
+ PRIVATE Fa in modo che il bot sia assegnabile
+ solo dagli IrcOp
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Sintassi: SET canale NOBOT {ON|OFF}
+
+ Questa opzione fa in modo che non sia possibile
+ assegnare alcun bot al canale specificato.
+ Se un bot è già assegnato, verrà rimosso nel
+ momento in cui viene attivata l'opzione.
+
+ Limitato ai Services admin.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Sintassi: SET nick-del-bot PRIVATE {ON|OFF}
+
+ Questa opzione fa sì che il bot sia assegnabile
+ soltanto dagli IrcOp.
+
+ Limitato ai Services admin.
+HOST_EMPTY
+ La lista dei vhost è vuota.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ Il vhost per %s è stato impostato a %s.
+HOST_IDENT_SET
+ Il vhost per %s è stato impostato a %s@%s.
+HOST_SETALL
+ Il vhost per il gruppo di %s è stato impostato a %s.
+HOST_DELALL
+ vhosts for group %s have been removed.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL <nick>.
+HOST_IDENT_SETALL
+ Il vhost per il gruppo di %s è stato impostato a %s@%s.
+HOST_SET_ERROR
+ Errore! Un vhost può contenere soltanto i caratteri A-Z, a-z, 0-9, '.' e '-'.
+HOST_SET_IDENT_ERROR
+ A vhost ident must be in the format of a valid ident
+HOST_SET_TOOLONG
+ Errore! Il vhost è troppo lungo; usane uno che sia %d caratteri o meno.
+HOST_SET_IDENTTOOLONG
+ Errore! L'ident è troppo lungo; usane uno che sia %d caratteri o meno.
+HOST_NOREG
+ L'utente %s non è presente nel database di NickServ.
+HOST_SET_SYNTAX
+ Sintassi: /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Sintassi: /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Accesso negato.
+HOST_NOT_ASSIGNED
+ Contatta un Operatore per avere un vhost assegnato a questo nick.
+HOST_ACTIVATED
+ Il tuo vhost (%s) ora è attivato.
+HOST_IDENT_ACTIVATED
+ Il tuo vhost (%s@%s) ora è attivato.
+HOST_ID
+ Per favore, identificati con NickServ.
+HOST_NOT_REGED
+ È necessario registrarsi prima che sia possibile assegnare un vhost a un nick.
+HOST_DEL
+ Il vhost di %s è stato rimosso.
+HOST_DEL_SYNTAX
+ Sintassi: /msg %s del <nick>.
+HOST_OFF_UNREAL
+ Il tuo vhost è stato rimosso. Per riattivare il mascheramento standard del tuo host o IP, digita /mode %s +x
+HOST_NO_VIDENT
+ Il tuo IRCD non supporta i vIdent; se li supporta, invia un messaggio al team di sviluppo dei Services indicandolo come possibile bug.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_GROUP
+ All vhost's in the group %s have been set to %s
+HOST_IDENT_GROUP
+ All vhost's in the group %s have been set to %s@%s
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_LIST_FOOTER
+ Displayed all records (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Displayed records from %d to %d
+HOST_LIST_KEY_FOOTER
+ Displayed records matching key %s (Count: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ Comandi di %S:
+ ON Attiva il tuo vhost
+ OFF Disattiva il tuo vhost
+ GROUP Sincronizza il vhost per tutti i nick nel gruppo
+
+HOST_OPER_HELP
+
+ Comandi disponibili solo ai Services Oper:
+ SET Imposta il vhost di un altro utente
+ SETALL Imposta il vhost per tutti i nick di un gruppo
+ DEL Rimuove il vhost di un altro utente
+ LIST Mostra uno o più vhost nel database
+
+HOST_ADMIN_HELP
+
+ Comandi disponibili solo ai Services Admin:
+
+HOST_HELP_ON
+ Sintassi: ON
+
+ Attiva il vhost attualmente assegnato al nick in uso.
+ Quando usi questo comando, ogni utente che effettua un
+ /whois su di te vedrà il vhost invece del tuo vero indirizzo IP.
+
+HOST_HELP_SET
+ Sintassi: SET <nick> <hostmask>.
+
+ Imposta il vhost per il nick indicato a quello della hostmask
+ indicata. Se il tuo IRCD supporta i vIdent, la forma
+ SET <nick> <ident>@<hostmask> permette di impostare l'ident,
+ oltre che il vhost.
+
+ Limitato ai Services oper.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Deletes the vhost for all nick's in the same group as
+ that of the given nick.
+
+ Limited to Host Removers.
+
+
+HOST_HELP_SETALL
+ Sintassi: SETALL <nick> <hostmask>.
+
+ Imposta il vhost per tutti i nick nel gruppo del nick indicato.
+ Se il tuo IRCD supporta i vIdent, la forma SET <nick>
+ <ident>@<hostmask> permette di impostare l'ident, oltre che il
+ vhost.
+
+ NOTA - questo comando non aggiornerà i vhost dei nick
+ aggiunti successivamente al gruppo.
+
+ Limitato ai Services oper.
+
+HOST_HELP_OFF
+ Sintassi: OFF
+
+ Disattiva il vhost attualmente assegnato al nick in uso.
+ Quando usi questo comando, ogni utente che effettua un /whois
+ su di te vedrà il tuo vero indirizzo IP.
+
+HOST_HELP_DEL
+ Sintassi: DEL <nick>
+
+ Elimina dal database il vhost assegnato al nick specificato.
+
+ Limitato ai Services oper.
+
+HOST_HELP_LIST
+ Syntax: LIST [<key>|<#X-Y>]
+
+ This command lists registered vhosts to the operator
+ if a Key is specified, only entries whos nick or vhost match
+ the pattern given in <key> are displayed e.g. Rob* for all
+ entries beginning with "Rob"
+
+ If a #X-Y style is used, only entries between the range of X
+ and Y will be displayed, e.g. #1-3 will display the first 3
+ nick/vhost entries.
+
+ The list uses the value of NSListMax as a hard limit for the
+ number of items to display to a operator at any 1 time.
+
+ Limited to Services operators.
+
+HOST_HELP_GROUP
+ Sintassi: GROUP
+
+ Questo comando permette agli utenti di impostare il vhost del
+ loro nick ATTUALE come vhost di tutti i nick nello stesso gruppo.
diff --git a/lang/langcomp.c b/lang/langcomp.c
new file mode 100644
index 000000000..8392fbd5b
--- /dev/null
+++ b/lang/langcomp.c
@@ -0,0 +1,256 @@
+/* Compiler for language definition files.
+ *
+ * Epona (c) 2000-2002 PegSoft
+ * Contact us at epona@pegsoft.net
+ *
+ * This program is free but copyrighted software; see the file COPYING for
+ * details.
+ *
+ * Based on the original code of Services by Andy Church.
+ *
+ */
+
+/*
+ * A language definition file contains all strings which Services sends to
+ * users in a particular language. A language file may contain comments
+ * (lines beginning with "#") and blank lines. All other lines must adhere
+ * to the following format:
+ *
+ * Each string definition begins with the C name of a message (as defined
+ * in the file "index"--see below). This must be alone on a line, preceded
+ * and followed by no blank space. Following this line are zero or more
+ * lines of text; each line of text must begin with exactly one tab
+ * character, which is discarded. Newlines are retained in the strings,
+ * except the last newline in the text, which is discarded. A message with
+ * no text is replaced by a null pointer in the array (not an empty
+ * string).
+ *
+ * All messages in the program are listed, one per line, in the "index"
+ * file. No comments or blank lines are permitted in that file. The index
+ * file can be generated from a language file with a command like:
+ * grep '^[A-Z]' en_us.l >index
+ *
+ * This program takes one parameter, the name of the language file. It
+ * generates a compiled language file whose name is created by removing any
+ * extension on the source file on the input filename.
+ *
+ * You may also pass a "-w" option to print warnings for missing strings.
+ *
+ * This program isn't very flexible, because it doesn't need to be, but
+ * anyone who wants to try making it more flexible is welcome to.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#undef getline
+int numstrings = 0; /* Number of strings we should have */
+char **stringnames; /* Names of the strings (from index file) */
+char **strings; /* Strings we have loaded */
+
+int linenum = 0; /* Current line number in input file */
+
+/*************************************************************************/
+
+/* Read the index file and load numstrings and stringnames. Return -1 on
+ * error, 0 on success. */
+
+int read_index_file()
+{
+ FILE *f;
+ char buf[256];
+ int i;
+
+ if (!(f = fopen("index", "r"))) {
+ perror("fopen(index)");
+ return -1;
+ }
+ while (fgets(buf, sizeof(buf), f))
+ numstrings++;
+ if (!(stringnames = calloc(sizeof(char *), numstrings))) {
+ perror("calloc(stringnames)");
+ return -1;
+ }
+ if (!(strings = calloc(sizeof(char *), numstrings))) {
+ perror("calloc(strings)");
+ return -1;
+ }
+ fseek(f, 0, SEEK_SET);
+ i = 0;
+ while (fgets(buf, sizeof(buf), f)) {
+ if (buf[strlen(buf)-1] == '\n')
+ buf[strlen(buf)-1] = '\0';
+ if (!(stringnames[i++] = strdup(buf))) {
+ perror("strdup()");
+ return -1;
+ }
+ }
+ fclose(f);
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Return the index of a string name in stringnames, or -1 if not found. */
+
+int stringnum(const char *name)
+{
+ int i;
+
+ for (i = 0; i < numstrings; i++) {
+ if (strcmp(stringnames[i], name) == 0)
+ return i;
+ }
+ return -1;
+}
+
+/*************************************************************************/
+
+/* Read a non-comment, non-blank line from the input file. Return NULL at
+ * end of file. */
+
+char *getline(FILE *f)
+{
+ static char buf[1024];
+ char *s;
+
+ do {
+ if (!(fgets(buf, sizeof(buf), f)))
+ return NULL;
+ linenum++;
+ } while (*buf == '#' || *buf == '\n');
+ s = buf + strlen(buf)-1;
+ if (*s == '\n')
+ *s = '\0';
+ return buf;
+}
+
+/*************************************************************************/
+
+/* Write a 32-bit value to a file in big-endian order. */
+
+int fput32(int val, FILE *f)
+{
+ if (fputc(val>>24, f) < 0 ||
+ fputc(val>>16, f) < 0 ||
+ fputc(val>> 8, f) < 0 ||
+ fputc(val , f) < 0
+ ) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+/*************************************************************************/
+
+int main(int ac, char **av)
+{
+ unsigned char *filename = NULL, *s;
+ char langname[254], outfile[256];
+ FILE *in, *out;
+ int warn = 0;
+ int retval = 0;
+ int curstring = -2, i;
+ char *line;
+ int pos;
+ int maxerr = 50; /* Max errors before we bail out */
+
+ if (ac >= 2 && strcmp(av[1], "-w") == 0) {
+ warn = 1;
+ av[1] = av[2];
+ ac--;
+ }
+ if (ac != 2) {
+ fprintf(stderr, "Usage: %s [-w] <lang-file>\n", av[0]);
+ return 1;
+ }
+ filename = av[1];
+ s = strrchr(filename, '.');
+ if (!s)
+ s = filename + strlen(filename);
+ if (s-filename > sizeof(langname)-3)
+ s = filename + sizeof(langname)-1;
+ strncpy(langname, filename, s-filename);
+ langname[s-filename] = '\0';
+ snprintf(outfile, sizeof(outfile), "%s", langname);
+
+ if (read_index_file() < 0)
+ return 1;
+ if (!(in = fopen(filename, "r"))) {
+ perror(filename);
+ return 1;
+ }
+ if (!(out = fopen(outfile, "w"))) {
+ perror(outfile);
+ return 1;
+ }
+
+ while (maxerr > 0 && (line = getline(in)) != NULL) {
+ if (*line == '\t') {
+ if (curstring == -2) {
+ fprintf(stderr, "%s:%d: Junk at beginning of file\n",
+ filename, linenum);
+ retval = 1;
+ } else if (curstring >= 0) {
+ line++;
+ i = strings[curstring] ? strlen(strings[curstring]) : 0;
+ if (!(strings[curstring] =
+ realloc(strings[curstring], i+strlen(line)+2))) {
+ fprintf(stderr, "%s:%d: Out of memory!\n",filename,linenum);
+ return 2;
+ }
+ sprintf(strings[curstring]+i, "%s\n", line);
+ }
+ } else {
+
+ if ((curstring = stringnum(line)) < 0) {
+ fprintf(stderr, "%s:%d: Unknown string name `%s'\n",
+ filename, linenum, line);
+ retval = 1;
+ maxerr--;
+ } else if (strings[curstring]) {
+ fprintf(stderr, "%s:%d: Duplicate occurrence of string `%s'\n",
+ filename, linenum, line);
+ retval = 1;
+ maxerr--;
+ } else {
+ if (!(strings[curstring] = malloc(1))) {
+ fprintf(stderr, "%s:%d: Out of memory!\n",filename,linenum);
+ return 2;
+ }
+ *strings[curstring] = '\0';
+ }
+
+ if (maxerr == 0)
+ fprintf(stderr, "%s:%d: Too many errors!\n", filename, linenum);
+
+ }
+ }
+
+ fput32(numstrings, out);
+ pos = numstrings * 8 + 4;
+ for (i = 0; i < numstrings; i++) {
+ int len = strings[i] && *strings[i] ? strlen(strings[i])-1 : 0;
+ fput32(pos, out);
+ fput32(len, out);
+ pos += len;
+ }
+ for (i = 0; i < numstrings; i++) {
+ if (strings[i]) {
+ if (*strings[i])
+ strings[i][strlen(strings[i])-1] = '\0'; /* kill last \n */
+ if (*strings[i])
+ fputs(strings[i], out);
+ } else if (warn) {
+ fprintf(stderr, "%s: String `%s' missing\n", filename,
+ stringnames[i]);
+ }
+ }
+
+ fclose(in);
+ fclose(out);
+ return retval;
+}
+
+/*************************************************************************/
diff --git a/lang/nl.l b/lang/nl.l
new file mode 100644
index 000000000..adac6ce50
--- /dev/null
+++ b/lang/nl.l
@@ -0,0 +1,6069 @@
+# Dutch Language File
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# Translated into Dutch by GeniusDex <geniusdex@twistification.net>
+#
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ Nederlands (Dutch)
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %d %b %Y %H:%M:%S %Z
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %d %b %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %d %b %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Zo
+ Ma
+ Di
+ Wo
+ Do
+ Vr
+ Za
+# %A
+STRFTIME_DAYS_LONG
+ Zondag
+ Maandag
+ Dinsdag
+ Woensdag
+ Donderdag
+ Vrijdag
+ Zaterdag
+# %b
+STRFTIME_MONTHS_SHORT
+ Jan
+ Feb
+ Mar
+ Apr
+ Mei
+ Jun
+ Jul
+ Aug
+ Sep
+ Okt
+ Nov
+ Dec
+# %B
+STRFTIME_MONTHS_LONG
+ Januari
+ Februari
+ Maart
+ April
+ Mei
+ Juni
+ Juli
+ Augustus
+ September
+ Oktober
+ November
+ December
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Interne fout - onmogelijk om aanvraag af te handelen.
+UNKNOWN_COMMAND
+ Onbekend commando %s.
+UNKNOWN_COMMAND_HELP
+ Onbekend commando %s. "/msg %s HELP" voor help.
+SYNTAX_ERROR
+ Gebruik: %s
+MORE_INFO
+ /msg %s HELP %s voor meer informatie.
+NO_HELP_AVAILABLE
+ Geen help beschikbaar voor %s.
+OBSOLETE_COMMAND
+ Dit commando is verouderd; gebruik %s.
+
+BAD_USERHOST_MASK
+ Hostmask moet gegeven worden in de vorm user@host.
+BAD_EXPIRY_TIME
+ Ongeldige verloop tijd.
+USERHOST_MASK_TOO_WIDE
+ %s dekking is te groot; Gebruik aub een meer specifiek hostmask.
+
+SERVICE_OFFLINE
+ %s is momenteel offline.
+READ_ONLY_MODE
+ Let op: Services zijn in alleen-lezen mode; veranderingen worden niet opgeslagen!
+PASSWORD_INCORRECT
+ Wachtwoord incorrect.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Toegang geweigerd.
+PERMISSION_DENIED
+ Toestemming geweigerd.
+RAW_DISABLED
+ De RAW optie is uitgeschakeld. Als je deze moet gebruiken, stel dan de DisableRaw optie in de Services configuratie in.
+
+
+MORE_OBSCURE_PASSWORD
+ Probeer aub opnieuw met een onduidelijker wachtwoord. Wachtwoorden moeten tenminste 5 tekens lang zijn, niet iets makkelijk raadbaars (bijv. je echte naam of je nick), en kan geen tab of spatie bevatten.
+PASSWORD_TRUNCATED
+ Let op: Je wachtwoord is ingekort tot %d tekens.
+
+NICK_NOT_REGISTERED
+ Je nick is niet geregistreerd.
+NICK_NOT_REGISTERED_HELP
+ Je nick is niet geregistreerd. Type /msg %s HELP voor informatie over het registreren van je nick.
+NICK_X_NOT_REGISTERED
+ Nick %s is niet geregistreerd.
+NICK_X_IN_USE
+ Nick %s is momenteel in gebruik.
+NICK_X_NOT_IN_USE
+ Nick %s is momenteel niet in gebruik.
+NICK_X_NOT_ON_CHAN
+ %s is momenteel niet op kanaal %s.
+NICK_X_FORBIDDEN
+ Nick %s mag niet geregistreerd of gebruikt worden.
+NICK_X_FORBIDDEN_OPER
+ Nick %s is verboden door %s:
+ %s
+NICK_X_ILLEGAL
+ Nick %s is een illegale nickname en mag niet worden gebruikt.
+NICK_X_TRUNCATED
+ Nick %s is verkort naar %d tekens.
+CHAN_X_NOT_REGISTERED
+ Channel %s is niet geregistreerd.
+CHAN_X_NOT_IN_USE
+ Channel %s bestaat niet.
+CHAN_X_FORBIDDEN
+ Channel %s mag niet geregistreerd of gebruikt worden.
+CHAN_X_FORBIDDEN_OPER
+ Channel %s is verboden door %s:
+ %s
+CHAN_X_SUSPENDED
+ Tijdelijk buiten werking gesteld: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Wachtwoord verificatie benodigd voor dat commando.
+ Probeer opnieuw na het typen van /msg %s IDENTIFY wachtwoord.
+CHAN_IDENTIFY_REQUIRED
+ Wachtwoord verificatie is benodigd voor dat commando.
+ Probeer opnieuw na het typen van /msg %s IDENTIFY %s wachtwoord.
+
+MAIL_DISABLED
+ Services zijn geconfigureerd geen e-mail te versturen.
+MAIL_INVALID
+ E-mail voor %s is ongeldig.
+MAIL_X_INVALID
+ %s is geen geldig e-mail adres.
+MAIL_LATER
+ Onmogelijk e-mail te sturen; probeer na een tijdje opnieuw.
+MAIL_DELAYED
+ Wacht %d seconden en probeer opnieuw.
+
+NO_REASON
+ Geen reden
+UNKNOWN
+ <onbekend>
+
+# Duration system
+DURATION_DAY
+ 1 dag
+DURATION_DAYS
+ %d dagen
+DURATION_HOUR
+ 1 uur
+DURATION_HOURS
+ %d uren
+DURATION_MINUTE
+ 1 minuut
+DURATION_MINUTES
+ %d minuten
+DURATION_SECOND
+ 1 seconde
+DURATION_SECONDS
+ %d secondes
+
+# Human readable expiration
+NO_EXPIRE
+ verloopt niet
+EXPIRES_SOON
+ verloopt bij de volgende database update
+EXPIRES_M
+ verloopt over %d minuten
+EXPIRES_1M
+ verloopt over %d minuut
+EXPIRES_HM
+ verloopt over %d uur, %d minuten
+EXPIRES_H1M
+ verloopt over %d uur, %d minuut
+EXPIRES_1HM
+ verloopt over %d uur, %d minuten
+EXPIRES_1H1M
+ verloopt over %d uur, %d minuut
+EXPIRES_D
+ verloopt over %d dagen
+EXPIRES_1D
+ verloopt over %d dag
+
+# Generic Footer message
+END_OF_ANY_LIST
+ Einde van de %s lijst.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Deze nick is eigendom van iemand anders. Kies een andere.
+ (Als dit jouw nick is, type /msg %s IDENTIFY wachtwoord.)
+NICK_IS_SECURE
+ Deze nickname is geregistreerd en beschermd. Als het jouw
+ nick is, type /msg %s IDENTIFY wachtwoord. Zo niet,
+ kies een andere nick.
+NICK_MAY_NOT_BE_USED
+ Deze nickname mag niet gebruikt worden. Kies een andere.
+FORCENICKCHANGE_IN_1_MINUTE
+ Als je niet binnen 1 minuut je nick verandert, verander ik je nick.
+FORCENICKCHANGE_IN_20_SECONDS
+ Als je niet binnen 20 seconden je nick verandert, verander ik je nick.
+FORCENICKCHANGE_NOW
+ Deze nickname is geregistreerd; je mag hem niet gebruiken.
+FORCENICKCHANGE_CHANGING
+ Je nickname wordt nu veranderd in %s
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER wachtwoord [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER wachtwoord email
+NICK_REGISTRATION_DISABLED
+ Sorry, nickname registratie is tijdelijk uitgeschakeld.
+NICK_REGISTRATION_FAILED
+ Sorry, registratie gefaald.
+NICK_REG_PLEASE_WAIT
+ Wacht %d seconden voor het opnieuw gebruiken van het REGISTER commando.
+NICK_CANNOT_BE_REGISTERED
+ Nickname %s mag niet geregistreerd worden.
+NICK_ALREADY_REGISTERED
+ Nickname %s is al geregistreerd!
+NICK_REGISTERED
+ Nickname %s is geregistreerd onder jouw account: %s
+NICK_PASSWORD_IS
+ Je wachtwoord is %s - onthoudt dit voor later gebruik.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP doel wachtwoord
+NICK_GROUP_DISABLED
+ Sorry, nickname groeperingen zijn tijdelijk uitgeschakeld.
+NICK_GROUP_FAILED
+ Sorry, groepering gefaald.
+NICK_GROUP_PLEASE_WAIT
+ Wacht %d seconden voor het opnieuw gebruiken van het GROUP commando.
+NICK_GROUP_CHANGE_DISABLED
+ Je nick is al geregistreerd; type eerst /msg %s DROP.
+NICK_GROUP_SAME
+ Je bent al lid van de group van %s.
+NICK_GROUP_TOO_MANY
+ Er zijn teveel nicks in %s's groep; geef ze weer en drop er een paar.
+ Type /msg %s HELP GLIST en/msg %s HELP DROP
+ voor meer informatie.
+NICK_GROUP_JOINED
+ Je zit nu in de group van %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY wachtwoord
+NICK_IDENTIFY_FAILED
+ Sorry, identificatie gefaald.
+NICK_IDENTIFY_SUCCEEDED
+ Wachtwoord geaccepteerd - je wordt nu herkend.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Je moet een e-mail adres opgeven voor je nick.
+ Dit stelt je in staat je wachtwoord terug te halen in
+ het geval dat je het vergeet.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Type /msg %S SET EMAIL e-mail om je e-mail in te stellen.
+ Je privacy wordt gerespecteerd; deze e-mail wordt niet aan
+ een derde partij doorgegeven.
+
+# LOGOUT responses
+NICK_ALREADY_IDENTIFIED
+ Je bent al geidentificeerd.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status geupdate (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Je nick is uitgelogd.
+NICK_LOGOUT_X_SUCCEEDED
+ Nick %s is uitgelogd.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ Kan %s niet uitloggen omdat hij een service administrator is.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Sorry, nickname de-registratie is tijdelijk uitgeschakeld.
+NICK_DROPPED
+ Je nickname is gedropped.
+NICK_X_DROPPED
+ Nickname %s is gedropped.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET optie parameters
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] optie parameters
+NICK_SET_DISABLED
+ Sorry, nickname opties aanpassen is tijdelijk uitgeschakeld.
+NICK_SET_UNKNOWN_OPTION
+ Onbekende SET optie %s.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ Onbekende SET optie %s, of nickname is niet geregistreerd.
+NICK_SET_OPTION_DISABLED
+ Optie %s kan niet gezet worden op dit netwerk.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ De nieuwe weergave MOET een nickname van je nickname groep zijn!
+NICK_SET_DISPLAY_CHANGED
+ De nieuwe weergave is nu %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Sorry, kan het wachtwoord niet veranderen.
+NICK_SET_PASSWORD_CHANGED
+ Password veranderd.
+NICK_SET_PASSWORD_CHANGED_TO
+ Password veranderd in %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE nummer
+NICK_SET_LANGUAGE_UNKNOWN
+ Onbekend taal nummer %d. Type /msg %s HELP SET LANGUAGE voor een lijst van talen.
+NICK_SET_LANGUAGE_CHANGED
+ Taal veranderd in Nederlands.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL veranderd in %s.
+NICK_SET_URL_UNSET
+ URL verwijderd.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ E-mail adres veranderd in %s.
+NICK_SET_EMAIL_UNSET
+ E-mail adres verwijderd.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ Je kan je e-mail adres niet verwijderen op dit netwerk.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ ICQ nummer veranderd in %s.
+NICK_SET_ICQ_UNSET
+ ICQ nummer verwijderd.
+NICK_SET_ICQ_INVALID
+ %s is geen geldig nummer.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Groet veranderd in %s.
+NICK_SET_GREET_UNSET
+ Groett verwijderd.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ Protectie staat nu AAN.
+NICK_SET_KILL_QUICK
+ Protectie staat nu AAN, met een gereduceerde vertraging.
+NICK_SET_KILL_IMMED
+ Protectie staat nu AAN, zonder vertraging.
+NICK_SET_KILL_IMMED_DISABLED
+ De IMMED optie is niet beschikbaar op dit netwerk.
+NICK_SET_KILL_OFF
+ Protectie staat nu UIT.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ Veiligheidsoptie staat nu AAN.
+NICK_SET_SECURE_OFF
+ Veiligheidsoptie staat nu UIT.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ Prive optie staat nu AAN.
+NICK_SET_PRIVATE_OFF
+ Prive optie staat nu UIT.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Je e-mail adres zal vanaf nu verborgen worden op %s INFO schermen.
+NICK_SET_HIDE_EMAIL_OFF
+ Je e-mail adres zal vanaf nu getoond worden op %s INFO schermen.
+NICK_SET_HIDE_MASK_ON
+ Je laatst bekende hostmask zal vanaf nu verborgen worden op %s INFO schermen.
+NICK_SET_HIDE_MASK_OFF
+ Je laatst bekende hostmask zal vanaf nu getoond worden op %s INFO schermen.
+NICK_SET_HIDE_QUIT_ON
+ Je laatste quit bericht zal vanaf nu verborgen worden op %s INFO schermen.
+NICK_SET_HIDE_QUIT_OFF
+ Je laatste quit bericht zal vanaf nu getoond worden op %s INFO schermen.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Services zullen je nu beantwoorden met berichten.
+NICK_SET_MSG_OFF
+ Services zullen je nu beantwoorden met notices.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nick] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ Nick %s zal niet verlopen.
+NICK_SET_NOEXPIRE_OFF
+ Nick %s zal verlopen.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mask]
+NICK_ACCESS_ALREADY_PRESENT
+ Hostmask %s bestaat al op je toegangslijst.
+NICK_ACCESS_REACHED_LIMIT
+ Sorry, er zijn maar %d plaatsen op de toegangslijst van een nickname.
+NICK_ACCESS_ADDED
+ %s toegevoegd aan je toegangslijst.
+NICK_ACCESS_NOT_FOUND
+ %s niet gevonden op je toegangslijst.
+NICK_ACCESS_DELETED
+ %s verwijderd van je toegangslijst.
+NICK_ACCESS_LIST
+ Toegangslijst:
+NICK_ACCESS_LIST_X
+ Toegangslijst voor %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s is %s
+NICK_INFO_SERVICES_OPER
+ %s is een services beheerder.
+NICK_INFO_SERVICES_ADMIN
+ %s is een services eigenaar.
+NICK_INFO_ADDRESS
+ Laatst bekende adres: %s
+NICK_INFO_ADDRESS_ONLINE
+ Is online van: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s is momenteel online.
+NICK_INFO_TIME_REGGED
+ Tijd geregistreerd: %s
+NICK_INFO_LAST_SEEN
+ Tijd laatst gezien: %s
+NICK_INFO_LAST_QUIT
+ Laatste quit-bericht: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ E-mail adres: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Groet-bericht: %s
+NICK_INFO_OPTIONS
+ Opties: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Bescherming
+NICK_INFO_OPT_SECURE
+ Veiligheid
+NICK_INFO_OPT_PRIVATE
+ Prive
+NICK_INFO_OPT_MSG
+ Bericht mode
+NICK_INFO_OPT_NONE
+ Geen
+NICK_INFO_NO_EXPIRE
+ Deze nick zal niet verlopen.
+NICK_INFO_FOR_MORE
+ Voor meer informatie, type /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST trefbeeld
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST trefbeeld [FORBIDDEN] [NOEXPIRE] [UNCONFIRMED]
+NICK_LIST_HEADER
+ Lijst van nicks overeenkomend met %s:
+NICK_LIST_RESULTS
+ Einde van lijst - %d/%d resultaten weergegeven.
+
+# ALIST responses
+NICK_ALIST_SYNTAX
+ ALIST nick
+NICK_ALIST_HEADER
+ Kanalen waarop je toegang hebt:
+ Nr Kanaal Niveau Beschrijving
+NICK_ALIST_HEADER_X
+ Kanalen waarop %s toegang heeft:
+ Nr Kanaal Niveau Beschrijving
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ Einde van de lijst - %d/%d kanalen weergegeven.
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Lijst van nicks in je groep:
+NICK_GLIST_HEADER_X
+ Lijst van nicks in de groep van %s:
+NICK_GLIST_FOOTER
+ %d nicks in de groep.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nickname [wachtwoord]
+NICK_NO_RECOVER_SELF
+ Je kan jezelf niet herstellen!
+NICK_RECOVERED
+ Gebruiker die je nick claimde is gekilld.
+ /msg %s RELEASE %s om deze voor de 1-minuut timeout terug te krijgen.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nickname [wachtwoord]
+NICK_RELEASE_NOT_HELD
+ Nick %s wordt niet vastgehouden.
+NICK_RELEASED
+ Nick is vrijgegeven.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nickname [wachtwoord]
+NICK_NO_GHOST_SELF
+ Je kan jezelf niet ghosten!
+NICK_GHOST_KILLED
+ Ghost met jouw nick is gekilld.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nickname
+NICK_GETPASS_UNAVAILABLE
+ GETPASS commando is onbeschikbaar omdat encryptie aanstaat.
+NICK_GETPASS_PASSWORD_IS
+ Wachtwoord voor %s is %s.
+
+# SENDPASS responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host geen Wildcards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails %s komen overeen met %s.
+NICK_GETEMAIL_NOT_USED
+ Geen emails voor %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nickname
+NICK_SENDPASS_UNAVAILABLE
+ SENDPASS commando is onbeschikbaar omdat encryptie aanstaat.
+NICK_SENDPASS_SUBJECT
+ Nick wachtwoord (%s)
+NICK_SENDPASS_HEAD
+ Hoi,
+NICK_SENDPASS_LINE_1
+ Je hebt het wachtwoord van nick %s via e-mail aangevraagd.
+NICK_SENDPASS_LINE_2
+ Het wachtwoord is %s. Wegens veiligheidsredenen kun je dit het beste zo snel mogelijk veranderen.
+NICK_SENDPASS_LINE_3
+ Als je niet weet waarom deze email gestuurd is, negeer deze dan.
+NICK_SENDPASS_LINE_4
+ ANTWOORD NIET OP DEZE E-MAIL!
+NICK_SENDPASS_LINE_5
+ %s beheerders.
+NICK_SENDPASS_OK
+ Wachtwoord %s is verstuurd.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nick [reden]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nick reden
+NICK_FORBID_SUCCEEDED
+ Nick %s is nu verboden.
+NICK_FORBID_FAILED
+ Nick %s verbieden gefaald!
+
+# Nick Registraion responses
+NICK_REQUESTED
+ Deze nick is al aangevraagd. Controleer je e-mail adres voor een verificatiecode.
+NICK_REG_RESENT
+ Je toegangscode is opnieuw gestuurd naar %s.
+NICK_REG_UNABLE
+ Nick is NIET geregistreerd, probeer later opnieuw.
+NICK_IS_PREREG
+ Deze nick wacht nog op een e-mail verificatie code coor de registratie is voltooid.
+NICK_ENTER_REG_CODE
+ Een verificatiecode is verstuurd naar %s. Type /msg %s confirm <verificatiecode> om de registratie te voltooien.
+NICK_CONFIRM_NOT_FOUND
+ Registratie stap 1 kan verlopen zijn. Gebruik eerst "/msg %s register <wachtwoord> <email>".
+NICK_CONFIRM_INVALID
+ Ongeldige verificatiecode ingevuld. Controleer je e-mail nog eens en probeer opnieuw.
+NICK_REG_MAIL_SUBJECT
+ Nickname Registratie (%s)
+NICK_REG_MAIL_HEAD
+ Hoi,
+NICK_REG_MAIL_LINE_1
+ Je hebt een aanvraag ingediend om de nickname %s te registreren.
+NICK_REG_MAIL_LINE_2
+ Type " /msg %s confirm %s " om de registratie te voltooien.
+NICK_REG_MAIL_LINE_3
+ Als je niet weet waarom deze e-mail naar je gestuurd is, negeer deze dan.
+NICK_REG_MAIL_LINE_4
+ REAGEER NIET OP DEZE MAIL!
+NICK_REG_MAIL_LINE_5
+ %s administrators.
+NICK_GETPASS_PASSCODE_IS
+ Verificatiecode voor %s is %s.
+NICK_FORCE_REG
+ Nickname %s geverificeerd.
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Automatisch mode +o
+CHAN_LEVEL_AUTOVOICE
+ Automatisch mode +v
+CHAN_LEVEL_AUTOHALFOP
+ Automatisch mode +h
+CHAN_LEVEL_AUTOPROTECT
+ Automatisch mode +a
+CHAN_LEVEL_AUTODEOP
+ Kanaal operator status niet toegestaan
+CHAN_LEVEL_NOJOIN
+ Niet toegestaan kanaal te joinen indien RESTRICTED
+CHAN_LEVEL_INVITE
+ Toegestaan om INVITE te gebruiken
+CHAN_LEVEL_AKICK
+ Toegestaan om AKICK te gebruiken
+CHAN_LEVEL_SET
+ Toegestaan om SET te gebruiken (niet FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ Toegestaan om CLEAR te gebruiken
+CHAN_LEVEL_UNBAN
+ Toegestaan om UNBAN te gebruiken
+CHAN_LEVEL_OPDEOP
+ Toegestaan om OP/DEOP te gebruiken
+CHAN_LEVEL_ACCESS_LIST
+ Toegestaan om de toegangslijst te bekijken
+CHAN_LEVEL_ACCESS_CHANGE
+ Toegestaan om de toegangslijst te wijzigen
+CHAN_LEVEL_MEMO
+ Toegestaan om kanaal memo's te lezen
+CHAN_LEVEL_ASSIGN
+ Toegestaan om een bot aan te stellen/weg te halen
+CHAN_LEVEL_BADWORDS
+ Toegestaan om BADWORDS te gebruiken
+CHAN_LEVEL_NOKICK
+ Wordt nooit gekicked door bot kickers
+CHAN_LEVEL_FANTASIA
+ Toegestaan om FANTASIA commando's te gebruiken
+CHAN_LEVEL_SAY
+ Toegestaan om SAY en ACT te gebruiken
+CHAN_LEVEL_GREET
+ Groetingsbericht weergegeven
+CHAN_LEVEL_VOICEME
+ Toegestaan om zichzelf te (de)voicen
+CHAN_LEVEL_VOICE
+ Toegestaan om VOICE/DEVOICE te gebruiken
+CHAN_LEVEL_GETKEY
+ Toegestaan om GETKEY te gebruiken
+CHAN_LEVEL_OPDEOPME
+ Toegestaan om zichzelf te (de)oppen
+CHAN_LEVEL_HALFOPME
+ Toegestaan om zichzelf te (de)halfoppen
+CHAN_LEVEL_HALFOP
+ Toegestaan om HALFOP/DEHALFOP te gebruiken
+CHAN_LEVEL_PROTECTME
+ Toegestaan om zichzelf (niet) te beschermen
+CHAN_LEVEL_PROTECT
+ Toegestaan om PROTECT/DEPROTECT te gebruiken
+CHAN_LEVEL_KICKME
+ Toegestaan om zichzelf te kicken
+CHAN_LEVEL_KICK
+ Toegestaan om KICK te gebruiken
+CHAN_LEVEL_SIGNKICK
+ Geen ondertekende kick wanneer SIGNKICK LEVEL is gebruikt
+CHAN_LEVEL_BANME
+ Toegestaan om zichzelf te bannen
+CHAN_LEVEL_BAN
+ Toegestaan om BAN te gebruiken
+CHAN_LEVEL_TOPIC
+ Toegestaan om TOPIC te gebruiken
+CHAN_LEVEL_INFO
+ Toegestaan om INFO met de ALL optie te gebruiken
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Dit kanaal is geregistreerd met %s.
+CHAN_NOT_ALLOWED_OP
+ Je mag geen kanaal operator zijn op kanaal %s.
+CHAN_MAY_NOT_BE_USED
+ Dit kanaal mag niet gebruikt worden.
+CHAN_NOT_ALLOWED_TO_JOIN
+ Je hebt geen toestemming om op dit kanaal te zijn.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER kanaal wachtwoord beschrijving
+CHAN_REGISTER_DISABLED
+ Sorry, kanaal registratie is tijdelijk uitgeschakeld.
+CHAN_REGISTER_NOT_LOCAL
+ Lokale kanalen kunnen niet geregistreerd worden.
+CHAN_MUST_REGISTER_NICK
+ Je moet je nickname eerst registreren. Type /msg %s HELP voor meer informatie over het registreren van nicknames.
+CHAN_MUST_IDENTIFY_NICK
+ Identificeer eerst met %s, door middel van het commando:
+ /msg %s IDENTIFY wachtwoord
+CHAN_MAY_NOT_BE_REGISTERED
+ Kanaal %s mag niet geregistreerd worden.
+CHAN_ALREADY_REGISTERED
+ Kanaal %s is al geregistreerd!
+CHAN_MUST_BE_CHANOP
+ Je moet een operator zijn op het kanaal om deze te registreren.
+CHAN_REACHED_CHANNEL_LIMIT
+ Sorry, je hebt je limiet van %d kanaalregistraties bereikt.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Sorry, je hebt je limiet van %d kanaalregistraties overschreden.
+CHAN_REGISTRATION_FAILED
+ Sorry, registratie gefaald.
+CHAN_REGISTERED
+ Kanaal %s is geregistreerd onder jouw nickname: %s
+CHAN_PASSWORD_IS
+ Het wachtwoord van je kanaal is %s - onthoudt dit voor later gebruik.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY kanaal wachtwoord
+CHAN_IDENTIFY_FAILED
+ Sorry, identificatie gefaald.
+CHAN_IDENTIFY_SUCCEEDED
+ Wachtwoord goedgekeurd - je hebt nu stichter-niveau toegang to %s.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT kanaal nickname
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT kanaal [nickname]
+CHAN_LOGOUT_SUCCEEDED
+ Gebruiker %s is uitgelogd van kanaal %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Alle geidentificeerde gebruikers zijn uitgelogd van kanaal %s.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP kanaal
+CHAN_DROP_DISABLED
+ Sorry, kanaal de-registratie is tijdelijk uitgeschakeld.
+CHAN_DROPPED
+ Kanaal %s is gede-registreerd.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET kanaal optie parameters
+CHAN_SET_DISABLED
+ Sorry, kanaal opties instellen is tijdelijk uitgeschakeld.
+CHAN_SET_UNKNOWN_OPTION
+ Onbekende SET optie %s.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s heeft te veel geregistreerde kanalen.
+CHAN_FOUNDER_CHANGED
+ Stichter van kanaal %s veranderd in %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Opvolger voor %s veranderd in %s.
+CHAN_SUCCESSOR_UNSET
+ Opvolger voor %s verwijderd.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s kan de opvolger niet zijn op kanaal %s omdat hij/zij founder is.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Sorry, kan wachtwoord niet zetten.
+CHAN_PASSWORD_CHANGED
+ %s wachtwoord veranderd.
+CHAN_PASSWORD_CHANGED_TO
+ %s wachtwoord veranderd in %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ Beschrijving van %s veranderd in %s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ URL voor %s veranderd in %s.
+CHAN_URL_UNSET
+ URL voor %s verwijderd.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ E-mail adres voor %s veranderd in %s.
+CHAN_EMAIL_UNSET
+ E-mail adres voor %s verwijderd.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Welkomstbericht voor %s veranderd.
+CHAN_ENTRY_MSG_UNSET
+ Welkomstbericht voor %s verwijderd.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s is geen geldig ban type.
+CHAN_SET_BANTYPE_CHANGED
+ Ban type voor kanaal %s is nu #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Onbekend mode karakter %c genegeerd.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Mode %c genegeerd omdat je deze niet kan forceren.
+CHAN_SET_MLOCK_L_REQUIRED
+ Je moet ook mode +l forceren als je mode +L forceert.
+CHAN_SET_MLOCK_K_REQUIRED
+ Je moet ook mode +i forceren als je mode +K forceert.
+CHAN_MLOCK_CHANGED
+ Mode forcering van kanaal %s veranderd in %s.
+
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET kanaal KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Topic behoudens optie staat nu AAN.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic behoudens optie staat nu UIT.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET kanaal TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topicslot optie staat nu AAN.
+CHAN_SET_TOPICLOCK_OFF
+ Topicslot optie staat nu UIT.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET kanaal PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Vredesoptie staat nu AAN.
+CHAN_SET_PEACE_OFF
+ Vredesoptie staat nu UIT.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET kanaal PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Prive optie staat nu AAN.
+CHAN_SET_PRIVATE_OFF
+ Prive optie staat nu UIT.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET kanaal SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Veilige ops optie staat nu AAN.
+CHAN_SET_SECUREOPS_OFF
+ Veilige ops optie staat nu UIT.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET kanaal SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Veilige founder optie staat nu AAN.
+CHAN_SET_SECUREFOUNDER_OFF
+ Veilige founder optie staat nu UIT.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET kanaal RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Gelimiteerde toegangsoptie staat nu AAN.
+CHAN_SET_RESTRICTED_OFF
+ Gelimiteerde toegangsoptie staat nu OFF.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET kanaal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Veiligheidsoptie staat nu AAN.
+CHAN_SET_SECURE_OFF
+ Veiligheidsoptie staat nu UIT.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET kanaal SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Ondertekende kick optie staat nu AAN.
+CHAN_SET_SIGNKICK_LEVEL
+ Ondertekende kick optie staat nu AAN, maar hangt af van het level van de
+ gebruiker van het commando.
+CHAN_SET_SIGNKICK_OFF
+ Ondertekende kick optie staat nu UIT.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET kanaal OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Op-notificatie optie staat nu AAN.
+CHAN_SET_OPNOTICE_OFF
+ Op-notificatie optie staat nu UIT.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET kanaal XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP lijsten systeem staat nu AAN.
+CHAN_SET_XOP_OFF
+ xOP lijsten systeem staat nu UIT.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET kanaal NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ Kanaal %s zal niet verlopen.
+CHAN_SET_NOEXPIRE_OFF
+ Kanaal %s zal verlopen.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Sorry, je kan maar %d AOPs/SOPs/VOPs in dit kanaal hebben.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Je kan dit commando niet gebruiken. Gebruik het ACCESS commando.
+ Type /msg %s HELP ACCESS voor meer informatie.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP kanaal {ADD|DEL|LIST|CLEAR} [nick | lijst]
+CHAN_AOP_DISABLED
+ Sorry, kanaal AOP lijst wijzigen is tijdelijk uitgeschakeld.
+CHAN_AOP_NICKS_ONLY
+ Kanaal AOP lijsten mogen alleen geregistreerde nicks bevatten.
+CHAN_AOP_ADDED
+ %s toegevoegd aan %s AOP lijst.
+CHAN_AOP_MOVED
+ %s verplaatst naar %s AOP lijst.
+CHAN_AOP_NO_SUCH_ENTRY
+ #%d bestaat niet op %s AOP lijst.
+CHAN_AOP_NOT_FOUND
+ %s niet gevonden op %s AOP lijst.
+CHAN_AOP_NO_MATCH
+ Geen overeenkomsten op %s AOP lijst.
+CHAN_AOP_DELETED
+ %s verwijderd van %s AOP lijst.
+CHAN_AOP_DELETED_ONE
+ 1 AOP verwijderd van %s AOP lijst.
+CHAN_AOP_DELETED_SEVERAL
+ %d AOPs verwijderd van %s AOP lijst.
+CHAN_AOP_LIST_EMPTY
+ %s AOP lijst is leeg.
+CHAN_AOP_LIST_HEADER
+ AOP lijst voor %s:
+ Num Nick
+CHAN_AOP_CLEAR
+ Kanaal AOP lijst is leeggemaakt.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP kanaal {ADD|DEL|LIST|CLEAR} [nick | lijst]
+CHAN_HOP_DISABLED
+ Sorry, kanaal HOP lijst wijzigen is tijdelijk uitgeschakeld.
+CHAN_HOP_NICKS_ONLY
+ Kanaal HOP lijsten mogen alleen geregistreerde nicks bevatten.
+CHAN_HOP_ADDED
+ %s toegevoegd aan %s HOP lijst.
+CHAN_HOP_MOVED
+ %s verplaatst naar %s HOP lijst.
+CHAN_HOP_NO_SUCH_ENTRY
+ #%d bestaat niet op %s HOP lijst.
+CHAN_HOP_NOT_FOUND
+ %s niet gevonden op %s HOP lijst.
+CHAN_HOP_NO_MATCH
+ Geen overeenkomsten op %s HOP lijst.
+CHAN_HOP_DELETED
+ %s verwijderd van %s HOP lijst.
+CHAN_HOP_DELETED_ONE
+ 1 HOP verwijderd van de %s HOP lijst.
+CHAN_HOP_DELETED_SEVERAL
+ %d HOPs verwijderd van de %s HOP lijst.
+CHAN_HOP_LIST_EMPTY
+ %s HOP lijst is leeg.
+CHAN_HOP_LIST_HEADER
+ HOP lijst voor %s:
+ Num Nick
+CHAN_HOP_CLEAR
+ Kanaal HOP lijst is leeggemaakt.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP kanaal {ADD|DEL|LIST|CLEAR} [nick | lijst]
+CHAN_SOP_DISABLED
+ Sorry, kanaal SOP lijst wijzigen is tijdelijk uitgeschakeld.
+CHAN_SOP_NICKS_ONLY
+ Kanaal SOP list mag alleen geregistreerde nicks bevatten.
+CHAN_SOP_ADDED
+ %s toegevoegd aan %s SOP lijst.
+CHAN_SOP_MOVED
+ %s verplaatst naar %s SOP lijst.
+CHAN_SOP_NO_SUCH_ENTRY
+ #%d bestaat niet op %s SOP lijst.
+CHAN_SOP_NOT_FOUND
+ %s niet gevonden op %s SOP lijst.
+CHAN_SOP_NO_MATCH
+ Geen overeenkomsten op %s SOP lijst.
+CHAN_SOP_DELETED
+ %s verwijderd van %s SOP lijst.
+CHAN_SOP_DELETED_ONE
+ 1 SOP verwijderd van %s SOP lijst.
+CHAN_SOP_DELETED_SEVERAL
+ %d SOPs verwijderd van %s SOP lijst.
+CHAN_SOP_LIST_EMPTY
+ %s SOP lijst is leeg.
+CHAN_SOP_LIST_HEADER
+ SOP lijst voor %s:
+ Num Nick
+CHAN_SOP_CLEAR
+ Kanaal SOP list is leeggemaakt.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP kanaal {ADD|DEL|LIST|CLEAR} [nick | lijst]
+CHAN_VOP_DISABLED
+ Sorry, kanaal VOP lijst wijzigen is tijdelijk uitgeschakeld.
+CHAN_VOP_NICKS_ONLY
+ Kanaal VOP lijst mag alleen geregistreerde nicks bevatten.
+CHAN_VOP_ADDED
+ %s toegevoegd aan %s VOP lijst.
+CHAN_VOP_MOVED
+ %s verplaatst %s VOP lijst.
+CHAN_VOP_NO_SUCH_ENTRY
+ #%d bestaat niet op %s VOP lijst.
+CHAN_VOP_NOT_FOUND
+ %s niet gevonden op %s VOP lijst.
+CHAN_VOP_NO_MATCH
+ Geen overeenkomsten op %s VOP lijst.
+CHAN_VOP_DELETED
+ %s verwijderd van %s VOP lijst.
+CHAN_VOP_DELETED_ONE
+ 1 VOP verwijderd van %s VOP lijst.
+CHAN_VOP_DELETED_SEVERAL
+ %d VOPs verwijderd van %s VOP lijst.
+CHAN_VOP_LIST_EMPTY
+ %s VOP lijst is empty.
+CHAN_VOP_LIST_HEADER
+ VOP lijst for %s:
+ Num Nick
+CHAN_VOP_CLEAR
+ Kanaal VOP lijst is leeggemaakt.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS kanaal {ADD|DEL|LIST|CLEAR} [nick [niveau] | lijst]
+CHAN_ACCESS_XOP
+ Je kan dit commando niet gebruiken.
+ Gebruik de AOP, SOP en VOP commando's in plaats van deze.
+ Type /msg %s HELP command voor meer informatie.
+CHAN_ACCESS_DISABLED
+ Sorry, kanaal toegangslijst modificatie is tijdelijk uitgeschakeld.
+CHAN_ACCESS_LEVEL_NONZERO
+ Toegangsniveau mag geen nul zijn.
+CHAN_ACCESS_LEVEL_RANGE
+ Toegansniveau moet tussen de %d en %d inclusief liggen.
+CHAN_ACCESS_NICKS_ONLY
+ Kanaal toegangslijst mag alleen geregistreerde nicks bevatten.
+CHAN_ACCESS_REACHED_LIMIT
+ Sorry, je kan maar %d nicks op de toegangslijst van een kanaal hebben.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Toegangsniveau voor %s op %s onveranderd van %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Toegangsniveau voor %s op %s veranderd in %d.
+CHAN_ACCESS_ADDED
+ %s toegevoegd aan %s toeganslijst met niveau %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ #%d bestaat niet op %s toegangslijst.
+CHAN_ACCESS_NOT_FOUND
+ %s niet gevonden op %s toegangslijst.
+CHAN_ACCESS_NO_MATCH
+ Geen overeenkomsten op %s toegangslijst.
+CHAN_ACCESS_DELETED
+ %s verwijderd van %s toegangslijst.
+CHAN_ACCESS_DELETED_ONE
+ 1 nick verwijderd van %s toegangslijst.
+CHAN_ACCESS_DELETED_SEVERAL
+ %d nicks verwijderd van %s toegangslijst.
+CHAN_ACCESS_LIST_EMPTY
+ %s toegangslijst is leeg.
+CHAN_ACCESS_LIST_HEADER
+ Toegangslijst voor %s:
+ Num Niv Nick
+CHAN_ACCESS_LIST_FOOTER
+ Einde van de toegangslijst.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ Kanaal toegangslijst is leeggemaakt.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK kanaal {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-of-usermask] [reden]
+CHAN_AKICK_DISABLED
+ Sorry, kanaal autokick lijst wijzigen is tijdelijk uitgeschakeld.
+CHAN_AKICK_ALREADY_EXISTS
+ %s bestaat al op %s autokick lijst.
+CHAN_AKICK_REACHED_LIMIT
+ Sorry, je kan maar %d autokick masks op een kanaal hebben.
+CHAN_AKICK_ADDED
+ %s toegevoegd aan %s autokick lijst.
+CHAN_AKICK_NO_SUCH_ENTRY
+ #%d bestaat niet op %s autokick lijst.
+CHAN_AKICK_NOT_FOUND
+ %s niet gevonden op %s autokick lijst.
+CHAN_AKICK_NO_MATCH
+ Geen overeenkomsten op %s autokick lijst.
+CHAN_AKICK_STUCK
+ %s is nu altijd actief op kanaal %s.
+CHAN_AKICK_UNSTUCK
+ %s is niet meer altijd actief op kanaal %s.
+CHAN_AKICK_DELETED
+ %s verwijderd van %s autokick lijst.
+CHAN_AKICK_DELETED_ONE
+ 1 autokick verwijderd van %s autokick lijst.
+CHAN_AKICK_DELETED_SEVERAL
+ %d autokicks verwijderd van %s autokick lijst.
+CHAN_AKICK_LIST_EMPTY
+ %s autokick lijst is leeg.
+CHAN_AKICK_LIST_HEADER
+ Autokick lijst voor %s:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (door %s op %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (eeuwig) (door %s op %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE voor %s compleet; %d gebruikers zijn getroffen.
+CHAN_AKICK_CLEAR
+ Kanaal autokick lijst is leeggemaakt.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS kanaal {SET | DIS[ABLE] | LIST | RESET} [item [niveau]]
+CHAN_LEVELS_XOP
+ Dit commando is nutteloos in deze mode.
+CHAN_LEVELS_RANGE
+ Niveau moet tussen de %d en %d inclusief zijn.
+CHAN_LEVELS_CHANGED
+ Niveau voor %s op kanaal %s veranderd in %d.
+CHAN_LEVELS_UNKNOWN
+ Instelling %s onbekend. Type /msg %s HELP LEVELS DESC voor een lijst van geldige instellingen.
+CHAN_LEVELS_DISABLED
+ %s uitgeschakeld op kanaal %s.
+CHAN_LEVELS_LIST_HEADER
+ Toegangsniveau instellingen voor kanaal %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (uitgeschakeld)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (alleen stichter)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ Toegangsniveaus voor %s teruggezet naar standaardwaarden.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO kanaal [ALL]
+CHAN_INFO_HEADER
+ Informatie voor kanaal %s:
+CHAN_INFO_FOUNDER
+ Stichter: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Stichter: %s
+CHAN_INFO_SUCCESSOR
+ Opvolger: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Opvolger: %s
+CHAN_INFO_DESCRIPTION
+ Beschrijving: %s
+CHAN_INFO_ENTRYMSG
+ Toegangsbericht: %s
+CHAN_INFO_TIME_REGGED
+ Geregistreerd: %s
+CHAN_INFO_LAST_USED
+ Laatst gebruikt: %s
+CHAN_INFO_LAST_TOPIC
+ Laatste topic: %s
+CHAN_INFO_TOPIC_SET_BY
+ Topic gezet door: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ E-mail adres: %s
+CHAN_INFO_BANTYPE
+ Ban type: %d
+CHAN_INFO_OPTIONS
+ Opties: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Topicbehoud
+CHAN_INFO_OPT_OPNOTICE
+ OP Notice
+CHAN_INFO_OPT_PEACE
+ Vrede
+CHAN_INFO_OPT_PRIVATE
+ Prive
+CHAN_INFO_OPT_RESTRICTED
+ Beperkte Toegang
+CHAN_INFO_OPT_SECURE
+ Veilig
+CHAN_INFO_OPT_SECUREOPS
+ Veilige Ops
+CHAN_INFO_OPT_SECUREFOUNDER
+ Veilige Stichter
+CHAN_INFO_OPT_SIGNKICK
+ Ondertekende Kicks
+CHAN_INFO_OPT_TOPICLOCK
+ Topicslot
+CHAN_INFO_OPT_XOP
+ xOP lijsten systeem
+CHAN_INFO_OPT_NONE
+ Geen
+CHAN_INFO_MODE_LOCK
+ Modeslot: %s
+CHAN_INFO_NO_EXPIRE
+ Dit kanaal zal niet verlopen.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST trefbeeld
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST trefbeeld [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Lijst van kanalen overeenkomend met %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Einde van lijst - %d/%d overeenkomsten weergegeven.
+
+# INVITE responses
+CHAN_INVITE_SYNTAX
+ INVITE kanaal
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN kanaal
+CHAN_UNBANNED
+ Bans met betrekking to jou op %s zijn opgeheven.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC kanaal [topic]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR kanaal wat
+CHAN_CLEARED_BANS
+ Alle bans op kanaal %s zijn weggehaald.
+CHAN_CLEARED_EXCEPTS
+ Alle uitzonderingen op kanaal %s zijn verwijderd.
+CHAN_CLEARED_MODES
+ Alle modes op kanaal %s zijn teruggezet op hun oorspronkelijke waarde.
+CHAN_CLEARED_OPS
+ Mode +o is verwijderd van kanaal %s.
+CHAN_CLEARED_VOICES
+ Mode +v is verwijderd van kanaal %s.
+CHAN_CLEARED_USERS
+ Alle users zijn gekicked van kanaal %s.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS kanaal
+CHAN_GETPASS_UNAVAILABLE
+ GETPASS commando onbeschikbaar wegens encryptie van de gegevens.
+CHAN_GETPASS_PASSWORD_IS
+ Wachtwoord voor kanaal %s is %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS kanaal
+CHAN_SENDPASS_UNAVAILABLE
+ SENDPASS commando onbeschikbaar wegens encryptie van de gegevens.
+CHAN_SENDPASS_SUBJECT
+ Kanaal wachtwoord (%s)
+CHAN_SENDPASS_HEAD
+ Hallo,
+CHAN_SENDPASS_LINE_1
+ Je hebt het wachtwoord aangevraag van kanaal %s via e-mail.
+CHAN_SENDPASS_LINE_2
+ Het wachtwoord is %s. Wegens veiligheidsredenen zou je deze zo snel mogelijk moeten veranderen.
+CHAN_SENDPASS_LINE_3
+ Als je niet weet waarom deze e-mail verstuurd is, negeer deze dan.
+CHAN_SENDPASS_LINE_4
+ ANTWOORD NIET OP DEZE MAIL!
+CHAN_SENDPASS_LINE_5
+ %s beheerders.
+CHAN_SENDPASS_OK
+ Wachtwoord %s is verstuurd.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID kanaal [reden]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID kanaal reden
+CHAN_FORBID_SUCCEEDED
+ Kanaal %s is nu verboden.
+CHAN_FORBID_FAILED
+ Kan kanaal %s niet verbieden!
+CHAN_FORBID_REASON
+ Dit kanaal is verboden.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND kanaal [reden]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND kanaal reden
+CHAN_SUSPEND_SUCCEEDED
+ Kanaal %s is tijdelijk buiten werking gesteld.
+CHAN_SUSPEND_FAILED
+ Kan kanaal %s niet tijdelijk buiten werking stellen!
+CHAN_SUSPEND_REASON
+ Dit kanaal is tijdelijk buiten werking gesteld.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND kanaal
+CHAN_UNSUSPEND_ERROR
+ Geen # gevonden aan het begin van de kanaalnaam.
+CHAN_UNSUSPEND_SUCCEEDED
+ Kanaal %s is nu weer in werking gesteld.
+CHAN_UNSUSPEND_FAILED
+ Kan kanaal %s niet terug in werking stellen!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s komt overeen met een uitzondering op %s en kan niet worden gebanned totdat de uitzondering is verwijderd.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Je hebt 1 nieuwe memo.
+MEMO_HAVE_NEW_MEMOS
+ Je hebt %d nieuwe memo's.
+MEMO_TYPE_READ_LAST
+ Type /msg %s READ LAST om deze te lezen.
+MEMO_TYPE_READ_NUM
+ Type /msg %s READ %d om deze te lezen.
+MEMO_TYPE_LIST_NEW
+ Type /msg %s LIST NEW om ze weer te geven.
+MEMO_AT_LIMIT
+ Waarschuwing: Je hebt je maximum aantal memo's bereikt (%d). Je kan geen nieuwe memo's ontvangen totdat je enkele van je huidige memo's verwijdert.
+MEMO_OVER_LIMIT
+ Waarschuwing: Je hebt je maximum aantal memo's overschreden (%d). Je kan geen nieuwe memo's ontvangen totdat je enkele van je huidige memo's verwijdert.
+MEMO_X_MANY_NOTICE
+ Er zijn %d memo's op kanaal %s.
+MEMO_X_ONE_NOTICE
+ Er is %d memo op kanaal %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ Er is een nieuwe memo op kanaal %s.
+ Type /msg %s READ %s %d om deze te lezen.
+MEMO_NEW_MEMO_ARRIVED
+ Je hebt een nieuwe memo van %s.
+ Type /msg %s READ %d om deze te lezen.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ Je hebt geen memo's.
+MEMO_X_HAS_NO_MEMOS
+ %s heeft geen memo's.
+MEMO_DOES_NOT_EXIST
+ Memo %d bestaat niet!
+MEMO_LIST_NOT_FOUND
+ Geen overeenkomende memo's gevonden.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | kanaal} memo-text
+MEMO_SEND_DISABLED
+ Sorry, memo's sturen is tijdelijk uitgeschakeld.
+MEMO_SEND_PLEASE_WAIT
+ Wacht %d seconden voor het opnieuw gebruiken van het SEND commando.
+MEMO_X_GETS_NO_MEMOS
+ %s kan geen memo's ontvangen.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s heeft momenteel te veel memo's en kan er geen meer ontvangen.
+MEMO_SENT
+ Memo verstuurd naar %s.
+
+# CANCEL responses
+MEMO_MASS_SENT
+ Een memo werd gestuurd naar alle geregistreerde gebruikers.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | kanaal}
+MEMO_CANCEL_DISABLED
+ Sorry, memo's annuleren is tijdelijk uitgeschakeld.
+MEMO_CANCEL_NONE
+ Geen annuleerbare memo's gevonden.
+MEMO_CANCELLED
+ Laatste memo naar %s is ge-annuleerd.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [kanaal] [lijst | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ Je hebt geen nieuwe memo's.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s heeft geen nieuwe memo's.
+MEMO_LIST_MEMOS
+ Memo's voor %s. Om te lezen, type: /msg %s READ nr
+MEMO_LIST_NEW_MEMOS
+ Nieuwe memo's voor %s. Om te lezen, type: /msg %s READ nr
+MEMO_LIST_CHAN_MEMOS
+ Memo's voor %s. Om te lezen, type: /msg %s READ %s nr
+MEMO_LIST_CHAN_NEW_MEMOS
+ Nieuwe memo's voor %s. Om te lezen, type: /msg %s READ %s nr
+MEMO_LIST_HEADER
+ Nr Verstuurder Datum/Tijd
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [kanaal] {lijst | LAST | NEW}
+MEMO_HEADER
+ Memo %d van %s (%s). Om te verwijderen, type: /msg %s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d van %s (%s). Om te verwijderen, type: /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [kanaal] {nr | lijst | ALL}
+MEMO_DELETED_NONE
+ Geen memo's verwijderd.
+MEMO_DELETED_ONE
+ Memo %d is verwijderd.
+MEMO_DELETED_SEVERAL
+ Memo's %s zijn verwijderd.
+MEMO_DELETED_ALL
+ Al je memo's zijn verwijderd.
+MEMO_CHAN_DELETED_ALL
+ Alle memo's voor kanaal %s zijn verwijderd.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET optie parameters
+MEMO_SET_DISABLED
+ Sorry, memo opties instellen is tijdelijk uitgeschakeld.
+MEMO_SET_UNKNOWN_OPTION
+ Onbekende SET optie %s.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s zal je nu informeren over memo's zodra je inlogt en wanneer deze naar je toe gezonden worden.
+MEMO_SET_NOTIFY_LOGON
+ %s zal je nu informeren over memo's wanneer je inlogt of /AWAY uitschakelt.
+MEMO_SET_NOTIFY_NEW
+ %s zal je nu informeren over memo's wanneer deze naar jou worden verzonden.
+MEMO_SET_NOTIFY_OFF
+ %s zal je nu niet over memo's informeren.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [kanaal] limiet
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [gebruiker | kanaal] {limiet | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Je het geen toestemming je memo limiet te veranderen.
+MEMO_SET_LIMIT_FORBIDDEN
+ De memo limiet voor %s mag niet worden veranderd.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ Je kan je memo limiet niet hoger dan %d zetten.
+MEMO_SET_LIMIT_TOO_HIGH
+ Je kan de memo limiet voor %s niet hoger dan %d zetten.
+MEMO_SET_LIMIT_OVERFLOW
+ Memo limiet te hoog; limitatie ingesteld op %d.
+MEMO_SET_YOUR_LIMIT
+ Je memo limiet is veranderd in %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ Je kan niet langer memo's ontvangen.
+MEMO_UNSET_YOUR_LIMIT
+ Je memo limiet is uitgeschakeld.
+MEMO_SET_LIMIT
+ Memo limiet voor %s veranderd in %d.
+MEMO_SET_LIMIT_ZERO
+ Memo limiet voor %s veranderd in 0.
+MEMO_UNSET_LIMIT
+ Memo limit voor %s uitgeschakeld.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [kanaal]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | kanaal]
+MEMO_INFO_NO_MEMOS
+ Je hebt momenteel geen memo's.
+MEMO_INFO_MEMO
+ Je hebt momenteel 1 memo.
+MEMO_INFO_MEMO_UNREAD
+ Je hebt momenteel 1 memo, en deze is nog niet gelezen.
+MEMO_INFO_MEMOS
+ Je hebt momenteel %d memo's.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Je hebt momenteel %d memo's, waarven er 1 ongelezen is.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Je hebt momenteel %d memo's, waarvan er %d ongelezen zijn.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Je hebt momenteel %d memo's; allemaal zijn ze ongelezen.
+MEMO_INFO_LIMIT
+ Je memo limiet is %d.
+MEMO_INFO_HARD_LIMIT
+ Je memo limiet is %d, en mag niet worden veranderd.
+MEMO_INFO_LIMIT_ZERO
+ Je memo limiet is 0; Je zal geen memo's ontvangen.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Je memo limiet is 0; Je zal geen memo's ontvangen. Je kan deze limiet niet veranderen.
+MEMO_INFO_NO_LIMIT
+ Er staat geen limiet op het aantal memo's dat je mag hebben.
+MEMO_INFO_NOTIFY_OFF
+ Je wordt niet geinformeerd over nieuwe memo's.
+MEMO_INFO_NOTIFY_ON
+ Je wordt geinformeerd over nieuwe memo's wanneer je inlogt en wanneer deze arriveren.
+MEMO_INFO_NOTIFY_RECEIVE
+ Je wordt geinformeerd over nieuwe memo's wanneer deze arriveren.
+MEMO_INFO_NOTIFY_SIGNON
+ Je wordt geinformeerd over nieuwe memo's wanneer je inlogt.
+MEMO_INFO_X_NO_MEMOS
+ %s heeft momenteel geen memo's.
+MEMO_INFO_X_MEMO
+ %s heeft momenteel 1 memo.
+MEMO_INFO_X_MEMO_UNREAD
+ %s heeft momenteel 1 memo, en deze is nog ongelezen.
+MEMO_INFO_X_MEMOS
+ %s heeft momenteel %d memo's.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s heeft momenteel %d memo's, waarvan er 1 ongelezen is.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s heeft momenteel %d memo's, waarvan er %d ongelezen zijn.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s heeft momenteel %d memo's; allemaal zijn ze ongelezen.
+MEMO_INFO_X_LIMIT
+ %s's memo limiet is %d.
+MEMO_INFO_X_HARD_LIMIT
+ %s's memo limiet is %d, en mag niet worden veranderd.
+MEMO_INFO_X_NO_LIMIT
+ %s heeft geen memo limiet.
+MEMO_INFO_X_NOTIFY_OFF
+ %s wordt niet geinformeerd over nieuwe memo's.
+MEMO_INFO_X_NOTIFY_ON
+ %s wordt geinformeerd over nieuwe memo's wanneer je inlogt en wanneer deze arriveren.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s wordt geinformeerd over nieuwe memo's wanneer deze arriveren.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s wordt geinformeerd over nieuwe memo's wanneer je inlogt.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Bot %s bestaat niet.
+BOT_NOT_ASSIGNED
+ Je moet een bot aan een kanaal toewijzen voordat je dit commando gebruikt.
+ Type /msg %S HELP ASSIGN voor meer informatie.
+BOT_NOT_ON_CHANNEL
+ Bot is niet in kanaal %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ Gebruik het woord %s niet in dit kanaal!
+BOT_REASON_BADWORD_GENTLE
+ Let op je taal!
+BOT_REASON_BOLD
+ Gebruik geen vet in dit kanaal!
+BOT_REASON_CAPS
+ Zet caps lock UIT!
+BOT_REASON_COLOR
+ Gebruik geen kleuren in dit kanaal!
+BOT_REASON_FLOOD
+ Stop met flooden!
+BOT_REASON_REPEAT
+ Stop met jezelf herhalen!
+BOT_REASON_REVERSE
+ Gebruik geen inverteringen in dit kanaal!
+BOT_REASON_UNDERLINE
+ Gebruik geen onderstrepingen in dit kanaal!
+
+# !seen replies
+BOT_SEEN_BOT
+ Je hebt me gevonden, %s!
+BOT_SEEN_YOU
+ Naar jezelf aan het zoeken he, %s?
+BOT_SEEN_ON_CHANNEL
+ %s is nu op het kanaal!
+BOT_SEEN_ON_CHANNEL_AS
+ %s is nu op het kanaal (als %s) !
+BOT_SEEN_ON
+ %s is voor het laatst %s geleden gezien.
+BOT_SEEN_NEVER
+ Ik heb %s nooit op dit kanaal gezien.
+BOT_SEEN_UNKNOWN
+ Ik weet niet wie %s is.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick gebruiker host echte naam
+ BOT CHANGE oude-nick nieuwe-nick [gebruiker [host [echte naam]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ Bot %s bestaat al.
+BOT_BOT_CREATION_FAILED
+ Sorry, bot creatie gefaald.
+BOT_BOT_READONLY
+ Sorry, bot wijzigen is tijdelijk uitgeschakeld.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) toegevoegd aan de bot lijst.
+BOT_BOT_ANY_CHANGES
+ Oude informatie is gelijk aan de nieuwe.
+BOT_BOT_CHANGED
+ Bot %s is veranderd in %s!%s@%s (%s)
+BOT_BOT_DELETED
+ Bot %s is verwijderd.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Bot lijst:
+BOT_BOTLIST_PRIVATE_HEADER
+ Bots gereserveerd voor IRC operators:
+BOT_BOTLIST_FOOTER
+ %d bots beschikbaar.
+BOT_BOTLIST_EMPTY
+ Er zijn momenteel geen bots beschikbaar.
+ Vraag een Services beheerder er een te maken!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN kanaal nick
+BOT_ASSIGN_READONLY
+ Sorry, bot toewijzing is tijdelijk uitgeschakeld.
+BOT_ASSIGN_ALREADY
+ Channel %s heeft al een bot toegewezen namelijk: %s.
+BOT_ASSIGN_ASSIGNED
+ Bot %s toegewezen aan %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN kanaal
+BOT_UNASSIGN_UNASSIGNED
+ Er is geen bot meer toegewezen aan %s.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {kanaal | nick}
+BOT_INFO_NOT_FOUND
+ %s is geen geldige bot of geregistreerd kanaal.
+BOT_INFO_BOT_HEADER
+ Informatie voor bot %s:
+BOT_INFO_BOT_MASK
+ Mask: %s@%s
+BOT_INFO_BOT_REALNAME
+ Echte naam: %s
+BOT_INFO_BOT_CREATED
+ Gemaakt: %s
+BOT_INFO_BOT_USAGE
+ Gebruikt op: %d kana(a)l(en)
+BOT_INFO_BOT_OPTIONS
+ Opties: %s
+BOT_INFO_OPT_PRIVATE
+ Prive
+BOT_INFO_CHAN_HEADER
+ Informatie voor kanaal %s:
+BOT_INFO_CHAN_BOT
+ Bot nick: %s
+BOT_INFO_CHAN_BOT_NONE
+ Bot nick: nog geen toegewezen.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Foute woorden kicker: %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Foute woorden kicker: %s (%d kick(s) om te bannen)
+BOT_INFO_CHAN_KICK_BOLDS
+ Vet kicker: %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Vet kicker: %s (%d kick(s) om te bannen)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Hoofdletter kicker: %s (minimaal %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Hoofdletter kicker: %s (%d kick(s) om te bannen; minimaal %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Hoofdletter kicker: %s
+BOT_INFO_CHAN_KICK_COLORS
+ Kleuren kicker: %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Kleuren kicker: %s (%d kick(s) om te bannen)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Flood kicker: %s (%d regels in %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Flood kicker: %s (%d kick(s) om te bannen; %d regels in %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Flood kicker: %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Herhalings kicker: %s (%d maal)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Herhalings kicker: %s (%d kick(s) om te bannen; %d maal)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Herhalings kicker: %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Inverterings kicker: %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Inverterings kicker: %s (%d kick(s) om te bannen)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Onderstrepings kicker: %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Onderstrepings kicker: %s (%d kick(s) om bannen)
+BOT_INFO_ACTIVE
+ ingeschakeld
+BOT_INFO_INACTIVE
+ uitgeschakeld
+BOT_INFO_CHAN_OPTIONS
+ Opties: %s
+BOT_INFO_OPT_DONTKICKOPS
+ Ops bescherming
+BOT_INFO_OPT_DONTKICKVOICES
+ Voices bescherming
+BOT_INFO_OPT_FANTASY
+ Fantasie
+BOT_INFO_OPT_GREET
+ Begroeting
+BOT_INFO_OPT_NOBOT
+ Geen bot
+BOT_INFO_OPT_SYMBIOSIS
+ Symbiose
+BOT_INFO_OPT_NONE
+ Geen
+
+# SET responses
+BOT_SET_SYNTAX
+ SET kanaal optie instellingen
+BOT_SET_DISABLED
+ Sorry, bot opties instellen is tijdelijk uitgeschakeld.
+BOT_SET_UNKNOWN
+ Onbekende optie %s.
+ Type /msg %S HELP SET voor meer informatie.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET kanaal DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Bot zal geen ops kicken op kanaal %s.
+BOT_SET_DONTKICKOPS_OFF
+ Bot zal ops kicken op kanaal %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET kanaal DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Bot zal geen voices kicken op kanaal %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Bot zal voices kicken op kanaal %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET kanaal FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Fantasie mode staat nu AAN op kanaal %s.
+BOT_SET_FANTASY_OFF
+ Fantasie mode staat nu UIT op kanaal %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET kanaal GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Begroetingsmode staat nu AAN op kanaal %s.
+BOT_SET_GREET_OFF
+ Begroetingsmode staat nu UIT op kanaal %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET kanaal NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ Geen Bot mode staat nu AAN op kanaal %s.
+BOT_SET_NOBOT_OFF
+ Geen Bot mode staat nu UIT op kanaal %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET kanaal PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Prive mode van bot %s staat nu AAN.
+BOT_SET_PRIVATE_OFF
+ Prive mode van bot %s staat nu AAN.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET kanaal SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ Symbiose mode staat nu AAN op kanaal %s.
+BOT_SET_SYMBIOSIS_OFF
+ Symbiose mode staat nu AAN op kanaal %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK kanaal optie {ON|OFF} [instellingen]
+BOT_KICK_DISABLED
+ Sorry, kicker configuratie is tijdelijk uitgeschakeld.
+BOT_KICK_UNKNOWN
+ Onbekende optie %s.
+ Type /msg %S HELP KICK voor meer informatie.
+BOT_KICK_BAD_TTB
+ %s kan niet worden ingesteld als aantal keer om te bannen.
+
+BOT_KICK_BADWORDS_ON
+ Bot zal nu kicken op slechte woorden. Gebruik het BADWORDS commando
+ om slechte woorden toe te voegen of te verwijderen.
+BOT_KICK_BADWORDS_ON_BAN
+ Bot zal nu kicken op slechte woorden, en zal een ban zetten na
+ %d kicks voor dezelde gebruiker. Gebruik BADWORDS commando
+ om slechte woorden toe te voegen of te verwijderen.
+BOT_KICK_BADWORDS_OFF
+ Bot zal niet meer kicken op slechte woorden.
+BOT_KICK_BOLDS_ON
+ Bot zal nu kicken op vet.
+BOT_KICK_BOLDS_ON_BAN
+ Bot zal nu kicken op vet, en zal een ban zetten na
+ %d kicks voor dezelfde gebruiker.
+BOT_KICK_BOLDS_OFF
+ Bot zal niet meer kicken op vet.
+BOT_KICK_CAPS_ON
+ Bot zal nu kicken op hoofdletters (bij minstens
+ %d karakters en %d%% van het gehele bericht).
+BOT_KICK_CAPS_ON_BAN
+ Bot zal nu kicken op hoofdletters (bij minstens
+ %d karakters en %d%% van het gehele bericht), en zal
+ een ban plaatsen na %d kicks voor dezelfde gebruiker.
+BOT_KICK_CAPS_OFF
+ Bot zal niet meer kicken op hoofdletters.
+BOT_KICK_COLORS_ON
+ Bot zal nu kicken op kleuren.
+BOT_KICK_COLORS_ON_BAN
+ Bot zak nu kicken op kleuren, en zal een ban zetten na
+ %d kicks voor dezelfde gebruiker.
+BOT_KICK_COLORS_OFF
+ Bot zal niet meer kicken op kleuren.
+BOT_KICK_FLOOD_ON
+ Bot zal nu kicken op flood (%d regels in %d seconden).
+BOT_KICK_FLOOD_ON_BAN
+ Bot zal nu kicken op flood (%d regels in %d seconden),
+ en zal een ban zitten na %d kicks voor dezelfde gebruiker.
+BOT_KICK_FLOOD_OFF
+ Bot zal niet meer kicken op flood.
+BOT_KICK_REPEAT_ON
+ Bot zal nu kicken op herhalingen (users die %d maal
+ hetzelfde zeggen).
+BOT_KICK_REPEAT_ON_BAN
+ Bot zal nu kicken op herhalingen (users die %d maal
+ hetzelfde zeggen), en zal een ban zetten na %d
+ kicks voor dezelfde gebruiker.
+BOT_KICK_REPEAT_OFF
+ Bot zal niet meer kicken op herhalingen.
+BOT_KICK_REVERSES_ON
+ Bot zal nu kicken op inverteringen.
+BOT_KICK_REVERSES_ON_BAN
+ Bot zal nu kicken op inverteringen, en zal een ban zetten na
+ %d kicks voor dezelfde gebruiker.
+BOT_KICK_REVERSES_OFF
+ Bot zal niet meer kicken op inverteringen.
+BOT_KICK_UNDERLINES_ON
+ Bot zal nu kicken op onderstrepingen.
+BOT_KICK_UNDERLINES_ON_BAN
+ Bot zal nu kicken op onderstrepingen, en zal een ban zetten na
+ %d kicks voor dezelfde gebruiker.
+BOT_KICK_UNDERLINES_OFF
+ Bot zal niet meer kicken op onderstrepingen.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS kanaal {ADD|DEL|LIST|CLEAR} [woord | entry-lijst] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Sorry, kanaal slechte woorden lijst wijzigen is tijdelijk uitgeschakeld.
+BOT_BADWORDS_REACHED_LIMIT
+ Sorry, je kan maar %d slechte woorden per kanaal instellen.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s bestaat al op %s slechte woorden lijst.
+BOT_BADWORDS_ADDED
+ %s toegevoegd aan %s slechte woorden lijst.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ #%d niet gevonden op %s slechte woorden lijst.
+BOT_BADWORDS_NOT_FOUND
+ %s niet gevonden op %s slechte woorden lijst.
+BOT_BADWORDS_NO_MATCH
+ Geen overeenkomsten op %s slechte woorden lijst.
+BOT_BADWORDS_DELETED
+ %s verwijderd van %s slechte woorden lijst.
+BOT_BADWORDS_DELETED_ONE
+ 1 slecht woord verwijderd van %s slechte woorden lijst.
+BOT_BADWORDS_DELETED_SEVERAL
+ %d slechte woorden verwijderd van %s slechte woorden lijst.
+BOT_BADWORDS_LIST_EMPTY
+ %s slechte woorden lijst is leeg.
+BOT_BADWORDS_LIST_HEADER
+ Slechte woorden lijst voor %s:
+ Nr Woord Type
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ Slechte woorden lijst is nu leeg.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY kanaal text
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT kanaal text
+
+# Errors
+BOT_EXCEPT
+ Gebruiker komt overeen met kanaal-uitzondering.
+BOT_BAD_NICK
+ Bot Nicks mogen alleen geldige nick-tekens bevatten.
+BOT_BAD_HOST
+ Bot Hosts mogen alleen geldige host-tekens bevatten.
+BOT_BAD_IDENT
+ Bot Idents mogen alleen geldige tekens bevatten.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Services kan geen modes veranderen. Zijn je server goed geconfigureerd?
+OPER_BOUNCY_MODES_U_LINE
+ Services kan geen modes veranderen. Zijn de U:lines van je servers goed geconfigureerd?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL bericht
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Onbekende STATS optie %s.
+OPER_STATS_CURRENT_USERS
+ Huidige gebruikers: %d (%d ops)
+OPER_STATS_MAX_USERS
+ Maximum gebruikers: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Services draaien %d dagen, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Services draaien %d dagen, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Services draaien %d uur, %d minuten
+OPER_STATS_UPTIME_HM1S
+ Services draaien %d uur, %d minuten
+OPER_STATS_UPTIME_H1MS
+ Services draaien %d uur, %d minuut
+OPER_STATS_UPTIME_H1M1S
+ Services draaien %d uur, %d minuut
+OPER_STATS_UPTIME_1HMS
+ Services draaien %d uur, %d minuten
+OPER_STATS_UPTIME_1HM1S
+ Services draaien %d uur, %d minuten
+OPER_STATS_UPTIME_1H1MS
+ Services draaien %d uur, %d minuut
+OPER_STATS_UPTIME_1H1M1S
+ Services draaien %d uur, %d minuut
+OPER_STATS_UPTIME_MS
+ Services draaien %d minuten, %d seconden
+OPER_STATS_UPTIME_M1S
+ Services draaien %d minuten, %d seconde
+OPER_STATS_UPTIME_1MS
+ Services draaien %d minuut, %d seconden
+OPER_STATS_UPTIME_1M1S
+ Services draaien %d minuut, %d seconde
+OPER_STATS_BYTES_READ
+ Bytes gelezen: %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Bytes geschreven: %5d kB
+OPER_STATS_USER_MEM
+ Gebruiker : %6d records, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Kanaal : %6d records, %5d kB
+OPER_STATS_GROUPS_MEM
+ NS Groepen : %6d records, %5d kB
+OPER_STATS_ALIASES_MEM
+ NS Aliassen : %6d records, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d records, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d records, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d records, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessies : %6d records, %5d kB
+OPER_STATS_PROXY_MEM
+ Proxies : %6d records, %5d kB
+OPER_STATS_AKILL_COUNT
+ Huidig aantal AKILLs: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Standaard AKILL verloop tijd: %d dagen
+OPER_STATS_AKILL_EXPIRE_DAY
+ Standaard AKILL verloop rijd: 1 dag
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Standaard AKILL verloop tijd: %d uur
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Standaard AKILL verloop tijd: 1 uur
+OPER_STATS_AKILL_EXPIRE_MINS
+ Standaard AKILL verloop tijd: %d minuten
+OPER_STATS_AKILL_EXPIRE_MIN
+ Standaard AKILL verloop tijd: 1 minuut
+OPER_STATS_AKILL_EXPIRE_NONE
+ Standaard AKILL verloop tijd: Verloopt niet
+OPER_STATS_SGLINE_COUNT
+ Huidig aantal SGLINEs: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Standaard SGLINE verloop tijd: %d dagen
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Standaard SGLINE verloop tijd: 1 dag
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Standaard SGLINE verloop tijd: %d uur
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Standaard SGLINE verloop tijd: 1 uur
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Standaard SGLINE verloop tijd: %d minuten
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Standaard SGLINE verloop tijd: 1 minuut
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Standaard SGLINE verloop tijd: Verloopt niet
+OPER_STATS_SQLINE_COUNT
+ Huidig aantal SQLINEs: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Standaard SQLINE verloop tijd: %d dagen
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Standaard SQLINE verloop tijd: 1 dag
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Standaard SQLINE verloop tijd: %d uur
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Standaard SQLINE verloop tijd: 1 uur
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Standaard SQLINE verloop tijd: %d minuten
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Standaard SQLINE verloop tijd: 1 minuut
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Standaard SQLINE verloop tijd: Verloopt niet
+OPER_STATS_SZLINE_COUNT
+ Huidig aantal SZLINEs: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Standaard SZLINE verloop tijd: %d dagen
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Standaard SZLINE verloop tijd: 1 dag
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Standaard SZLINE verloop tijd: %d uur
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Standaard SZLINE verloop tijd: 1 uur
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Standaard SZLINE verloop tijd: %d minuten
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Standaard SZLINE verloop tijd: 1 minuut
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Standaard SZLINE verloop tijd: Verloopt niet
+OPER_STATS_RESET
+ Statistieken opnieuw gezet.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE kanaal modes
+
+# UMODE respondes
+OPER_UMODE_SYNTAX
+ UMODE nick modes
+OPER_UMODE_SUCCESS
+ Gebruikersmodes van %s veranderd.
+OPER_UMODE_CHANGED
+ %s heeft je gebruikersmodes veranderd.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flags
+OPER_OLINE_SUCCESS
+ Operflags %s zijn toegevoegd voor %s.
+OPER_OLINE_IRCOP
+ Je bent nu een IRC Operator.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES kanaal [ALL]
+OPER_CLEARMODES_DONE
+ Binaire modes en bans verwijderd van kanaal %s.
+OPER_CLEARMODES_ALL_DONE
+ Alle modes verwijderd van kanaal %s.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK kanaal gebruiker reden
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick nieuwe nick
+OPER_SVSNICK_NEWNICK
+ De nick %s wordt nu veranderd in %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | toeganslijst]
+OPER_ADMIN_SKELETON
+ Services is in skelet mode; het ADMIN commando is niet beschikbaar.
+OPER_ADMIN_EXISTS
+ %s bestaat al op de Services admin lijst.
+OPER_ADMIN_REACHED_LIMIT
+ Sorry, je kan maar %d Services admins hebben.
+OPER_ADMIN_ADDED
+ %s toegevoegd aan de Services admin lijst.
+OPER_ADMIN_NOT_FOUND
+ %s niet gevonden op de Services admin lijst.
+OPER_ADMIN_NO_MATCH
+ Geen overkeenkomsten op de Services admin lijst.
+OPER_ADMIN_DELETED
+ %s verwijderd van de Services admin lijst.
+OPER_ADMIN_DELETED_ONE
+ 1 admin verwijderd van de Services admin lijst.
+OPER_ADMIN_DELETED_SEVERAL
+ %d admins verwijderd van de Services admin lijst.
+OPER_ADMIN_LIST_EMPTY
+ Services admin lijst is leeg.
+OPER_ADMIN_LIST_HEADER
+ Services admin lijst:
+ Nr Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Services admin lijst is leeggemaakt.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | toegangslijst]
+OPER_OPER_SKELETON
+ Services is in skelet mode; het OPER commando is onbeschikbaar.
+OPER_OPER_EXISTS
+ %s bestaat al op de Services operator lijst.
+OPER_OPER_REACHED_LIMIT
+ Sorry, je kan maar %d Services operators hebben.
+OPER_OPER_ADDED
+ %s toegevoegd aan Services operator lijst.
+OPER_OPER_NOT_FOUND
+ %s niet gevonden op Services operator lijst.
+OPER_OPER_NO_MATCH
+ Geen overeenkomsten op Services operator lijst.
+OPER_OPER_DELETED
+ %s verwijderd van Services operator lijst.
+OPER_OPER_DELETED_ONE
+ 1 operator verwijderd van Services operator lijst.
+OPER_OPER_DELETED_SEVERAL
+ %d operators verwijderd van Services operator lijst.
+OPER_OPER_LIST_EMPTY
+ Services operator lijst is leeg.
+OPER_OPER_LIST_HEADER
+ Services operator lijst:
+ Nr Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ Services operator lijst is leeggemaakt.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+verloop] {mask | toegangslijst} [reden]]
+OPER_AKILL_EXISTS
+ %s bestaat al op de AKILL lijst.
+OPER_AKILL_ALREADY_COVERED
+ %s is al gedekt door %s.
+OPER_AKILL_REACHED_LIMIT
+ Sorry, je kan maar %d AKILLs hebben.
+OPER_AKILL_NO_NICK
+ Reminder: AKILL masks kunnen geen nicknames bevatten; ben er zeker van dat je geen nick-deel in je mask hebt.
+OPER_AKILL_ADDED
+ %s toegevoegd aan de AKILL lijst.
+OPER_AKILL_CHANGED
+ Verlooptijd van %s veranders.
+OPER_AKILL_NOT_FOUND
+ %s niet gevonden op de AKILL lijst.
+OPER_AKILL_NO_MATCH
+ Geen overeenkomsten op de AKILL lijst.
+OPER_AKILL_DELETED
+ %s verwijderd van de AKILL lijst.
+OPER_AKILL_DELETED_ONE
+ 1 AKILL verwijderd van de AKILL lijst.
+OPER_AKILL_DELETED_SEVERAL
+ %d AKILLs verwijderd van de AKILL lijst.
+OPER_AKILL_LIST_EMPTY
+ AKILL lijst is leeg.
+OPER_AKILL_LIST_HEADER
+ Huidige AKILL lijst:
+ Nr Mask Reden
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Huidige AKILL lijst:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (door %s op %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ The AKILL lijst is leeggemaakt.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+verloop] {mask | toegangslijst}[:reden]]
+OPER_SGLINE_UNSUPPORTED
+ Sorry, SGLINE is niet beschikbaar op dit netwerk.
+OPER_SGLINE_EXISTS
+ %s bestaat al op de SGLINE lijst.
+OPER_SGLINE_ALREADY_COVERED
+ %s is al gedekt door %s.
+OPER_SGLINE_REACHED_LIMIT
+ Sorry, je kan maar %d SGLINEs hebben.
+OPER_SGLINE_ADDED
+ %s toegevoegd aan de SGLINE lijst.
+OPER_SGLINE_CHANGED
+ Verlloptijd van %s veranderd.
+OPER_SGLINE_NOT_FOUND
+ %s niet gevonden op de SGLINE lijst.
+OPER_SGLINE_NO_MATCH
+ Geen overeenkomsten op de SGLINE lijst.
+OPER_SGLINE_DELETED
+ %s verwijderd van de SGLINE lijst.
+OPER_SGLINE_DELETED_ONE
+ 1 SGLINE verwijderd van de SGLINE lijst.
+OPER_SGLINE_DELETED_SEVERAL
+ %d SGLINEs verwijderd van de SGLINE lijst.
+OPER_SGLINE_LIST_EMPTY
+ SGLINE lijst is leeg.
+OPER_SGLINE_LIST_HEADER
+ Huidige SGLINE lijst:
+ Nr Mask Reden
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Huidige SGLINE lijst:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (door %s op %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ De SGLINE lijst is leeggemaakt.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+verloop] {mask | toegangslijst} [reden]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Kanaal SQLINEs worden niet ondersteund door je IRCd, dus kun je ze niet gebruiken.
+OPER_SQLINE_EXISTS
+ %s bestaat al op de SQLINE lijst.
+OPER_SQLINE_ALREADY_COVERED
+ %s is al gedekt door %s.
+OPER_SQLINE_REACHED_LIMIT
+ Sorry, je kan maar %d SQLINEs hebben.
+OPER_SQLINE_ADDED
+ %s toegevoegd aan de SQLINE lijst.
+OPER_SQLINE_CHANGED
+ Verlooptijd van %s veranderd.
+OPER_SQLINE_NOT_FOUND
+ %s niet gevonden op de SQLINE lijst.
+OPER_SQLINE_NO_MATCH
+ Geen overeenkomsten op de SQLINE lijst.
+OPER_SQLINE_DELETED
+ %s verwijderd van de SQLINE lijst.
+OPER_SQLINE_DELETED_ONE
+ 1 SQLINE verwijderd van de SQLINE lijst.
+OPER_SQLINE_DELETED_SEVERAL
+ %d SQLINEs verwijderd van de SQLINE lijst.
+OPER_SQLINE_LIST_EMPTY
+ SQLINE lijst is leeg.
+OPER_SQLINE_LIST_HEADER
+ Huidige SQLINE lijst:
+ Nr Mask Reden
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Huidige SQLINE lijst:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (door %s op %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ The SQLINE lijst is leeggemaakt.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+verloop] {mask | toegangslijst} [reden]]
+OPER_SZLINE_UNSUPPORTED
+ Sorry, SZLINE is niet beschikbaar op dit netwerk.
+OPER_SZLINE_EXISTS
+ %s bestaat al op de SZLINE lijst.
+OPER_SZLINE_ALREADY_COVERED
+ %s is al gedekt door %s.
+OPER_SZLINE_REACHED_LIMIT
+ Sorry, je kan maar %d SZLINEs hebben.
+OPER_SZLINE_ONLY_IPS
+ Herrinering: Je kan alleen IP masks toevoegen aan de SZLINE lijst.
+OPER_SZLINE_ADDED
+ %s toegevoegd aan de SZLINE lijst.
+OPER_SZLINE_CHANGED
+ Verlooptijd van %s veranderd.
+OPER_SZLINE_NOT_FOUND
+ %s niet gevonden op de SZLINE lijst.
+OPER_SZLINE_NO_MATCH
+ Geen overeenkomsten op de SZLINE lijst.
+OPER_SZLINE_DELETED
+ %s verwijderd van de SZLINE lijst.
+OPER_SZLINE_DELETED_ONE
+ 1 SZLINE verwijderd van de SZLINE lijst.
+OPER_SZLINE_DELETED_SEVERAL
+ %d SZLINEs verwijderd van de SZLINE lijst.
+OPER_SZLINE_LIST_EMPTY
+ SZLINE lijst is leeg.
+OPER_SZLINE_LIST_HEADER
+ Current SZLINE list:
+ Nr Mask Reden
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Huidige SZLINE lijst:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (door %s op %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ The SZLINE lijst is leeggemaakt.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET optie instelling
+OPER_SET_IGNORE_ON
+ Negeer code zal worden gebruikt.
+OPER_SET_IGNORE_OFF
+ Negeer code zal niet worden gebruikt.
+OPER_SET_IGNORE_ERROR
+ Instelling voor negeer code moet ON of OFF zijn.
+OPER_SET_READONLY_ON
+ Services is nu in alleen-lezen mode.
+OPER_SET_READONLY_OFF
+ Services is nu in lezen-schrijven mode.
+OPER_SET_READONLY_ERROR
+ Instelling voor alleen-lezen moet ON of OFF zijn.
+OPER_SET_LOGCHAN_ON
+ Services rapporteert nu log-berichten naar %s.
+OPER_SET_LOGCHAN_OFF
+ Services rapporteert geen log-berichten meer naar een kanaal.
+OPER_SET_LOGCHAN_ERROR
+ Instelling voor LOGCHAN moet ON of OFF zijn en LogChannel moet gedefineerd zijn.
+OPER_SET_DEBUG_ON
+ Services is nu in debug mode.
+OPER_SET_DEBUG_OFF
+ Services is nu in non-debug mode.
+OPER_SET_DEBUG_LEVEL
+ Services is nu in debug mode (niveau %d).
+OPER_SET_DEBUG_ERROR
+ Instelling voor DEBUG moet ON, OFF, of een positief nummer zijn.
+OPER_SET_NOEXPIRE_ON
+ Services is nu in geen-verloop mode.
+OPER_SET_NOEXPIRE_OFF
+ Services is nu in verloop mode.
+OPER_SET_NOEXPIRE_ERROR
+ Instelling voor NOEXPIRE moet ON of OFF zijn.
+OPER_SET_UNKNOWN_OPTION
+ Onbekende optie %s.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} server
+OPER_NOOP_SET
+ Alle O:lines van %s zijn verwijderd.
+OPER_NOOP_REVOKE
+ Alle O:lines van %s zijn hersteld.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE servername [reden]
+OPER_JUPE_HOST_ERROR
+ Gebruik een geldige servernaam bij het jupen
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW text
+
+# UPDATE responses
+OPER_UPDATING
+ Databases bijwerkend.
+
+# RELOAD responses
+OPER_RELOAD
+ Services' configuratie bestand is opnieuw geladen.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN niet gedefineerd; kan niet herstarten. Voer het \2configure\2 script opnieuw uit en hercompileer de Services om het RESTART commando in te schakelen.
+
+# IGNORE respondes
+OPER_IGNORE_SYNTAX
+ Gebruik: IGNORE {ADD|DEL|LIST|CLEAR} [tijd] [nick]
+OPER_IGNORE_VALID_TIME
+ Je moet een geldig nummer als tijd invoeren.
+OPER_IGNORE_TIME_DONE
+ Nick %s zal nu genegeerd worden voor %s.
+OPER_IGNORE_PERM_DONE
+ Nick %s zal nu permanent genegeerd worden.
+OPER_IGNORE_DEL_DONE
+ Nick %s zal niet meer genegeerd worden.
+OPER_IGNORE_LIST
+ Services negeer-lijst:
+OPER_IGNORE_LIST_NOMATCH
+ Nick %s niet gevonden op de negeer-lijst.
+OPER_IGNORE_LIST_EMPTY
+ Negeer-lijst is leeg.
+OPER_IGNORE_LIST_CLEARED
+ Negeer-lijst is leeggemaakt.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Kan gebruiker %s niet vinden.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Kanalen lijst:
+ Naam Gebruikers Modes Topic
+OPER_CHANLIST_HEADER_USER
+ %s kanalen lijst:
+ Naam Gebruikers Modes Topic
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ Einde van kanalen lijst.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Gebruikers lijst:
+ Nick Mask
+OPER_USERLIST_HEADER_CHAN
+ %s gebruikers lijst:
+ Nick Mask
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Einde van gebruikers lijst.
+
+# CACHE responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {hostname | trefbeeld} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Proxy detectie is uitgeschakeld.
+OPER_CACHE_NOT_FOUND
+ %s is niet gevonden in de cache.
+OPER_CACHE_REMOVED
+ %s is verwijderd uit de cache.
+OPER_CACHE_HEADER
+ Hostname Status
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ Eind lijst - %d/%d overeenkomsten weergegeven.
+OPER_CACHE_QUEUED
+ In de wachtrij
+OPER_CACHE_PROGRESS
+ In behandeling
+OPER_CACHE_NORMAL
+ Normaal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ HTTP proxy
+OPER_SUPER_ADMIN_ON
+ Je bent nu een SuperAdministrator
+OPER_SUPER_ADMIN_OFF
+ Je bent geen SuperAdministrator meer
+OPER_SUPER_ADMIN_SYNTAX
+ Instelling voor SuperAdministrator moet ON of OFF zijn (moet ook ingeschakeld zijn in services.conf)
+OPER_SUPER_ADMIN_WALL_ON
+ %s is nu een SuperAdministrator
+OPER_SUPER_ADMIN_WALL_OFF
+ %s is geen SuperAdminstrator meer
+OPER_SUPER_ADMIN_ONLY
+ Alleen SuperAdminstrators kunnen dit commando gebruiken.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ Services zijn in Defcon modus. Probeer later opnieuw.
+OPER_DEFCON_NO_CONF
+ Het Defcon systeem moet worden ingeschakeld via services.conf
+OPER_DEFCON_CHANGED
+ Services zijn nu in DEFCON %d
+OPER_DEFCON_WALL
+ %s heeft het DEFCON level veranderd naar %d
+DEFCON_GLOBAL
+ Het Defcon Level staat nu op Level: %d
+
+# Module strings
+
+OPER_MODULE_LOADED
+ Module %s geladen
+OPER_MODULE_UNLOADED
+ Module %s is uitgeladen
+OPER_MODULE_LOAD_FAIL
+ Laden van de module %s is gefaald
+OPER_MODULE_REMOVE_FAIL
+ Het verwijderen van module %s is gefaald
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD bestandsnaam
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD bestandsnaam
+OPER_MODULE_LIST
+ Module: %s
+OPER_MODULE_INFO_LIST
+ Module: %s Versie: %s Auteur: %s Geladen: %s
+OPER_MODULE_CMD_LIST
+ Stelt het commando: /msg %s %s ter beschikking
+OPER_MODULE_MSG_LIST
+ Stelt de IRCD handler voor: %s ter beschikking
+OPER_MODULE_NO_LIST
+ Op dit moment zijn er geen modules geladen
+OPER_MODULE_NO_INFO
+ Er is geen informatie aanwezig voor module %s
+OPER_MODULE_INFO_SYNTAX
+ MODINFO FileName
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ De volgende commando's zijn geladen door een module:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [paramenters]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+verloop] mask limiet reden
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {mask | lijst}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE nr positie
+OPER_EXCEPTION_DISABLED
+ Sessie limitering is tijdelijk uitgeschakeld.
+OPER_EXCEPTION_ALREADY_PRESENT
+ Mask %s bestaat l op de uitzonderingenlijst.
+OPER_EXCEPTION_TOO_MANY
+ Sessie limiet uitzonderingenlijst is vol!
+OPER_EXCEPTION_ADDED
+ Sessie limiet voor %s veranderd in %d.
+OPER_EXCEPTION_MOVED
+ Uitzondering voor %s (#%d) verplaatst naar positie %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ #%d bestaat niet op de sessie limiet uitzonderingenlijst.
+OPER_EXCEPTION_NOT_FOUND
+ %s niet gevonden op de sessie limiet uitzonderingenlijst.
+OPER_EXCEPTION_NO_MATCH
+ Geen overeenkomsten op de sessie limiet uitzonderingenlijst.
+OPER_EXCEPTION_DELETED
+ %s verwijderd van de sessie limiet uitzonderingenlijst.
+OPER_EXCEPTION_DELETED_ONE
+ 1 uitzondering verwijderd van de sessie limiet uitzonderingenlijst.
+OPER_EXCEPTION_DELETED_SEVERAL
+ %d uitzonderingen verwijderd van de sessie limiet uitzonderingenlijst.
+OPER_EXCEPTION_LIST_HEADER
+ Huidige Sessie Limiet Uitzonderingenlijst:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Nr Limiet Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (door %s op %s; %s)
+ Limiet: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Ongeldige sessie limiet. Het moet een geldige integer groter dan of gelijk aan nul en kleiner dan %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Ongeldige hostmask. Alleen echte hostmasks zijn geldig als uitzondering omdat deze niet worden vergeleken met nicks of usernames.
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST limiet | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST limiet
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ Session limitering is uitgeschakeld.
+OPER_SESSION_INVALID_THRESHOLD
+ Ongeldige drempel waarrde. Het moet een geldige integer groter dan 1 zijn.
+OPER_SESSION_NOT_FOUND
+ %s niet gevonden op de sessie lijst.
+OPER_SESSION_LIST_HEADER
+ Hosts met tenminste %d sessies:
+OPER_SESSION_LIST_COLHEAD
+ Sessies Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ De host %s heeft momenteel %d sessies met een limiet van %d.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Gebruik: EXCEPTION ADD [+verloop] mask limiet reden
+ EXCEPTION DEL {mask | lijst}
+ EXCEPTION MOVE nr positie
+ EXCEPTION LIST [mask | lijst]
+ EXCEPTION VIEW [mask | lijst]
+
+ Staat Services admin toe de lijst van hosts met een specifieke
+ sessielimit aan te passen, zodat zeker machines, bijvoorbeeld
+ shell servers, meer dan het standaard aantal clients kunnen
+ hebben. Zodra een host zijn seesie limiet bereikt, zullen alle
+ client die proberen vanaf die host te verbinen worden gekilled
+ Voor de gebruiker wordt gekilled wordt deze geinformeerd via
+ een /NOTICE van %S, van een bron van hulp aangaande sessie
+ limitering. The inhoud van deze notice is een configuratie
+ optie.
+
+ EXCEPTION ADD voegt de gegeven hostmask toe aan de
+ uitzonderingenlijst. Let op: nick!user@host en user@host
+ zijn ongeldig! Alleen echte host masks, zoals box.host.dom
+ en *.hot.dom, zijn toegestaan omdat sessie limitering geen
+ rekening houdt met nicks of usernames. limiet moet een nummer
+ groter dan of gelijk aan 0 zijn. Dit bepaalt hoe veel sessies
+ deze host tegelijkertijd mag hebben. Een waarde van 0 betekent
+ dat de host een ongelimiteerde sessielimiet heeft. Bekijk de
+ AKILL help voor details of het formaat van de optionele
+ verloop paramenter.
+ EXCEPTION DEL verwijdert het gegeven mask van de
+ uitzonderingenlijst.
+ EXCEPTION MOVE verplaatst uitzondering nr naar positie.
+ De tussenliggende uitzondering worden omhoog of omlaag
+ geschoven om het gat te vullen.
+ EXCEPTION LIST en EXCEPTION VIEW geven alle huidige
+ uitzonderingen weer; als het optionele mask is gegeven wordt de
+ lijst gelimiteerd tot uitzondering overeenkomend het het
+ gegeven mask. Het verschil is dat EXCEPTION VIEW meer
+ informatie geeft: de naam van degene die de uitzondering
+ aangemaakt heeft, de bijbehorende sessielimiet, reden, hostmask
+ en de verloop datum en tijd.
+
+ Let op: een verbindinde client zal de eerste uitzondering die
+ met zijn host overeenkomt "gebruiken". Grote uitzonderingen-
+ lijsten en breed overeenkomende uitzondering-masks zullen
+ zeer waarschijnlijk de prestaties van de services verminderen.
+
+ Gelimiteerd tot Services admins.
+
+OPER_HELP_SESSION
+ Gebruik: SESSION LIST drempel
+ SESSION VIEW host
+
+ Stelt Services admins instaat de sessie lijst te bekijken.
+
+ SESSION LIST geeft hosts weer met tenminste drempel
+ sessies weer. Deze drempel moet een nummer groter dan 1 zijn.
+ Dit is om te verkomen dat je perongeluk het grote aantal
+ hosts met maar 1 sessie weergeeft.
+ SESSION VIEW geeft gedetailleerde informatie weer over een
+ specifieke host, inclusief het huidige aantal sessies en de
+ sessie limiet. De host waarde mag geen wildcards bevatten.
+
+ Bekijk de EXCEPTION help voor meer informatie over sessie
+ limiteringen en hoe sessie limieten in te stellen voor
+ specifieken hosts en groepen daarvan.
+
+ Gelimiteerd tot Services admins.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Geeft de nicks van alle Services Staff samen met
+ hun level en on-line status weer.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ Het defcon systeem kan gebruikt worden om een vooraf bepaalde
+ set van restricties op de services toe te passen tijdens een
+ aanval op het netwerk.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * Geen nieuwe channel registratie's
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * Geen nieuwe nick registratie's
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * Geen MLOCK veranderingen
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Forceer Kanaal Modes (%s) op alle kanalen
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Gebruik de beperkte sessie limiet van %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill elke nieuwe client die connecteerd
+OPER_HELP_DEFCON_OPER_ONLY
+ * Negeer elke non-oper met een boodschap
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Negeer non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL elke nieuwe client die connecteerd
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * Geen nieuwe memo's verzenden
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+expiry] channel reason
+
+ Plaatst een AKILL voor elke nick op een gegeven kanaal. Het
+ gebruikt de complete en echte ident@host voor elke nick,
+ en forceerd dan een AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Login Nieuws - %s] %s
+NEWS_OPER_TEXT
+ [Oper Nieuws - %s] %s
+NEWS_RANDOM_TEXT
+ [Willekeurig Nieuws - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Genbruik: LOGONNEWS {ADD|DEL|LIST} [text|nr]
+NEWS_LOGON_LIST_HEADER
+ Login nieuwsberichten:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s door %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ Er is geen login nieuws.
+NEWS_LOGON_ADD_SYNTAX
+ Gebruik: LOGONNEWS ADD text
+NEWS_LOGON_ADD_FULL
+ Nieuws lijst is vol!
+NEWS_LOGON_ADDED
+ Nieuw login nieuws toegevoegd (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Gebruik: LOGONNEWS DEL {nr | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Login nieuwsbericht #%d niet gevonden!
+NEWS_LOGON_DELETED
+ Login nieuwsbericht #%d verwijderd.
+NEWS_LOGON_DEL_NONE
+ Geen login nieuwsberichten om te verwijderen!
+NEWS_LOGON_DELETED_ALL
+ Alle login nieuwsberichten zijn verwijderd.
+
+NEWS_OPER_SYNTAX
+ Gebruik: OPERNEWS {ADD|DEL|LIST} [text|nr]
+NEWS_OPER_LIST_HEADER
+ Oper nieuwsberichten:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s door %s)
+ %s
+NEWS_OPER_LIST_NONE
+ Er is geen opernieuws.
+NEWS_OPER_ADD_SYNTAX
+ Gebruik: OPERNEWS ADD text
+NEWS_OPER_ADD_FULL
+ Nieuwslijst is vol!
+NEWS_OPER_ADDED
+ Nieuw oper nieuwsbericht toegevoegd (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Gebruik: OPERNEWS DEL {nr | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Oper nieuwsbericht #%d niet gevonden!
+NEWS_OPER_DELETED
+ Oper nieuwsbericht #%d verwijderd.
+NEWS_OPER_DEL_NONE
+ Geen oper nieuwsberichten om te verwijderen!
+NEWS_OPER_DELETED_ALL
+ Alle oper nieuwsberichten zijn verwijderd.
+
+NEWS_RANDOM_SYNTAX
+ Gebruik: RANDOMNEWS {ADD|DEL|LIST} [text|nr]
+NEWS_RANDOM_LIST_HEADER
+ Willekeurige nieuwsberichten:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s door %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Er is geen willekeurig nieuws.
+NEWS_RANDOM_ADD_SYNTAX
+ Gebruik: RANDOMNEWS ADD text
+NEWS_RANDOM_ADD_FULL
+ Nieuwslijst is vol!
+NEWS_RANDOM_ADDED
+ Nieuw willekeurig nieuwsbericht toegevoegd (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Gebruik: RANDOMNEWS DEL {nr | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Willekeurig nieuwsbericht #%d niet gevonden!
+NEWS_RANDOM_DELETED
+ Willekeurig nieuwsbericht #%d verwijderd.
+NEWS_RANDOM_DEL_NONE
+ Geen willekeurige nieuwsberichten om te verwijderen!
+NEWS_RANDOM_DELETED_ALL
+ Alle willekeurige nieuwsberichten zijn verwijderd.
+
+NEWS_HELP_LOGON
+ Gebruik: LOGONNEWS ADD text
+ LOGONNEWS DEL {nr | ALL}
+ LOGONNEWS LIST
+
+ Wijzigt de lijst met login nieuwsberichten of geeft deze weer.
+ Wanneer een gebruiker met het netwerk verbindt, worden deze
+ berichten naar hem/haar verzonden. (Echter, er zullen nooit
+ meer dan drie berichten worden verstuurd om het flooden van de
+ gebruiker te voorkomen. Als er meer dan drie nieuwsberichten
+ zijn worden alleen de drie meest recente vestuurd.)
+
+ LOGONNEWS LIST mag door elke IRC operator worden gebruikt om
+ de huidige nieuwsberichten weer te geven. ADD en DEL mogen
+ alleen door Services admins gebruikt worden.
+
+
+NEWS_HELP_OPER
+ Gebruik: OPERNEWS ADD text
+ OPERNEWS DEL {nr | ALL}
+ OPERNEWS LIST
+
+ Wijzigt de lijst met oper nieuwsberichten of geeft deze weer.
+ Wanneer een gebruiker opert (dmv het /OPER commando), worden
+ deze berichtennaar hem/haar verzonden. (Echter, er zullen
+ nooit meer dan drie berichten worden verstuurd om het flooden
+ van de gebruiker te voorkomen. Als er meer dan drie nieuws-
+ berichten zijn worden alleen de drie meest recente vestuurd.)
+
+ OPERNEWS LIST mag door elke IRC operator worden gebruikt om
+ de huidige nieuwsberichten weer te geven. ADD en DEL mogen
+ alleen door Services admins gebruikt worden.
+
+NEWS_HELP_RANDOM
+ Syntax: RANDOMNEWS ADD text
+ RANDOMNEWS DEL {num | ALL}
+ RANDOMNEWS LIST
+
+ Wijzigt de lijst mer willekeurige nieuwsberichten of geeft
+ deze weer. Wanneer een gebruiker met het netwerk verbindt,
+ wordt er een (en niet meer dan een) van deze willekeurige
+ nieuwsberichten willekeurig uitgekozen en naar hem/haar
+ verstuurd.
+
+ RANDOMNEWS LIST mag door elke IRC operator worden gebruikt om
+ de huidige nieuwsberichten weer te geven. ADD en DEL mogen
+ alleen door Services admins gebruikt worden.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S is een service die informatie over Services geeft.
+ Help onderwerpen zijn toegankelijk via de HELP commando's
+ of de andere Service clients:
+
+ /msg %s HELP
+ voor informatie over nickname registratie
+
+ /msg %s HELP
+ voor informatie over kanaal instellingen en registratie
+
+ /msg %s HELP
+ voor informatie over berichten naar offline gebruikers
+ sturen
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ voor informatie over een bot in je kanaal instellen
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ %S stelt je in staat een nickname te "registreren", en
+ te voorkomen dat anderen hem gebruiken. De volgende commando's
+ kunnen gebruikt worden voor registratie en onderhoud van
+ nicknames; om ze te gebruiken, type /msg %S commando.
+ Voor meer informatie over een specifiek commando, type
+ /msg %S HELP commando.
+
+ REGISTER Registreer een nickname
+ GROUP Bij een groep aanmelden
+ IDENTIFY Jezelf identificeren met je wachtwoord
+ ACCESS De lijst met toegestane adressen wijzigen
+ SET Opties instellen, inclusief kill bescherming
+ DROP De registratie van je nickname annuleren
+ RECOVER Een andere gebruiker killen die je nick gebruikt
+ RELEASE Je nick terugnemen nadat je RECOVER gebruikt hebt
+ SENDPASS Je wachtwoord vergeten? Probeer dit
+
+ Andere commando's: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS
+
+ OPMERKING: Deze service is bedoeld om IRC gebruikers een weg
+ te bieden om te verzekeren dat hun identiteit niet in gevaar komt.
+ Het is NIET bedoeld om het "stelen" van nicknames of andere
+ kwaadwillige acties te helpen. Misbruik van %S zal resulteren in,
+ minimaal, verlies van de misbruikte nick(s).
+
+NICK_HELP_EXPIRES
+
+ Nicknames die niet meer gebruikt worden zullen na een tijd
+ automatisch verlopen, oftewel: ze zullen verwijderd worden na
+ %d dagen inactiviteit.
+
+NICK_HELP_REGISTER
+ Gebruik: REGISTER wachtwoord [email]
+
+ Registreert je nickname in de %S database. Wanneer je nick
+ geregistreerd is kan je de SET en ACCESS commando's
+ gebruiken om je nick instellingen te veranderen.
+ Onthoud het wachtwoord dat je gebruikt bij het registreren,
+ je hebt het nodig als je je nick instellingen later wilt
+ veranderen. (Let erop dat hoofdletters uitmaken! ANOPE,
+ Anope, en anope zijn allemaal andere wachtwoorden!)
+
+ Wachtwoordrichtlijnen:
+
+ Wachtwoorden moeten niet makkelijk te raden zijn. Bijvoorbeeld,
+ je echte naam als wachtwoord gebruiken is een slecht idee. Je
+ nick als een wachtwoord gebruiken is een veel slechter idee ;)
+ en in feite, %S staat het niet toe. Trouwens, korte wachtwoorden
+ zijn kwetsbaar voor zoekacties, dus je moet een wachtwoord
+ kiezen dat minstens 5 tekens lang is. Als laatste, de spatie
+ kan niet gebruikt worden in wachtwoorden.
+
+ De email parameter is optioneel en stelt onmiddelijk de email
+ voor je nick in. Het kan echter vereist zijn voor bepaalde
+ netwerken.
+ Je privacy wordt gerespecteerd; deze email zal nooit aan derden
+ gegeven worden.
+
+ Dit commando maakt ook een nieuwe groep voor je nickname, die
+ toestaat andere nicks onder dezelfde configuratie, dezelfde
+ memos en dezelfde kanaalrechten te delen. Voor meer informatie
+ over deze functie, type /msg %S HELP GROUP.
+
+NICK_HELP_GROUP
+ Gebruik: GROUP doel wachtwoord
+
+ Dit commando zorgt ervoor dat je huidige nickname zich bij de
+ groep van doel's nick aanmeldt. wachtwoord is het
+ wachtwoord van het doel.
+
+ Bij een groep aanmelden stelt je in staat om je configuratie,
+ memos en kanaalrechten met alle nicknames in je groep te delen,
+ en veel meer!
+
+ Een groep bestaat zo lang als het nuttig is. Dit betekent dat
+ zelfs als een nick in de groep geannuleerd je niet de gedeelde
+ dingen die hierboven beschreven zijn verliest, zo lang als er
+ minstens een nick overblijft in de groep.
+
+ Je kan dit commando zelfs gebruiken als je nog niet
+ geregistreerd hebt. Als je nick al geregistreerd is moet je je
+ eerst identificeren voordat je dit commando gebruikt. Type
+ /msg %S HELP IDENTIFY voor meer informatie. Dit laatste is
+ misschien niet mogelijk op je IRC netwerk.
+
+ Het is aanbevolen om dit commando te gebruiken met een niet-
+ geregistreerde nick omdat het automatisch geregistreerd wordt
+ als je dit commando gebruikt. Je mag het alleen met een geregistreerde
+ nick gebruiken (om je groep te veranderen) als de netwerkbeheerders
+ het toestaan.
+
+ Je kan maar in een groep tegelijk zijn. Groepen samenvoegen is
+ niet mogelijk.
+
+ Opmerking: alle nicks in een groep hebben hetzelfde wachtwoord.
+
+NICK_HELP_IDENTIFY
+ Gebruik: IDENTIFY wachtwoord
+
+ Vertelt %S dat je echt de eigenaar van deze nick bent. Veel
+ commandos vereisen dat je jezelf identificeert met dit commando
+ voordat je ze gebruikt. Het wachtwoord moet hetzelfde zijn als
+ die je gestuurd hebt met het REGISTER commando.
+
+NICK_HELP_UPDATE
+ Gebruik: UPDATE
+
+ Werkt je huidige status bij, het controleert bijv. op nieuwe
+ memo's, stelt de benodigde kanaalmodes in (ModeonID), en
+ werkt je vhost en gebruikersflags bij (laatstgezien, etc).
+
+NICK_HELP_LOGOUT
+ Gebruik: LOGOUT
+
+ Dit draait het effect van het IDENTIFY commando om: het
+ zorgt er voor dat je niet meer herkend word als de echte
+ eigenaar van de nick. Merk op dat je niet gevraagd wordt om
+ je opnieuw te identificeren.
+
+NICK_HELP_DROP
+ Gebruik: DROP [nick]
+
+ Verwijdert je nickname uit de %S database. Een nick die
+ verwijderd is kan door iedereen weer geregistreerd worden.
+
+ Je kan een nick binnen een groep verwijderen door de nick
+ parameter toe te voegen.
+
+ Om dit commando te kunnen gebruiken moet je je eerst identificeren
+ met je wachtwoord. (/msg %S HELP IDENTIFY voor meer informatie).
+
+NICK_HELP_ACCESS
+ Gebruik: ACCESS ADD mask
+ ACCESS DEL mask
+ ACCESS LIST
+
+ Verandert of geeft de toegangslijst weer van je nick. Dit is
+ de lijst met adressen waar vanaf je automatisch toegestaan
+ wordt door %S om je nick te gebruiken. Als je je nick vanaf
+ een ander adres wilt gebruiken moet je een IDENTIFY commando
+ sturen om %S je te laten herkennen.
+
+ Voorbeelden:
+
+ ACCESS ADD iemand@*.bepeg.com
+ Staat toegang toe voor gebruiker iemand vanuit elke machine in
+ het bepeg.com domein..
+
+ ACCESS DEL anyone@*.bepeg.com
+ Keert het vorige commando om.
+
+ ACCESS LIST
+ Geeft de huidige toegangslijst weer.
+
+NICK_HELP_SET
+ Gebruik: SET optie parameters
+
+ Stelt verscheidene nick opties in. option kan zijn:
+
+ DISPLAY Stel de weergave van je groep in Services in
+ PASSWORD Verander het wachtwoord voor je nick
+ LANGUAGE Selecteer de taal die Services zal gebruiken
+ voor het versturen van berichten naar jou
+ URL Associeer een URL met je nick
+ EMAIL Associeer een E-mail adres met je nick
+ ICQ Associeer een ICQ nummer met je nick
+ GREET Associeer een begroeting met je nick
+ KILL Zet bescherming aan of uit
+ SECURE Zet nickname beveiliging aan of uit
+ PRIVATE Zorgt ervoor dat je nick niet verschijnt in een
+ /msg %S LIST
+ HIDE Verberg verschillende soorten nick informatie
+ MSG Verander de communicatiemanier van Services
+
+ Om dit commando te gebruiken moet je je eerst identificeren
+ met je wachtwoord (/msg %S HELP IDENTIFY voor meer
+ informatie).
+
+ Type /msg %S HELP SET optie voor meer informatie over een
+ specifieke optie.
+
+NICK_HELP_SET_DISPLAY
+ Gebruik: SET DISPLAY nieuwe-weergave
+
+ Verandert de weergegeven nick van je nick-groep in Services.
+ De nieuwe weergave MOET een nick in je groep zijn.
+
+NICK_HELP_SET_PASSWORD
+ Gebruik: SET PASSWORD nieuw-wachtwoord
+
+ Verandert het wachtwoord dat je gebruik om je te identificeren
+ als de eigenaar van je nick.
+
+NICK_HELP_SET_LANGUAGE
+ Gebruik: SET LANGUAGE nummer
+
+ Verandert de taal die Services gebruikt wanneer deze een
+ bericht naar jou stuurt (bijvoorbeeld wanneer deze antwoord
+ op een commando dat je hebt verzonden). nummer moet gekozen
+ worden uit de volgende lijst van ondersteunde talen:
+
+NICK_HELP_SET_URL
+ Gebruik: SET URL url
+
+ Associeert de gegeven URL met je nick. Deze URL zal worden
+ weergegeven wanneer iemand informatie over jouw nick
+ opvraagt met het INFO commando.
+
+NICK_HELP_SET_EMAIL
+ Gebruik: SET EMAIL adres
+
+ Associeert het gegeven e-mail adres met jouw nick. Dit adres
+ zal worden weergegeven wanneer iemand informatie over een van
+ je kanalen opvraagt met het INFO commando.
+
+NICK_HELP_SET_ICQ
+ Gebruik: SET ICQ nummer
+
+ Associeert het gegeven ICQ nummer met je nick. Dit nummer
+ zal worden weergegeven wanneer iemand informatie opvraagt
+ over je nick met het INFO commando.
+
+NICK_HELP_SET_GREET
+ Gebruik: SET GREET bericht
+
+ Het opgegeven bericht zal als groet worden weergegeven in
+ elk kanaal dat je joint waarbij de GREET optie aanstaat,
+ indien je toegangsniveau hoog genoeg is hiervoor.
+
+NICK_HELP_SET_KILL
+ Gebruik: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Zet de automatiche beschermingsoptie voor je nick aan of uit.
+ Met bescherming aan, krijgt elke gebruik met jouw nick een
+ minuut om zich te identificeren of om zijn/haar nick te
+ veranderen. Is geen van beiden gebeurd in die minuut, dan zal
+ %S een nick-verandering forceren.
+
+ Als je QUICK kiest, zal de gebruiker maar 20 seconden hebben
+ om zijn/haar nick te veranderen in plaats van de gebruikelijke
+ 60. Als je IMMED kiest, zal de nick meteen worden aangepaast
+ zonder enige waarschuwing vooraf of kans om zijn/haar nick
+ te wijzigen; gebruik deze optie alleen wanneer noodzakelijk.
+ Deze optie kan ook uitgeschakeld zijn door de netwerk
+ administrators.
+
+NICK_HELP_SET_SECURE
+ Gebruik: SET SECURE {ON | OFF}
+
+ Zet %S's veiligheidsopties aan of uit voor jouw nick.
+ Met SECURE aan moet je altijd een wachtwoord invullen
+ voordat je wordt herkend als de eigenaar van de nick,
+ ook als je adres op de toegangslijst voor deze nick
+ staat. Echter, als je op de toegangslijst staat zal
+ %S je niet automatisch killen, hoe de KILL optie ook
+ ingesteld is.
+
+NICK_HELP_SET_PRIVATE
+ Gebruik: SET PRIVATE {ON | OFF}
+
+ Zet de prive optie van %S aan of uit voor jouw nick.
+ Met PRIVATE aan zal je nick niet verschijnen in nicklijsten
+ gegenereerd met %S's LIST commando. (Echter,
+ iedereen die je nick weet kan nog steeds informatie krijgen
+ mbv het INFO commando.
+
+NICK_HELP_SET_HIDE
+ Gebruik: SET HIDE {EMAIL | MASK | QUIT} {ON | OFF}
+
+ Deze optie stelt je in staat verschillende informatie te
+ verbergen wanneer iemand een %S INFO op jouw nick
+ doet. Je kan je e-mail adres (EMAIL), laatst bekende
+ gebruikter@host mask (MASK) en laatste quit bericht (QUIT)
+ verbergen. De tweede paramenter geeft aan of de informatie
+ moet worden weergegeven (OFF) of verborgen (ON).
+
+NICK_HELP_SET_MSG
+ Gebruik: SET MSG {ON | OFF}
+
+ Deze optie stelt je in staat de manier te kiezen waaop Services
+ met je communiceren. Met MSG aan zullen de Services gewone
+ berichten gebruiken, anders zullen ze notices gebruiken.
+
+NICK_HELP_RECOVER
+ Gebruik: RECOVER nick [wachtwoord]
+
+ Deze optie stelt je instaat je nick terug te nemen wanneer
+ iemand anders deze heeft. Deze optie doet hetzelfde als
+ %S automatisch doet als iemand een nick probeert te
+ gebruiken die beschermd is door de KILL optie.
+
+ Wanneer je dit commando geeft zal %S een nep-gebruiker
+ online brengen met dezelfde nickname als de gebruiker waarvan
+ je de nick terugneemt. Dit zorgt ervoor dat de IRC server de
+ andere gebruiker zijn/haar verbinding sluiten. Deze nep-
+ gebruiker zal voor 1 minuut online blijven om ervoor te zorgen
+ dat de gebruiker niet meteen opnieuw verbindt met dezelfde
+ nick. Na deze minuut kan je je nick opnieuw claimen, of je kan
+ tussentijds je nick terugkrijgen mbv het RELEASE commando.
+ (Bekijk /msg %S HELP RELEASE voor meer informatie hierover)
+
+ Om het RECOVER commando op een nick te mogen gebruiken moet
+ je huidige adres zoals deze in /WHOIS staat op de toegangslijst
+ van deze nick zijn, je geindentificeerd zijn in de group van
+ die nick, of het correcte wachtwoord opgegeven zijn.
+
+NICK_HELP_RELEASE
+ Gebruik: RELEASE nickname [wachtwoord]
+
+ Geeft %S de opdracht elke nep-gebruiker met jouw nick te
+ verwijderen. Deze nep-gebruiker wordt aangemaakt na een
+ automatische kill-bescherming of na gebruik van het RECOVER
+ commando. Standaard blijft zo'n nep-gebruiker 1 minuut staan;
+ dit commando zorgt ervoor dat deze eerder wegghaald wordt.
+
+ Om het RELEASE commando op een nick te mogen gebruiken moet
+ je huidige adres zoals deze in /WHOIS staat op de toegangslijst
+ van deze nick zijn, je geindentificeerd zijn in de group van
+ die nick, of het correcte wachtwoord opgegeven zijn.
+
+
+NICK_HELP_GHOST
+ Gebruik: GHOST nick [wachtwoord]
+
+ Be-eindigd een "ghost" IRC sessie met jouw nick. Een "ghost"
+ sessie is een sessie die niet feitelijk verbonden is, maar
+ waarvan de IRC server denkt dat deze nog steeds online is
+ voor om het even welke reden. Dit gebeurt vaak als je
+ computer crasht of als je internet of modem verbinding
+ ermee ophoudt wanneer je op IRC zit.
+
+ Om het GHOST commando op een nick te mogen gebruiken moet
+ je huidige adres zoals deze in /WHOIS staat op de toegangslijst
+ van deze nick zijn, je geindentificeerd zijn in de group van
+ die nick, of het correcte wachtwoord opgegeven zijn.
+
+NICK_HELP_INFO
+ Gebruik: INFO nick [ALL]
+
+ Geeft informatie weer over de gegeven nick, zoals de laatste
+ eigenaar van de nick, het laatst beekende adres, wanneer deze
+ voor het laatst gezien is, en de ingestelde optie. Als je
+ voor de gegeven nick geidentificeerd bent en het ALL
+ commando is gegeven zal je alle informatie te zien krijgen,
+ om het verborgen is of niet.
+
+NICK_HELP_LIST
+ Gebruik: LIST trefbeeld
+
+ Geeft alle geregistreerde nicks weer die overeenkomen met
+ het gegeven trefbeeld, in nick!gebruiker@host formaat.
+ Nicks met de PRIVATE optie aan worden niet weergegeven.
+
+ Voorbeelden:
+
+ LIST *!joeuser@foo.com
+ Geeft alle nicks weer van joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Geeft alle geregistreerde nicks weer met Bot in
+ hun naam (hoofdlettergevoelig).
+
+ LIST *!*@*.bar.org
+ Geeft alle nicks weer van het bar.org domein
+
+NICK_HELP_ALIST
+ Gebruik: ALIST [niveau]
+
+ Geeft alle kanalen weer waarop je toegang hebt. Optioneel
+ kun je een niveau opgeven in XOP of ACCESS formaat. De
+ resulterende lijst zal alleen kanalen bevatten waar je het
+ gegeven toegangsniveau hebt.
+
+ Voorbeelden:
+ ALIST Founder
+ Geeft alle kanalen weer waar je stichter-
+ toegang hebt.
+
+ ALIST AOP
+ Geeft alle kanalen weer waar je AOP-toegang of
+ meer hebt.
+
+ ALIST 10
+ Geeft alle kanalen weer waar je toegangsniveau
+ 10 of hoger hebt.
+
+ Kanalen met de NOEXPIRE optie aan zullen voorafgegaan
+ worden door een uitroepteken.
+
+NICK_HELP_GLIST
+ Gebruik: GLIST
+
+ Geeft alle nicks in je groep weer.
+
+NICK_HELP_STATUS
+ Gebruik: STATUS nick...
+
+ Geef terug of de gebruiker van de gegeven nick wordt herkend
+ als de eigenaar van die nick. Het antwoord is in dit formaat:
+
+ nick status-code
+
+ waar nick de nick is die verstuurd is met he commando, en
+ status-code een van de volgende mogelijkheden is:
+
+ 0 - gebruiker niet online of nick niet geregistreerd
+ 1 - gebruiker wordt niet herkend als de eigenaar van de nick
+ 2 - gebruiker wordt alleen via de toegangslijst herkend als eigenaar
+ 3 - gebruiker wordt door wachtwoordidentificatie herkend als eigenaar
+
+ Er kunnen maximaal zestien nicks per keer worden verstuurd;
+ de rest wordt genegeerd. Er wordt geen foutmelding
+ gegeven als er geen nicks zijn gegeven.
+
+NICK_HELP_SENDPASS
+ Gebruik: SENDPASS nick
+
+ Verstuur het wachtwoord van de gegeven nick naar het e-mail
+ adres wat bij de nick hoort. Dit commando is erg handig om
+ verloren wachtwoorden terug te krijgen.
+
+ Kan gelimiteerd zijn tot IRC operators op sommige netwerken.
+
+ Dit commando is alleen beschikbaar als encryptie is uitgeschakeld.
+
+NICK_SERVADMIN_HELP
+
+ De volgende commando's zijn beschikbaar voor Services admins:
+
+ GETPASS Bekijk het wachtwoord voor een nick
+ (alleen als encryptie is uitgeschakeld)
+ FORBID Voorkom dat een nick gebruikt wordt
+
+ Services admins kunnen ook de registratie van elke nick
+ opheffen zonder zich voor die nick te identificeren, en
+ mogen de toegangslijst voor elke nick bekijken.
+ (/msg %S ACCESS LIST nick)
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Gebruik: LOGOUT [nick [REVALIDATE]]
+
+ Zonder een paramenter keert dit command het effect van het
+ IDENTIFY commando om; je wordt dus niet meer herkend als
+ de echte eigenaar van je huidige nick. Merk echter op dat
+ je niet wordt gevraagd jezelf opnieuw te identificeren.
+
+ Met een paramenter doet dit commando hetzelfde voor de
+ gegeven nick. Als je ook REVALIDATE meegeeft zullen de
+ Services de gegeven nick vragen opnieuw te identificeren.
+ Het gebruik hiervan is gelimiteerd tot Services admins.
+
+NICK_SERVADMIN_HELP_DROP
+ Gebruik: DROP [nick]
+
+ Zonder een paramenter wordt je eigen nick uit de %S
+ database verwijderd.
+
+ Met een paramenter wordt de gegeven nick uit de database
+ verwijderd. Je kan de registratie van elke nick in je groep
+ ongedaan maken zonder speciale privileges. Het verwijderen
+ van elke nick is gelimiteerd tot Services admins.
+
+NICK_SERVADMIN_HELP_SET
+
+ Services admins kunnen ook de optie NOEXPIRE aanzetten,
+ waardoor nicknames niet meer verlopen. Ook kunnen Services
+ admins elke optie instellen voor een nick zonder een
+ wachtwoord in te vullen. Hiervoor roep je SET zo aan:
+ SET nickname option parameters.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Gebruik: SET [nick] NOEXPIRE {ON | OFF}
+
+ Stel in of de nick zal verlopen of niet. Als je deze optie
+ op aan (ON) zet zal de gegeven nick niet verlopen. Als er
+ geen nick is gegeven wordt de verloopoptie van je eigen
+ nick aangepast.
+
+ Gelimiteerd tot Services admins.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Services admins mogen het ALL parameter met elke nick gebruiken.
+
+NICK_SERVADMIN_HELP_LIST
+ Gebruik: trefbeeld [FORBIDDEN] [NOEXPIRE]
+
+ Geeft alle geregistreerde nicknames weer die overeen komen
+ met het gegeven trefbeeld, in nick!gebruiker@host formaat.
+ Nicks met de PRIVATE optie in worden alleen weergegeven
+ aan Services admins. Nicks met de NOEXPIRE optie aan zullen
+ een ! voor de naam hebben als een Services admin de lijst
+ bekijkt.
+
+ Als de FORBIDDEN of NOEXPIRE opties zijn gegeven worden alleen
+ nicks die, respectievelijk, verboden zijn of niet zullen
+ verlopen worden weergegeven. Als beide opties zijn gegeven
+ zullen beide types nicks worden weergegeven. Deze opties zijn
+ gelimiteerd tot Services admins.
+
+ Voorbeelden:
+
+ LIST *!joeuser@foo.com
+ Geeft alle nicks weer van joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Geeft alle geregistreerde nicks weer met Bot in
+ hun naam (hoofdlettergevoelig).
+
+ LIST * NOEXPIRE
+ Geeft alle geregistreerde nicks weer die niet
+ zullen verlopen.
+
+NICK_SERVADMIN_HELP_ALIST
+ Gebruik: ALIST [nick] [niveau]
+
+ Zonder paramenters geeft dit elk kanaal weer waar je toegang
+ hebt. Met een paramenter geeft het de kanalen weer waar
+ nick toegang heeft. Met twee paramenters geeft het de
+ kanalen weer waar nick een toegangsniveau van tenminste
+ niveau heeft.
+
+ Dit gebruik is gelimiteerd tot Services adminstrators.
+
+NICK_SERVADMIN_HELP_GLIST
+ Gebruik: GLIST [nick]
+
+ Zonder een paramenter worden alle nicks weergegeven die
+ zich in jouw groep bevinden.
+
+ Indied een paramenter gegeven is worden alle nicks
+ weergegeven die zich in de groep van de gegeven nick
+ bevinden.
+ Dit gebruik is gelimiteerd tot Services admins.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Gebruik: GETPASS nick
+
+ Geeft het wachtwoord van de opgegeven nick weer. Merk op
+ dat wanneer je dit commando gebruikt er een bericht met de
+ persoon die het commando heeft uitgevoerd en de nick waarop
+ het is gebruikt zal worden gelogd en verstuurd zal worden
+ als WALLOPS/GLOBOPS.
+
+ Gelimiteerd tot Services admins.
+
+ Dit commando is onbeschikbaar wanneer encryptie is ingeschakeld.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Geeft de bijpassende nicks weer dat gegeven email gebruikt.
+ Merk op dat er geen wildcards mogen worden gebruikt in
+ de user en de emailhost. Elke keer als dit commando wordt
+ gebruikt wordt er een bericht gelogged met de persoon
+ die dit commando uitvoerde samen met de emailhost waarop
+ het werd gebruikt.
+
+ Gelimiteerd tot Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Gebruik: FORBID nick [reden]
+
+ Zorgt ervoor dat de gegeven nick niet kan worden geregistreerd
+ of gebruikt door iedereen. Dit kan ongedaan gemaakt worden
+ door de registratie van de nick ongedaan te maken (DROP).
+
+ Op sommige netwerken is een reden verplicht.
+
+ Gelimiteerd tot Services admins.
+
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ %S stelt je in staat om kanalen te registreren en er
+ verschillende opties van in te stellen. %S kan vaak
+ voorkomen dat boosaardig gebruikers een kanaal "overnemen"
+ door te limiteren wie er op het kanaal operator mag zijn.
+ Beschikbare commando's staan hier beneden; om ze te gebruiken
+ type je /msg %S commando. Voor meer informatie over een
+ specifiek commando type je /msg %S HELP commando.
+
+ REGISTER Registreer een kanaal
+ IDENTIFY Identificeer jezelf met je wachtwoord
+ SET Stel kanaal opties en informatie in
+ AOP Wijzig de lijst van AOP's
+ SOP Wijzig de lijst van SOP's
+ ACCESS Wijzig de lijst van toegestane gebruikers
+ LEVELS Verander de betekenissen van toegangsniveaus
+ AKICK Beheer de AutoKick lijst
+ DROP Annuleer een kanaalregistratie
+ SENDPASS Wachtwoord vergeten?
+
+ Overige commando's: BAN, CLEAR, DEOP, DEVOICE, GETKEY,
+ INFO, INVITE, KICK, LIST, LOGOUT, OP,
+ TOPIC, UNBAN, VOICE, VOP
+
+CHAN_HELP_UNREAL
+
+ Deze commando's zijn ook beschikbaar op dit netwerk:
+ DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER,
+ PROTECT
+
+CHAN_HELP_ULTIMATE
+
+ Deze commando's zijn ook beschikbaar op dit netwerk:
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ Deze commando's zijn ook beschikbaar op dit netwerk:
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Onthoud dat elk kanaal wat %d dagen ongebruikt is (dwz dat
+ er geen gebruiker die op de toegangslijst staat in die periode
+ het kanaal binnen is gekomen) automatisch zal worden verwijderd.
+
+CHAN_HELP_REGISTER
+ Gebruik: REGISTER kanaal wachtwoord beschrijving
+
+ Registreert een kanaal in de %S database. Om dit commando te
+ gebruiken moet je eerst een operator op het kanaal zijn dat
+ je wil registreren. Het wachtwoord wordt gebruikt met het
+ IDENTIFY commando dat anderen in staat stelt om later
+ wijzigingen aan de kanaalinstellingen door te voeren. Het
+ laatste paramenter, die moet worden opgegeven, is een
+ algemene beschrijving van het doel van het kanaal.
+
+ Wanneer je een kanaal registreert wordt je de "stichter"
+ van het kanaal. De kanaalstichter mag alle instellingen
+ van het kanaal veranderen. %S zal ook de stichter automatisch
+ stichterrechten geven wanneer deze het kanaal binnenkomt.
+ Zie het ACCESS commando (/msg %S HELP ACCESS) voor meer
+ informatie over het geven van rechten aan andere kanaalgebruikers.
+
+ OPMERKING: Om een kanaal te registreren moet je je nick
+ eerst geregistreerd hebben. Als je dit niet gedaan hebt
+ bekijk dan /msg %s HELP voor informatie over hoe je
+ dit kunt doen.
+
+CHAN_HELP_IDENTIFY
+ Gebruik: IDENTIFY kanaal wachtwoord
+
+ Identificeert je bij %S als de stichter van het gegeven
+ kanaal. Veel commando's verplichten je dit commando te
+ gebruiken voordat je ze gebruikt. Het wachtwoord moet
+ identiek zijn aan degene verstuurd met het REGISTER
+ commando.
+
+CHAN_HELP_LOGOUT
+ Gebruik: LOGOUT kanaal nick
+
+ Dit commando zorgt ervoor dat de opgegeven nick niet meer
+ geidentificeerd is voor het opgegeven kanaal
+
+ Als je de stichter van het kanaal bent kan je iedereen
+ uitloggen, anders alleen jezelf.
+
+CHAN_HELP_DROP
+ Gebruik: DROP kanaal
+
+ Heft de registratie van het gegeven kanaal op. Kan alleen
+ gebruik wordt door de kanaalstichter, die eerst het
+ IDENTIFY commando moet gebruiken.
+
+CHAN_HELP_SET
+ Gebruik: SET kanaal optie parameters
+
+ Stelt de kanaalstichter in staat om verschillende kanaal-
+ opties en andere informatie in te stellen.
+
+ Beschikbare opties:
+
+ FOUNDER Stelt de stichter van het kanaal in
+ SUCCESSOR Stelt de opvolger van het kanaal in
+ PASSWORD Stelt het stichterwachtwoord in
+ DESC Stelt de kanaalbeschrijving in
+ URL Associeer een URL met het kanaal
+ EMAIL Associate een E-mail adres met het kanaal
+ ENTRYMSG Stel een bericht in dat naar de gebruikers
+ wordt gestuurd zodra ze het kanaal binnekomen
+ BANTYPE Stelt in hoe Services bans op het kanaal maken
+ MLOCK Zet kanaal modes vast aan of uit
+ KEEPTOPIC Onthoud het topic zoland het kanaal niet in
+ gebruik is
+ OPNOTICE Stuur een notice wanneer de OP/DEOP commando's
+ worden gebruikt.
+ PEACE Reguleer het gebruik van kritieke commando's
+ PRIVATE Verberg een kanaal van het LIST commando
+ RESTRICTED Limiteer toegang tot het kanaal
+ SECURE Activeer %S veiligheidsopties
+ SECUREOPS Sterkere controlle van de kanaalop status
+ SECUREFOUNDER Sterkere controlle van de stichter status
+ SIGNKICK Onderteken kicks die worden uitgevoerd met het
+ KICK commando
+ TOPICLOCK Topic kan alleen veranderd worden met TOPIC
+ XOP Schakel het gebruikersprivilegesysteem om
+
+ Type /msg %S HELP option voor meer informatie over een
+ specifieke optie.
+
+CHAN_HELP_SET_FOUNDER
+ Gebruik: SET kanaal FOUNDER nick
+
+ Veranderd de stichter van een kanaal. De nieuwe nick moet
+ een geregistreerde nick zijn.
+
+CHAN_HELP_SET_SUCCESSOR
+ Gebruik: SET kanaal SUCCESSOR nick
+
+ Veranderd de opvolger van een kanaal. Als de nick van de
+ stichter verloopt of de registratie ervan wordt geannuleerd
+ zolang het kanaal nog geregistreerd is wordt de opvolger
+ de nieuwe stichter van het kanaal, behalve als de opvolger
+ als te veel kanalen (%d) geregistreerd heeft: dan wordt de
+ registratie van het kanaal geannuleerd, wat ook gebeurt als
+ er geen opvolger is ingesteld. De nieuwe nick moet een
+ geregistreerde nick zijn.
+
+CHAN_HELP_SET_PASSWORD
+ Gebruik: SET kanaal PASSWORD wachtwoord
+
+ Stelt het wachtwoord in dat gebruikt wordt om de stichter
+ van het kanaal te identificeren.
+
+CHAN_HELP_SET_DESC
+ Gebruik: SET kanaal DESC beschrijving
+
+ Stelt de beschrijving van een kanaal in, die weergegeven
+ wordt door de LIST en INFO commando's.
+
+CHAN_HELP_SET_URL
+ Gebruik: SET kanaal URL [url]
+
+ Associeer de gegeven URL met het kanaal. Deze URL zal worden
+ weergegeven wanneer iemand informatie over het kanaal op-
+ vraagt met het INFO commando. Als er geen paramenter wordt
+ wordt de URL voor het kanaal verwijderd.
+
+CHAN_HELP_SET_EMAIL
+ Gebruik: SET kanaal EMAIL [adres]
+
+ Associeer het gegeven e-mail adres met het kanaal. Dit adres
+ zal worden weergegeven wanneer iemand informatie over het
+ kanaal opvraagt met het INFO commando. Als er geen para-
+ menter wordt gegeven wordt het e-mail adres voor het kanaal
+ verwijderd.
+
+CHAN_HELP_SET_ENTRYMSG
+ Gebruik: SET kanaal ENTRYMSG [bericht]
+
+ Stelt het bericht in dat via /notice zal worden verstuurd
+ aan gebruikers die het kanaal binnenkomen. Als er geen
+ paramenter wordt gegeven wordt er geen bericht verstuurd
+ als iemand het kanaal binnenkomt.
+
+CHAN_HELP_SET_BANTYPE
+ Gebruik: SET kanaal BANTYPE bantype
+
+ Stelt het bantype in dat gebruikt zal worden door services
+ wanneer ze een ban moet zetten op je kanaal.
+
+ bantype is een nummer tussen 0 en 3 dat betekent:
+
+ 0: ban in het formaat *!gebruiker@host
+ 1: ban in het formaat *!*gebruiker@host
+ 2: ban in het formaat *!*@host
+ 3: ban in het formaat *!*gebruiker@*.domein
+
+CHAN_HELP_SET_KEEPTOPIC
+ Gebruik: SET kanaal KEEPTOPIC {ON | OFF}
+
+ Zet de topicbehoud optie aan of uit voor een kanaal.
+ Wanneer topicbehoud aan staat zal het topic van het
+ kanaal onthouden worden door %S, zelfs nadat de laatste
+ gebruiker het kanaal heeft verlaten. Het topic zal wanneer
+ de volgende gebruiker het kanaal binnenkomt worden
+ teruggezet.
+
+CHAN_HELP_SET_TOPICLOCK
+ Gebruik: SET kanaal TOPICLOCK {ON | OFF}
+
+ Zet de topicslot optie aan of uit voor een kanaal.
+ Wanneer topicslot aan staat zal %S het niet toestaan om
+ het topic van het kanaal te veranderen. Het topic kan dan
+ alleen veranderd worden met het TOPIC commando.
+
+CHAN_HELP_SET_MLOCK
+ Gebruik: SET kanaal MLOCK modes
+
+ Stelt de mode-slot paramenter in voor het kanaal. %S
+ staat je toe om verschillen kanaalmodes altijd aan of uit
+ te laten staan, of om het mogelijk te maken deze aan of uit
+ te zetten met het /MODE commando.
+
+ De modes paramenter wordt precies hetzelfde opgebouwd als
+ in een /MODE commando: modes achter een + zijn altijd aan,
+ en modes achter een - zijn altijd uit. Merk wel op dat, in
+ tegenstelling tot het /MODE commando, alleen opgegeven modes
+ geforceerd worden door SET MLOCK; het mode-slot wordt eerst
+ leeggemaakt voor de nieuwe modes erin worden gezet!
+
+ Waarschuwing: Als je het mode-slot gebruikt om een wachtwoord
+ op het kanaal te zette moet je, zoals in het 2e voorbeeld, ook
+ de optie RESTRICTED aanzette (zie HELP SET RESTRICTED), of
+ iedereen die het kanaal binnenkomt als het leeg is kan het
+ wachtwoord zien!
+
+ Voorbeelden:
+
+ SET #channel MLOCK +nt-iklps
+ Foreert modes n en t aan, en modes i, k, l, p, en s
+ uit. Mode m kan aan of uit gezet worden met /MODE.
+
+ SET #channel MLOCK +knst-ilmp wachtwoord
+ Forceert modes k, n, s, en t aan, en modes i, l, m,
+ en p uit. Forceert ook dat het kanaalwachtwoord
+ "wachtwoord" is.
+
+ SET #channel MLOCK +
+ Verwijderd het mode-slot; alle kanaalmodes kunnen
+ vrij ingesteld worden met /MODE.
+
+CHAN_HELP_SET_PEACE
+ Gebruik: SET kanaal PEACE {ON | OFF}
+
+ Zet de vrede optie aan of uit voor een kanaal. Wanneer
+ vrede aanstaat kan een gebruiker niemand kicken, bannen,
+ of iemand's kanaal status wijzigen/verwijderen van een
+ gebruiker met een gelijkwaardig of hoger level dan die
+ van zichzelf via de %S commando's.
+
+CHAN_HELP_SET_PRIVATE
+ Gebruik: SET kanaal PRIVATE {ON | OFF}
+
+ Zet de prive optie aan of uit voor een kanaal. Wanneer
+ de prive optie aan staat zal /msg %S LIST het kanaal
+ in geen enkele lijst weergeven.
+
+CHAN_HELP_SET_RESTRICTED
+ Gebruik: SET kanaal RESTRICTED {ON | OFF}
+
+ Zet de beperkte toegang optie aan of uit voor een kanaal.
+ Wanneer beperkte toegang aan staat zullen gebruikers die
+ normaliter geen kanaaloperator status mogen hebben (dwz
+ gebruikers met negatieve toegangsniveaus en, als de veilige
+ ops optie aan staat, ook gebruikers die niet op de toegangs-
+ lijst staan) worden gekicked en gebanned van het kanaal.
+
+CHAN_HELP_SET_SECURE
+ Gebruik: SET kanaal SECURE {ON | OFF}
+
+ Zet %S's veiligheidsfuncties aan of uit voor een kanaal.
+ Wanneer SECURE aan staat zullen alleen gebruikers die
+ hun nicks met %s geregistreerd hebben en geidentificeerd
+ zijn met hun wachtwoord toegang krijgen tot het kanaal,
+ zoals geregeld door de toegangslijst.
+
+CHAN_HELP_SET_SECUREOPS
+ Gebruik: SET kanaal SECUREOPS {ON | OFF}
+
+ Zet de veilige ops optie aan of uit voor een kanaal.
+ Wanneer veilige ops aan staat mogen gebruikers die niet
+ op de toegangslijst staan geen kanaalop status krijgen.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Gebruik: SET kanaal SECUREFOUNDER {ON | OFF}
+
+ Zet de veilige stichter optie aan of uit voor een kanaal.
+ Wanneer veilige stichter aan staat zal alleen de echte
+ stichter een kanaal kunnen annuleren en het wachtwoord, de
+ stichter en de opvolger kunnen veranderen, en niet degenen
+ die alleen geidentificeerd zijn met %S.
+
+CHAN_HELP_SET_SIGNKICK
+ Gebruik: SET kanaal SIGNKICK {ON | LEVEL | OFF}
+
+ Zet ondertekende kicks aan of uit voor een kanaal.
+ Wanneer SIGNKICK aan staat zullen kicks die uitgevoerd
+ worden dmv het %S KICK commando de nick van degene die
+ het commando uitgevoerd heeft de nick in de reden hebben.
+
+ Als je LEVEL gebruikt zullen degenen die een niveau hebben
+ gelijk aan of hoger dan het SIGNKICK niveau op het kanaal
+ hun nick niet toegevoegd hebben aan de kicks.
+ Zie /msg %S HELP LEVELS voor meer informatie.
+
+CHAN_HELP_SET_XOP
+ Gebruik: SET kanaal XOP {ON | OFF}
+
+ Zet het xOP lijsten systeem aan of uit voor een kanaal.
+ Wanneer XOP aan staat moet je de AOP/SOP/VOP
+ commando's gebruiken om kanaalprivileges aan gebruikers
+ te geven, anders moet je het ACCESS command gebruiken.
+
+ Technische Opmerking: Als je van toegangslijsten naar xOP
+ lijsten overschakeld zullen je level beschrijvingen en
+ gebruikersniveaus worden aangepast. Je zult ze dus niet met
+ dezelfde waarden terugvinden als je terugschakelt naar het
+ toegangslijsten systeem!
+
+ Je moet ook goed opletten of de gebruikers in de goede xOP
+ lijst staan als je overschakelt, omdat de gok niet altijd
+ perfect is... het is zelfs niet aangeraden om de xOP lijsten
+ te gebruiken als je niveaubeschrijvingen hebt veranderd
+ met het LEVELS commando.
+
+ Het overschakelen van xOP lijsten naar het toegangslijsten
+ systeem brengt echter geen problemen met zich mee.
+
+CHAN_HELP_SET_OPNOTICE
+ Gebruik: SET kanaal OPNOTICE {ON | OFF}
+
+ Zet de op-notificatie optie aan of uit voor een kanaal.
+ Wanneer op-notificatie aan staat zal %S een notice naar
+ het kanaal sturen wanneer de OP of DEOP commando's worden
+ gebruikt voor een gebruiker in het kanaal.
+
+CHAN_HELP_AOP
+ Gebruik: AOP kanaal ADD nick
+ AOP kanaal DEL {nick | entry-nr | lijst}
+ AOP kanaal LIST [mask | lijst]
+ AOP kanaal CLEAR
+
+ Onderhoud de AOP (AutoOP) lijst voor een kanaal. De AOP
+ lijst geeft gebruikers het recht om automatisch operator te
+ worden op het kanaal, zichzelf te unbannen of uit te nodigen
+ als dat nodig is, hun groetbericht weer te geven als ze het
+ kanaal binnenkomen, enzovoorts.
+
+ Het AOP ADD commando voegt de gegeven nick toe aan de
+ AOP lijst.
+
+ Het AOP DEL commando verwijderd de gegeven nick van de
+ AOP lijst. Als een lijst van entry-nummers is opgegeven
+ worden die verwijderd. (Zie het LIST-voorbeeld hieronder)
+
+ Het AOP LIST commando geeft de AOP lijst weer. Als er
+ een mask is gegeven worden alleen de de AOP's die over-
+ eenkomen met het opgegeven mask weergegeven. Als een lijst
+ van entry-nummers is opgegeven, worden alleen die weer-
+ gegeven. Bijvoorbeeld:
+
+ AOP #kanaal LIST 2-5,7-9
+ Geeft AOP's 2 t/m 5 en 7 t/m 9 weer.
+
+ Het AOP CLEAR commando verwijderd alle AOP's van de
+ AOP lijst.
+
+ De AOP ADD en AOP DEL commando's zijn gelimiteerd tot
+ SOP's of hoger. AOP CLEAR can alleen gebruikt worden door
+ de kanaalstichter. Elke gebruiker op de AOP lijst mag
+ echter AOP LIST gebruiken.
+
+ Dit commando kan uitgeschakeld zijn voor je kanaal, en in
+ dat geval heb je de toegangslijst nodig. Zie
+ /msg %S HELP ACCESS voor meer informatie over toegangs-
+ lijsten, en /msg %S HELP SET XOP om te weten te komen
+ hoe je tussen toegangslijsten en xOP-lijsten schakelt.
+
+CHAN_HELP_HOP
+ Gebruik: HOP kanaal ADD nick
+ HOP kanaal DEL {nick | entry-nr | lijst}
+ HOP kanaal LIST [mask | lijst]
+ HOP kanaal CLEAR
+
+ Onderhound de HOP (HalfOP) lijst voor een kanaal. De
+ HOP lijst geeft gebruikers de rechten om automatisch
+ half-operator te worden op het kanaal.
+
+ Het HOP ADD commando voegt de gegeven nick toe aan de
+ HOP lijst.
+
+ Het HOP DEL commando verwijderd de gegeven nick van de
+ HOP lijst. Als een lijst van entry-nummers is opgegeven
+ worden die verwijderd. (Zie het LIST-voorbeeld hieronder)
+
+ Het HOP LIST commando geeft de HOP lijst weer. Als er
+ een mask is gegeven worden alleen de de HOP's die over-
+ eenkomen met het opgegeven mask weergegeven. Als een lijst
+ van entry-nummers is opgegeven, worden alleen die weer-
+ gegeven. Bijvoorbeeld:
+
+ HOP #kanaal LIST 2-5,7-9
+ Geeft AOP's 2 t/m 5 en 7 t/m 9 weer.
+
+ Het HOP CLEAR commando verwijderd alle HOP's van de
+ HOP lijst.
+
+ De HOP ADD, HOP DEL en HOP LIST commando's zijn
+ gelimiteerd tot AOP's en hoger. Het HOP CLEAR commando
+ mag alleen door de kanaalstichter gebruikt worden.
+
+ Dit commando kan uitgeschakeld zijn voor je kanaal, en in
+ dat geval heb je de toegangslijst nodig. Zie
+ /msg %S HELP ACCESS voor meer informatie over toegangs-
+ lijsten, en /msg %S HELP SET XOP om te weten te komen
+ hoe je tussen toegangslijsten en xOP-lijsten schakelt.
+
+CHAN_HELP_SOP
+ Gebruik: SOP kanaal ADD nick
+ SOP kanaal DEL {nick | entry-nr | lijst}
+ SOP kanaal LIST [mask | lijst]
+ SOP kanaal CLEAR
+
+ Onderhoud de SOP (SuperOP) lijst voor een kanaal. De
+ SOP lijst geeft gebruikers alle rechten van die van de AOP
+ lijst, en voegt de vereiste rechten toe om de AutoKick en
+ SlechteWoorden lijst te onderhouden, kanaalmemo's te ver-
+ struen en te lezen, enzovoorts.
+
+ Het SOP ADD commando voegt de gegeven nick toe aan de
+ SOP lijst.
+
+ Het SOP DEL commando verwijderd de gegeven nick van de
+ SOP lijst. Als een lijst van entry-nummers is opgegeven
+ worden die verwijderd. (Zie het LIST-voorbeeld hieronder)
+
+ Het SOP LIST commando geeft de SOP lijst weer. Als er
+ een mask is gegeven worden alleen de de SOP's die over-
+ eenkomen met het opgegeven mask weergegeven. Als een lijst
+ van entry-nummers is opgegeven, worden alleen die weer-
+ gegeven. Bijvoorbeeld:
+
+ SOP #kanaal LIST 2-5,7-9
+ Geeft SOP's 2 t/m 5 en 7 t/m 9 weer.
+
+ Het SOP CLEAR commando verwijderd alle SOP's van de
+ SOP lijst.
+
+ De SOP ADD, SOP DEL en SOP CLEAR commando's zijn
+ gelimiteerd tot de kanaalstichter. SOP LIST mag door
+ elke gebruiker op de AOP lijst gebruikt worden.
+
+ Dit commando kan uitgeschakeld zijn voor je kanaal, en in
+ dat geval heb je de toegangslijst nodig. Zie
+ /msg %S HELP ACCESS voor meer informatie over toegangs-
+ lijsten, en /msg %S HELP SET XOP om te weten te komen
+ hoe je tussen toegangslijsten en xOP-lijsten schakelt.
+
+CHAN_HELP_VOP
+ Gebruik: VOP kanaal ADD nick
+ VOP kanaal DEL {nick | entry-nr | lijst}
+ VOP kanaal LIST [mask | lijst]
+ VOP kanaal CLEAR
+
+ Onderhoud de VOP (VOicePeople) lijst voor een kanaal.
+ De VOP lijst geeft gebruikers het recht om automatisch
+ voice te worden op het kanaal en zichzelf voice te geven
+ als ze die niet hebben.
+
+ Het VOP ADD commando voegt de gegeven nick toe aan de
+ VOP lijst.
+
+ Het VOP DEL commando verwijderd de gegeven nick van de
+ VOP lijst. Als een lijst van entry-nummers is opgegeven
+ worden die verwijderd. (Zie het LIST-voorbeeld hieronder)
+
+ Het VOP LIST commando geeft de VOP lijst weer. Als er
+ een mask is gegeven worden alleen de de VOP's die over-
+ eenkomen met het opgegeven mask weergegeven. Als een lijst
+ van entry-nummers is opgegeven, worden alleen die weer-
+ gegeven. Bijvoorbeeld:
+
+ VOP #kanaal LIST 2-5,7-9
+ Geeft VOP's 2 t/m 5 en 7 t/m 9 weer.
+
+ Het VOP CLEAR commando verwijderd alle AOP's van de
+ VOP lijst.
+
+ De VOP ADD, VOP DEL en VOP LIST commando's zijn
+ gelimiteerd tot AOPs en hoger. VOP CLEAR kan alleen
+ door de kanaalstichter gebruikt worden.
+
+ Dit commando kan uitgeschakeld zijn voor je kanaal, en in
+ dat geval heb je de toegangslijst nodig. Zie
+ /msg %S HELP ACCESS voor meer informatie over toegangs-
+ lijsten, en /msg %S HELP SET XOP om te weten te komen
+ hoe je tussen toegangslijsten en xOP-lijsten schakelt.
+
+CHAN_HELP_ACCESS
+ Gebruik: ACCESS kanaal ADD nick niveau
+ ACCESS kanaal DEL {nick | entry-nr | lijst}
+ ACCESS kanaal LIST [mask | lijst]
+ ACCESS kanaal CLEAR
+
+ Onderhoud de toegangslijst voor een kanaal. De toegangs-
+ lijst specificeert welke gebruikers toestemming hebben om
+ kanaal operator te worden, of om %S commando's te gebruiken
+ op het kanaal. Verschillende gebruikersniveaus maken het
+ mogelijk om verschillende sets met privileges te maken.
+ /msg %S HELP ACCESS LEVELS voor meer informatie hierover.
+ Elke gebruiker die niet op de toegangslijst staat heeft een
+ gebruikersniveau van 0.
+
+ Het ACCESS ADD commando voegt de gegeven nick toe aan de
+ toegangslijst met het gegeven gebruikersniveau. Als de nick
+ al op de lijst staat wordt het toegangsniveau veranderd in
+ het niveau gespecificeerd in het commando. Het niveau dat
+ gespecificeerd is moet minder zijn dan de gebruiker die het
+ commando invoert, en als nick al op de toegangslijst
+ bestaat moet het huidige toegangsniveau van die nick lager
+ zijn dan die van degene die het commando uitvoert.
+
+ Het ACCESS DEL commando verwijderd de opgegeven nick van
+ de toegangslijst. Als een lijst met entry-nummers is
+ gegeven worden die verwijderd. (Zie het voorbeeld voor
+ LIST hier onder)
+
+ Het ACCESS LIST commando geeft de toegangslijst weer. Als
+ een wildcard mask is opgegeven worden alleen de overeen-
+ komsten weergegeven. Als een lijst van entry-nummers ie
+ gegeven wordt alleen die weergegeven. Bijvoorbeeld:
+
+ ACCESS #kanaal LIST 2-5,7-9
+ Geeft gebruikers 2 t/m 5 en 7 t/m 9 van de
+ toegangslijst weer.
+
+ Het ACCESS CLEAR commando maakt de toegangslijst leeg.
+
+CHAN_HELP_ACCESS_LEVELS
+ Gebruikerstoegangslevels
+
+ Standaard zijn de volgende toegangslevels gedefineerd:
+
+ Founder Volledige rechten tot de %S functies;
+ automatisch op worden bij het binnenkomen
+ van een kanaal. Merk op dat maar een
+ persoon stichterstatus kan hebben (het
+ kan niet worden gegeven met het ACCESS
+ commando).
+  10 Toegang tot het AKICK commando; automatisch op.
+  5 Automatisch op.
+  3 Automatisch voice.
+  0 Geen speciale privileges; kan op status krijgen
+ door andere ops (tenzij secure-ops aan is).
+  <0 Mag geen op worden.
+
+ Deze niveaus kunnen worden veranderd, en er kunnen nieuwe
+ worden toegevoegd dmv het LEVELS commando; type
+ /msg %S HELP LEVELS voor meer informatie.
+
+CHAN_HELP_AKICK
+ Gebruik: AKICK kanaal ADD mask [reden]
+ AKICK kanaal STICK mask
+ AKICK kanaal UNSTICK mask
+ AKICK kanaal DEL mask
+ AKICK kanaal LIST [mask]
+ AKICK kanaal VIEW [mask]
+ AKICK kanaal ENFORCE
+ AKICK kanaal CLEAR
+
+ Onderhoud de AutoKick lijst voor een kanaal. Als een
+ gebruiker op de AutoKick lijst het kanaal binnen probeert
+ te komen zal %S die gebruiker automatisch worden bannen
+ en kicken van het kanaal.
+
+ Het AKICK ADD commando voegt de gegeven nick of gebruikers-
+ mask toe aan de AutoKick lijst. Als er een reden is gegeven
+ met het commando zal die reden gebruikt worden om de gebruiker
+ te kicken; zo niet is de reden "You have been banned from the
+ channel".
+
+ Het AKICK STICK commando bant het gegeven mask permanent
+ op het kanaal. Als iemand de ban probeert te verwijderen
+ zal %S de ban automatisch opnieu toevoegen.
+ Deze functie kan niet op geregistreerde nicks gebruikt worden.
+
+ Het AKICK UNSTICK commando annuleert het effect van het
+ AKICK STICK commando, zodat je de ban weer weg kan halen
+ van het kanaal.
+
+ Het AKICK DEL commando verwijderd de gegeven nick of mask
+ van de AutoKick lijst. Het verwijderd echter geen ban die
+ is geplaatst door een AutoKick; die moeten handmatig
+ verwijderd worden.
+
+ Het AKICK LIST commando geeft de AutoKick lijst weer, of
+ optioneel alleen de AutoKick's die overeenkomen met het
+ opgegeven mask.
+
+ Het AKICK VIEW commando is een woordenrijkere versie
+ van het AKICK LIST commando.
+
+ Het AKICK ENFORCE commando zorgt ervoor dat %S de
+ huidige AKICK lijst forceert door het verwijderen van
+ gebruikers die overeenkomen met een AKICK mask.
+
+ The AKICK CLEAR commando maakt de AutoKick lijst leeg.
+
+CHAN_HELP_LEVELS
+ Gebruik: LEVELS kanaal SET type niveau
+ LEVELS kanaal {DIS | DISABLE} type
+ LEVELS kanaal LIST
+ LEVELS kanaal RESET
+
+ Het LEVELS commando staat precieze controle toe over de
+ betekenis van de numerieke toegangsniveaus die worden
+ gebruikt voor kanalen. Met dit commando kan je de toegangs-
+ niveaus defineren die benodigd zijn voor de meeste functies
+ van %S. (De SET FOUNDER en SET PASSWORD commando's zijn,
+ evenals dit commando, altijd gelimiteerd tot de stichter.)
+
+ LEVELS SET staat toe om de toegangsniveaus voor functies
+ of een groep functies te veranderen. LEVELS DISABLE (of
+ kortweg DIS) schakelt een automatische functie uit, of
+ staat gebruik van de functie niet toe door iemand anders
+ dan de stichter.
+
+ LEVELS LIST geeft de huidige levels voor elke functie of
+ groep van functies weer. LEVELS RESET stelt de niveaus in
+ op de standaardwaarden van een nieuw kanaal (zie
+ HELP ACCESS LEVELS).
+
+ Voor een list van de opties en functies waarvan de niveaus
+ kunnen worden aangepast, zie HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ De volgende optie-/functienamen worden begrepen. Let op dat
+ de niveaus voor AUTODEOP en NOJOIN maximale niveaus zijn,
+ terwijl alle andere minimale niveaus zijn.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Gebruik: INFO kanaal [ALL]
+
+ Geeft informatie weer over het gegeven geregistreerde
+ kanaal, zoals de stichter, registratietijd, tijd van
+ laatste gebruik, beschrijving, en mode-slot indien aan-
+ wezig. Als ALL is gespecificeerd zullen het groetbericht
+ en de opvolger ook worden weergegeven.
+
+ Standaard is de ALL optie gelimiteerd tot degenen met
+ stichter-toegang tot het kanaal.
+
+CHAN_HELP_LIST
+ Gebruik: LIST trefbeeld
+
+ Geeft alle geregistreerde kanalen weer die overeen komen
+ met het trefbeeld. (Kanalen met de PRIVATE optie aan
+ worden niet weergegeven.)
+
+CHAN_HELP_OP
+ Gebruik: OP [#kanaal [nick]]
+
+ Geeft de gegeven nick op-status op een kanaal. Als er geen
+ nick is gegeven zal je zelf op-status krijgen. Als er geen
+ kanaal en nick zijn gegeven zal je op-status krijgen op
+ alle kanalen waar je die rechten hebt.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met niveau
+ 5 of hoger op het kanaal.
+
+CHAN_HELP_DEOP
+ Gebruik: DEOP [#kanaal [nick]]
+
+ Verwijderd de op status van de gegeven nick op een kanaal.
+ Als er geen nick is gegeven zal je zelf je opstatus kwijt
+ raken. Als er geen kanaal en nick zijn gegeveen zal je
+ je op status kwijtraken op alle kanalen waar je momenteel
+ bent waar je die rechten hebt.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met niveau
+ 5 of hoger op het kanaal.
+
+CHAN_HELP_VOICE
+ Gebruik: VOICE [#kanaal [nick]]
+
+ Geeft de geselecteerde nick voice status op een kanaal. Als
+ er geen nick gegeven is zal je zelf voice status krijgen.
+ Als er geen kanaal en geen nick gegeven zijn zal je op alle
+ kanalen waar je momenteel bent en de rechten daartoe hebt
+ voice status krijgen.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met niveau
+ 5 of hoger op het kanaal, of tot VOPs of degenen met niveau
+ 3 of hoger voor het voice status geven van zichzelf.
+
+CHAN_HELP_DEVOICE
+ Gebruik: DEVOICE [#kanaal [nick]]
+
+ Verwijdert de voice status van de gegeven nick op een kanaal.
+ Als er geen nick is gegeven zal je zelf je voice status
+ kwijtraken. Als er geen kanaal en nick gegeven zijn zal je
+ zelf je voice status kwijtraken op alle kanalen waar je
+ momenteel bent en de rechten ervoor hebt.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met niveau
+ 5 of hoger op het kanaal, of tot VOPs of degenen met niveau
+ 3 of hoger voor het voice status geven van zichzelf.
+
+CHAN_HELP_HALFOP
+ Gebruik: HALFOP [#kanaal [nick]]
+
+ Geeft de geselecteerde nick halfop status op een kanaal. Als
+ er geen nick is gegeven zul je zelf halfop status krijgen.
+ Als er geen kanaal en geen nick gegeven zijn zul je op alle
+ kanalen waar je momenteel bent halfop krijgen, mits je daar
+ rechten toe hebt.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met niveau
+ 5 of hoger op het kanaal, of tot HOPs of degenen met niveau
+ 4 of hoger voor het halfop status geven van zichzelf.
+
+CHAN_HELP_DEHALFOP
+ Gebruik: DEHALFOP [#kanaal [nick]]
+
+ Verwijdert de halfop status van de gegeven nick op een kanaal.
+ Als er geen nick is gegeven zal je zelf je halfop status
+ kwijtraken. Als er geen nick en geen kanaal zijn gegeven zal
+ je zelf je halfop status kwijt raken op alle kanalen waar je
+ momenteel bent, mits je de rechten daartoe hebt.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met niveau
+ 5 of hoger op het kanaal, of tot HOPs of degenen met niveau
+ 4 of hoger voor het halfop status geven van zichzelf.
+
+CHAN_HELP_PROTECT
+ Gebruik: PROTECT [#kanaal [nick]]
+
+ Beschermt de geselecteerde nick op een kanaal. Als nick niet
+ is gegeven, zal je zelf beschermd worden. Als kanaal en nick
+ beiden niet zijn gegeven, zal je zelf op alle kanalen waar
+ je momenteel bent beschermd worden, mits je de rechten
+ daartoe hebt.
+
+ Standaard is dit gelimiteerd tot de oprichter, SOPs, of
+ degenen met een niveau van 10 of hoger op het kanaal voor
+ zelf-protectie.
+
+CHAN_HELP_DEPROTECT
+ Gebruik: DEPROTECT [#kanaal [nick]]
+
+ Heft de bescherming van de gegeven nick op een kanaal op.
+ Als nick niet is gegeven, zal de beschermen van jezelf
+ opgeheven worden. Als kanaal en nick niet zijn gegeven,
+ zal de bescherming van jezelf op alle kanalen waar je
+ momenteel bent worden opgeheven, mits je de rechten
+ daartoe hebt.
+
+ Standaard is dit gelimiteerd tot de stichter, SOPs, of
+ degenen met een niveau van 10 of hoger op het kanaal voor
+ zelf-protectie.
+
+CHAN_HELP_OWNER
+ Gebruik: OWNER [#kanaal]
+
+ Geeft je eigenaar status op kanaal. Als kanaal niet is
+ gegeven krijg je eigenaar status op alle kanalen waar je
+ momenteel bent, mits je de rechten daartoe hebt.
+
+ Gelimiteerd tot degenen met stichter-rechten op het kanaal.
+
+CHAN_HELP_DEOWNER
+ Gebruik: DEOWNER [#kanaal]
+
+ Verwijdert je eigenaar status op channel. Als kanaal niet
+ is gegeven wordt je eigenaar status op alle kanalen waar je
+ momenteel bent verwijderd, mits je de rechten daartoe hebt.
+
+ Gelimiteerd tot degenen met stichter-rechten op het kanaal.
+
+CHAN_HELP_INVITE
+ Gebruik: INVITE kanaal
+
+ Laat %S je uitnodigen in een gegeven kanaal.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met
+ niveau 5 of hoger op het kanaal.
+
+CHAN_HELP_UNBAN
+ Gebruik: UNBAN kanaal
+
+ Zorgt ervoor dat %S alle bans verwijdert die je ervan
+ belemmeren het gegeven kanaal te joinen.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met
+ niveau 5 of hoger op het kanaal.
+
+CHAN_HELP_KICK
+ Gebruik: KICK [#kanaal [nick [reden]]]
+
+ Kickt de gegeven nick van het gegeven kanaal. Als nick niet
+ is gegeven wordt je zelf gekicked. Als kanaal en nick niet
+ zijn gegeven wordt je zelf gekicked op alle kanalen waar je
+ bent, mits je de rechten daartoe hebt.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met
+ niveau 5 of hoger op het kanaal.
+
+CHAN_HELP_BAN
+ Gebruik: BAN [#kanaal [nick [reden]]]
+
+ Bant de gegeven nick op het gegeven kanaal. Als nick niet
+ is gegeven wordt je zelf gebanned. Als kanaal en nick niet
+ zijn gegeven wordt je zelf gebanned op alle kanalen waar je
+ momenteel bent, mits je de rechten daartoe hebt.
+
+ Standaard is dit gelimiteerd tot AOPs of degenen met
+ niveau 5 of hoger op het kanaal.
+
+CHAN_HELP_TOPIC
+ Gebruik: TOPIC kanaal [topic]
+
+ Zorgt ervoor dat %S het kanaal topic verandert in het
+ gegeven topic. Als topic niet is gegeven wordt het topic
+ leeg gemaakt. Dit commando is het meest bruikbaar in
+ samenwerking met SET TOPICLOCK. Zie ook /msg %S HELP SET
+ TOPICLOCK voor meer informatie.
+
+ Standaard is dit gelimiteerd tot degenen met stichter-toegang
+ op het kanaal.
+
+CHAN_HELP_CLEAR
+ Gebruik: CLEAR kanaal wat
+
+ Zorgt ervoor dat %S bepaalde instellingen van het kanaal
+ verwijdert. wat kan zijn:
+
+ MODES Verwijder alle modes op het kanaal (verwijdert
+ modes i,k,l,m,n,p,s,t).
+ BANS Verwijder alle bans op het kanaal.
+ OPS Verwijder kanaal-operator status (mode +o) van
+ alle kanaal-operators.
+ VOICES Verwijder "voice" status (mode +v) van iedereen
+ met "voice" status op het kanaal.
+ USERS Verwijder (kick) alle gebruikers van het kanaal.
+
+ Standaard is dit gelimiteerd tot degenen met stichter-toegang
+ op het kanaal.
+
+CHAN_HELP_GETKEY
+ Gebruik: GETKEY kanaal
+
+ Geef de key van het gegeven kanaal terug. Dit is een
+ commando wat vooral bedoeld is voor gebruik door bots of
+ scripts, dus is de output in het volgende formaat:
+
+ KEY <kanaal> <key>
+
+ key is "NO KEY" als er geen key is ingesteld.
+
+CHAN_HELP_SENDPASS
+ Gebruik: SENDPASS kanaal
+
+ Stuur het wachtwoord van het gegeven kanaal naar het email
+ adres gespecificeerd in NickServ voor de stichter van het
+ kanaal. Dit commando is erg bruikbaar om verloren wacht-
+ woorden terug te halen.
+
+ Kan gelimiteerd zijn tot IRC operators op sommige netwerken.
+
+ Dit commando is onbeschikbaar wanneer encryptie is ingeschakeld.
+
+CHAN_SERVADMIN_HELP
+
+ De volgende commando's zijn beschikbaar voor services administrators:
+
+ GETPASS Haal het stichter-wachtwoord voor een kanaal op
+ (alleen als encryptie is uitgeschakeld)
+ FORBID Verbied het gebruik van een kanaal
+ SUSPEND Stel een kanaal tijdelijk buiten werking terwijl de
+ kanaal-data en -instellingen bewaard blijven.
+ UNSUSPEND Stelt een tijdelijk buiten werking gesteld kanaal weer
+ in werking
+ STATUS Geeft het huidige toegangsniveau van een gebruiker
+ op een kanaal weer
+
+ Services administrators kunnen ook elk kanaal dropped zonder dat
+ ze hoeven te indentificeren via een wachtwoord, en kunnen de
+ toegangs-, AKICK-, en niveau-lijsten bekijken voor elk kanaal.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Gebruik: LOGOUT kanaal [nick]
+
+ Dit kanaal zorgt ervoor dat de gegeven nick niet meer
+ geidentificeerd is voor het gegeven kanaal.
+
+ Als je de stichter van het kanaal bent kun je iedereen
+ uitloggen, anders kun je alleen jezelf uitloggen.
+
+ Als je een Services adminstrator bent kun je iedereen
+ uitloggen van elke kanaal zonder daar stichter-rechten te
+ hebben. Je kan ook het nick-paramenter weglaten: dit
+ zorgt ervoor dat iedereen uitgelogd zal worden.
+
+CHAN_SERVADMIN_HELP_DROP
+ Gebruik: DROP kanaal
+
+ Zegt de registratie van het gegeven kanaal op. Alleen
+ Services admins kunnen elk kanaal droppen, ook al zijn
+ ze niet voor het betreffende kanaal geindtificeerd.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Services adminstrators kunnen ook de NOEXPIRE optie
+ instellen, waarmee kanalen niet kunnen verlopen. Ook
+ kunnen ze elke optie voor elk kanaal zet zonder zich te
+ identificeren met het wachtwoord voor het kanaal.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Gebruik: SET kanaal NOEXPIRE {ON | OFF}
+
+ Stelt in of het gegeven kanaal zal verlopen. Door deze optie
+ AAN te zetten kun je verhinderen dan het kanaal verloopt.
+
+ Gelimiteerd tot Services adminstrators.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Services adminstrators kunnen het ALL parameter gebruiken
+ bij elk kanaal.
+
+CHAN_SERVADMIN_HELP_LIST
+ Gebruik: LIST trefbeeld [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+ Geeft alle geregistreerde kanalen weer die overeen komen met
+ het gegeven tgrefbeeld. Kanalen met de PRIVATE optie aan
+ worden alleen weergegeven aan Services administrators.
+ Kanalen met de NOEXPIRE aan zullen een ! voor de kanaal-
+ naam hebben voor Services administrators.
+
+ Als de FORBIDDEN, SUSPENDED of NOEXPIRE opties zijn gegeven
+ worden alleen kanalen die, respectievelijk, verboden,
+ tijdelijk buiten werken gesteld zijn, of als niet-verlopen
+ gemarkeerd zijn weergegeven. Als er meerdere opties worden
+ gegeven worden alle gevraagde types weergegeven. Deze opties
+ zijn gelimiteerd tot Services adminstrators.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Gebruik: GETPASS kanaal
+
+ Geeft het wachtwoord voor het gegeven kanaal terug.
+ Let op: wanneer je dit commando gebruikt zal er een bericht
+ waarin staat wie het commando op welk kanaal heeft gebruikt
+ worden gelogged en verstuurd als WALLOPS/GLOBOPS.
+
+ Gelimiteerd tot Services adminstrators.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Gebruik: FORBID kanaal [reden]
+
+ Verbied iedereen van het registreren of gebruiken van het
+ gegeven kanaal. Kan ongedaan gemaakt worden door het
+ droppen van het kanaal.
+
+ Reden kan verplicht zijn op sommige netwerken.
+
+ Gelimiteerd tot Services adminstrators.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Gebruik: SUSPEND kanaal [reden]
+
+ Verbied iedereen van het registreren of gebruiken van het
+ gegeven kanaal. Kan ongedaan gemaakt worden door middel van
+ het UNSUSPEND commando om alle vorige kanaal data en
+ instellingen te behouden.
+
+ Op sommige netwerken is een reden verplicht.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Stelt een buiten werking gesteld kanaal weer in werking.
+ Alle data en instellingen worden teruggeven van voor de
+ buitenwerkingstelling.
+ Releases a suspended channel. All data and settings
+ are preserved from before the suspention.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Gebruik: STATUS kanaal nick
+
+ Geeft het huidige toegangsniveau van de gegeven nick op het
+ gegeven kanaal weer. Het antwoord is in het formaat:
+
+ STATUS kanaal nick toegangsniveau
+
+ Als er een fout optreed zal het antwoord zijn in het formaat:
+
+ STATUS ERROR fout-bericht
+
+ Gelimiteerd tot Services adminstrators.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S is een services die IRC gebruikers in staat stelt om
+ korte berichten te sturen naar andere IRC gebruikers, online
+ of offline, of naar kanalen(*). De verstuurder's nick en de
+ nick van de vanger, of het kanaal waar de memo naartoe gaat,
+ moeten geregistreerd zijn om de memo te versturn.
+
+ %S's commando's bevatten:
+
+ SEND Vertstuur een memo naar een nick of kanaal
+ CANCEL Annuleer je laatst verzonden memo
+ LIST Geef je memo's weer
+ READ Lees een of meerdere memo's
+ DEL Verwijder een of meerdere memo's
+ SET Stel opties gerelateerd aan memo's in
+ INFO Toont info over jouw memo's
+
+MEMO_HELP_ADMIN
+ SENDALL Stuur een memo naar alle geregistreerde gebruikers
+
+MEMO_HELP_OPER
+ STAFF Stuur een memo naar alle opers/admin
+
+MEMO_HELP_FOOTER
+
+ Type /msg %S HELP commando voor hulp bij een van
+ de bovenstaande commando's
+
+ (*) Standaard kan elke gebruiker met tenminste toegangsniveau
+ 10 de kanaalmemo's lezen. Dit kan aangepast worden met
+ het %s LEVELS commando.
+
+MEMO_HELP_SEND
+ Gebruik: SEND {nick | kanaal} memo-text
+
+ Stuurt de genoemde nick of kanaal een memo bevattende
+ memo-text. Wanneer je een memo naar een nick stuurt zal
+ de ontvanger een notice krijgen dat hij/zij een nieuwe memo
+ heeft. De doel nick/kanaal moet geregistreerd zijn.
+
+MEMO_HELP_CANCEL
+ Gebruik: CANCEL {nick | kanaal}
+
+ Annuleert de laatste memo die je gestuurd hebt aan de gegeven
+ nick of kanaal, indien deze nog niet gelezen is op het moment
+ dat je dit commando gebruikt.
+
+MEMO_HELP_LIST
+ Gebruik: LIST [kanaal] [lijst | NEW]
+
+ Geeft alle memo's die je hebt weer. Als je NEW opgeeft worden
+ alleen nieuwe (ongelezen) memo's weergegeven. Ongelezen memo's
+ worden gemarkeerd met een "*" links van het memo nummer. Je kan
+ ook een lijst van nummers specificeren, zoals in het voorbeeld:
+
+ LIST 2-5,7-9
+ Geeft de memo's genummerd 2 t/m 5 en 7 t/m 9 weer.
+
+MEMO_HELP_READ
+ Gebruik: READ [kanaal] {nr | lijst | LAST | NEW}
+
+ Verstuurt de text van de gespecificeerde memo's. Als LAST is
+ gegeven wordt de laatst ontvangen memo verstuurd. Als NEW is
+ gegeven worden alle nieuwe memo's verstuurd. Anders wordt
+ memo nummer nr gegeven. Je kan ook een lijst van nummers
+ opgeven, zoals in onderstaand voorbeeld:
+
+ READ 2-5,7-9
+ Geeft de memo's genummerd 2 t/m 5 en 7 t/m 9 weer.
+
+MEMO_HELP_DEL
+ Gebruik: DEL [kanaal] {nr | lijst | LAST | ALL}
+
+ Verwijdert de gespicificeerde memo('s). Je kan meerdere
+ memo-nummers specificeren of bereiken van nummers ipv een
+ enkel nummer, zoals in het 2e voorbeeld hier onder.
+
+ Als LAST is gegeven, wordt je laatste nieuwe memo verwijderd.
+ Als ALL is gegeven, worden al je memo's verwijderd.
+
+ Voorbeelden:
+
+ DEL 1
+ Verwijdert je eersye memo.
+
+ DEL 2-5,7-9
+ Verwijdert de memo's genummerd 2 t/m 5 en 7 t/m 9.
+
+MEMO_HELP_SET
+ Gebruik: SET optie parameters
+
+ Stelt verschillende memo opties in. optie kan zijn:
+
+ NOTIFY Veranderd wanneer je geinformeerd wordt over
+ nieuwe memo's (alleen voor nicks)
+ LIMIT Stelt het maximum aantal memo's dat je kan
+ ontvangen in
+
+ Type /msg %S HELP SET optie voor more informatie over
+ een specifieke optie.
+
+MEMO_HELP_SET_NOTIFY
+ Gebruik: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Verandert wanneer je geinformeerd zal worden over nieuwe memo's:
+
+ ON Je wordt geinformeerd over memo's wanneer je inlogt,
+ terugkomt van /AWAY, en wanneer ze naar je
+ gestuurd worden.
+ LOGON Je wordt geinformeerd over memo's wanneer je inlogt,
+ of wanneer je terugkomt van /AWAY.
+ NEW Je wordt alleen geinformeerd over memo's wanner ze
+ naar je worden verstuurd.
+ OFF Je zal geen informaties over memo's ontvangen.
+
+ ON is wezenlijk LOGON en NEW gecombineerd.
+
+MEMO_HELP_SET_LIMIT
+ Gebruik: SET LIMIT [kanaal] limiet
+
+ Stelt het maximum aantal memo's in dat jij (of het gegeven
+ kanaal) kan hebben. Als je dit op 0 zet zal niemand memo's
+ naar je kunnen sturen. Je kan dit echter niet hoger dan %d
+ zetten.
+
+MEMO_HELP_INFO
+ Gebruik: INFO [kanaal]
+
+ Geeft informatie weer over het aantal memo's dat je hebt,
+ hoeveel daarvan er ongelezen zijn, en hoeveel memo's je in
+ totaal kan ontvangen. Met een paramenter wordt dezelfde
+ informatie voor het gegeven kanaal weergegeven.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Gebruik: SET LIMIT [gebruiker | kanaall] {limiet | NONE} [HARD]
+
+ Stelt het maximum aantal memo's in dat een gebruiker of
+ kanaal mag hebben. Als je deze limiet op 0 zet kan de
+ gebruiker geen memo's ontvangen; zet dit op NONE om toe
+ te staan dat de gebruiker of kanaal zoveel memo's mag hebben
+ als hij/zij wil. Als je geen nick of kanaal opgeeft wordt
+ je eigen limiet ingesteld.
+
+ Als je HARD toevoegt kan de gebruiker de limiet niet
+ veranderen. HARD weglaten heeft het tegenovergestelde
+ effect: de gebruiker in staat stellen de limiet te veranderen
+ (zelfs als een vorige limiet is ingesteld met HARD).
+
+ Het gebruiken van het SET LIMIT commando is gelimiteerd tot
+ Services admins. Andere gebruikers mogen alleen een limiet
+ voor zichzelf of voor een kanaal waar ze genoeg rechten hebben
+ instellen, mogen geen limiet instellen boven %d, en mogen geen
+ harde limiet instellen.
+
+MEMO_SERVADMIN_HELP_INFO
+ Gebruik: INFO [nick | kanaal]
+
+ Geeft informatie weer over het aantal memo's dat je hebt,
+ hoeveel daarvan er ongelezen zijn, en hoeveel memo's je in
+ totaal kan ontvangen.
+
+ Met een kanaal paramenter wordt dezelfde informatie voor
+ het gegeven kanaal weergegeven.
+
+ Met een nick paramenter wordt dezelfde informatie voor de
+ gegeven nick weergegeven. Dit gebruik is gelimiteerd tot
+ Services admins.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Gebruik: STAFF memo-text
+
+ Stuurt alle services-staf een memo die memo-text bevat.
+ Let op: Als je opers op de operator- en op de administrator-
+ lijst hebt zullen ze de memo twee keer ontvangen. Hetzelfde
+ geldt voor oper's die tegelijk op de root-lijst als op een
+ andere lijst staan.
+
+MEMO_HELP_SENDALL
+ Gebruik: SENDALL memo-text
+
+ Stuurt alle geregistreerde gebruikers een memo die
+ memo-text bevat.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ %S commando's:
+ GLOBAL Stuurt een bericht naar alle gebruikers
+ STATS Geeft de status van Services en netwerk weer
+ OPER LIST Geeft alle Services operators weer
+ ADMIN LIST Geeft alle Services admins weer
+ STAFF Display Services staff and online status
+
+OPER_HELP_OPER_CMD
+ Commando's beschikbaar voor Services operators en administrators:
+ MODE Verander de modes op een kanaal
+ KICK Kick een gebruiker uit een kanaal
+ CLEARMODES Verwijder alle modes van een kanaal
+ KILLCLONES Kill alle gebruikers met een bepaalde hostmask
+ AKILL Beheer de AKILL lijst
+ SGLINE Beheer de SGLINE lijst
+ SQLINE Beheer de SQLINE lijst
+ SZLINE Beheer de SZLINE lijst
+
+OPER_HELP_ADMIN_CMD
+ Commando's beschikbaar voor Services administrators:
+ OPER Wijzig de Services operator lijst
+ CHANLIST Geef alle kanalen weer
+ USERLIST Geef alle gebruikers weer
+ LOGONNEWS Stel de berichten in die gebruikers krijgen als
+ ze inloggen
+ RANDOMNEWS Stel de berichten in waarvan gebruikers er willekeurig
+ een te zien krijgen als ze inloggen
+ OPERNEWS Stel de berichten in die gebruikers te zien krijgen
+ die OPER worden
+ SESSION Bekijk de lijst met sessies per host
+ EXCEPTION Beheer de sessie-limiet uitzonderingen lijst
+ CACHE Geeft de hostname cache weer die gebruikt wordt door
+ de proxy detectie.
+ NOOP Verwijder tijdelijk alle O:regels van een server
+ op afstand
+ JUPE "Jupiter" een server
+ IGNORE Wijzig de Services negeer-lijst
+ UMODE Wijzigt de modus van een gebruiker
+ OLINE Geef Operflags aan een bepaalde gebruiker (alleen
+ UnrealIRCd)
+ SET Stel verscheidene globale Services opties in
+ RELOAD Herlaad Services' configuratie bestand
+ UPDATE Forceer dat de Services database onmiddelijk
+ op de harde schijf wordt weggeschreven
+ RESTART Sla databases op en herstart Services
+ QUIT Sluit Services af zonder databases op te slaan
+ SHUTDOWN Sla databases op en sluit Services af
+
+ Commando's beschikbaar voor Services super-gebruikers:
+ ADMIN Wijzig de Services Administrator lijst
+
+OPER_HELP_ROOT_CMD
+ Commando's beschikbaar voor Services Roots:
+ MODLOAD Laad een module
+ MODUNLOAD Ontlaad een module
+ MODLIST Geef geladen modules weer
+ MODINFO Info over een geladen module
+
+OPER_HELP_LOGGED
+ Waarschuwing: Alle commando's die naar %S gestuurd worden worden gelogd!
+
+OPER_HELP_GLOBAL
+ Gebruik: GLOBAL bericht
+
+ Stelt IRCops in staat om berichten te versturen naar alle gebruikers
+ op het netwerk.
+ Berichten zullen verstuurd worden vanaf de nick %s.
+
+OPER_HELP_STATS
+ Gebruik: STATS [AKILL | ALL | RESET]
+
+ Zonder een optie wordt het huidig aantal gebruikers en IRCops
+ online (zonder Services), het hoogste aantal gebruikers
+ gelijktijdig online sinds Services zijn gestuurd, en hoe lang
+ de Services al online zijn weegegeven.
+
+ Met de AKILL optie worden de huidige grootte van de AKILL
+ lijst en de huidige standaard verloop-tijd weergegeven.
+
+ De ALL optie is alleen beschikbaar voor Services administrators
+ en geeft informatie over het geheugen gebruik van Services.
+ Het gebruiken van dit commando van er voor zorgen dat de Services
+ gedurende een korte tijd niet meer reageren indien ze gebruikt
+ worden op een groot netwerk, dus gebruik het niet te vaak!
+
+ De ALL optie stelt momenteel het maximum aantal gebruikers in
+ op het aantal gebruikers dat momenteel aanwezig is op het netwerk.
+
+ UPTIME kan als een synoniem voor STATS gebruikt worden.
+
+OPER_HELP_OPER
+ Gebruik: OPER ADD nick
+ OPER DEL {nick | entry-nr | lijst}
+ OPER LIST [mask | lijst]
+ OPER CLEAR
+
+ Stelt Services administrators in staat om nicknames toe te
+ voegen of te verwijderen uit de Services operator lijst. Een
+ gebruiker van wie de nickname op de Services operator lijst
+ staat en die geidentificeerd is bij %s zal in staat
+ zijn om de Services operator commando's te gebruiken.
+
+ Het OPER ADD commando voegt de opgegeven nickname toe aan
+ de Services operator lijst.
+
+ Het OPER DEL commando verwijdert de opgegeven nickname van
+ de Services operator lijst. Als een lijst van entry-nummers is
+ opgegeven worden die verwijderd.
+ (Zie ook het voorbeeld van LIST hier onder.)
+
+ Het OPER LIST commando geeft de Services operator lijst weer.
+ Als een mask met een * is gegeven, worden alleen de gebruikers
+ die overeenkomen met het opgegeven mask weergegven. Als een lijst
+ van entry-nummers is opgegeven worden alleen die weergegeven.
+ Bijvoorbeeld:
+
+ OPER LIST 2-5,7-9
+ Geeft Services operator nummer 2 t/m 5 en 7 t/m 9 weer.
+
+ Het OPER CLEAR commando verwijdert alle nicks van de Services
+ operator lijst.
+
+ Elke IRCop mag OPER LIST gebruiken. De rest is gelimiteerd tot
+ Services administrators.
+
+OPER_HELP_ADMIN
+ Gebruik: ADMIN ADD nick
+ ADMIN DEL {nick | entry-nr | lijst}
+ ADMIN LIST [mask | list]
+ ADMIN CLEAR
+
+ Stelt de Services root in staat om nicknames toe te voegen of
+ te verwijderen uit de Services administrator lijst. Een
+ gebruiker van wie de nickname op de Services administrator
+ lijst staat en die geidentificeerd is bij %s zal in staat
+ zijn om de Services administrator commando's te gebruiken.
+
+ Het ADMIN ADD commando voegt de opgegeven nickname toe aan
+ de Services administrator lijst.
+
+ Het ADMIN DEL commando verwijdert de opgegeven nickname van
+ de Services administrator lijst. Als een lijst van entry-nummers is
+ opgegeven worden die verwijderd.
+ (Zie ook het voorbeeld van LIST hier onder.)
+
+ Het ADMIN LIST commando geeft de Services administrator lijst weer.
+ Als een mask met een * is gegeven, worden alleen de gebruikers
+ die overeenkomen met het opgegeven mask weergegven. Als een lijst
+ van entry-nummers is opgegeven worden alleen die weergegeven.
+ Bijvoorbeeld:
+
+ ADMIN LIST 2-5,7-9
+ Geeft Services administrator nummer 2 t/m 5 en 7 t/m 9 weer.
+
+ Het ADMIN CLEAR commando verwijdert alle nicks van de Services
+ adminisrator lijst.
+
+ Elke IRCop mag ADMIN LIST gebruiken. De rest is gelimiteerd tot
+ Services root.
+
+OPER_HELP_IGNORE
+ Gebruik: IGNORE {ADD|DEL|LIST|CLEAR} [tijd] [nick]
+
+ Stelt Services administrators in staat de Services een nick
+ voor een bepaalde tijd of tot de volgende herstart te laten
+ negeren. Stdnaard wordt de tijd gegeven in seconden. Je kan
+ de tijd opgegeven met behulup van units. Geldige units zijn:
+ s voor seconden, m voor minuten, h voor uur and d
+ voor dagen. Combinaties hiervan zijn niet toegestaan. Om
+ Services iemand permanent te laten negeren kun je 0 typen
+ als tijd.
+
+OPER_HELP_MODE
+ Gebruik: MODE kanaal modes
+
+ Stelt Services operators in staat om de modes van elk willekeurig
+ kanaal in te stellen. De paramenters zijn het zelfde als bij een
+ standaard /MODE commando.
+
+ Gelimiteerd tot Services operators.
+
+OPER_HELP_UMODE
+ Gebruik: UMODE gebruiker modes
+
+ Stelt Services administrators in staat gebruikersmodes van
+ elke willekeurige gebruiker in te stellen. De paramenters
+ zijn hetzelfde als van een standaard /MODE commando.
+
+ Gelimiteerd tot Services adminstrators.
+
+OPER_HELP_OLINE
+ Gebruik: OLINE gebruiker flags
+
+ Stelt Services administrators in staat om Operflags te geven
+ aan elke willekeurig gebruiker. Flags moeten worden vooraf
+ gegeaan door een "+" of een "-". Om alle flags te verwijderen
+ kun je simpelweg een "-" typen in plaats van de flags.
+
+ Gelimiteerd tot Services adminstrators.
+
+OPER_HELP_CLEARMODES
+ Gebruik: CLEARMODES kanaal [ALL]
+
+ Verwijdert alle binaire modes (i,k,l,m,n,p,s,t) en bans van
+ een kanaal. Als ALL is opgegeven, worden ook alle ops en
+ voices (+o en +v modes) van het kanaal verwijderd.
+
+ Gelimiteerd tot Services operators.
+
+OPER_HELP_KICK
+ Gebruik: KICK kanaal gebruiker reden
+
+ Stelt IRCops in staat om een gebruik van elk willekeurig
+ kanaal te kicken. De paramenters zijn hetzelfde als die van
+ een standaard /KICK commando. Het kick-bericht zal de nickname
+ van de IRCop die het KICK commando uitvoert bevatten.
+ Bijvoorbeeld:
+
+ *** Gebruiker has been kicked off channel #mijn_kanaal by %S (IRCOp (Misbruik))
+
+ Gelimiteerd tot Services operators.
+
+OPER_HELP_SVSNICK
+ Gebruik: SVSNICK nick nieuwe nick
+
+ Veranderd een gebruiker's nick van nick naar nieuwe nick.
+
+ Gelimiteerd tot Services administrators
+
+OPER_HELP_AKILL
+ Gebruik: AKILL ADD [+verlooptijd] mask reden
+ AKILL DEL {mask | entry-nr | lijst}
+ AKILL LIST [mask | lijst]
+ AKILL VIEW [mask | lijst]
+ AKILL CLEAR
+
+ Stelt Services operators in staat de AKILL lijst te beheren.
+ Als een gebruiker die overeenkomt met een AKILL mask probeert
+ te verbinden zullen Services een KILL voor die gebruiker door-
+ voeren en, als het netwerk dit ondersteund, zullen alle servers
+ geinstrueerd worden een ban (K-line) voor het betreffende mask
+ toe te voegen.
+
+ AKILL ADD voeg het gegeven user@host mask toe aan de AKILL
+ lijst met de gegeven reden (die moet worden gegeven).
+ verlooptijd wordt gespecificeerd als een getal waarachter d
+ (dagen), h (uur), of m (minuten) geplaatst wordt. Combinaties
+ (zoals 1h30m) zijn niet toegestaan. Als er geen d, h of m wordt
+ meegegeven, is het standaard dagen (dus +30 zelfstandig betekent
+ 30 dagen). Om een AKILL die niet verloopt toe te voegen, gebruik je
+ +0. Als de usermask die toegevoegd moet worden met een + begint,
+ is een verlooptijd verplicht, zelfs als die overeenkomt met de
+ standaard verlooptijd. De huidige standaard verlooptijd voor een
+ AKILL kan gevonden worden met het STATS AKILL commando.
+
+ Het AKILL DEL commando verwijdert het gegeven mask van de AKILL
+ lijst als deze erop staat. Als er een lijst van entry-nummers
+ is opgegeven zullen die verwijderd worden. (Zie het voorbeeld voor
+ LIST hier onder.)
+
+ Her AKILL LIST commando geeft de AKILL lijst weer.
+ Als een mask met een * is gegeven zullen alleen de AKILLs die
+ overeenkomen met het mask worden weergegeven. Als een lijst van
+ entry-nummers is gegeven worden alleen die weergegeven.
+ Bijvoorbeeld:
+
+ AKILL LIST 2-5,7-9
+ Geeft AKILLs 2 t/m 5 en 7 t/m 9 weer.
+
+ AKILL VIEW is een versie van AKILL LIST die meer informatie
+ geeft: de naam van degene die de AKILL toe heeft gevoegd, de datum
+ waarop dit gebeurde, waneer deze verloopt, en de user@host mask
+ en de reden.
+
+ AKILL CLEAR maakt de AKILL lijst leeg.
+
+ Gelimiteerd tot Services operators.
+
+OPER_HELP_SGLINE
+ Gebruik: SGLINE ADD [+verlooptijd] mask reden
+ SGLINE DEL {mask | entry-nr | lijst}
+ SGLINE LIST [mask | lijst]
+ SGLINE VIEW [mask | lijst]
+ SGLINE CLEAR
+
+ Stelt Services operators in staat de SGLINE lijst te beheren.
+ Als een gebruiker die overeenkomt met een SGLINE mask probeert
+ te verbinden zullen Services deze gebruiker niet toestaan zijn
+ of haar IRC sessie voort te zetten.
+
+ SGLINE ADD voeg het gegeven user@host mask toe aan de SGLINE
+ lijst met de gegeven reden (die moet worden gegeven).
+ verlooptijd wordt gespecificeerd als een getal waarachter d
+ (dagen), h (uur), of m (minuten) geplaatst wordt. Combinaties
+ (zoals 1h30m) zijn niet toegestaan. Als er geen d, h of m wordt
+ meegegeven, is het standaard dagen (dus +30 zelfstandig betekent
+ 30 dagen). Om een SGLINE die niet verloopt toe te voegen, gebruik je
+ +0. Als de usermask die toegevoegd moet worden met een + begint,
+ is een verlooptijd verplicht, zelfs als die overeenkomt met de
+ standaard verlooptijd. De huidige standaard verlooptijd voor een
+ SGLINE kan gevonden worden met het STATS AKILL commando.
+
+ Het SGLINE DEL commando verwijdert het gegeven mask van de SGLINE
+ lijst als deze erop staat. Als er een lijst van entry-nummers
+ is opgegeven zullen die verwijderd worden. (Zie het voorbeeld voor
+ LIST hier onder.)
+
+ Her SGLINE LIST commando geeft de SGLINE lijst weer.
+ Als een mask met een * is gegeven zullen alleen de SGLINEs die
+ overeenkomen met het mask worden weergegeven. Als een lijst van
+ entry-nummers is gegeven worden alleen die weergegeven.
+ Bijvoorbeeld:
+
+ SGLINE LIST 2-5,7-9
+ Geeft SGLINEs 2 t/m 5 en 7 t/m 9 weer.
+
+ SGLINE VIEW is een versie van SGLINE LIST die meer informatie
+ geeft: de naam van degene die de SGLINE toe heeft gevoegd, de datum
+ waarop dit gebeurde, waneer deze verloopt, en de user@host mask
+ en de reden.
+
+ SGLINE CLEAR maakt de SGLINE lijst leeg.
+
+ Gelimiteerd tot Services operators.
+
+OPER_HELP_SQLINE
+ Gebruik: SQLINE ADD [+verlooptijd] mask reden
+ SQLINE DEL {mask | entry-nr | lijst}
+ SQLINE LIST [mask | lijst]
+ SQLINE VIEW [mask | lijst]
+ SQLINE CLEAR
+
+ Stelt Services operators in staat de SQLINE lijst te beheren.
+ Als een gebruiker met een nick die overeenkomt met een SQLINE
+ mask probeert zullen Services deze gebruiker niet toestaan zijn
+ of haar IRC sessie voort te zetten.
+
+ Als het eerste teken van een mask een # is, zullen Services
+ voorkomen dat overeenkomende kanalen gebruik worden (mits de
+ IRC servers het ondersteunen).
+
+ SQLINE ADD voeg het gegeven mask toe aan de SQLINE
+ lijst met de gegeven reden (die moet worden gegeven).
+ verlooptijd wordt gespecificeerd als een getal waarachter d
+ (dagen), h (uur), of m (minuten) geplaatst wordt. Combinaties
+ (zoals 1h30m) zijn niet toegestaan. Als er geen d, h of m wordt
+ meegegeven, is het standaard dagen (dus +30 zelfstandig betekent
+ 30 dagen). Om een SQLINE die niet verloopt toe te voegen, gebruik je
+ +0. Als de usermask die toegevoegd moet worden met een + begint,
+ is een verlooptijd verplicht, zelfs als die overeenkomt met de
+ standaard verlooptijd. De huidige standaard verlooptijd voor een
+ SQLINE kan gevonden worden met het STATS AKILL commando.
+
+ Het SQLINE DEL commando verwijdert het gegeven mask van de SQLINE
+ lijst als deze erop staat. Als er een lijst van entry-nummers
+ is opgegeven zullen die verwijderd worden. (Zie het voorbeeld voor
+ LIST hier onder.)
+
+ Her SQLINE LIST commando geeft de SQLINE lijst weer.
+ Als een mask met een * is gegeven zullen alleen de SQLINEs die
+ overeenkomen met het mask worden weergegeven. Als een lijst van
+ entry-nummers is gegeven worden alleen die weergegeven.
+ Bijvoorbeeld:
+
+ SQLINE LIST 2-5,7-9
+ Geeft SQLINEs 2 t/m 5 en 7 t/m 9 weer.
+
+ SQLINE VIEW is een versie van SQLINE LIST die meer informatie
+ geeft: de naam van degene die de SQLINE toe heeft gevoegd, de datum
+ waarop dit gebeurde, waneer deze verloopt, en de mask en de reden.
+
+ SQLINE CLEAR maakt de SQLINE lijst leeg.
+
+ Gelimiteerd tot Services operators.
+
+OPER_HELP_SZLINE
+ Gebruik: SZLINE ADD [+verlooptijd] mask reden
+ SZLINE DEL {mask | entry-nr | lijst}
+ SZLINE LIST [mask | lijst]
+ SZLINE VIEW [mask | lijst]
+ SZLINE CLEAR
+
+ Stelt Services operators in staat de SZLINE lijst te beheren.
+ Als een gebruiker met een IP wat overeenkomt met een SZLINE
+ mask probeert te verbinden zullen de Services deze verbieden
+ zijn/haar IRC sessie voort te zetten (dit werkt ook als er
+ een werkende reverse hostname bij het IP hoort).
+
+ SZLINE ADD voeg het gegeven IP aan de SZLINE lijst toe
+ met de gegeven reden (die moet worden gegeven).
+ verlooptijd wordt gespecificeerd als een getal waarachter d
+ (dagen), h (uur), of m (minuten) geplaatst wordt. Combinaties
+ (zoals 1h30m) zijn niet toegestaan. Als er geen d, h of m wordt
+ meegegeven, is het standaard dagen (dus +30 zelfstandig betekent
+ 30 dagen). Om een SZLINE die niet verloopt toe te voegen, gebruik je
+ +0. Als de usermask die toegevoegd moet worden met een + begint,
+ is een verlooptijd verplicht, zelfs als die overeenkomt met de
+ standaard verlooptijd. De huidige standaard verlooptijd voor een
+ SZLINE kan gevonden worden met het STATS AKILL commando.
+
+ Het SZLINE DEL commando verwijdert het gegeven mask van de
+ SZLINE lijst als deze erop staat. Als een lijst van entry-nummers
+ is gegeven, zullen die verwijderd worden. (Zie het voorbijbeeld
+ bij LIST hier onder.)
+
+ Het SZLINE LIST commando geeft de SZLINE lijst weer. Als er
+ een wildcard mask is gegeven zullen alleen de overeenkomende
+ masks worden weergegeven. Als een lijst van entry-nummers is
+ gegeven zullen alleen die worden weergegeven. Bijvoorbeeld:
+
+ SZLINE LIST 2-5,7-9
+ Geeft SZLINE 2 t/m 5 en 7 t/m 9 weer.
+
+ SZLINE VIEW is een meer verbale versie van SZLINE LIST,
+ en geeft weer wie een SZLINE heeft toegevoegd, op welke datum
+ hij/zij dat heeft gedaan, wanneer deze verloopt, en het IP
+ adres en de reden.
+
+ SZLINE CLEAR maakt de SZLINE lijst leeg
+
+ Gelimiteerd tot Services operators.
+
+OPER_HELP_SET
+ Gebruik: SET optie instelling
+
+ Stelt verschillende globale Services opties in. Momenteel
+ zijn de volgende opties beschikbaar:
+ READONLY Stel alleen-lezen of lezen-schrijven mode in
+ LOGCHAN Rapporteer log-berichten naar een kanaal
+ DEBUG (De)activeer debug mode
+ NOEXPIRE (De)activeer de geen-verloop mode
+ SUPERADMIN (De)activeer SuperAdministrator mode
+
+ Gelimiteerd tot Services adminstrators.
+
+OPER_HELP_SET_READONLY
+ Gebruik: SET READONLY {ON | OFF}
+
+ Zet de alleen-lezen mode aan of uit. In alleen-lezen mode
+ zullen normale gebruikers niet in staat zijn data van de
+ Services te wijzigen, inclusief kanaal toegangslijsten,
+ nickname alias lijst, etc. IRCops met voldoende Services
+ rechten kunnen de Services' AKILL lijst wijzigen, en nicknames
+ en kanalen droppen of verbieden, maar deze veranderingen
+ zullen niet worden opgeslagen behalve als de alleen-leze mode
+ wordt uitgeschakeld voordat de Services uitgezet of opnieuw
+ gestart worden.
+
+ Deze optie komt overeen met de commandline-optie -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Gebruik: SET LOGCHAN {ON | OFF}
+
+ Wanneer deze optie aan staat zullen Services de log-berichten
+ naast de log-bestanden ook naar een gespecificeerd kanaal
+ sturen. LogChannel moet ik ook gedefineerd zijn in het Services
+ configuratie bestand om deze instelling bruikbaar te laten zijn.
+
+ Let op: Dit kan grote beveiligingsimplicaties met zich mee
+ bregen als het log-kanaal niet goed beveiligd is.
+
+OPER_HELP_SET_DEBUG
+ GEBRUIK: SET DEBUG {ON | OFF | nummer}
+
+ Zet debug mode aan of uit. In debug mode zal alle data die
+ naar en van Services verzonden worden, alsmede een aantal
+ debug-berichten, naar het log-bestand geschreven worden.
+ Als nummer is gegeven zal debug mode worden geactiveerd met
+ het debug-niveau op nummer
+
+ Deze optie komt overeen met de commandline-optie -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Gebruik: SET NOEXPIRE {ON | OFF}
+
+ Zet de geen-verloop mode aan of uit. In de geen-verloop mode
+ zullen nicks, kanalen, AKILLs en uitzonderingen niet verlopen
+ totdat de geen-verloop mode weer wordt uitgezet.
+
+ Deze optie komt overeen met de commandline-optie -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Gebruik: SET SUPERADMIN {ON | OFF}
+
+ Als je dit aan zet krijg je extra privileges, zo ben je dan
+ bijvoorbeeld stichter op alle kanalen, etc...
+
+ Deze optie is niet persistent, en moet alleen gebruikt worden
+ wanneer het echt nodig is, en terug op OFF gezet worden als het
+ niet meer nodig is.
+
+OPER_HELP_NOOP
+ Gebruik: NOOP SET server
+ NOOP REVOKE server
+
+ NOOP SET verwijder alle O:lines van de gegeven server
+ en /KILLt alle IRCops die momenteel verbonden zijn met de
+ server om te voorkomen dat ze de server rehashen, omdat
+ dit het effect weer ongedaan zou maken.
+
+ NOOP REVOKE maakt alle verwijderde O:lines op de gegeven
+ server weer beschikbaar.
+
+ Pas op: De server wordt niet gecontroleerd door Services.
+
+ Gelimiteerd tot Services admintrators.
+
+OPER_HELP_JUPE
+ GEBRUIK: JUPE server [reden]
+
+ Zorgt ervoor dat Services de opgegeven server "jupiteren".
+ Dit betekent dat er een nep "server" die verbonden is aan
+ Services gemaakt wordt, die voorkomt dat de echte server met
+ die naam verbindt. De JUPE kan worden verwijderd met een
+ standaard SQUIT commando. Als een reden is gegeven, wordt
+ deze in het server informatie veld geplaatsd, anders zal het
+ informatie veld de text "Juped by <nick>" bevatten, waar
+ <nick> vervangen wordt door de <nick> die de server JUPEt.
+
+ Gelimiteerd tot Services adminstrators.
+
+OPER_HELP_RAW
+ Gebruik: RAW text
+
+ Stuurt text direct naar de server waarmee Services verbonden
+ zijn. Dit commando heeft een beperkt aantal mogelijkheden, en
+ kan voor chaos zorgen op een netwerk als het onjuist gebruikt
+ wordt. GEBRUIK DIT COMMANDO NIET tenzij je absoluut zeker
+ bent van wat je doet!
+
+ Gelimiteerd tot Services admins.
+
+OPER_HELP_UPDATE
+ Gebruik: UPDATE
+
+ Zorgt ervoor dat Services de database bestanden op de harde
+ schijf bijwerken zodra je dit commando vertsuurt.
+
+ Gelimiteerd tot Services admins.
+
+OPER_HELP_RELOAD
+ Gebruik: RELOAD
+
+ Zorgt ervoor dat Services het configuratie-bestand opnieuw
+ inladen. Let er wel op dat sommige instellingen nog steeds
+ vereisen dat de Services opnieuw gestart worden (bijvoorbeeld
+ Services' nicknames, activatie van de sessie limiet, etc.)
+
+ Gelimiteerd tot Services admins.
+
+OPER_HELP_QUIT
+ Gebruik: QUIT
+
+ Zorgt ervoor dat Services meteen afsluiten: databases worden
+ niet opgeslagen. Dit commando moet niet gebruikt worden
+ tenzij schade aan de kopieen van de databases in het geheugen
+ wordt gevreesd en ze niet moeten worden opgeslagen. Voor
+ normaal afsluiten moet je het SHUTDOWN commando gebruiken.
+
+ Gelimiteerd tot Services admins.
+
+OPER_HELP_SHUTDOWN
+ Gebruik: SHUTDOWN
+
+ Zorgt ervoor dat Services alle databases opslaat en dan
+ afsluit.
+
+ Gelimiteerd tot Services admins.
+
+OPER_HELP_RESTART
+ Gebruik: RESTART
+
+ Zorgt ervoor dat Services alle databases opslaat en dan
+ opnieuw opstart.
+
+ Gelimiteerd tot Services admins.
+
+OPER_HELP_KILLCLONES
+ Gebruik: KILLCLONES nick
+
+ KILLt alle gebruikers die dezelfde hostname als nick hebben.
+ Een tijdelijk AKILL, in de vorm *@host, wordt toegevoegd om
+ te voorkomen dat de getroffen clients meteen opnieuw verbinden.
+ Er wordt ook een WALLOPS verstuurd waarin staat wie het
+ commando gebruikte, welke host er getroffen is en hoeveel
+ gebuiker se geKILLed zijn. Dit commando is bruikbaar om
+ een groot aantal klonen van het netwerk te verwijderen.
+
+ Gelimiteerd tot Services operators.
+
+OPER_HELP_CHANLIST
+ Gebruik: CHANLIST [{trefbeeld | nick} [SECRET]]
+
+ Geeft alle kanalen weer die momenteel in gebruik zijn op het
+ IRC netwerk, ook de kanalen die niet geregistreerd zijn.
+
+ Als trefbeeld is gegeven, worden alleen overeenkomende
+ kanalen weergegeven. Als een nick is gegeven worden
+ alleen de kanalen waar de betreffende gebruiker aanwezig is
+ weergegeven. Als SECRET is gegeven worden alleen kanalen
+ die met trefbeeld overeenkomen en +s of +p mode hebben.
+
+ Gelimiteerd tot Services admins.
+
+OPER_HELP_USERLIST
+ Gebruik: USERLIST [{trefbeeld | kanaal} [INVISIBLE]]
+
+ Geeft alle gebruikers weer die momenteel online zijn op het
+ IRC netwerk, ook degenen die niet geregistreerd zijn.
+
+ Als trefbeeld is gegeven worden alleen overeenkomende
+ gebruikers weergegeven (het moet in het nick!user@host
+ formaat gegeven worden. Als kanaal is gegeven worden
+ alleen gebruikers die op het betreffende kanaal zijn
+ weergegeven. Als INVISBLE is gespecifificeerd worden alleen
+ gebruikers met gebruikersmode +i weergegeven.
+
+ Gelimiteerd tot Services admins.
+
+OPER_HELP_CACHE
+ Gebruik: CACHE DEL hostname
+ CACHE LIST trefbeeld [QUEUED | ALL]
+
+ Het CACHE DEL commando verwijderd de gegeven hostname uit
+ de cache. Dit commando is alleen bedoeld voor debugging.
+
+ Het CACHE LIST commando geeft alle gevonden proxies weer
+ die overeenkomen met het gegeven trefbeeld. Als de QUEUED
+ optie is meegegeven zullen alleen scans die in de wachtrij
+ staan of op het moment bezig zijn weergegeven worden, en als
+ de ALL optie is gegeven zullen alle gecachde hostnames
+ worden weergegeven.
+
+ Gelimiteerd tot Services admins.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_MODLOAD
+ Gebruik: MODLOAD bestandsnaam
+
+ Dit commando laadt de module genaamd bestandsnaam uit de
+ modules directory.
+
+ Gelimiteerd tot Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Gebruik: MODUNLOAD bestandsnaam
+
+ Dit commando ontlaadt de module genaamd bestandsnaam uit
+ de modules directory.
+
+ Gelimiteerd tot Services Roots.
+
+OPER_HELP_MODINFO
+ Gebruik: MODINFO bestandsnaam
+
+ Dit command geeft informatie weer over de gespecificeerde
+ geladen module.
+
+ Gelimiteerd to Services Roots.
+
+OPER_HELP_MODLIST
+ Gebruik: MODLIST
+
+ Geeft alle momenteel geladen modules weer.
+
+ Gelimiteerd tot Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S stelt je in staat een bot op je eigen kanaal te hebben.
+ Het is gemaakt voor gebruikers die geen eigen bot kunnen
+ hosten of configureren, of voor gebruik op netwerken die
+ geen bots van gebruikers toestaan. Beschikbare commando's
+ worden hieronder weergegeven. Om ze te gebruiken moet je
+ /msg %S commando typen. Voor meer informatie over een
+ specifiek commando moet je /msg %S HELP command typen.
+
+ BOTLIST Geef beschikbare bots weer
+ ASSIGN Wijs een bot toe aan een kanaal
+ SET Configureer bot opties
+ KICK Configureer kickers
+ BADWORDS Beheer slechte-woorden lijst
+
+ Overige commando's: ACT INFO SAY UNASSIGN
+
+ Bot zal een kanaal joinen wanneer daar tenminste %d
+ gebruiker(s) is/zijn.
+
+BOT_HELP_BOTLIST
+ Gebruik: BOTLIST
+
+ Geeft alle beschikbare bots op dit netwerk weer.
+
+BOT_HELP_ASSIGN
+ Gebruik: ASSIGN kanaal nick
+
+ Wijst een bot met de nick nick toe aan kanaal kanaal.
+ Hierna kun je de bot voor het kanaal instellen zoals je
+ wil.
+
+BOT_HELP_UNASSIGN
+ Gebruik: UNASSIGN kanaal
+
+ Verwijdert een bot van een kanaal. Wanneer je dit commando
+ gebruikt zal de bot niet meer in het kanaal komen. De
+ configuratie van de bot voor het kanaal wordt wel behouden,
+ zodat je later de bot altijd opnieuw aan het kanaal kun
+ toewijzen zonder dat je deze opnieuw hoeft te configureren.
+
+BOT_HELP_INFO
+ Gebruik: INFO {kanaal | nick}
+
+ Stelt je in staat %S informatie te zien over een kanaal
+ of een bot. Als het paramenter een kanaal is krijg je bijvoorbeeld
+ informatie over kickers. Als het paramenter een nick is krijg
+ je informatie over een bot, bijvoorbeeld de tijd waarop deze
+ gemaakt is of op hoeveel kanalen deze is.
+
+BOT_HELP_SET
+ Gebruik: SET kanaal optie parameters
+
+ Stel bot opties in. optie kan zijn:
+
+ DONTKICKOPS Om ops te beschermen tegen bot kicks
+ DONTKICKVOICES Om voices te beschermen tegen bot kicks
+ GREET Zet groet-berichten aan
+ FANTASY Zet fantasie-commando's aan
+ SYMBIOSIS Stel de bot in staat te handelen als een
+ echte bot.
+
+ Type /msg %S HELP SET optie voor meer informatie over een
+ specifieke optie.
+
+ Let op: toegang tot dit commando wordt geregeld via het
+ niveau SET commando.
+
+BOT_HELP_SET_DONTKICKOPS
+ Gebruik: SET kanaal DONTKICKOPS {ON|OFF}
+
+ (De)activeer ops protectie mode op een kanaal.
+ Wanneer deze geactiveerd is zullen ops niet door de bot
+ gekicked worden, zelfs wanneer deze niet overeen komen
+ met het NOKICK niveau.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Gebruik: SET kanaal DONTKICKVOICES {ON|OFF}
+
+ (De)activeer voices protectie mode op een kanaal.
+ Wanneer deze geactiveerd is zullen voices niet door de bot
+ gekicked worden, zelfs wanneer deze niet overeen komen
+ met het NOKICK niveau.
+
+BOT_HELP_SET_FANTASY
+ Gebruik: SET kanaal FANTASY {ON|OFF}
+
+ (De)activeert fantasie mode op een kanaal.
+ Wanner het geactiveerd is zullen users de !op, !deop,
+ !voice, !devoice, !kick, !kb, !unban, en !seen commando's
+ op een kanaal kunnen gebruiken (ontdek hoe je ze moet
+ gebruiken; probeer ze allemaal met een nick, en misschien
+ sommigen met een reden?).
+
+ Let op dat de gebruikers die de fantasie-commando's willen
+ gebruiken een hoog genoeg niveau MOETEN hebben voor zowel
+ de FANTASIA en het niveau voor het commando indien vereisd.
+ Bijvoorbeeld: om !op te mogen gebruiken moet een gebruiken
+ genoeg rechten voor het OPDEOP niveau hebben.
+
+BOT_HELP_SET_GREET
+ Gebruik: SET kanaal GREET {ON|OFF}
+
+ (De)activeert greet mode op een kanaal.
+ Wanneer deze geactiveerd is zal de bot de groetberichten
+ van de gebruikers die het kanaal joinen weergegeven, mits
+ ze hiertoe rechten hebben op het kanaal.
+
+BOT_HELP_SET_SYMBIOSIS
+ Gebruik: SET kanaal SYMBIOSIS {ON|OFF}
+
+ (De)activeert symbiosis mode op een kanaal.
+ Wanneer dit is geactiveerd zal de bot alles doen wat normaal
+ foor %s wordt gedaan bij kanalen, zoals MODEs, KICKs, en
+ zelfs het welkomstbericht.
+
+BOT_HELP_KICK
+ Gebruik: KICK kanaal optie parameters
+
+ Configureer bot kickers. optie kan zijn:
+
+ BOLDS Stelt in of de bot kickt op vet
+ BADWORDS Stelt in of de bot kickt op slechte woorden
+ CAPS Stelt in of de bot kickt op hoofdletters
+ COLORS Stelt in of de bot kicks op kleuren
+ FLOOD Stelt in of de bot floodende gebruikers kickt
+ REPEAT Stelt in of de bot gebruikers kickt die
+ zichzelf herhalen
+ REVERSES Stelt in of de bot kickt op inverteringen
+ UNDERLINES Stelt in of de bot kickt op onderstrepingen
+
+ Type /msg %S HELP KICK optie voor meer informatie over
+ een specifieke optie.
+
+ Let op: toegang tot dit commando wordt gecontroleerd door
+ het niveau SET commando.
+
+BOT_HELP_KICK_BOLDS
+ Gebruik: KICK kanaal BOLDS {ON|OFF} [ttb]
+
+ Zet de vet-kicker aan of uit. Wanneer deze aan staat zal
+ de bot gebruikers kicken die vet gebruiken.
+
+ ttb is het aantal keren dat een gebruiker gekicked kan
+ worden voordat deze gebanned wordt. Geef geen ttb op om het
+ ban system uit te schakelen als deze kicker geactiveerd is.
+
+BOT_HELP_KICK_COLORS
+ Gebruik: KICK kanaal COLORS {ON|OFF} [ttb]
+
+ Zet de kleuren-kicker aan of uit. Wanneer deze aan staat
+ zal de bot gebruikers kicken die kleuren gebruiken.
+
+ ttb is het aantal keren dat een gebruiker gekicked kan
+ worden voordat deze gebanned wordt. Geef geen ttb op om het
+ ban system uit te schakelen als deze kicker geactiveerd is.
+
+BOT_HELP_KICK_REVERSES
+ Gebruik: KICK kanaal REVERSES {ON|OFF} [ttb]
+
+ Zet de inverteringen-kicker aan of uit. Wanneer deze aan
+ staat zal de bot gebruikers kicken die inverteringen
+ gebruiken.
+
+ ttb is het aantal keren dat een gebruiker gekicked kan
+ worden voordat deze gebanned wordt. Geef geen ttb op om het
+ ban system uit te schakelen als deze kicker geactiveerd is.
+
+BOT_HELP_KICK_UNDERLINES
+ Gebruik: KICK kanaal UNDERLINES {ON|OFF} [ttb]
+
+ Zet de onderstrepingen-kicker aan of uit. Wanneer deze aan
+ staat zal de bot gebruikers kicken die onderstrepingen
+ gebruiken.
+
+ ttb is het aantal keren dat een gebruiker gekicked kan
+ worden voordat deze gebanned wordt. Geef geen ttb op om het
+ ban system uit te schakelen als deze kicker geactiveerd is.
+
+BOT_HELP_KICK_CAPS
+ Gebruik: KICK kanaal CAPS {ON|OFF} [ttb [min [procent]]]
+
+ Zet de hoofdletter-kicker aan of uit. Wanneer deze aan staat
+ zal de bot gebruikers kicken die HOOFDLETTERS gebruiken.
+
+ De bot kickt alleen als er minstens min hoofdletters in
+ de zin staan en deze minstens procent%% van de totale
+ regel bevatten (indien niet gegeven, staat dit standaard op
+ 10 hoofdletters en 25%%).
+
+ ttb is het aantal keren dat een gebruiker gekicked kan
+ worden voordat deze gebanned wordt. Geef geen ttb op om het
+ ban system uit te schakelen als deze kicker geactiveerd is.
+
+BOT_HELP_KICK_FLOOD
+ Gebruik: KICK kanaal FLOOD {ON|OFF} [ttb [regels [seconden]]]
+
+ Zet de flood-kicker aan of uit. Wanneer deze aan staat zal
+ de bot gebruikers kicken die het kanaal flooden met minstens
+ regels regels in seconden seconden. (indien niet gegeven,
+ staat dit standaard op 6 regels in 10 seconden).
+
+ ttb is het aantal keren dat een gebruiker gekicked kan
+ worden voordat deze gebanned wordt. Geef geen ttb op om het
+ ban system uit te schakelen als deze kicker geactiveerd is.
+
+BOT_HELP_KICK_REPEAT
+ Gebruik: KICK kanaal REPEAT {ON|OFF} [ttb [nr]]
+
+ Zet de herhalings-kicker aan of uit. Wanneer deze aan staat
+ zal de bot gebruikers kicken die zichzelf nr keer herhalen
+ (als nr niet is gegeven staat die standaard op 3).
+
+ ttb is het aantal keren dat een gebruiker gekicked kan
+ worden voordat deze gebanned wordt. Geef geen ttb op om het
+ ban system uit te schakelen als deze kicker geactiveerd is.
+
+BOT_HELP_KICK_BADWORDS
+ Gebruik: KICK kanaal BADWORDS {ON|OFF} [ttb]
+
+ Zet de slechte-woorden-kicker aan of uit. Wanneer deze aan
+ staat zal de bot gebruikers kicken die bepaald slechte
+ woorden op het kanaal zeggen.
+
+ Je kan de slechte woorden voor je kanaal instellen met het
+ BADWORDS commando. Type /msg %S HELP BADWORDS voor
+ meer informatie.
+
+ ttb is het aantal keren dat een gebruiker gekicked kan
+ worden voordat deze gebanned wordt. Geef geen ttb op om het
+ ban system uit te schakelen als deze kicker geactiveerd is.
+
+BOT_HELP_BADWORDS
+ Gebruik: BADWORDS kanaal ADD woord [SINGLE | START | END]
+ BADWORDS kanaal DEL {woord | entry-nr | lijst}
+ BADWORDS kanaal LIST [mask | lijst]
+ BADWORDS kanaal CLEAR
+
+ Beheert de slechte woorden lijst voor een kanaal. De
+ slechte woorden lijst bepaalt voor welke woorden wordt
+ gekicked als de slechte-woorden-kicker aan staat. Voor
+ meer informatie, type /msg %S HELP KICK BADWORDS.
+
+ Het BADWORDS ADD commando voegt het gegeven woord toe aan
+ de slechte woorden lijst. Als SINGLE is gespecificeerd zal
+ alleen worden gekicked als de gebruiker het gehele woord zegt.
+ Als START is gespecificeerd zal allen gekicked worden als de
+ gebruiker een woord zegt dat begint met woord. Als END is
+ gespecificeerd zal alleen gekicked worden als de gebruiker
+ een woord zegt dat eindigt op woord. Als er niks
+ gespecificeerd is zal er elke keer dat woord gezegd wordt
+ door een gebruiker gekicked worden.
+
+ Het BADWORDS DEL commando verwijdert het gegeven woord van
+ de slechte woorden lijst. Als een lijst van entry-nummers is
+ gegeven worden die verwijderd. (Zie het voorbeeld bij LIST
+ hier onder.)
+
+ Het BADWORDS LIST commando geeft de slechte woorden lijst
+ weer. Als een mask met een * is gegeven worden alleen de
+ slechte woorden die overeenkomen met het mask weergegeven.
+ Als een lijst van entry-nummers is gegeven worden alleen
+ die weergegeven. Bijvoorbeeld:
+
+ BADWORDS #kanaa; LIST 2-5,7-9
+ Geeft slechte woorden 2 t/m 5 en 7 t/m 9 weer.
+
+ Het BADWORDS CLEAR commando maakt de slechte woorden
+ lijst leeg.
+
+BOT_HELP_SAY
+ Gebruik: SAY kanaal tekst
+
+ Laat de bot de gegeven tekst op het gegeven kanaal zeggen.
+
+BOT_HELP_ACT
+ Gebruik: ACT kanaal tekst
+
+ Laat de bot een "/me" commando doen op het gegeven kanaal
+ met de gegeven tekst.
+
+BOT_SERVADMIN_HELP
+
+ Het volgende commando is beschikbaar voor Services administrators:
+
+ BOT Beheer de lijst met bots op het netwerk
+
+BOT_SERVADMIN_HELP_BOT
+ Gebruik: BOT ADD nick gebruiker host echte naam
+ BOT CHANGE oldnick newnick [gebruiker [host [echte naam]]]
+ BOT DEL nick
+ BOT LIST
+
+ Stelt Services administrators in staat om bots te maken,
+ wijzigen en verwijderen die gebruikers op hun eigen kanaal
+ kunnen gebruiken.
+
+ BOT ADD voegt een bot toe met de gegeven nickname,
+ gebruikersnaam, host en echte naam. De paramenters worden
+ niet nagekeken of ze correct zijn, dus pas op.
+ BOT CHANGE kan de nick, gebruikersnaam, host of echte
+ naam van een bot veranderen zonder deze (en de date die
+ met de bot geassocieerd is) te verwijderen.
+ BOT DEL verwijdert de gegeven bot van de bot lijst.
+ BOT LIST is een synoniem van BOTLIST en geeft gewoon
+ alle beschikbare bots op het netwerk weer.
+
+ Let op: Als je een bot maakt die een nick heeft die momenteel
+ in gebruiker is zal de betreffende gebruiker worden gekilled.
+ Als de nick geregistreerd is, wordt deze gedropped.
+
+BOT_SERVADMIN_HELP_SET
+
+ Deze opties zijn gereserveerd voor Services administrators:
+
+ NOBOT Zorg dat een bot niet aan een kanaal kan
+ worden toegevoegd
+ PRIVATE Zorg dat een bot alleen door IRC operators
+ kan worden toegevoegd
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Gebruik: SET kanaal NOBOT {ON|OFF}
+
+ Deze optie zorgt ervoor dat een kanaal geen bot kan hebben.
+ Als er al een bot aan het kanaal is toegewezen wordt deze
+ automatisch van het kanaal gehaald wanneer je deze optie
+ aan zet.
+
+ Gelimiteerd tot Services admins.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Gebruik: SET bot-nick PRIVATE {ON|OFF}
+
+ Deze optie szorgt ervoor dat een bot niet kan worden
+ toegewezen aan een kanaal door gebruikers die geen
+ IRC operator zijn.
+
+ Gelimiteerd tot Services admins.
+
+###########################################################################
+#
+# HostServ messages
+#
+###########################################################################
+HOST_EMPTY
+ De vhost lijst is leeg.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ vhost voor %s gezet op %s.
+HOST_IDENT_SET
+ vhost voor %s gezet op %s@%s.
+HOST_SETALL
+ vhost voor groep %s gezet op %s.
+HOST_DELALL
+ vhosts voor group %s zijn verwijderd.
+HOST_DELALL_SYNTAX
+ Gebruik: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost voor groep %s gezet op %s@%s.
+HOST_SET_ERROR
+ Een vhost moet in een geldig hostmask formaat zijn.
+HOST_SET_IDENT_ERROR
+ Een vhost ident moet in een geldig ident formaat zijn.
+HOST_SET_TOOLONG
+ Fout! De vhost is te lang. Gebruik een host die korter is dan %d tekens.
+HOST_SET_IDENTTOOLONG
+ Fout! De ident is te lang. Gebruik een ident die korter is dan %d tekens.
+HOST_NOREG
+ Gebruiker %s niet gevonden in de nickserv database.
+HOST_SET_SYNTAX
+ Gebruik /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Gebruik /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Toegang geweigerd.
+HOST_NOT_ASSIGNED
+ Neem contact op met een Operator om een vhost aan deze nick te binden.
+HOST_ACTIVATED
+ Je vhost van %s is nu geactiveerd.
+HOST_IDENT_ACTIVATED
+ Je vhost van %s@%s is nu geactiveerd.
+HOST_ID
+ Identificeer eerst bij Services.
+HOST_NOT_REGED
+ Je moet je eerst registreren voordat een vhost aan je nick kan worden gebonden.
+HOST_DEL
+ vhost voor %s verwijderd.
+HOST_DEL_SYNTAX
+ Gebruik: /msg %s del <nick>.
+HOST_OFF_UNREAL
+ Je vhost is verwijderd. Om standaard host verberging weer aan te schakelen, type je /mode %s +x
+HOST_NO_VIDENT
+ Je IRCD ondersteund geen vIdent's. Als dit niet klopt, rapporteer dit dan als een mogelijke bug
+HOST_GROUP
+ Alle vhost's in de groep %s zijn ingesteld op %s
+HOST_IDENT_GROUP
+ Alle vhost's in de groep %s zijn ingesteld op %s@%s
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_LIST_FOOTER
+ Alle records zijn weergegeven (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Alle records getoond van %d tot %d
+HOST_LIST_KEY_FOOTER
+ Alle records getoond met overeenkomende key %s (Count: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ %S commando'ss:
+ ON Activeert je toegewezen vhost
+ OFF Deactiveert je toegewezen vhost
+ GROUP Stelt de vhost voor all nicks in een groep gelijk
+
+HOST_OPER_HELP
+ Commando's beschikbaar voor Services operators:
+ SET Stel de vhost van een andere gebruiker in
+ SETALL Stel de vhost voor alle nicks in een groep in
+ DEL Verwijder de vhost van een andere gebruiker
+ DELALL Verwijder de vhost voor alle nicks in een groep
+ LIST Geeft een of meer vhosts weer.
+
+HOST_ADMIN_HELP
+ Commando's beschikbaar voor Services administrators:
+
+HOST_HELP_ON
+ Gebruik: ON
+
+ Activeert de vhost die momenteel toegewezen is aan de nick
+ die je gebruikt. Als je dit commando uitvoert zal elke
+ gebruiker die een /whois op je doet de vhost zien in plaats
+ van je echte hostname.
+
+HOST_HELP_SET
+ Gebruik: SET <nick> <hostmask>.
+
+ Stelt de vhost voor de gegeven nick in op de vhost die je
+ meegegeven heeft. Als de IRCD vIdent's ondersteund kun je
+ ook SET <nick> <ident>@<hostmask> gebruiken om de ident
+ voor een gebruiker aan te passen gelijk met de hostname.
+
+ Gelimiteerd tot Services operators.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Verwijderd de vhost voor alle nick's in dezelfde groep
+ als de gegeven nick.
+
+ Gelimiteerd tot Host Removers.
+
+
+HOST_HELP_SETALL
+ Gebruik: SETALL <nick> <hostmask>.
+
+ Stelt de vhost voor alle nicks in dezelfde groep als de
+ gegeven nick in. Als de IRCD vIdent's ondersteund kun je
+ ook SET <nick> <ident>@<hostmask> gebruiken om de ident
+ voor gebruikers aan te passen gelijk met de hostname.
+
+ * LET OP, dit wijzigt niet de vhost voor elke nick lid
+ wordt van de groep nadat dit commando is gebruikt.
+
+ Gelimiteerd tot Services operators.
+
+HOST_HELP_OFF
+ Gebruik: OFF
+
+ Deactiveert de vhost die moementeel toegewezen is aan de nick
+ die je gebruikt. Als je dit commando uitvoert zal elke
+ gebruiker die een /whois op je doet je echte hostname zien
+ in plaats van je vhost.
+
+HOST_HELP_DEL
+ Gebruik: DEL <nick>
+
+ Verwijdert de vhost die toegewezen is aan de gegeven nick
+ uit de database.
+
+ Gelimiteerd tot Services operators.
+
+HOST_HELP_LIST
+ Gebruik: LIST [<nick>|<vhost>]
+
+ Dit commando geeft alle geregistreerde vhosts weer. Als je
+ een nick of vhost meegeeft zulleen alleen die nick/vhost
+ worden weergegeven. LET OP: er is momenteel geen flood-
+ bescherming voor grote databases.
+
+ Gelimiteerd tor Services admins.
+
+HOST_HELP_GROUP
+ Gebruik: GROUP
+
+ Dit commando stelt gebruikers in staat de vhost van hun
+ HUIDIGE nick de vhost van alle nicks in de zelfde groep te
+ laten zijn.
+
diff --git a/lang/obs.pl b/lang/obs.pl
new file mode 100755
index 000000000..305351648
--- /dev/null
+++ b/lang/obs.pl
@@ -0,0 +1,129 @@
+#!/usr/bin/perl
+#
+# Checks a language file against the reference language (en_us), and
+# finds #define string diferences
+#
+my $srcfile = $ARGV[0];
+my $engfile = "en_us.l";
+my %is_there= ();
+my $pos=0;
+my $wc=0;
+my $edef="";
+my $sdef="";
+
+my @efile;
+my @sfile;
+my @defs;
+
+sub error {
+
+ my $msg = shift ;
+ print "*** Error: $msg \n";
+ exit ;
+}
+
+sub not_del {
+ $line = shift;
+ if ($is_there{$line}) {
+ return 1;
+ } else {
+ return 0;
+ }
+
+}
+
+sub get_format {
+ my $fmt="";
+
+ my $str=shift;
+
+ while ($str =~ m/%\w/g) {
+ $fmt .= $&;
+ }
+
+ return $fmt;
+}
+
+# Could not think of a worse of doing this...
+sub get_def {
+ my $ndef;
+ my $start=0;
+ my $found=0;
+
+ $buf = shift;
+ $def = shift;
+ for (@$buf) {
+ my $line = $_;
+ chomp $line;
+
+ if (/^[A-Z]/) {
+ $start=0;
+ last if $found;
+ }
+
+ if ($start) {
+ $found=1;
+ $ndef.=$_;
+ }
+
+ if ($line eq $def) {
+ $start=1;
+ }
+
+ }
+ return $ndef;
+}
+
+error("Usage $0 [lang.l]") unless ($srcfile);
+error("Can't find language file: $srcfile") if (! -f $srcfile);
+error("Can't find language file: $engfile") if (! -f $engfile);
+
+open (EFILE, "< $engfile");
+while (<EFILE>) {
+ my $line = $_;
+ push(@efile, $line);
+ chomp $line;
+ if (/^[A-Z]/) {
+ $wc = push (@defs, $line);
+ $is_there{$line} = 1;
+ }
+}
+close(EFILE);
+
+open (SFILE, "< $srcfile");
+while (<SFILE>) {
+ push(@sfile, $_);
+}
+close(SFILE);
+
+#for (@defs) {
+# $is_there{$_} = 1;
+#}
+
+for (@sfile) {
+ my $line = $_;
+ chomp $line;
+ if (/^[A-Z]/) {
+ if (not_del($line)) {
+ while ($line ne $defs[$pos]) {
+ print "ADD: $defs[$pos]\n";
+ $pos++;
+ }
+ if (! /^STRFTIME/ ) {
+ $edef = get_format(get_def(\@efile, $line)) ;
+ $sdef = get_format(get_def(\@sfile, $line)) ;
+ if ( $edef ne $sdef ) {
+ print "FORMAT: $line (expecting '$edef' and got '$sdef')\n";
+ }
+ }
+ $pos++;
+ } else {
+ print "DEL: $line\n";
+ }
+ }
+}
+
+for($pos ; $pos < $wc; $pos++) {
+ print "ADD: $defs[$pos]\n";
+}
+
diff --git a/lang/pt.l b/lang/pt.l
new file mode 100644
index 000000000..82a265781
--- /dev/null
+++ b/lang/pt.l
@@ -0,0 +1,5804 @@
+# Portuguese language file.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ Português (Portuguese)
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %d %b %H:%M:%S %Y %Z
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %d %b %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %d %b %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Dom
+ Seg
+ Ter
+ Qua
+ Qui
+ Sex
+ Sab
+# %A
+STRFTIME_DAYS_LONG
+ Domingo
+ Segunda
+ Terça
+ Quarta
+ Quinta
+ Sexta
+ Sábado
+# %b
+STRFTIME_MONTHS_SHORT
+ Jan
+ Fev
+ Mar
+ Abr
+ Mai
+ Jun
+ Jul
+ Ago
+ Set
+ Out
+ Nov
+ Dez
+# %B
+STRFTIME_MONTHS_LONG
+ Janeiro
+ Fevereiro
+ Março
+ Abril
+ Maio
+ Junho
+ Julho
+ Agosto
+ Setembro
+ Outubro
+ Novembro
+ Dezembro
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Erro interno - não foi possível processar seu pedido.
+UNKNOWN_COMMAND
+ Comando desconhecido: %s.
+UNKNOWN_COMMAND_HELP
+ Comando desconhecido %s. "/msg %s HELP" para ajuda.
+SYNTAX_ERROR
+ Sintaxe: %s
+MORE_INFO
+ /msg %s HELP %s para maiores informações.
+NO_HELP_AVAILABLE
+ Nenhuma ajuda disponível para %s.
+OBSOLETE_COMMAND
+ Este comando não é mais usado; use %s.
+
+BAD_USERHOST_MASK
+ A máscara deve ser no formato user@host.
+BAD_EXPIRY_TIME
+ Tempo de expiração inválido.
+USERHOST_MASK_TOO_WIDE
+ Máscara %s é muito grande; por favor seja mais específico.
+
+SERVICE_OFFLINE
+ %s não está conectado no momento.
+READ_ONLY_MODE
+ Atenção: Os services estão no modo leitura apenas; as mudanças não serão salvas!
+PASSWORD_INCORRECT
+ Senha incorreta.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Acesso negado.
+PERMISSION_DENIED
+ Permissão negada.
+RAW_DISABLED
+ A opção RAW ha sido desabilitada. Se realmente precisar deve habilitar a opção DisableRaw na configuração dos Servicos.
+
+MORE_OBSCURE_PASSWORD
+ Por favor tente novamente com uma senha mais difícil. Não use TAB ou espaços.
+PASSWORD_TRUNCATED
+ Atenção: Sua senha foi reduzida a %d caracteres.
+
+NICK_NOT_REGISTERED
+ Seu nick não está registrado.
+NICK_NOT_REGISTERED_HELP
+ Seu nick não está registrado. Digite /msg %s HELP para maiores informações sobre como registrar o nick.
+NICK_X_NOT_REGISTERED
+ Nick %s não está registrado.
+NICK_X_IN_USE
+ Nick %s is currently in use.
+NICK_X_NOT_IN_USE
+ Nick %s não está sendo usado.
+NICK_X_NOT_ON_CHAN
+ %s is not currently on channel %s.
+NICK_X_FORBIDDEN
+ Nick %s não pode ser registrado ou usado.
+NICK_X_FORBIDDEN_OPER
+ Nick %s foi bloqueado por %s:
+ %s
+NICK_X_ILLEGAL
+ Nick %s is an illegal nickname and cannot be used.
+NICK_X_TRUNCATED
+ Nick %s was truncated to %d characters.
+CHAN_X_NOT_REGISTERED
+ O canal %s não está registrado.
+CHAN_X_NOT_IN_USE
+ O canal %s não existe.
+CHAN_X_FORBIDDEN
+ O canal %s não pode ser registrado ou usado.
+CHAN_X_FORBIDDEN_OPER
+ Canal %s foi bloqueado por %s:
+ %s
+CHAN_X_SUSPENDED
+ Suspended: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Identificação de senha requerida para usar este comando.
+ Tente novamente após digitar /msg %s IDENTIFY senha.
+CHAN_IDENTIFY_REQUIRED
+ Identificação de senha requerida para usar este comando.
+ Tente novamente após digitar /msg %s IDENTIFY %s senha.
+
+MAIL_DISABLED
+ Os services foram configurados para não enviar e-mail.
+MAIL_INVALID
+ E-mail para %s é inválido.
+MAIL_X_INVALID
+ %s não é um endereço de e-mail válido.
+MAIL_LATER
+ Não foi possível enviar e-mail agora; tente novamente mais tarde.
+MAIL_DELAYED
+ Por favor aguarde %d segundos e tente novamente.
+
+NO_REASON
+ Sem motivo
+UNKNOWN
+ <desconhecido>
+
+# Duration system
+DURATION_DAY
+ 1 dia
+DURATION_DAYS
+ %d dias
+DURATION_HOUR
+ 1 hora
+DURATION_HOURS
+ %d horas
+DURATION_MINUTE
+ 1 minuto
+DURATION_MINUTES
+ %d minutos
+DURATION_SECOND
+ 1 segundo
+DURATION_SECONDS
+ %d segundos
+
+# Human readable expiration
+NO_EXPIRE
+ não expira
+EXPIRES_SOON
+ irá expirar na próxima atualização do banco de dados
+EXPIRES_M
+ expira em %d minutos
+EXPIRES_1M
+ expira em %d minuto
+EXPIRES_HM
+ expira em %d horas, %d minutos
+EXPIRES_H1M
+ expira em %d horas, %d minuto
+EXPIRES_1HM
+ expira em %d hora, %d minutos
+EXPIRES_1H1M
+ expira em %d hora, %d minuto
+EXPIRES_D
+ expira em %d dias
+EXPIRES_1D
+ expira em %d dia
+
+# Generic Footer message
+END_OF_ANY_LIST
+ End of %s list.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Este nick foi registrado por outra pessoa. Por favor escolha outro.
+ (Se este for seu nick, digite /msg %s IDENTIFY senha.)
+NICK_IS_SECURE
+ Este nick está registrado e protegido. Se este for seu
+ nick, digite /msg %s IDENTIFY senha. Caso contrário,
+ por favor escolha outro nick.
+NICK_MAY_NOT_BE_USED
+ Este nick não pode ser usado. Por favor escolha outro.
+FORCENICKCHANGE_IN_1_MINUTE
+ Se você não mudar seu nick em 1 minuto, eu irei mudá-lo.
+FORCENICKCHANGE_IN_20_SECONDS
+ Se você não mudar seu nick em 20 segundos, eu irei mudá-lo.
+FORCENICKCHANGE_NOW
+ Este nick é registrado; você não pode usá-lo.
+FORCENICKCHANGE_CHANGING
+ Seu nick está sendo mudado para %s.
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER senha [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER senha email
+NICK_REGISTRATION_DISABLED
+ Desculpe, registros de nick estão temporariamente desativados.
+NICK_REGISTRATION_FAILED
+ Desculpe, registro de nick falhou.
+NICK_REG_PLEASE_WAIT
+ Por favor espere %d segundos antes de usar o comando REGISTER novamente.
+NICK_CANNOT_BE_REGISTERED
+ O nick %s não pode ser registrado.
+NICK_ALREADY_REGISTERED
+ O nick %s já está registrado!
+NICK_REGISTERED
+ O nick %s foi registrado em sua conta: %s
+NICK_PASSWORD_IS
+ Sua senha é %s - guarde ela para uso posterior.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP alvo senha
+NICK_GROUP_DISABLED
+ Desculpe, o comando GROUP está temporariamente desativado.
+NICK_GROUP_FAILED
+ Desculpe, o comando GROUP falhou.
+NICK_GROUP_PLEASE_WAIT
+ Por favor espere %d segundos antes de usar o comando GROUP novamente.
+NICK_GROUP_CHANGE_DISABLED
+ Seu nick já está registrado; digite /msg %s DROP primeiro.
+NICK_GROUP_SAME
+ Você já é um membro do grupo %s.
+NICK_GROUP_TOO_MANY
+ There are too many nicks in %s's group; list them and drop some.
+ Type /msg %s HELP GLIST and /msg %s HELP DROP
+ for more information.
+NICK_GROUP_JOINED
+ Você é agora um membro do grupo %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY senha
+NICK_IDENTIFY_FAILED
+ Desculpe, a identificação falhou.
+NICK_IDENTIFY_SUCCEEDED
+ Senha aceita - você está agora reconhecido.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Você deve agora setar um e-mail para seu nick.
+ Este e-mail permitirá que você receba sua senha por ele
+ caso você se esqueça dela.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Digite /msg %S SET EMAIL e-mail para setar seu e-mail.
+ Sua privacidade é respeitada; seu e-mail não será dado
+ para terceiros.
+
+# LOGOUT responses
+NICK_ALREADY_IDENTIFIED
+ You are already identified.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status updated (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Seu nick foi desconectado.
+NICK_LOGOUT_X_SUCCEEDED
+ O nick %s foi desconectado.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ Can't logout %s because he's a services administrator.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Desculpe, o comando DROP está temporariamente desativado.
+NICK_DROPPED
+ O registro do seu nick foi cancelado.
+NICK_X_DROPPED
+ O nick %s foi desregistrado.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET opções parâmetros
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] opções parâmetros
+NICK_SET_DISABLED
+ Desculpe, a opção SET está temporariamente desativada.
+NICK_SET_UNKNOWN_OPTION
+ Opção SET desconhecida: %s.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ Opção SET desconhecida: %s, ou nick não registrado.
+NICK_SET_OPTION_DISABLED
+ Opção %s não pode ser usada nesta Rede.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ O novo display deve ser um nick do seu grupo!
+NICK_SET_DISPLAY_CHANGED
+ O novo display é agora %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Desculpe, não foi possível alterar a senha.
+NICK_SET_PASSWORD_CHANGED
+ Senha alterada.
+NICK_SET_PASSWORD_CHANGED_TO
+ Senha alterada para %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE número
+NICK_SET_LANGUAGE_UNKNOWN
+ Número de linguagem desconhecida %d. Digite /msg %s HELP SET LANGUAGE para uma lista das linguagens disponíveis.
+NICK_SET_LANGUAGE_CHANGED
+ Linguagem alterada para Português.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL alterada para %s.
+NICK_SET_URL_UNSET
+ URL removida.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ E-mail alterado para %s.
+NICK_SET_EMAIL_UNSET
+ E-mail removido.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ Você não pode remover o e-mail nessa Rede.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ Número de ICQ alterado para %s.
+NICK_SET_ICQ_UNSET
+ Número de ICQ removido.
+NICK_SET_ICQ_INVALID
+ %s não é um número válido.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Mensagem de entrada alterada para %s.
+NICK_SET_GREET_UNSET
+ Mensagem de entrada removida.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ Proteção de KILL está agora ATIVADA.
+NICK_SET_KILL_QUICK
+ Proteção de KILL está agora ATIVADA, com tempo de espera reduzido.
+NICK_SET_KILL_IMMED
+ Proteção de KILL está agora ATIVADA, sem tempo de espera.
+NICK_SET_KILL_IMMED_DISABLED
+ O comando IMMED não está disponível nesta Rede.
+NICK_SET_KILL_OFF
+ Proteção de KILL está agora DESATIVADA.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ Opção SECURE está agora ATIVADA.
+NICK_SET_SECURE_OFF
+ Opção SECURE está agora DESATIVADA.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ Opção PRIVATE está agora ATIVADA.
+NICK_SET_PRIVATE_OFF
+ Opção PRIVATE está agora DESATIVADA.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Seu e-mail está agora escondido do comango %s INFO.
+NICK_SET_HIDE_EMAIL_OFF
+ Seu e-mail irá agora aparecer no comando %s INFO.
+NICK_SET_HIDE_MASK_ON
+ Seu último endereço usado (user@host) está agora escondido do comando %s INFO.
+NICK_SET_HIDE_MASK_OFF
+ Seu último endereço usado (user@host) irá agora aparecer no comando %s INFO.
+NICK_SET_HIDE_QUIT_ON
+ Sua última mensagem de saída está agora escondida do comando %s INFO.
+NICK_SET_HIDE_QUIT_OFF
+ Sua última mensagem de saída irá agora aparecer no comando %s INFO.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Os services irão agora respondê-lo através de mensagens.
+NICK_SET_MSG_OFF
+ Os services irão agora respondê-lo através de notices.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nic] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ O nick %s não irá expirar.
+NICK_SET_NOEXPIRE_OFF
+ O nick %s irá expirar.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mask]
+NICK_ACCESS_ALREADY_PRESENT
+ A máscara %s já se encontra em sua lista de acesso.
+NICK_ACCESS_REACHED_LIMIT
+ Desculpe, você pode ter somente %d entradas em sua lista de acesso.
+NICK_ACCESS_ADDED
+ %s adicionado em sua lista de acesso.
+NICK_ACCESS_NOT_FOUND
+ %s não foi encontrado em sua lista de acesso.
+NICK_ACCESS_DELETED
+ %s removido da sua lista de acesso.
+NICK_ACCESS_LIST
+ Lista de acesso:
+NICK_ACCESS_LIST_X
+ Lista de acesso para %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s é %s
+NICK_INFO_SERVICES_OPER
+ %s é um Operador dos Services.
+NICK_INFO_SERVICES_ADMIN
+ %s é um Admin dos Services.
+NICK_INFO_ADDRESS
+ Último endereço visto: %s
+NICK_INFO_ADDRESS_ONLINE
+ está online em: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s está online neste momento.
+NICK_INFO_TIME_REGGED
+ Hora de registro: %s
+NICK_INFO_LAST_SEEN
+ Ultimo horário visto: %s
+NICK_INFO_LAST_QUIT
+ Última mensagem de saída: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ E-mail: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ ICQ: %d
+NICK_INFO_GREET
+ Mensagem de entrada: %s
+NICK_INFO_OPTIONS
+ Opções: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Proteção
+NICK_INFO_OPT_SECURE
+ Segurança
+NICK_INFO_OPT_PRIVATE
+ Privado
+NICK_INFO_OPT_MSG
+ Modo mensagem
+NICK_INFO_OPT_NONE
+ Nenhuma
+NICK_INFO_NO_EXPIRE
+ Este nick não irá expirar.
+NICK_INFO_FOR_MORE
+ Para maiores informações sobre o usuário, digite /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST opções
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST opções [FORBIDDEN] [NOEXPIRE]
+NICK_LIST_HEADER
+ Lista de entradas com %s:
+NICK_LIST_RESULTS
+ Fim da listagem - %d/%d resultados mostrados.
+
+# GLIST responses
+NICK_ALIST_SYNTAX
+ ALIST nickname
+NICK_ALIST_HEADER
+ Channels that you have access on:
+ Num Channel Level Description
+NICK_ALIST_HEADER_X
+ Channels that %s has access on:
+ Num Channel Level Description
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ Fim da listagem - %d/%d resultados mostrados.
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Lista de nicks no grupo:
+NICK_GLIST_HEADER_X
+ Lista de nicks no grupo %s:
+NICK_GLIST_FOOTER
+ %d nicks no grupo.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nick [senha]
+NICK_NO_RECOVER_SELF
+ Você não pode usar o comando RECOVER em si mesmo!
+NICK_RECOVERED
+ Usuário que usava seu nick foi derrubado.
+ /msg %s RELEASE %s para liberar seu nick antes de um minuto.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nick [senha]
+NICK_RELEASE_NOT_HELD
+ Nick %s não está em uso no momento.
+NICK_RELEASED
+ Seu nick foi derrubado e pode ser usado.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nick [senha]
+NICK_NO_GHOST_SELF
+ Você não pode usar o comando GHOST em si mesmo!
+NICK_GHOST_KILLED
+ Seu nick foi derrubado e pode ser usado.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nick
+NICK_GETPASS_UNAVAILABLE
+ Comando GETPASS não disponível: modo de encriptação ativado.
+NICK_GETPASS_PASSWORD_IS
+ Senha para %s é %s.
+
+# SENDPASS responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host No WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails Match %s to %s.
+NICK_GETEMAIL_NOT_USED
+ No Emails listed for %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nick
+NICK_SENDPASS_UNAVAILABLE
+ Comando SENDPASS não disponível: modo de encriptação ativado.
+NICK_SENDPASS_SUBJECT
+ Senha do nick (%s)
+NICK_SENDPASS_HEAD
+ Olá,
+NICK_SENDPASS_LINE_1
+ Você pediu para que a senha do nick %s fosse enviada por e-mail.
+NICK_SENDPASS_LINE_2
+ A senha é %s. Por motivos de segurança, recomendamos que você mude sua senha após ler este e-mail.
+NICK_SENDPASS_LINE_3
+ Se você não souber porque este e-mail lhe foi enviado, por favor ignore-o.
+NICK_SENDPASS_LINE_4
+ NÃO RESPONDA ESTE E-MAIL!
+NICK_SENDPASS_LINE_5
+ Administradores do %s.
+NICK_SENDPASS_OK
+ Senha para %s foi enviada.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nick [motivo]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nick motivo
+NICK_FORBID_SUCCEEDED
+ Nick %s está agora bloqueado.
+NICK_FORBID_FAILED
+ Não foi possível bloquear o nick %s!
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+NICK_REQUESTED
+ This nick has already been requested, please check your e-mail address for the pass code
+NICK_REG_RESENT
+ Your passcode has been re-sent to %s.
+NICK_REG_UNABLE
+ Nick NOT registered, please try again later.
+NICK_IS_PREREG
+ This nick is awaiting an e-mail verification code before completing registration.
+NICK_ENTER_REG_CODE
+ A passcode has been sent to %s, please type /msg %s confirm <passcode> to complete registration
+NICK_CONFIRM_NOT_FOUND
+ Registration step 1 may have expired, please use "/msg %s register <password> <email>" first.
+NICK_CONFIRM_INVALID
+ Invalid passcode has been entered, please check the e-mail again, and retry
+NICK_REG_MAIL_SUBJECT
+ Nickname Registration (%s)
+NICK_REG_MAIL_HEAD
+ Hi,
+NICK_REG_MAIL_LINE_1
+ You have requested to register the following nickname %s.
+NICK_REG_MAIL_LINE_2
+ Please type " /msg %s confirm %s " to complete registration.
+NICK_REG_MAIL_LINE_3
+ If you don't know why this mail is sent to you, please ignore it silently.
+NICK_REG_MAIL_LINE_4
+ PLEASE DON'T ANSWER TO THIS MAIL!
+NICK_REG_MAIL_LINE_5
+ %s administrators.
+NICK_GETPASS_PASSCODE_IS
+ Passcode for %s is %s.
+NICK_FORCE_REG
+ Nickname %s confirmed
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Modo +o automático
+CHAN_LEVEL_AUTOVOICE
+ Modo +v automático
+CHAN_LEVEL_AUTOHALFOP
+ Modo +h automático
+CHAN_LEVEL_AUTOPROTECT
+ Modo +a automático
+CHAN_LEVEL_AUTODEOP
+ Modo -o automático
+CHAN_LEVEL_NOJOIN
+ Entrada no canal não permitida se a opção RESTRICTED estiver ativada
+CHAN_LEVEL_INVITE
+ Permitido o uso do comando INVITE
+CHAN_LEVEL_AKICK
+ Permitido o uso do comando AKICK
+CHAN_LEVEL_SET
+ Permitido o uso do comando SET (não inclui FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ Permitido o uso do comando CLEAR
+CHAN_LEVEL_UNBAN
+ Permitido o uso do comando UNBAN
+CHAN_LEVEL_OPDEOP
+ Permitido o uso do comando OP/DEOP
+CHAN_LEVEL_ACCESS_LIST
+ Permitido visualizar a lista de acesso
+CHAN_LEVEL_ACCESS_CHANGE
+ Permitido modificar a lista de acesso
+CHAN_LEVEL_MEMO
+ Permitido listar/ler memos do canal
+CHAN_LEVEL_ASSIGN
+ Permitido associar/desassociar um bot à um canal
+CHAN_LEVEL_BADWORDS
+ Permitido o uso do comando BADWORDS
+CHAN_LEVEL_NOKICK
+ Nunca ser kickado pelos kickers do bot
+CHAN_LEVEL_FANTASIA
+ Permitido o uso do comando FANTASIA
+CHAN_LEVEL_SAY
+ Permitido o uso dos comandos SAY e ACT
+CHAN_LEVEL_GREET
+ Mensagem de entrada
+CHAN_LEVEL_VOICEME
+ Permitido usar o comando (de)voice em si mesmo
+CHAN_LEVEL_VOICE
+ Permitido o uso dos comandos VOICE/DEVOICE
+CHAN_LEVEL_GETKEY
+ Permitido o uso do comando GETKEY
+CHAN_LEVEL_OPDEOPME
+ Permitido usar o comando (de)op em si mesmo
+CHAN_LEVEL_HALFOPME
+ Permitido usar o comando (de)halfop em si mesmo
+CHAN_LEVEL_HALFOP
+ Permitido o uso dos comandos HALFOP/DEHALFOP
+CHAN_LEVEL_PROTECTME
+ Permitido usar o comando (de)protect em si mesmo
+CHAN_LEVEL_PROTECT
+ Permitido o uso dos comandos PROTECT/DEPROTECT
+CHAN_LEVEL_KICKME
+ Permitido usar o comando KICK em si mesmo
+CHAN_LEVEL_KICK
+ Permitido o uso do comando KICK
+CHAN_LEVEL_SIGNKICK
+ Sem assinatura no kick quando a opção SIGNKICK LEVEL estiver em uso
+
+# Automatic responses
+CHAN_LEVEL_BANME
+ Allowed to ban him/herself
+CHAN_LEVEL_BAN
+ Allowed to use BAN command
+CHAN_LEVEL_TOPIC
+ Allowed to use TOPIC command
+CHAN_LEVEL_INFO
+ Allowed to use INFO command with ALL option
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Este canal foi registrado com o %s.
+CHAN_NOT_ALLOWED_OP
+ Você não tem permissão para ser operador no canal %s.
+CHAN_MAY_NOT_BE_USED
+ Este canal não pode ser usado.
+CHAN_NOT_ALLOWED_TO_JOIN
+ Você não tem permissão para permanecer neste canal.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER canal senha descrição
+CHAN_REGISTER_DISABLED
+ Desculpe, o registro de canais está temporariamente desativado.
+CHAN_REGISTER_NOT_LOCAL
+ Canais locais não podem ser registrados.
+CHAN_MUST_REGISTER_NICK
+ Você deve registrar seu nick primeiro. Digite /msg %s HELP para maiores informações sobre registro de nick.
+CHAN_MUST_IDENTIFY_NICK
+ Por favor se identifique com o %s primeiro, usando o comando:
+ /msg %s IDENTIFY senha
+CHAN_MAY_NOT_BE_REGISTERED
+ O canal %s não pode ser registrado.
+CHAN_ALREADY_REGISTERED
+ O canal %s já está registrado!
+CHAN_MUST_BE_CHANOP
+ Você deve ser no mínimo um operador para registrar o canal.
+CHAN_REACHED_CHANNEL_LIMIT
+ Desculpe, você já alcançou o limite de %d canais registrados.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Desculpe, você já ultrapassou o limite de %d canais registrados.
+CHAN_REGISTRATION_FAILED
+ Desculpe, o registro falhou.
+CHAN_REGISTERED
+ O canal %s está registrado sob seu nick: %s
+CHAN_PASSWORD_IS
+ A senha do seu canal é %s - guarde ela para uso posterior.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY canal senha
+CHAN_IDENTIFY_FAILED
+ Desculpe, a identificação falhou.
+CHAN_IDENTIFY_SUCCEEDED
+ Senha aceita - você está sendo reconhecido agora como dono do %s.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT canal nick
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT canal [nick]
+CHAN_LOGOUT_SUCCEEDED
+ Usuário %s foi desconectado do canal %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Todos os usuários registrados foram desconectados do canal %s.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP canal
+CHAN_DROP_DISABLED
+ Desculpe, o comando DROP está temporariamente desativado.
+CHAN_DROPPED
+ O canal %s foi desregistrado.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET canal opções parâmetros
+CHAN_SET_DISABLED
+ Desculpe, o comando SET está temporariamente desativado.
+CHAN_SET_UNKNOWN_OPTION
+ Comando SET %s desconhecido.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s possui muitos canais registrados.
+CHAN_FOUNDER_CHANGED
+ Founder do canal %s alterado para %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Successor do canal %s alterado para %s.
+CHAN_SUCCESSOR_UNSET
+ Successor do canal %s removido.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s não pode ser o successor do canal %s porque ele é o founder.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Desculpe, a mudança de senha falhou.
+CHAN_PASSWORD_CHANGED
+ A senha do %s foi alterada.
+CHAN_PASSWORD_CHANGED_TO
+ A senha do %s foi alterada para %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ Descrição do canal %s alterada para %s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ URL do canal %s alterada para %s.
+CHAN_URL_UNSET
+ URL do canal %s removida.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ E-mail do canal %s alterado para %s.
+CHAN_EMAIL_UNSET
+ E-mail do canal %s removido.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Mensagem de entrada para o canal %s alterada.
+CHAN_ENTRY_MSG_UNSET
+ Mensagem de entrada para o canal %s removida.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s não é um ban válido.
+CHAN_SET_BANTYPE_CHANGED
+ Tipo de ban para o canal %s é agora #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Modo %c desconhecido e ignorado.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Mode %c ignored because you can't lock it.
+CHAN_SET_MLOCK_L_REQUIRED
+ Você deve setar o modo +l bem como o modo +L.
+CHAN_SET_MLOCK_K_REQUIRED
+ You must lock mode +i as well to lock mode +K.
+CHAN_MLOCK_CHANGED
+ Modo MLOCK no canal %s alterado para %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET canal KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Retenção de tópico está agora ATIVADA.
+CHAN_SET_KEEPTOPIC_OFF
+ Retenção de tópico está agora DESATIVADA.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET canal TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Trava de tópico está agora ATIVADA.
+CHAN_SET_TOPICLOCK_OFF
+ Trava de tópico está agora DESATIVADA.
+
+# SET PRIVATE responses
+CHAN_SET_PEACE_SYNTAX
+ SET channel PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Peace option is now ON.
+CHAN_SET_PEACE_OFF
+ Peace option is now OFF.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET canal PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Opção Private está agora ATIVADA.
+CHAN_SET_PRIVATE_OFF
+ Opção Private está agora DESATIVADA.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET canal SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Opção Secure ops está agora ATIVADA.
+CHAN_SET_SECUREOPS_OFF
+ Opção Secure ops está agora DESATIVADA.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET canal SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Opção Secure founder está agora ATIVADA.
+CHAN_SET_SECUREFOUNDER_OFF
+ Opção Secure founder está agora DESATIVADA.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET canal RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Opção Restricted está agora ATIVADA.
+CHAN_SET_RESTRICTED_OFF
+ Opção Restricted está agora DESATIVADA.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET canal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Opção Secure está agora ATIVADA.
+CHAN_SET_SECURE_OFF
+ Opção Secure está agora DESATIVADA.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET canal SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Opção Signed kick está agora ATIVADA.
+CHAN_SET_SIGNKICK_LEVEL
+ Opção Signed kick está agora ATIVADA, mas depende do nível de acesso
+ do usuário que usar o comando.
+CHAN_SET_SIGNKICK_OFF
+ Opção Signed kick está agora DESATIVADA.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET canal OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Opção Op-notice está agora ATIVADA.
+CHAN_SET_OPNOTICE_OFF
+ Opção Op-notice está agora DESATIVADA.
+
+# SET NOEXPIRE responses
+CHAN_SET_XOP_SYNTAX
+ SET channel XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP lists system is now ON.
+CHAN_SET_XOP_OFF
+ xOP lists system is now OFF.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET canal NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ O canal %s não irá expirar.
+CHAN_SET_NOEXPIRE_OFF
+ O canal %s irá expirar.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Sorry, you can only have %d AOP/SOP/VOP entries on a channel.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ You can't use this command. Use the ACCESS command instead.
+ Type /msg %s HELP ACCESS for more information.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_AOP_DISABLED
+ Sorry, channel AOP list modification is temporarily disabled.
+CHAN_AOP_NICKS_ONLY
+ Channel AOP lists may only contain registered nicknames.
+CHAN_AOP_ADDED
+ %s added to %s AOP list.
+CHAN_AOP_MOVED
+ %s moved to %s AOP list.
+CHAN_AOP_NO_SUCH_ENTRY
+ No such entry (#%d) on %s AOP list.
+CHAN_AOP_NOT_FOUND
+ %s not found on %s AOP list.
+CHAN_AOP_NO_MATCH
+ No matching entries on %s AOP list.
+CHAN_AOP_DELETED
+ %s deleted from %s AOP list.
+CHAN_AOP_DELETED_ONE
+ Deleted 1 entry from %s AOP list.
+CHAN_AOP_DELETED_SEVERAL
+ Deleted %d entries from %s AOP list.
+CHAN_AOP_LIST_EMPTY
+ %s AOP list is empty.
+CHAN_AOP_LIST_HEADER
+ AOP list for %s:
+ Num Nick
+CHAN_AOP_CLEAR
+ Channel AOP list has been cleared.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_HOP_DISABLED
+ Sorry, channel HOP list modification is temporarily disabled.
+CHAN_HOP_NICKS_ONLY
+ Channel HOP lists may only contain registered nicknames.
+CHAN_HOP_ADDED
+ %s added to %s HOP list.
+CHAN_HOP_MOVED
+ %s moved to %s HOP list.
+CHAN_HOP_NO_SUCH_ENTRY
+ No such entry (#%d) on %s HOP list.
+CHAN_HOP_NOT_FOUND
+ %s not found on %s HOP list.
+CHAN_HOP_NO_MATCH
+ No matching entries on %s HOP list.
+CHAN_HOP_DELETED
+ %s deleted from %s HOP list.
+CHAN_HOP_DELETED_ONE
+ Deleted 1 entry from %s HOP list.
+CHAN_HOP_DELETED_SEVERAL
+ Deleted %d entries from %s HOP list.
+CHAN_HOP_LIST_EMPTY
+ %s HOP list is empty.
+CHAN_HOP_LIST_HEADER
+ HOP list for %s:
+ Num Nick
+CHAN_HOP_CLEAR
+ Channel HOP list has been cleared.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_SOP_DISABLED
+ Sorry, channel SOP list modification is temporarily disabled.
+CHAN_SOP_NICKS_ONLY
+ Channel SOP lists may only contain registered nicknames.
+CHAN_SOP_ADDED
+ %s added to %s SOP list.
+CHAN_SOP_MOVED
+ %s moved to %s SOP list.
+CHAN_SOP_NO_SUCH_ENTRY
+ No such entry (#%d) on %s SOP list.
+CHAN_SOP_NOT_FOUND
+ %s not found on %s SOP list.
+CHAN_SOP_NO_MATCH
+ No matching entries on %s SOP list.
+CHAN_SOP_DELETED
+ %s deleted from %s SOP list.
+CHAN_SOP_DELETED_ONE
+ Deleted 1 entry from %s SOP list.
+CHAN_SOP_DELETED_SEVERAL
+ Deleted %d entries from %s SOP list.
+CHAN_SOP_LIST_EMPTY
+ %s SOP list is empty.
+CHAN_SOP_LIST_HEADER
+ SOP list for %s:
+ Num Nick
+CHAN_SOP_CLEAR
+ Channel SOP list has been cleared.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP channel {ADD|DEL|LIST|CLEAR} [nick | entry-list]
+CHAN_VOP_DISABLED
+ Sorry, channel VOP list modification is temporarily disabled.
+CHAN_VOP_NICKS_ONLY
+ Channel VOP lists may only contain registered nicknames.
+CHAN_VOP_ADDED
+ %s added to %s VOP list.
+CHAN_VOP_MOVED
+ %s moved to %s VOP list.
+CHAN_VOP_NO_SUCH_ENTRY
+ No such entry (#%d) on %s VOP list.
+CHAN_VOP_NOT_FOUND
+ %s not found on %s VOP list.
+CHAN_VOP_NO_MATCH
+ No matching entries on %s VOP list.
+CHAN_VOP_DELETED
+ %s deleted from %s VOP list.
+CHAN_VOP_DELETED_ONE
+ Deleted 1 entry from %s VOP list.
+CHAN_VOP_DELETED_SEVERAL
+ Deleted %d entries from %s VOP list.
+CHAN_VOP_LIST_EMPTY
+ %s VOP list is empty.
+CHAN_VOP_LIST_HEADER
+ VOP list for %s:
+ Num Nick
+CHAN_VOP_CLEAR
+ Channel VOP list has been cleared.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS canal {ADD|DEL|LIST|CLEAR} [nick [nível] | entry-list]
+CHAN_ACCESS_XOP
+ You can't use this command.
+ Use the AOP, SOP and VOP commands instead.
+ Type /msg %s HELP command for more information.
+CHAN_ACCESS_DISABLED
+ Desculpe, o registro de canais está temporariamente desativado.
+CHAN_ACCESS_LEVEL_NONZERO
+ O nível de acesso deve ser diferente de zero.
+CHAN_ACCESS_LEVEL_RANGE
+ O nível de acesso deve ser entre %d e %d inclusive.
+CHAN_ACCESS_NICKS_ONLY
+ A lista de acesso do canal deve conter apenas nicks registrados.
+CHAN_ACCESS_REACHED_LIMIT
+ Desculpe, você pode ter apenas %d entradas na lista de acesso do canal.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Nível de acesso para %s no %s não alterado %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Nível de acesso para %s no %s alterado para %d.
+CHAN_ACCESS_ADDED
+ %s adicionado a lista de acesso do %s com o nível %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ Nenhuma entrada com (#%d) encontrada na lista de acesso do %s.
+CHAN_ACCESS_NOT_FOUND
+ %s não foi encontrado na lista de acesso do %s.
+CHAN_ACCESS_NO_MATCH
+ Resultado não encontrado na lista de acesso do %s.
+CHAN_ACCESS_DELETED
+ %s removido da lista de acesso do %s.
+CHAN_ACCESS_DELETED_ONE
+ Removida 1 entrada da lista de acesso do %s.
+CHAN_ACCESS_DELETED_SEVERAL
+ Removidas %d entradas da lista de acesso do %s.
+CHAN_ACCESS_LIST_EMPTY
+ Lista de acesso do %s vazia.
+CHAN_ACCESS_LIST_HEADER
+ Lista de acesso para %s:
+ Num Nív Nick
+CHAN_ACCESS_LIST_FOOTER
+ Fim da lista de acesso.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ Lista de acesso do canal apagada.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK canal {ADD | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-ou-máscara]
+CHAN_AKICK_DISABLED
+ Desculpe, o comando AKICK está temporariamente desativado.
+CHAN_AKICK_ALREADY_EXISTS
+ %s já existe na lista de akick do %s.
+CHAN_AKICK_REACHED_LIMIT
+ Desculpe, você pode ter apenas %d akicks na lista do canal.
+CHAN_AKICK_ADDED
+ %s adicionado a lista de akick do %s.
+CHAN_AKICK_NO_SUCH_ENTRY
+ Nenhuma entrada com (#%d) na lista de akick do %s.
+CHAN_AKICK_NOT_FOUND
+ %s não encontrado na lista de akick do %s.
+CHAN_AKICK_NO_MATCH
+ Nenhum resultado encontrado na lista de akick do %s.
+CHAN_AKICK_STUCK
+ %s is now always active on channel %s.
+CHAN_AKICK_UNSTUCK
+ %s is not always active anymore on channel %s.
+CHAN_AKICK_DELETED
+ %s removido da lista de akick do %s.
+CHAN_AKICK_DELETED_ONE
+ Removida 1 entrada da lista de akick do %s.
+CHAN_AKICK_DELETED_SEVERAL
+ Removidas %d entradas da lista de akick do %s.
+CHAN_AKICK_LIST_EMPTY
+ Lista de akick do %s vazia.
+CHAN_AKICK_LIST_HEADER
+ Lista de akick para %s:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s%s
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (por %s em %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (stuck) (by %s on %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE para %s terminado; %d usuários afetados.
+CHAN_AKICK_CLEAR
+ Lista de akick do canal foi limpa.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS canal {SET | DIS[ABLE] | LIST | RESET} [item [nível]]
+CHAN_LEVELS_XOP
+ This command is useless in this mode.
+CHAN_LEVELS_RANGE
+ O nível deve ser entre %d e %d inclusive.
+CHAN_LEVELS_CHANGED
+ Nível para %s no canal %s alterado para %d.
+CHAN_LEVELS_UNKNOWN
+ Level %s desconhecido. Digite /msg %s HELP LEVELS DESC para uma lista de levels válidos.
+CHAN_LEVELS_DISABLED
+ %s desabilitado no canal %s.
+CHAN_LEVELS_LIST_HEADER
+ Opções de nível de acesso para o canal %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (desabilitado)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (founder apenas)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ Níveis de acesso para o %s redefinidos para o padrão.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO canal [ALL]
+CHAN_INFO_HEADER
+ Informações do canal %s:
+CHAN_INFO_FOUNDER
+ Fundador: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Fundador: %s
+CHAN_INFO_SUCCESSOR
+ Sucessor: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Sucessor: %s
+CHAN_INFO_DESCRIPTION
+ Descrição: %s
+CHAN_INFO_ENTRYMSG
+ Mensagem de entrada: %s
+CHAN_INFO_TIME_REGGED
+ Registrado: %s
+CHAN_INFO_LAST_USED
+ Último uso: %s
+CHAN_INFO_LAST_TOPIC
+ Último tópico: %s
+CHAN_INFO_TOPIC_SET_BY
+ Tópico por: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ E-mail: %s
+CHAN_INFO_BANTYPE
+ Tipo de ban: %d
+CHAN_INFO_OPTIONS
+ Opções: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Retenção de tópico
+CHAN_INFO_OPT_OPNOTICE
+ OP Notice
+CHAN_INFO_OPT_PEACE
+ Peace
+CHAN_INFO_OPT_PRIVATE
+ Privado
+CHAN_INFO_OPT_RESTRICTED
+ Acesso restrito
+CHAN_INFO_OPT_SECURE
+ Seguro
+CHAN_INFO_OPT_SECUREOPS
+ Secure Ops
+CHAN_INFO_OPT_SECUREFOUNDER
+ Secure Founder
+CHAN_INFO_OPT_SIGNKICK
+ Signed kicks
+CHAN_INFO_OPT_TOPICLOCK
+ Trava de tópico
+CHAN_INFO_OPT_XOP
+ xOP lists system
+CHAN_INFO_OPT_NONE
+ Nenhuma
+CHAN_INFO_MODE_LOCK
+ Trava de modo: %s
+CHAN_INFO_NO_EXPIRE
+ Este canal não irá expirar.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST padrão
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST padrão [FORBIDDEN] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Lista de entradas com %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Fim da lista - %d/%d resultados mostrados.
+
+# CLIST responses
+CHAN_INVITE_SYNTAX
+ INVITE canal
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN canal
+CHAN_UNBANNED
+ Você não está mais banido do %s.
+
+# CLEAR responses
+CHAN_TOPIC_SYNTAX
+ TOPIC channel [topic]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR canal opção
+CHAN_CLEARED_BANS
+ Todos os bans do canal %s foram removidos.
+CHAN_CLEARED_EXCEPTS
+ Todos os excepts do canal %s foram removidos.
+CHAN_CLEARED_MODES
+ Todos os modos no canal %s foram removidos.
+CHAN_CLEARED_OPS
+ Modo +o foi retirado do canal %s.
+CHAN_CLEARED_VOICES
+ Mode +v foi retirado do canal %s.
+CHAN_CLEARED_USERS
+ Todos os usuários foram kickados do canal %s.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS canal
+CHAN_GETPASS_UNAVAILABLE
+ Comando GETPASS indisponível: modo de encriptação em uso.
+CHAN_GETPASS_PASSWORD_IS
+ Senha do canal %s é %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS canal
+CHAN_SENDPASS_UNAVAILABLE
+ Comando SENDPASS indisponível: modo de encriptação em uso.
+CHAN_SENDPASS_SUBJECT
+ Senha do canal (%s)
+CHAN_SENDPASS_HEAD
+ Olá,
+CHAN_SENDPASS_LINE_1
+ Você pediu para receber a senha do canal %s por e-mail.
+CHAN_SENDPASS_LINE_2
+ A senha é %s. Por motivos de segurança, recomendamos que você mude a senha assim que receber este e-mail.
+CHAN_SENDPASS_LINE_3
+ Se você não sabe porque este e-mail lhe foi enviado, por favor ignore-o.
+CHAN_SENDPASS_LINE_4
+ POR FAVOR NÃO RESPONDA ESTE E-MAIL!
+CHAN_SENDPASS_LINE_5
+ Administradores do %s.
+CHAN_SENDPASS_OK
+ Senha do canal %s foi enviada.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID canal [motivo]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID canal motivo
+CHAN_FORBID_SUCCEEDED
+ Canal %s está agora bloqueado.
+CHAN_FORBID_FAILED
+ Não foi possível bloquear o canal %s!
+
+# Misc responses
+CHAN_FORBID_REASON
+ This channel has been forbidden.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND channel [reason]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND channel reason
+CHAN_SUSPEND_SUCCEEDED
+ Channel %s is now suspended.
+CHAN_SUSPEND_FAILED
+ Couldn't suspended channel %s!
+CHAN_SUSPEND_REASON
+ This channel has been suspended.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND channel
+CHAN_UNSUSPEND_ERROR
+ No # found in front of channel name.
+CHAN_UNSUSPEND_SUCCEEDED
+ Channel %s is now released.
+CHAN_UNSUSPEND_FAILED
+ Couldn't release channel %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s matches an except on %s and cannot be banned until the except have been removed.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Você tem 1 novo memo.
+MEMO_HAVE_NEW_MEMOS
+ Você tem %d novos memos.
+MEMO_TYPE_READ_LAST
+ Digite /msg %s READ LAST para ler.
+MEMO_TYPE_READ_NUM
+ Digite /msg %s READ %d para ler.
+MEMO_TYPE_LIST_NEW
+ Digite /msg %s LIST NEW para listar.
+MEMO_AT_LIMIT
+ Atenção: Você atingiu seu número máximo de memos (%d). Não será possível receber novos memos enquanto você não apagar alguns.
+MEMO_OVER_LIMIT
+ Atenção: Você ultrapassou seu número máximo de memos (%d). Não será possível receber novos memos enquanto você não apagar alguns.
+MEMO_X_MANY_NOTICE
+ There are %d memos on channel %s.
+MEMO_X_ONE_NOTICE
+ There is %d memo on channel %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ There is a new memo on channel %s.
+ Type /msg %s READ %s %d to read it.
+MEMO_NEW_MEMO_ARRIVED
+ Você possui um novo memo de %s.
+ Digite /msg %s READ %d para ler.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ Você não possui memos.
+MEMO_X_HAS_NO_MEMOS
+ %s não possui memos.
+MEMO_DOES_NOT_EXIST
+ Memo %d não existe!
+MEMO_LIST_NOT_FOUND
+ Nenhum memo encontrado.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | canal} texto
+MEMO_SEND_DISABLED
+ Desculpe, o envio de memos está temporariamente desabilitado.
+MEMO_SEND_PLEASE_WAIT
+ Por favor aguarde %d segundos antes de usar o comando SEND novamente.
+MEMO_X_GETS_NO_MEMOS
+ %s não pode receber memos.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s possui muitos memos atualmente e não pode receber mais nenhum.
+MEMO_SENT
+ Memo enviado para %s.
+
+# CANCEL responses
+MEMO_MASS_SENT
+ A massmemo has been sent to all registered users.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | canal}
+MEMO_CANCEL_DISABLED
+ Desculpe, o comando CANCEL está temporariamente desativado.
+MEMO_CANCEL_NONE
+ Nenhum memo foi cancelado.
+MEMO_CANCELLED
+ Último memo enviado para %s foi cancelado.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [canal] [list | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ Você não possui novos memos.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s não possui novos memos.
+MEMO_LIST_MEMOS
+ Memos para %s. Para ler, digite: /msg %s READ núm
+MEMO_LIST_NEW_MEMOS
+ Novos memos para %s. Para ler, digite: /msg %s READ núm
+MEMO_LIST_CHAN_MEMOS
+ Memos para %s. Para ler, digite: /msg %s READ %s núm
+MEMO_LIST_CHAN_NEW_MEMOS
+ Novos memos para %s. Para ler, digite: /msg %s READ %s núm
+MEMO_LIST_HEADER
+ Núm Remetente Data/Hora
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [canal] {list | LAST | NEW}
+MEMO_HEADER
+ Memo %d de %s (%s). Para apagar, digite: /msg %s DEL %d
+MEMO_CHAN_HEADER
+ Memo %d de %s (%s). Para apagar, digite: /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [canal] {núm | list | ALL}
+MEMO_DELETED_NONE
+ Nenhum memo apagado.
+MEMO_DELETED_ONE
+ Memo %d foi apagado.
+MEMO_DELETED_SEVERAL
+ Memos %s foram apagados.
+MEMO_DELETED_ALL
+ Todos os seus memos foram apagados.
+
+# SET responses
+MEMO_CHAN_DELETED_ALL
+ All memos for channel %s have been deleted.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET opção parâmetros
+MEMO_SET_DISABLED
+ Desculpe, a opção SET está temporariamente desativada.
+MEMO_SET_UNKNOWN_OPTION
+ Comando SET desconhecido: %s.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s irá agora notificá-lo de novos memos quando você conectar ou quando eles lhe forem enviados.
+MEMO_SET_NOTIFY_LOGON
+ %s irá agora notificá-lo de novos memos quando você conectar ou desativar o /AWAY.
+MEMO_SET_NOTIFY_NEW
+ %s irá agora notificá-lo de novos memos quando eles lhe forem enviados.
+MEMO_SET_NOTIFY_OFF
+ %s não irá mais notificá-lo de novos memos.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [canal] limite
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [usuário | canal] {limite | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Você não tem permissão para mudar seu limite de memos.
+MEMO_SET_LIMIT_FORBIDDEN
+ O limite de memos para %s não pode ser mudado.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ Você não pode colocar seu limite de memos maior que %d.
+MEMO_SET_LIMIT_TOO_HIGH
+ Você não pode colocar o limite de memos para %s maior que %d.
+MEMO_SET_LIMIT_OVERFLOW
+ Limite de memos muito grande; limitando em %d.
+MEMO_SET_YOUR_LIMIT
+ Seu limite de memo é agora de %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ Você não poderá mais receber memos.
+MEMO_UNSET_YOUR_LIMIT
+ Seu limite de memos foi desativado.
+MEMO_SET_LIMIT
+ Limite de memos para %s é agora de %d.
+MEMO_SET_LIMIT_ZERO
+ Limite de memos para %s é agora de 0.
+MEMO_UNSET_LIMIT
+ Limite de memos desativado para %s.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [anal]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | canal]
+MEMO_INFO_NO_MEMOS
+ Você não possui nenhum memo atualmente.
+MEMO_INFO_MEMO
+ Você possui atualmente 1 memo.
+MEMO_INFO_MEMO_UNREAD
+ Você possui atualmente 1 memo, e este ainda não foi lido.
+MEMO_INFO_MEMOS
+ Você possui atualmente %d memos.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Você possui atualmente %d memos, dos quais 1 não foi lido.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Você possui atualmente %d memos, dos quais %d não foram lidos.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Você possui atualmente %d memos; dos quais nenhum foi lido.
+MEMO_INFO_LIMIT
+ Seu limite de memos é de %d.
+MEMO_INFO_HARD_LIMIT
+ Seu limite de memos é de %d, e não pode ser alterado.
+MEMO_INFO_LIMIT_ZERO
+ Seu limite de memos é de 0; você não pode receber novos memos.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Seu limite de memos é de 0; você não pode receber novos memos. Você não pode alterar esse limite.
+MEMO_INFO_NO_LIMIT
+ Você não possui limite de memos que pode guardar.
+MEMO_INFO_NOTIFY_OFF
+ Você será notificado de novos memos.
+MEMO_INFO_NOTIFY_ON
+ Você será notificado de novos memos quando conectar e quando eles forem enviados.
+MEMO_INFO_NOTIFY_RECEIVE
+ Você será notificado de novos memos quando eles forem enviados.
+MEMO_INFO_NOTIFY_SIGNON
+ Você será notificado de novos memos quando conectar.
+MEMO_INFO_X_NO_MEMOS
+ %s não possui nenhum memo atualmente.
+MEMO_INFO_X_MEMO
+ %s possui atualmente 1 memo.
+MEMO_INFO_X_MEMO_UNREAD
+ %s possui atualmente 1 memo, e ainda não foi lido.
+MEMO_INFO_X_MEMOS
+ %s possui atualmente %d memos.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s possui atualmente %d memos, dos quais 1 não foi lido.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s possui atualmente %d memos, dos quais %d não foram lidos.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s possui atualmente %d memos; dos quais nenhum foi lido.
+MEMO_INFO_X_LIMIT
+ Limite de memos para %s é de %d.
+MEMO_INFO_X_HARD_LIMIT
+ Limite de memos para %s é de %d, e não pode ser alterado.
+MEMO_INFO_X_NO_LIMIT
+ %s não possui limite de memos.
+MEMO_INFO_X_NOTIFY_OFF
+ %s não é notificado de novos memos.
+MEMO_INFO_X_NOTIFY_ON
+ %s é notificado de novos memos quando conecta e quando eles são enviados.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s é notificado de novos memos quando eles são enviados.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s é notificado de novos memos quando conecta.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Bot %s não existe.
+BOT_NOT_ASSIGNED
+ Você precisa primeiro associar um bot ao canal antes de usar este comando.
+ Digite /msg %S HELP ASSIGN para maiores informações.
+BOT_NOT_ON_CHANNEL
+ Bot não está no canal %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ Não use a palavra %s neste canal!
+BOT_REASON_BADWORD_GENTLE
+ Cuidado com suas palavras!
+BOT_REASON_BOLD
+ Não use negritos neste canal!
+BOT_REASON_CAPS
+ Desligue o CAPS LOCK!
+BOT_REASON_COLOR
+ Não use cores neste canal!
+BOT_REASON_FLOOD
+ Pare de floodar!
+BOT_REASON_REPEAT
+ Pare de ficar repetindo!
+BOT_REASON_REVERSE
+ Por favor não user reversos no canal!
+BOT_REASON_UNDERLINE
+ Não use sublinhados neste canal!
+
+# !seen replies
+BOT_SEEN_BOT
+ Você me encontrou, %s!
+BOT_SEEN_YOU
+ Procurando por si mesmo %s?
+BOT_SEEN_ON_CHANNEL
+ %s está no canal neste momento!
+BOT_SEEN_ON_CHANNEL_AS
+ %s está no canal neste momento (como %s) !
+BOT_SEEN_ON
+ %s foi visto aqui pela última vez %s atrás.
+BOT_SEEN_NEVER
+ Eu nunca vi %s neste canal.
+BOT_SEEN_UNKNOWN
+ Eu não sei quem é %s.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick user host real
+ BOT CHANGE nickantigo nicknovo [user [host [real]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ Bot %s já existe.
+BOT_BOT_CREATION_FAILED
+ Desculpe, criação do bot falhou.
+BOT_BOT_READONLY
+ Desculpe, comando CHANGE temporariamente desativado.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) adicionado a lista de bots.
+BOT_BOT_ANY_CHANGES
+ Informação antiga é igual a nova.
+BOT_BOT_CHANGED
+ Bot %s foi alterado para %s!%s@%s (%s)
+BOT_BOT_DELETED
+ Bot %s foi removido.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Lista de bots:
+BOT_BOTLIST_PRIVATE_HEADER
+ Bots reserved to IRC operators:
+BOT_BOTLIST_FOOTER
+ %d bots available.
+BOT_BOTLIST_EMPTY
+ Não existem bots disponíveis no momento.
+ Pergunte a um Administrador dos Services para criar mais bots!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN canal nick
+BOT_ASSIGN_READONLY
+ Desculpe, mas o comando ASSIGN está temporariamente desativado.
+BOT_ASSIGN_ALREADY
+ Bot %s is already assigned to channel %s.
+BOT_ASSIGN_ASSIGNED
+ Bot %s foi associado ao canal %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN canal
+BOT_UNASSIGN_UNASSIGNED
+ Não possui mais nenhum bot associado ao canal %s.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {canal | nick}
+BOT_INFO_NOT_FOUND
+ %s não é um bot válido ou um canal registrado.
+BOT_INFO_BOT_HEADER
+ Informações do bot %s:
+BOT_INFO_BOT_MASK
+ Máscara : %s@%s
+BOT_INFO_BOT_REALNAME
+ Nome real : %s
+BOT_INFO_BOT_CREATED
+ Criado : %s
+BOT_INFO_BOT_USAGE
+ Usado em : %d canal(is)
+BOT_INFO_BOT_OPTIONS
+ Options : %s
+BOT_INFO_OPT_PRIVATE
+ Private
+BOT_INFO_CHAN_HEADER
+ Informações do canal %s:
+BOT_INFO_CHAN_BOT
+ Nick do bot : %s
+BOT_INFO_CHAN_BOT_NONE
+ Nick do bot : nenhum associado no momento.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Kick por palavrão : %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Kick por palavrão : %s (%d kick(s) para banir)
+BOT_INFO_CHAN_KICK_BOLDS
+ Kick por negrito : %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Kick por negrito : %s (%d kick(s) para banir)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Kick por Caps : %s (mínimo %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Kick por Caps : %s (%d kick(s) para banir; mínimo %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Kick por Caps : %s
+BOT_INFO_CHAN_KICK_COLORS
+ Kick por cores : %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Kick por cores : %s (%d kick(s) para banir)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Kick por flood : %s (%d linhas em %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Kick por flood : %s (%d kick(s) para banir; %d linhas em %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Kick por flood : %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Kick por repetição : %s (%d vezes)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Kick por repetição : %s (%d kick(s) para banir; %d vezes)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Kick por repetição : %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Kick por reversos : %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Kick por reversos : %s (%d kick(s) para banir)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Kick por sublinhado : %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Kick por sublinhado : %s (%d kick(s) para banir)
+BOT_INFO_ACTIVE
+ ativado
+BOT_INFO_INACTIVE
+ desativado
+BOT_INFO_CHAN_OPTIONS
+ Opções : %s
+BOT_INFO_OPT_DONTKICKOPS
+ Proteção de Ops
+BOT_INFO_OPT_DONTKICKVOICES
+ Proteção de Voices
+BOT_INFO_OPT_FANTASY
+ Fantasia
+BOT_INFO_OPT_GREET
+ Mensagem de entrada
+BOT_INFO_OPT_NOBOT
+ Sem bot
+BOT_INFO_OPT_SYMBIOSIS
+ Simbiose
+BOT_INFO_OPT_NONE
+ Nenhuma
+
+# SET responses
+BOT_SET_SYNTAX
+ SET canal opções configurações
+BOT_SET_DISABLED
+ Desculpe, o comando SET está temporariamente desativado.
+BOT_SET_UNKNOWN
+ Opção desconhecida: %s.
+ Digite /msg %S HELP SET para maiores informações.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET canal DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Bot não irá kickar ops no canal %s.
+BOT_SET_DONTKICKOPS_OFF
+ Bot irá kickar ops no canal %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET canal DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Bot não irá kickar voices no canal %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Bot irá kickar voices no canal %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET canal FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Modo Fantasia está agora ATIVADO no canal %s.
+BOT_SET_FANTASY_OFF
+ Modo Fantasia está agora DESATIVADO no canal %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET canal GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Modo mensagem de entrada está agora ATIVADO no canal %s.
+BOT_SET_GREET_OFF
+ Modo mensagem de entrada está agora DESATIVADO no canal %s.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET canal NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ Modo NOBOT está agora ATIVADO no canal %s.
+BOT_SET_NOBOT_OFF
+ Modo NOBOT está agora DESATIVADO no canal %s.
+
+# SET SYMBIOSIS
+BOT_SET_PRIVATE_SYNTAX
+ SET channel PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ Private mode of bot %s is now ON.
+BOT_SET_PRIVATE_OFF
+ Private mode of bot %s is now OFF.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET canal SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ Modo SYMBIOSIS está agora ATIVADO no canal %s.
+BOT_SET_SYMBIOSIS_OFF
+ Modo SYMBIOSIS está agora DESATIVADO no canal %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK canal opções {ON|OFF} [configurações]
+BOT_KICK_DISABLED
+ Desculpe, as configurações do kicker estão temporariamente desativadas.
+BOT_KICK_UNKNOWN
+ Opção desconhecida: %s.
+ Digite /msg %S HELP KICK para maiores informações.
+BOT_KICK_BAD_TTB
+ %s não pode ser colocado como tempo para ban.
+
+BOT_KICK_BADWORDS_ON
+ O bot irá agora kickar por palavrões. Use o comando
+ BADWORDS para adicionar ou remover um palavrão.
+BOT_KICK_BADWORDS_ON_BAN
+ O bot irá agora kickar por palavrões, e irá setar um ban
+ após %d kicks no mesmo usuário. Use o comando BADWORDS
+ para adicionar ou remover um palavrão.
+BOT_KICK_BADWORDS_OFF
+ O bot não irá mais kickar por palavrões.
+BOT_KICK_BOLDS_ON
+ O bot irá agora kickar por negritos.
+BOT_KICK_BOLDS_ON_BAN
+ O bot irá agora kickar por negritos, e irá setar um ban
+ após %d kicks no mesmo usuário.
+BOT_KICK_BOLDS_OFF
+ O bot não irá mais kickar por negritos.
+BOT_KICK_CAPS_ON
+ O bot irá agora kickar por caps (deve ter no mínimo
+ %d caracteres e %d%% na mensagem inteira).
+BOT_KICK_CAPS_ON_BAN
+ O bot irá agora kickar por caps (deve ter no mínimo
+ %d caracteres e %d%% na mensagem inteira), e irá setar
+ um ban após %d kicks no mesmo usuário.
+BOT_KICK_CAPS_OFF
+ O bot não irá mais kickar por caps.
+BOT_KICK_COLORS_ON
+ O bot irá agora kickar por cores.
+BOT_KICK_COLORS_ON_BAN
+ O bot irá agora kickar por cores, e irá setar um ban após %d
+ kicks no mesmo usuário.
+BOT_KICK_COLORS_OFF
+ O bot não irá mais kickar por cores.
+BOT_KICK_FLOOD_ON
+ O bot irá agora kickar por flood (%d linhas em %d segundos).
+BOT_KICK_FLOOD_ON_BAN
+ O bot irá agora kickar por flood (%d linhas em %d segundos), e
+ setar um ban após %d kicks no mesmo usuário.
+BOT_KICK_FLOOD_OFF
+ O bot não irá mais kickar por flood.
+BOT_KICK_REPEAT_ON
+ O bot irá agora kickar por repetição (usuários que escreverem
+ %d vezes a mesma coisa).
+BOT_KICK_REPEAT_ON_BAN
+ O bot irá agora kickar por repetição (usuários que escreverem
+ %d vezes a mesma coisa), e irá setar um ban após %d
+ kicks no mesmo usuário.
+BOT_KICK_REPEAT_OFF
+ O bot não irá mais kickar por repetição.
+BOT_KICK_REVERSES_ON
+ O bot irá agora kickar por reversos.
+BOT_KICK_REVERSES_ON_BAN
+ O bot irá agora kickar por reversos, e irá setar um ban após %d
+ kicks no mesmo usuário.
+BOT_KICK_REVERSES_OFF
+ O bot não irá mais kickar por reversos.
+BOT_KICK_UNDERLINES_ON
+ O bot irá agora kickar por sublinhados.
+BOT_KICK_UNDERLINES_ON_BAN
+ O bot irá agora kickar por sublinhados, e irá setar um ban após %d
+ kicks no mesmo usuário.
+BOT_KICK_UNDERLINES_OFF
+ O bot não irá mais kickar por sublinhados.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS canal {ADD|DEL|LIST|CLEAR} [palavra | lista] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Desculpe, o comando BADWORDS está temporariamente desatvado.
+BOT_BADWORDS_REACHED_LIMIT
+ Desculpe, você pode ter apenas %d palavrões em sua lista.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s já existe na lista de palavrões do %s.
+BOT_BADWORDS_ADDED
+ %s adicionado na lista de palavrões do %s.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ Entrada não encontrada (#%d) na lista de palavrões do %s.
+BOT_BADWORDS_NOT_FOUND
+ %s não foi encontrado na lista de palavrões do %s.
+BOT_BADWORDS_NO_MATCH
+ Nenhum resultado correspondente encontrado na lista do %s.
+BOT_BADWORDS_DELETED
+ %s removido da lista de palavrões do %s.
+BOT_BADWORDS_DELETED_ONE
+ Removida 1 entrada da lista de palavrões do %s.
+BOT_BADWORDS_DELETED_SEVERAL
+ Removidas %d entradas da lista de palavrões do %s.
+BOT_BADWORDS_LIST_EMPTY
+ Lista de palvrões do %s está vazia.
+BOT_BADWORDS_LIST_HEADER
+ Lista de palavrões do %s:
+ Núm Palavra Tipo
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ Lista de palavrões está agora vazia.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY canal texto
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT canal texto
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_EXCEPT
+ User matches channel except.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_BAD_NICK
+ Bot Nicks may only contain valid nick characters.
+BOT_BAD_HOST
+ Bot Hosts may only contain valid host characters.
+BOT_BAD_IDENT
+ Bot Idents may only contain valid characters.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Os services não conseguiram alterar os modos. Seus servers estão configurados corretamente?
+OPER_BOUNCY_MODES_U_LINE
+ Os services não conseguiram alterar os modos. As U:lines do seus servers estão configuradas corretamente?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL mensagem
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Opção STATS desconhecida: %s.
+OPER_STATS_CURRENT_USERS
+ Usuários atuais: %d (%d ops)
+OPER_STATS_MAX_USERS
+ Máximo atingido: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Services ativos %d dias, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Services ativos %d dia, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Services ativos %d horas, %d minutos
+OPER_STATS_UPTIME_HM1S
+ Services ativos %d horas, %d minutos
+OPER_STATS_UPTIME_H1MS
+ Services ativos %d horas, %d minut0
+OPER_STATS_UPTIME_H1M1S
+ Services ativos %d horas, %d minut0
+OPER_STATS_UPTIME_1HMS
+ Services ativos %d hora, %d minutos
+OPER_STATS_UPTIME_1HM1S
+ Services ativos %d hora, %d minutos
+OPER_STATS_UPTIME_1H1MS
+ Services ativos %d hora, %d minuto
+OPER_STATS_UPTIME_1H1M1S
+ Services ativos %d hora, %d minuto
+OPER_STATS_UPTIME_MS
+ Services ativos %d minutos, %d segundos
+OPER_STATS_UPTIME_M1S
+ Services ativos %d minutos, %d segundo
+OPER_STATS_UPTIME_1MS
+ Services ativos %d minuto, %d segundos
+OPER_STATS_UPTIME_1M1S
+ Services ativos %d minuto, %d segundo
+OPER_STATS_BYTES_READ
+ Bytes lidos : %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Bytes escritos: %5d kB
+OPER_STATS_USER_MEM
+ Usuários : %6d registros, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Channel : %6d registros, %5d kB
+OPER_STATS_GROUPS_MEM
+ NS Grupos : %6d registros, %5d kB
+OPER_STATS_ALIASES_MEM
+ NS Aliases : %6d registros, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d registros, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d registros, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d registros, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Sessões : %6d registros, %5d kB
+OPER_STATS_PROXY_MEM
+ Proxies : %6d records, %5d kB
+OPER_STATS_AKILL_COUNT
+ Número atual de AKILLs: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Tempo atual de expiração de akill: %d dias
+OPER_STATS_AKILL_EXPIRE_DAY
+ Tempo atual de expiração de akill: 1 dia
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Tempo atual de expiração de akill: %d horas
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Tempo atual de expiração de akill: 1 hora
+OPER_STATS_AKILL_EXPIRE_MINS
+ Tempo atual de expiração de akill: %d minutos
+OPER_STATS_AKILL_EXPIRE_MIN
+ Tempo atual de expiração de akill: 1 minuto
+OPER_STATS_AKILL_EXPIRE_NONE
+ Tempo atual de expiração de akill: Não expira
+OPER_STATS_SGLINE_COUNT
+ Número atual de SGLINEs: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Tempo atual de expiração de SGLINE: %d dias
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Tempo atual de expiração de SGLINE: 1 dia
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Tempo atual de expiração de SGLINE: %d horas
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Tempo atual de expiração de SGLINE: 1 hora
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Tempo atual de expiração de SGLINE: %d minutos
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Tempo atual de expiração de SGLINE: 1 minuto
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Tempo atual de expiração de SGLINE: Não expira
+OPER_STATS_SQLINE_COUNT
+ Current number of SQLINEs: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Default SQLINE expiry time: %d days
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Default SQLINE expiry time: 1 day
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Default SQLINE expiry time: %d hours
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Default SQLINE expiry time: 1 hour
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Default SQLINE expiry time: %d minutes
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Default SQLINE expiry time: 1 minute
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Default SQLINE expiry time: No expiration
+OPER_STATS_SZLINE_COUNT
+ Número atual de SZLINEs: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Tempo atual de expiração de SZLINE: %d dias
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Tempo atual de expiração de SZLINE: 1 dia
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Tempo atual de expiração de SZLINE: %d horas
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Tempo atual de expiração de SZLINE: 1 hora
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Tempo atual de expiração de SZLINE: %d minutos
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Tempo atual de expiração de SZLINE: 1 minuto
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Tempo atual de expiração de SZLINE: Não expira
+OPER_STATS_RESET
+ Resetar estatísticas.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE canal modos
+
+# CLEARMODES responses
+OPER_UMODE_SYNTAX
+ UMODE nick modes
+
+# OLINE responses
+OPER_UMODE_SUCCESS
+ Changed usermodes of %s.
+OPER_UMODE_CHANGED
+ %s changed your usermodes.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flags
+OPER_OLINE_SUCCESS
+ An O:Line with the flags %s has been added for %s.
+
+# CLEARMODES responses
+OPER_OLINE_IRCOP
+ You are now an IRC Operator.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES canal [ALL]
+OPER_CLEARMODES_DONE
+ Modos binários e bans removidos do canal %s.
+OPER_CLEARMODES_ALL_DONE
+ Todos os modos foram removidos do canal %s.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK canal usuário motivo
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick newnick
+OPER_SVSNICK_NEWNICK
+ The nick %s is now being changed to %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | lista]
+OPER_ADMIN_SKELETON
+ Services estão no modo esqueleto; o comando ADMIN não está disponível.
+OPER_ADMIN_EXISTS
+ %s já está na lista de Administradores dos Services.
+OPER_ADMIN_REACHED_LIMIT
+ Desculpe, você pode ter apenas %d Administradores dos Services.
+OPER_ADMIN_ADDED
+ %s adicionado a lista de Administradores dos Services.
+OPER_ADMIN_NOT_FOUND
+ %s não encontrado na lista de Administradores dos Services.
+OPER_ADMIN_NO_MATCH
+ Nenhum resultado encontrado na lista de Administradores dos Services.
+OPER_ADMIN_DELETED
+ %s removido da lista de Administradores dos Services.
+OPER_ADMIN_DELETED_ONE
+ Removida 1 entrada da lista de Administradores dos Services.
+OPER_ADMIN_DELETED_SEVERAL
+ Removidas %d entradas da lista de Administradores dos Services.
+OPER_ADMIN_LIST_EMPTY
+ A lista de Administradores dos Services está vazia.
+OPER_ADMIN_LIST_HEADER
+ Lista de Administradores dos Services:
+ Núm Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Lista de Administradores dos Services foi apagada.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | lista]
+OPER_OPER_SKELETON
+ Services estão no modo esqueleto; o comando OPER não está disponível..
+OPER_OPER_EXISTS
+ %s já está na lista de Operadores dos Services.
+OPER_OPER_REACHED_LIMIT
+ Desculpe, você pode ter apenas %d Operadores dos Services.
+OPER_OPER_ADDED
+ %s adicionado a lista de Operadores dos Services.
+OPER_OPER_NOT_FOUND
+ %s não encontrado na lista de Operadores dos Services.
+OPER_OPER_NO_MATCH
+ Nenhum resultado equivalente na lista de Operadores dos Services.
+OPER_OPER_DELETED
+ %s removido da lista de Operadores dos Services.
+OPER_OPER_DELETED_ONE
+ Removida 1 entrada da lista de Operadores dos Services.
+OPER_OPER_DELETED_SEVERAL
+ Removidas %d entradas da lista de Operadores dos Services.
+OPER_OPER_LIST_EMPTY
+ A lista de Operadores dos Services está vazia.
+OPER_OPER_LIST_HEADER
+ Lista de Operadores dos Services:
+ Núm Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ A lista de Operadores dos Services foi apagada.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+tempo] {máscara | lista} [motivo]]
+OPER_AKILL_EXISTS
+ %s já se encontra na lista de AKILL.
+OPER_AKILL_ALREADY_COVERED
+ %s já está coberto pelo AKILL %s.
+OPER_AKILL_REACHED_LIMIT
+ Desculpe, você pode ter apenas %d AKILLs.
+OPER_AKILL_NO_NICK
+ Lembrete: As máscaras de AKILL não devem conter o nick; tenha certeza de que você não incluiu o nick na máscara.
+OPER_AKILL_ADDED
+ %s adicionado a lista de AKILL.
+OPER_AKILL_CHANGED
+ Tempo de expiração para %s alterado.
+OPER_AKILL_NOT_FOUND
+ %s não encontrado na lista de AKILL.
+OPER_AKILL_NO_MATCH
+ Nenhum resultado equivalente na lista de AKILL.
+OPER_AKILL_DELETED
+ %s removido da lista de AKILL.
+OPER_AKILL_DELETED_ONE
+ Removida 1 entrada da lista de AKILL.
+OPER_AKILL_DELETED_SEVERAL
+ Removidas %d entradas da lista de AKILL.
+OPER_AKILL_LIST_EMPTY
+ A lista de AKILL está vazia.
+OPER_AKILL_LIST_HEADER
+ Current AKILL list:
+ Núm Máscara Motivo
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Lista de AKILL atual:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (por %s em %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ Lista de AKILL apagada.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+tempo] {máscara | lista}[:motivo]]
+OPER_SGLINE_UNSUPPORTED
+ Desculpe, o comando SGLINE não está disponível nesta Rede.
+OPER_SGLINE_EXISTS
+ %s já se encontra na lista de SGLINE.
+OPER_SGLINE_ALREADY_COVERED
+ %s já está coberto por %s.
+OPER_SGLINE_REACHED_LIMIT
+ Desculpe, você pode ter apenas %d SGLINEs.
+OPER_SGLINE_ADDED
+ %s adicionado a lista de SGLINE.
+OPER_SGLINE_CHANGED
+ Tempo de expiração para %s aterado.
+OPER_SGLINE_NOT_FOUND
+ %s não encontrado na lista de SGLINE.
+OPER_SGLINE_NO_MATCH
+ Nenhum resultado equivalente na lista de SGLINE.
+OPER_SGLINE_DELETED
+ %s removido da lista de SGLINE.
+OPER_SGLINE_DELETED_ONE
+ Removida 1 entrada da lista de SGLINE.
+OPER_SGLINE_DELETED_SEVERAL
+ Removidas %d entradas da lista de SGLINE.
+OPER_SGLINE_LIST_EMPTY
+ A lista de SGLINE está vazia.
+OPER_SGLINE_LIST_HEADER
+ Current SGLINE list:
+ Núm Máscara Motivo
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Current SGLINE list:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (por %s em %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ A lista de SGLINE foi apagada.
+
+# SZLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+expiry] {mask | entry-list} [reason]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Channel SQLINEs are not supported by your IRCd, so you can't use them.
+OPER_SQLINE_EXISTS
+ %s already exists on the SQLINE list.
+OPER_SQLINE_ALREADY_COVERED
+ %s is already covered by %s.
+OPER_SQLINE_REACHED_LIMIT
+ Sorry, you can only have %d SQLINEs.
+OPER_SQLINE_ADDED
+ %s added to the SQLINE list.
+OPER_SQLINE_CHANGED
+ Expiry time of %s changed.
+OPER_SQLINE_NOT_FOUND
+ %s not found on the SQLINE list.
+OPER_SQLINE_NO_MATCH
+ No matching entries on the SQLINE list.
+OPER_SQLINE_DELETED
+ %s deleted from the SQLINE list.
+OPER_SQLINE_DELETED_ONE
+ Deleted 1 entry from the SQLINE list.
+OPER_SQLINE_DELETED_SEVERAL
+ Deleted %d entries from the SQLINE list.
+OPER_SQLINE_LIST_EMPTY
+ SQLINE list is empty.
+OPER_SQLINE_LIST_HEADER
+ Current SQLINE list:
+ Num Mask Reason
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Current SQLINE list:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ The SQLINE list has been cleared.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+tempo] {máscara | lista} [motivo]]
+OPER_SZLINE_UNSUPPORTED
+ Desculpe, comando SZLINE não disponível nesta Rede.
+OPER_SZLINE_EXISTS
+ %s já existe na lista de SZLINE.
+OPER_SZLINE_ALREADY_COVERED
+ %s já está coberto por %s.
+OPER_SZLINE_REACHED_LIMIT
+ Desculpe, você pode ter apenas %d SZLINEs.
+OPER_SZLINE_ONLY_IPS
+ Lembrete: você pode apenas adicionar endereços de IP para a lista de SZLINE.
+OPER_SZLINE_ADDED
+ %s adicionado a lista de SZLINE.
+OPER_SZLINE_CHANGED
+ Tempo de expiração para %s alterado.
+OPER_SZLINE_NOT_FOUND
+ %s não foi encontrado na lista de SZLINE.
+OPER_SZLINE_NO_MATCH
+ Nenhum resultado equivalente na lista de SZLINE.
+OPER_SZLINE_DELETED
+ %s removido da lista de SZLINE.
+OPER_SZLINE_DELETED_ONE
+ Removida 1 entrada da lista de SZLINE.
+OPER_SZLINE_DELETED_SEVERAL
+ Removidas %d entradas da lista de SZLINE.
+OPER_SZLINE_LIST_EMPTY
+ A lista de SZLINE está vazia.
+OPER_SZLINE_LIST_HEADER
+ Lista atual de SZLINE:
+ Núm Máscara Motivo
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Current SZLINE list:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (por %s em %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ A lista de SZLINE foi apagada.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET opção configuração
+OPER_SET_IGNORE_ON
+ Opção IGNORE será usada.
+OPER_SET_IGNORE_OFF
+ Opção IGNORE não será usada.
+OPER_SET_IGNORE_ERROR
+ Configuração do IGNORE deve ser ON ou OFF.
+OPER_SET_READONLY_ON
+ Services estão agora no modo somente leitura.
+OPER_SET_READONLY_OFF
+ Services estão agora no modo leitura e gravação.
+OPER_SET_READONLY_ERROR
+ Configuração do READONLY deve ser ON ou OFF.
+OPER_SET_LOGCHAN_ON
+ Services estão enviando o log no canal %s.
+OPER_SET_LOGCHAN_OFF
+ Services deixando de enviar o log.
+OPER_SET_LOGCHAN_ERROR
+ Configuração do LOGCHAN deve ser ON ou OFF e LogChan deve estar definido.
+OPER_SET_DEBUG_ON
+ Services estão agora no modo debug.
+OPER_SET_DEBUG_OFF
+ Services não estão mais no modo debug.
+OPER_SET_DEBUG_LEVEL
+ Services estão agora no modo debug (nível %d).
+OPER_SET_DEBUG_ERROR
+ Configuração do DEBUG deve ser ON, OFF, ou um número positivo.
+OPER_SET_NOEXPIRE_ON
+ Services estão agora no modo não expira.
+OPER_SET_NOEXPIRE_OFF
+ Services estão agora no modo expira.
+OPER_SET_NOEXPIRE_ERROR
+ Opção NOEXPIRE deve ser ON ou OFF.
+OPER_SET_UNKNOWN_OPTION
+ Opção desconhecida: %s.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} servidor
+OPER_NOOP_SET
+ Todas as O:lines do servidor %s foram removidas.
+OPER_NOOP_REVOKE
+ Todas as O:lines do servidor %s foram resetadas.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE server [motivo]
+
+# RAW responses
+OPER_JUPE_HOST_ERROR
+ Please use a valid server name when juping
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW texto
+
+# UPDATE responses
+OPER_UPDATING
+ Atualizando banco de dados.
+
+# RELOAD responses
+OPER_RELOAD
+ Arquivos de configuração dos services foram recarregados.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN não definido; não foi possível reiniciar. Rode novamente o \2configure\2 e reconfigure os services para habilitar o comando RESTART.
+
+# LISTIGNORE responses
+OPER_IGNORE_SYNTAX
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick]
+OPER_IGNORE_VALID_TIME
+ You have to enter a valid number as time.
+OPER_IGNORE_TIME_DONE
+ %s will now be ignored for %s.
+OPER_IGNORE_PERM_DONE
+ %s will now permanently be ignored.
+OPER_IGNORE_DEL_DONE
+ %s will no longer be ignored.
+OPER_IGNORE_LIST
+ Lista de ignore dos Services:
+OPER_IGNORE_LIST_NOMATCH
+ %s not found on ignore list.
+OPER_IGNORE_LIST_EMPTY
+ Lista de ignore dos Services vazia.
+
+# KILLCLONES responses
+OPER_IGNORE_LIST_CLEARED
+ Ignore list has been cleared.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Não foi possível encontrar o nick %s.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Lista de canais:
+ Nome Users Tópico
+OPER_CHANLIST_HEADER_USER
+ Lista de canais do %s:
+ Nome Users Tópico
+OPER_CHANLIST_RECORD
+ %-20s %4d %s
+OPER_CHANLIST_END
+ Fim da listagem.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Lista de usuários:
+ Nick Máscara
+OPER_USERLIST_HEADER_CHAN
+ Lista de users do %s:
+ Nick Máscara
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Fim da listagem.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {hostname | pattern} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Proxy detection is disabled.
+OPER_CACHE_NOT_FOUND
+ %s was not found in the cache.
+OPER_CACHE_REMOVED
+ %s has been removed from the cache.
+OPER_CACHE_HEADER
+ Hostname Status
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ End of list - %d/%d matches shown.
+OPER_CACHE_QUEUED
+ Queued
+OPER_CACHE_PROGRESS
+ In progress
+OPER_CACHE_NORMAL
+ Normal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ HTTP proxy
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ON
+ You are now a SuperAdmin
+OPER_SUPER_ADMIN_OFF
+ You are no longer a SuperAdmin
+OPER_SUPER_ADMIN_SYNTAX
+ Setting for SuperAdmin must be ON or OFF.
+OPER_SUPER_ADMIN_WALL_ON
+ %s is now a Super-Admin
+OPER_SUPER_ADMIN_WALL_OFF
+ %s is no longer a Super-Admin
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ONLY
+ Only Super-Admins can use this command.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ This service is temporarly disabled, please try again later
+OPER_DEFCON_NO_CONF
+ The Defcon system must be enabled in the services.conf file
+OPER_DEFCON_CHANGED
+ Services are now at DEFCON %d
+OPER_DEFCON_WALL
+ %s Changed the DEFCON level to %d
+DEFCON_GLOBAL
+ The Defcon Level is now at Level: %d
+
+# Modules strings
+
+OPER_MODULE_LOADED
+ Module %s loaded
+OPER_MODULE_UNLOADED
+ Module %s unloaded
+OPER_MODULE_LOAD_FAIL
+ Unable to load module %s
+OPER_MODULE_REMOVE_FAIL
+ Unable to remove module %s
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST
+ Module: %s
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Providing IRCD handler for: %s
+OPER_MODULE_NO_LIST
+ No modules currently loaded
+OPER_MODULE_NO_INFO
+ No information about module %s is available
+OPER_MODULE_INFO_SYNTAX
+ MODINFO FileName
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ The following commands have been loaded by a module:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [parâmetros]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+tempo] máscara limite motivo
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {máscara | lista}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE núm posição
+OPER_EXCEPTION_DISABLED
+ Opção de limite de sessões desabilitada.
+OPER_EXCEPTION_ALREADY_PRESENT
+ Máscara %s já presente na lista de limite de sessões.
+OPER_EXCEPTION_TOO_MANY
+ Lista de limite de sessões está cheia!
+OPER_EXCEPTION_ADDED
+ Limite de sessões para %s é agora de %d.
+OPER_EXCEPTION_MOVED
+ Sessão para %s (#%d) alterada para a posição %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ Nenhuma entrada equivalente (#%d) na lista de limite de sessões.
+OPER_EXCEPTION_NOT_FOUND
+ %s não encontrado na lista de limite de sessões.
+OPER_EXCEPTION_NO_MATCH
+ Nenhum resultado encontrado na lista de limite de sessões.
+OPER_EXCEPTION_DELETED
+ %s removido da lista de limite de sessões.
+OPER_EXCEPTION_DELETED_ONE
+ Removida 1 entrada da lista de limite de sessões.
+OPER_EXCEPTION_DELETED_SEVERAL
+ Removidas %d entradas da lista de limite de sessões.
+OPER_EXCEPTION_LIST_HEADER
+ Atual lista de Kimite de sessões:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Núm Limite Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (por %s em %s; %s)
+ Limite: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Limite de sessão inválida. O limite deve ser um número inteiro maior ou igual a zero e menor que %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Máscara inválida. Apenas máscaras (hosts) são válidas como exceções aos limites de sessões. Nick ou username não são válidos.
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST limite | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST limite
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ Limite de sessões está desativado.
+OPER_SESSION_INVALID_THRESHOLD
+ Número inválido. Deve ser um número inteiro maior que 1.
+OPER_SESSION_NOT_FOUND
+ %s não encontrado na lista de Limite de Sessões.
+OPER_SESSION_LIST_HEADER
+ Hosts com pelo menos %d sessões:
+OPER_SESSION_LIST_COLHEAD
+ Sessões Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ O host %s possui atualmente %d sessões com um limite de %d.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Sintaxe: EXCEPTION ADD [+tempo] máscara limite motivo
+ EXCEPTION DEL {máscara | lista}
+ EXCEPTION MOVE núm posição
+ EXCEPTION LIST [máscara | lista]
+ EXCEPTION VIEW [máscara | lista]
+
+ Permite que os Administradores dos Services manipulem a lista
+ de hosts que tenham limite de conexões especificados - deixando
+ certos hosts, como shell de servidores, conectar mais que o
+ número padrão de conexões simultâneas. Uma vez um host atingindo
+ um limite de conexão, todos os clientes que tentem conectar
+ daquele host serão expulsos ("killados").
+
+ Antes do usuário ser expulso ("killado"), ele será notificado
+ via /NOTICE do %S com um tópico de ajuda sobre limitação
+ de conexões.
+
+ EXCEPTION ADD adiciona a máscara fornecida à lista de exceções.
+ Note que as máscaras nick!user@host e user@host são
+ inválidas. Só nomes reais de hosts, como mail.dominio.com e
+ *.dominio.com, são permitidos porque a limitação de
+ conexão não utiliza o nick ou ident para bloquear o acesso.
+
+ EXCEPTION DEL remove a máscara especificada da Lista de
+ exceções.
+ EXCEPTION MOVE move uma exceção de número num para uma
+ posição dada. As exceções que estavam na faixa onde houve
+ alteração serão todas movidas para cima ou para baixo conforme
+ for o deslocamento necessário.
+ EXCEPTION LIST ou EXCEPTION VIEW mostram todas as
+ exceções atuais válidas; se uma máscara é dada como parâmetro
+ opcional, a lista é limitada as exceções que são compatíveis
+ com a máscara dada. A diferenca é que EXCEPTION VIEW
+ é mais detalhado, mostrando o nome da pessoa que adicionou
+ a exceção, o seu limite de conexões, o motivo, a máscara do
+ host, a data e o tempo de validade.
+
+ Note que um cliente que conecte vai usar a primeira exceção
+ que for compatível com o seu host. Listas de exceções muito
+ grandes e máscaras de hosts muito abrangentes certamente
+ irão degradar a eficácia de funcionamento ("performance")
+ dos services.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_SESSION
+ Sintaxe: SESSION LIST número
+ SESSION VIEW host
+
+ Permite que os Administradores dos Services vejam a lista de
+ conexões.
+
+ SESSION LIST lista máscaras de hosts com pelo menos
+ número conexões permitidas.
+ O limite deve ser um número maior que 1. Isto deve previnir
+ a listagem de muitos hosts com um limite de conexões
+ limitado a 1.
+ SESSION VIEW mostra informações detalhadas sobre um host
+ específico, incluindo o número de conexões atual e o limite
+ A máscara dada em host não deve incluir wildcards.
+
+ Veja a ajuda sobre EXCEPTION para mais informações sobre
+ o limite de conexões e como especificar limites de conexões
+ para certos hosts e grupos de hosts.
+
+ Limitado aos Administradores dos Services.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Displays all Services Staff nicks along with level
+ and on-line status.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ The defcon system can be used to implement a pre-defined
+ set of restrictions to services useful during an attemtped
+ attack on the network.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * No new channel registrations
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * No new nick registrations
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * No MLOCK changes
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Force Chan Modes (%s) to be set on all channels
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Use the reduced session limit of %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill any NEW clients connecting
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignore any non-opers with message
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Silently ignore non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL any new clients connecting
+
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * No new memos sent
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+expiry] channel reason
+
+ Puts an AKILL for every nick on the specified channel. It
+ uses the entire and complete real ident@host for every nick,
+ then enforces the AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Logon News - %s] %s
+NEWS_OPER_TEXT
+ [Oper News - %s] %s
+
+NEWS_RANDOM_TEXT
+ [Random News - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Sintaxe: LOGONNEWS {ADD|DEL|LIST} [texto|núm]
+NEWS_LOGON_LIST_HEADER
+ Logon news items:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s por %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ Não existem logon news.
+NEWS_LOGON_ADD_SYNTAX
+ Sintaxe: LOGONNEWS ADD texto
+NEWS_LOGON_ADD_FULL
+ Lista de logon news está cheia!
+NEWS_LOGON_ADDED
+ Adicionado novo logon news (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Sintaxe: LOGONNEWS DEL {núm | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Logon news não encontrado #%d!
+NEWS_LOGON_DELETED
+ Logon news removido #%d.
+NEWS_LOGON_DEL_NONE
+ Nenhum logon news para remover!
+NEWS_LOGON_DELETED_ALL
+ Todos os logon news foram removidos.
+
+NEWS_OPER_SYNTAX
+ Sintaxe: OPERNEWS {ADD|DEL|LIST} [texto|núm]
+NEWS_OPER_LIST_HEADER
+ Oper news items:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s por %s)
+ %s
+NEWS_OPER_LIST_NONE
+ Não existe nenhum oper news.
+NEWS_OPER_ADD_SYNTAX
+ Sintaxe: OPERNEWS ADD texto
+NEWS_OPER_ADD_FULL
+ Lista de oper news está cheia!
+NEWS_OPER_ADDED
+ Adicionado novo oper news (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Sintaxe: OPERNEWS DEL {núm | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Oper news não encontrado #%d!
+NEWS_OPER_DELETED
+ Oper news removido #%d.
+NEWS_OPER_DEL_NONE
+ Nenhum oper news para remover!
+NEWS_OPER_DELETED_ALL
+ Todos os oper news foram removidos.
+
+NEWS_RANDOM_SYNTAX
+ Syntax: RANDOMNEWS {ADD|DEL|LIST} [text|num]
+NEWS_RANDOM_LIST_HEADER
+ Random news items:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ There is no random news.
+NEWS_RANDOM_ADD_SYNTAX
+ Syntax: RANDOMNEWS ADD text
+NEWS_RANDOM_ADD_FULL
+ News list is full!
+NEWS_RANDOM_ADDED
+ Added new random news item (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Syntax: RANDOMNEWS DEL {num | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Random news item #%d not found!
+NEWS_RANDOM_DELETED
+ Random news item #%d deleted.
+NEWS_RANDOM_DEL_NONE
+ No random news items to delete!
+NEWS_RANDOM_DELETED_ALL
+ All random news items deleted.
+
+NEWS_HELP_LOGON
+ Sintaxe: LOGONNEWS ADD texto
+ LOGONNEWS DEL {núm | ALL}
+ LOGONNEWS LIST
+
+ Edita ou mostra a lista de logon news. Quando um usuário
+ se conecta à rede, estas mensagens são enviadas para ele.
+ (No entanto, não mais que três mensagens serão enviadas
+ simultaneamente para evitar flood. Se houver mais que três
+ mensagens novas, apenas essas mais novas serão mostradas.)
+
+ LOGONNEWS LIST pode ser usado por qualquer Operador
+ para listar as mensagens atuais. ADD e DEL só podem
+ ser usados pelos Administradores dos Services.
+
+NEWS_HELP_OPER
+ Sintaxe: OPERNEWS ADD texto
+ OPERNEWS DEL {núm | ALL}
+ OPERNEWS LIST
+
+ Edita ou mostra a lista de oper news. Quando um usuário
+ se torna operador (pelo comando /OPER), estas mensagens
+ lhe serão enviadas. (No entanto, não mais que três
+ mensagens serão enviadas simultaneamente para evitar
+ flood. Se houver mais que três mensagens novas, apenas
+ as três mais novas serão mostradas).
+
+ OPERNEWS LIST pode ser usado por qualquer Operador
+ para listar as oper news. ADD e DEL só podem ser usados
+ Administradores dos Services.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+NEWS_HELP_RANDOM
+ Syntax: RANDOMNEWS ADD text
+ RANDOMNEWS DEL {num | ALL}
+ RANDOMNEWS LIST
+
+ Edits or displays the list of random news messages. When a
+ user connects to the network, one (and only one) of the
+ random news will be randomly chosen and sent to them.
+
+ RANDOMNEWS LIST may be used by any IRC operator to list the
+ current news messages. ADD and DEL may only be used by
+ Services admins.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S é um services criado para dar informações sobre
+ os Services. Os tópicos de ajuda são enviados pelo
+ comando HELP dos outros clientes dos Services:
+
+ /msg %s HELP
+ para informações sobre como registrar nicks
+
+ /msg %s HELP
+ para informações sobre como registrar e controlar
+ canais
+
+ /msg %s HELP
+ para informações sobre como enviar mensagens para
+ usuários que não estejam conectados no momento.
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ para informações sobre como colocar um bot em seu canal
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ %S permite que você "registre" um nick e evita que outras
+ pessoas o utilizem. Os seguintes comandos permitem o
+ registro e a manutenção dos nicks; para utilizá-los, digite
+ /msg %S comando. Para maiores informações sobre um
+ comando digite /msg %S HELP comando.
+
+ REGISTER Registra um nick
+ GROUP Se junta a um grupo
+ IDENTIFY Identifica seu nick com sua senha
+ ACCESS Modifica a lista de endereços autorizados
+ SET Ajusta opções, incluindo proteção de kill
+ DROP Cancela o registro de um nick
+ RECOVER Derruba usuário que esteja usando seu nick
+ RELEASE Retoma a custódia do seu nick após um RECOVER
+ SENDPASS Esqueceu sua senha? Tente isto
+
+ Outros comandos: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS
+
+ NOTICE: Este serviço tem a intenção de prover um modo para
+ que usuários do IRC não tenham sua identidade comprometida.
+ Isto NÃO é voltado para facilitar "roubo" dos nicks ou
+ outras atitudes má intencionadas. O abuso do %S
+ resultará em, no mínimo, perda do(s) nick(s) abusivo(s).
+
+NICK_HELP_EXPIRES
+
+ Nicks que não estejam mais sendo usados estão sujeitos
+ a expirarem automaticamente, ex. eles serão apagados
+ após %d dias sem serem usados.
+
+NICK_HELP_REGISTER
+ Sintaxe: REGISTER senha [email]
+
+ Registra seu nick no banco de dados do %S. Uma vez
+ que seu nick está registrado, você pode usar os comandos
+ SET e ACCESS para configurar as opções do seu nick como
+ você preferir depois. Certifique-se de lembrar sua senha
+ durante o registro, você precisará dela para fazer alterações
+ no seu nick futuramente.
+ (Lembre-se que maiúsculas diferem, como: ANOPE, Anope e
+ anope são senhas diferentes!)
+
+ Sugestões ao escolher sua senha:
+
+ As senhas não devem ser de fácil adivinhação. Por exemplo,
+ usar seu nome como senha é uma péssima idéia. Utilizar seu
+ nick como senha é uma idéia muito pior e, de fato, o %S
+ não permitirá isso. Da mesma maneira, senhas curtas são
+ vulneráveis a testes de erro-e-acerto, então você deve
+ escolher uma senha com pelo menos 5 caracteres. Finalmente,
+ o caractere "ESPAÇO" não pode ser usado em senhas.
+
+ O parâmetro email é opcional e servirá para setar um
+ email para seu nick. Entretanto, o email pode ser obrigatório
+ em algumas Redes de IRC.
+ Sua privacidade é respeitada; teste e-mail nunca será dado
+ para terceiros.
+
+ Este comando servirá também para criar um GRUPO para o seu
+ nick, e irá permitir que você registre outros nicks e divida
+ as mesmas configurações, os mesmos memos e os mesmos
+ privilégios em canais. É conhecido em outras redes como LINK.
+ Para maiores informações, digite /msg %S HELP GROUP.
+
+NICK_HELP_GROUP
+ Syntax: GROUP alvo senha
+
+ Liga seu nick a outro, efetivamente, fazendo uma ligação
+ do seu nick atual com um outro nick especificado. Quando
+ você emite este comando, a lista de acesso do seu nick
+ atualmente em uso é apagada e substituida pelo nick que
+ você está ligando, todos os memos do seu nick atual são
+ adicionados na lista de memos do nick alvo (isso pode
+ causar um excesso no limite de memos do nick, em alguns
+ casos você precisa apagar alguns memos antes de poder
+ receber mais memos de uma outra pessoa).
+
+ Uma vez que a ligação foi estabilizada, seu nick será
+ transparentemente convertido para o nick alvo em todos
+ os lugares nos Services, exceto para os comandos NickServ
+ UNLINK e DROP.
+
+ Por exemplo, você pode usar um nick ou outro para ler
+ o mesmo conjunto de memos (e mensagens enviadas para
+ um nick ou outro irão para a mesma lista). Se voce se
+ identificar para um nick, estará automaticamente
+ identificado para o outro. Se um nick ou outro está
+ na lista de acesso de um canal, ambos nicks terão os
+ mesmos privilégios de acesso.
+
+ Para usar este comando, você deve identificar o nick
+ atual usando /msg %S IDENTIFY senha, e você
+ deve forneceer a senha para o nick que você deseja
+ ligar.
+
+ Atenção: todos os nicks do grupo terão a mesma senha.
+
+NICK_HELP_IDENTIFY
+ Syntax: IDENTIFY senha
+
+ Identifica você ao %S como sendo dono do nick.
+ Muitos comandos exigem que você se identifique com este
+ comando antes de você usá-los. A senha deve ser a mesma que
+ você enviou com o comando REGISTER.
+
+NICK_HELP_UPDATE
+ Syntax: UPDATE
+
+ Updates your current status, i.e. it checks for new memos,
+ sets needed chanmodes (ModeonID) and updates your vhost and
+ your userflags (lastseentime, etc).
+
+NICK_HELP_LOGOUT
+ Sintaxe: LOGOUT
+
+ Este comando reverte o efeito do comando IDENTIFY, ex.
+ faz com que você não seja mais reconhecido como o verdadeiro
+ dono do nick. Note, entretanto, que ele não pedira que
+ você se identifique novamente.
+
+NICK_HELP_DROP
+ Syntax: DROP [nick]
+
+ Sem parâmetros, cancela o registro de seu nick no banco de
+ dados do %S.
+
+ Com parâmetros, cancela o registro de um nick especificado
+ do banco de dados (restrito aos Administradores dos
+ Services).
+
+ Para você usar este comando, será necessário que primeiro
+ você se identifique usando sua senha (/msg %S HELP DROP
+ para maiores informações).
+
+NICK_HELP_ACCESS
+ Sintaxe: ACCESS ADD máscara
+ ACCESS DEL máscara
+ ACCESS LIST
+
+ Modifica ou mostra a lista de acesso do seu nick. Esta é
+ a lista de endereços a qual será automaticamente reconhecida
+ pelo %S como as permitidas a usarem seu nick. Se você
+ quer usar um nick de um endereço diferente, você deve usar o
+ comando IDENTIFY para identificar-se ao %S
+
+ Exemplos:
+
+ ACCESS ADD nick@*.provedor.com.br
+ Permite o acesso do usuário nick de qualquer
+ máquina com o domínio provedor.com.br.
+
+ ACCESS DEL nick@*.provedor.com.br
+ Reverte o comando anterior
+
+ ACCESS LIST
+ Mostra a lista de acesso atual.
+
+NICK_HELP_SET
+ Sintaxe: SET opção parâmetros
+
+ Ajusta várias opções de nick. A opção pode ser:
+
+ DISPLAY Mostra o seu grupo nos Services
+ PASSWORD Ajusta a senha do seu nick
+ LANGUAGE Ajusta a linguagem dos Services quando
+ mensagens são enviadas à você
+ URL Associa um endereço URL com seu nick
+ EMAIL Associa um endereço de e-mail ao seu nick
+ ICQ Associa um número de ICQ ao seu nick
+ GREET Associa uma mensgem de entrada ao seu nick
+ KILL Ativa/Desativa a proteção de kill para o seu
+ nick
+ SECURE Ativa/Desativa o dispositivo de segurança para
+ o seu nick
+ PRIVATE Previne seu nick de aparecer em um /msg %S LIST
+ HIDE Esconde certas informações sobre seu nick
+ MSG Altera o método de comunicação dos Services
+
+ Para usar este comando, você deve primeiro se identificar
+ com sua senha (/msg %S HELP IDENTIFY para maiores
+ informações).
+
+ Digite /msg %S HELP SET oção para maiores informações
+ sobre um comando específico.
+
+NICK_HELP_SET_DISPLAY
+ Sintaxe SET DISPLAY novo-display
+
+ Altera o display usado como referência ao nome do seu grupo
+ nos Services. O novo display DEVE ser um nick do seu grupo.
+
+NICK_HELP_SET_PASSWORD
+ Sintaxe: SET PASSWORD nova-senha
+
+ Muda a senha de seu nick.
+
+NICK_HELP_SET_LANGUAGE
+ Sintaxe: SET LANGUAGE número
+
+ Muda a linguagem que os Services usam ao enviar mensagens
+ para você (por exemplo, quando responde um comando que você
+ emite). Lembre-se que apenas a linguagem em Português está
+ totalmente atualizada, outras linguagens podem enviar
+ mensagens com informações incorretas.
+ O número deve ser escolhido da seguinte lista de línguas:
+
+
+NICK_HELP_SET_URL
+ Sintaxe: SET URL url
+
+ Associa uma dada URL ao seu nick. Esta URL será mostrada
+ sempre que alguem solicitar informação sobre seu nick
+ através do comando INFO.
+
+NICK_HELP_SET_EMAIL
+ Sintaxe: SET EMAIL endereço
+
+ Associa um endereço de email designado ao seu nick. Este
+ endereço será sempre mostrado quando alguém solicitar
+ informação sobre seu nick atraves do comando INFO.
+ O email especificado também é usado para enviar sua senha
+ caso seja perdida. Caso não tenha nenhum endereço para seu
+ nick ou o mesmo seje inválido, não será possível recuperar
+ a senha perdida.
+
+NICK_HELP_SET_ICQ
+ Sintaxe: SET ICQ número
+
+ Associa um número de ICQ ao seu nick. Este número
+ será sempre mostrado quando alguém solicitar
+ informação sobre seu nick através do comando INFO.
+
+NICK_HELP_SET_GREET
+ Sintaxe: SET GREET mensagem
+
+ Faz com que a mensagen escolhida se torne a sua mensagem
+ de entrada que aparecerá sempre quando você entrar em um canal
+ que tenha a opção GREET habilitada, e também tenha acesso a isto.
+
+NICK_HELP_SET_KILL
+ Sintaxe: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Possibilita a proteção de KILL do seu nick. Com a proteção
+ de KILL acionada, se outro usuário tentar tomar seu nick,
+ será dado 1 minuto para este mudar de nick, após isso, será
+ trocado de nick ou removido do irc pelo %S.
+
+ Se você selecionar QUICK, será dado ao usuário somente 20
+ segundos para mudar de nick ao invés do usual (60 segundos).
+ Se você selecionar a opção IMMED, o nick será mudado
+ imediatamente sem mesmo ser avisado antes; é recomendado
+ não usar essa opção, a não ser que seja necessário. Pode
+ acontecer do Administrador da Rede desabilitar essa opção.
+
+NICK_HELP_SET_SECURE
+ Sintaxe: SET SECURE {ON | OFF}
+
+ Torna os recursos de segurança do %S ativados (ON) ou
+ desativados (OFF) sobre o seu nick. Com o SECURE acionado
+ você deve entrar com sua senha antes de ser reconhecido como
+ usuário do nick, independentemente do fato do seu endereço
+ constar na lista de acesso. Entretanto, se você está na
+ lista de acesso, o %S não irá dar auto-kill em você de
+ acordo com os ajustes da opção KILL.
+
+NICK_HELP_SET_PRIVATE
+ Sintaxe: SET PRIVATE {ON | OFF}
+
+ Torna a opção de privacidade do %S sobre o seu nick
+ em ativada (ON) ou desativada (OFF). Com o PRIVATE ativado,
+ seu nick não aparecerá nas listagens de nicks geradas com
+ o comando %S's LIST. (Entretando, alguém que sabe do seu
+ nick ainda pode obter informações usando o comando INFO).
+
+NICK_HELP_SET_HIDE
+ Sintaxe: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Permite que você previna que certas informações sejam
+ mostradas quando alguém usa %S INFO no seu nick. Você pode
+ esconder seu endereço de e-mail (EMAIL), última máscara vista
+ user@host (USERMASK), e sua última mensagem de saida (QUIT).
+ O segundo parâmetro especifica quando a informação deve ser
+ mostrada (OFF) ou escondida (ON).
+
+NICK_HELP_SET_MSG
+ Sintaxe: SET MSG {ON | OFF}
+
+ Permite que você escolha a forma que os Services devem se
+ comunicar com você. Com MSG acionado, os Services irão usar
+ mensagems, caso contrário, usarão notices.
+
+NICK_HELP_RECOVER
+ Syntax: RECOVER nickname [password]
+
+ Permite que você recupere seu nick se alguém o tiver
+ tomado; isso faz o mesmo que o %S faz automaticamente
+ se alguém "rouba" um nick protegido com kill.
+
+ Quando você usa este comando, o %S trará um falso
+ usuário online com o mesmo nick de quem o está usando.
+ Isto causará uma desconexão pelo servidor de IRC do outro
+ usuário. O falso usuário ficara online por 1 minuto para
+ assegurar que o outro usuário não reconecte imediatamente;
+ Durante este minuto, você pode reivindicar seu nick.
+ Alternativamente, use o comando RELEASE
+ (/msg %S HELP RELEASE) para retomar seu nick mais
+ rapidamente.
+
+ Para usar o comando RECOVER com um nick, seu endereço atual
+ como mostrado com /WHOIS deve estar na lista de acesso do
+ nick, ou você deve fornecer a senha correta para o nick.
+
+NICK_HELP_RELEASE
+ Sintaxe: RELEASE nick [senha]
+
+ Instrui o %S a remover qualquer espera no seu nick
+ causada pelo kill automático de proteção ou pelo uso do
+ comando RECOVER. Por padrão, essa espera dura 1 minuto;
+ este comando libera o seu nick mais cedo.
+
+ Para usar o comando RELEASE para um nick, seu endereço
+ atual como mostrado com /WHOIS deve estar na lista de acesso
+ do nick, ou você deve fornecer a senha correta para o nick.
+
+NICK_HELP_GHOST
+ Sintaxe: GHOST nick [senha]
+
+ Elimina uma sessão "fantasma" de IRC que esteja usando seu
+ nick. A sessão "fantasma" é aquela que não está realmente
+ conectada, mas que o servidor de IRC acredita estar ainda
+ ativa por qualquer razão. Isso acontece normalmente se seu
+ computador travar ou se sua conexão com a internet ou modem
+ cair por um período curto de tempo enquanto você esta no IRC.
+
+ Para usar o comando GHOST em um nick, seu endereço atual
+ como mostrado no /WHOIS deve pertencer a lista de acesso do
+ nick, ou você deve fornecer a senha correta para o nick.
+
+NICK_HELP_INFO
+ Sintaxe: INFO nick [ALL]
+
+ Mostra a informação sobre o nick dado, como o dono do nick,
+ último endereço utilizado, tempo e opções. Se você está
+ identificado para o nick que você esta obtendo informações
+ e a opção ALL é especificada, será mostrado à você toda
+ informação possível; havendo opções para esconder
+ informações ou não.
+
+NICK_HELP_LIST
+ Sintaxe: LIST padrão
+
+ Lista todos os nicks registrados que combinam com o padrão
+ fornecido no formato nick!ident@host. Nicks com a opção
+ PRIVATE ligada não serão mostrados.
+
+NICK_HELP_ALIST
+ Syntax: ALIST [level]
+
+ Lists all channels you have access on. Optionally, you can specify
+ a level in XOP or ACCESS format. The resulting list will only
+ include channels where you have the given level of access.
+
+ Examples:
+ ALIST Founder
+ Lists all channels where you have Founder
+ access.
+
+ ALIST AOP
+ Lists all channels where you have AOP access
+ or greater.
+
+ ALIST 10
+ Lists all channels where you have level 10
+ access or greater.
+
+ Channels that have the NOEXPIRE option set will be prefixed by
+ an exclamation mark.
+
+NICK_HELP_GLIST
+ Sintaxe: GLIST
+
+ Lista todos os nicks do grupo.
+
+NICK_HELP_STATUS
+ Sintaxe: STATUS nick
+
+ Retorna se o usuário que está usando um determinado nick
+ é reconhecio como dono do nick.
+ A resposta tem este formato:
+
+ nickname código-de-status
+
+ onde nick é o nick enviado com o comando, e
+ código-de-status um dos seguintes:
+
+ 0 - usuário não está conectado ou o nick não está registrado
+ 1 - usuário não reconhecido como dono do nick
+ 2 - usuário reconhecido como dono só pela lista de acesso
+ 3 - usuário reconhecido como dono via identificação por senha
+
+ Até 16 nicks podem ser enviados com cada comando; o resto será
+ ignorado. Não é gerado mensagem de erro se nenhum nick for fornecido.
+
+NICK_HELP_SENDPASS
+ Sintaxe: SENDPASS nick
+
+ Envia a senha do nick em questão para o endereço de email
+ que ele tiver setado para seu nick. Esse comando é bem útil em
+ se falando de senhas perdidas.
+
+ Poder ser limitado a IRC operators em algumas redes.
+
+ Este comando não está disponível quando estiver usando encriptação.
+
+NICK_SERVADMIN_HELP
+
+ Os comandos abaixo estão disponíveis para Admins dos Services:
+
+ GETPASS Recupera a senha de um nick determinado
+ (apenas se não estiver com encriptação)
+ FORBID Previne um nick de ser usado ou registrado
+
+ Os Administradores podem ainda usar o DROP em qualquer nick
+ sem ser necessário se identificar como dono dele (/msg %S
+ ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Sintaxe: LOGOUT [nick [REVALIDATE]]
+
+ Sem nenhum parâmetro ele irá apenas reverter o efeito do comando IDENTIFY
+
+ Com um parâmetro, fará o mesmo para o nick determinado. Se você usar
+ o comando REVALIDATE os Services irão pedir que o nick em questão
+ se identifique novamente.
+
+ Comando limitado aos Administradores dos Services.
+
+NICK_SERVADMIN_HELP_DROP
+ Sintaxe: DROP [nick]
+
+ Sem parâmetros, cancela o registro de seu nick no banco de
+ dados do %S.
+
+ Com parâmetros, cancela o registro de um nick especificado
+ do banco de dados.
+ Este comando é restrito aos Administradores dos Services.
+
+NICK_SERVADMIN_HELP_SET
+
+ Administradores dos Services podem ajustar a opção NOEXPIRE,
+ com a qual os nicks podem ser protegidos de expirar. E ainda,
+ Administradores dos Services podem ajustar opções para qualquer
+ nick sem se identificar com a senha, usando:
+ SET nick opção parametros.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Sintaxe: SET nick NOEXPIRE {ON | OFF}
+
+ Determina se um nick fornecido poderá ser expirado.
+ Ajustando este para ON, evita que o nick seja expirado.
+
+ Limitado aos Administradores dos Services.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Administradores de Services podem usar o comando ALL com qualquer nick.
+
+NICK_SERVADMIN_HELP_LIST
+ Sintaxe: LIST padrão [FORBIDDEN] [NOEXPIRE]
+
+ Lista todos os nicks registrados que combinem com o padrão
+ fornecido (formato nick!ident@host). Nicks com opção PRIVATE
+ serão somente exibidos para os Administradores dos Services.
+ Nicks com opção NOEXPIRE ajustada terão um ! preposto ao nick
+ na lista quando for a pedido de Administrador dos Services.
+ Se as opções FORBIDDEN ou NOEXPIRE forem fornecidas, somente os
+ nicks proibidos (forbidden) ou os que tem a flag NOEXPIRE serão
+ exibidos, respectivamente. Se ambas as opções são fornecidas,
+ ambos os tipos de nicks serão exibidos.
+
+ Essas opções são limitadas aos Administradores dos Services.
+
+ Exemplos:
+
+ LIST *!ident@servidor.com.br
+ Lista todos os nicks de *!ident@servidor.com.br.
+
+ LIST *Bot*!*@*
+ Lista todos os nicks registrados com Bot em seus nomes.
+
+ LIST * NOEXPIRE
+ Lista todos os nicks registrados cujos registros foram
+ ajustados para não expirar.
+
+NICK_SERVADMIN_HELP_ALIST
+ Syntax: ALIST [nickname] [level]
+
+ With no parameters, lists channels you have access on. With
+ one parameter, lists channels that nickname has access
+ on. With two parameters lists channels that nickname has
+ level access or greater on.
+
+ This use limited to Services admins.
+
+NICK_SERVADMIN_HELP_GLIST
+ Sintaxe: GLIST [nick]
+
+ Sem nenhum parâmetro lista todos os nicks no seu grupo.
+
+ Com um parâmetro, lista todos os nicks no grupo determinado.
+
+ Este comando é limitado aos Administradores dos Services.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Sintaxe: GETPASS nick
+
+ Mostra a senha de um nick especificado.
+ Note que sempre que este comando for usado, uma mensagem
+ incluindo o nick da pessoa que emitiu o comando o nick
+ requisitado será gravado e enviado para WALLOPS/GLOBOPS.
+
+ Limitado aos Administradores dos Services.
+
+ Este comando não é disponível quando a encriptação está habilitada.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Returns the matching nicks that used given email. Note that
+ you can not use wildcards for either user or emailhost. Whenever
+ this command is used, a message including the person who issued
+ the command and the email it was used on will be logged.
+
+ Limited to Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Sintaxe: FORBID nick
+
+ Não permite que um nick seja registrado ou usado por
+ ninguém. Pode ser cancelado desregistrando o nick.
+
+ Limitado aos Administradores dos Services.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ %S permite que você registre e controle vários
+ aspectos do canal. %S pode prevenir o "take over"
+ do canal de usuários maliciosos limitando quem possui
+ o privilégio de OP do canal. Os comandos disponíveis
+ estão listados abaixo.
+ Para usá-los, digite /msg %S comando.
+ Para mais informações de um comando, digite
+ /msg %S HELP comando.
+
+ REGISTER Registra um canal
+ IDENTIFY Identifica seu nick
+ SET Ajusta as opções e informações do canal
+ ACCESS Modifica a lista de usuários privilegiados
+ LEVELS Redefine os níveis de acesso
+ AKICK Faz a manutenção da Lista de Autokick
+ DROP Cancela o registro de um canal
+ SENDPASS Ajuda para recuperar senhas
+
+ Outros comandos: CLEAR, DEOP, DEVOICE, GETKEY, INFO,
+ INVITE, KICK, LIST, LOGOUT, OP, UNBAN,
+ VOICE
+
+CHAN_HELP_UNREAL
+
+ Estes comandos estão também disponíveis nesta Rede:
+ HALFOP, DEHALFOP, PROTECT, DEPROTECT
+
+CHAN_HELP_ULTIMATE
+
+ Estes comandos estão também disponíveis nesta Rede:
+ HALFOP, DEHALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ Estes comandos estão também disponíveis nesta Rede:
+ HALFOP, DEHALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Note que qualquer canal não utilizado por %d dias
+ (entenda como se nenhum usuário da lista de acesso
+ desse canal entrar neste periodo de tempo) terá
+ automaticamente cancelado o seu registro.
+
+CHAN_HELP_REGISTER
+ Sintaxe: REGISTER canal senha descrição
+
+ Registra um canal no banco de dados do %S.
+ Para utilizar este comando, você deve primeiro ser OP
+ do canal que está tentando registrar. O canal é registrado
+ para o seu nick, e você terá acesso de fundador do canal
+ quando tiver identificado quando tiver identificado a senha
+ do canal com o %S. Para ajuda sobre como mudar os privilégios
+ de usuários ao seu canal, escreva /msg %S HELP ACCESS.
+
+ IMPORTANTE: Para registrar um canal, você deve antes ter
+ registrado seu nick. Se ainda não tiver seu nick registrado,
+ digite /msg %s HELP para mais informações de como fazê-lo.
+
+CHAN_HELP_IDENTIFY
+ Sintaxe: IDENTIFY canal senha
+
+ Identifica você no %S como fundador do canal fornecido.
+ Muitos comandos exigem que você use este comando antes
+ de usá-los. A senha deverá ser a mesma usada por você
+ no comando REGISTER.
+
+CHAN_HELP_LOGOUT
+ Sintaxe: LOGOUT canal nick
+
+ Este comando faz que o nick determinado não esteja mais
+ reconhecido no canal especificado.
+
+ Se você for o dono do canal você pode usar este comando
+ em qualquer um, caso contrário, apenas em si mesmo.
+
+CHAN_HELP_DROP
+ Sintaxe: DROP #canal
+
+ Cancela o registro do canal. So poderá ser usado pelo
+ fundador do canal, que primeiramente deverá estar
+ identificado com o nickserv.
+
+CHAN_HELP_SET
+ Sintaxe: SET canal opção parâmetros
+
+ Permite ao fundador do canal ajustar as várias opções do
+ canal e outras informações. O fundador deve se identificar
+ com o nickserv antes de usar o SET.
+
+ Comandos disponiveis:
+
+ FOUNDER Ajusta o fundador do canal
+ SUCCESSOR Ajusta o sucessor do canal
+ PASSWORD Ajusta a senha do founder
+ DESC Ajusta a descrição do canal
+ URL Associa uma URL a um canal
+ EMAIL Associa um e-mail a um canal
+ ENTRYMSG Ajusta a mensagem que deve ser mandada
+ aos usuários quando eles entram no canal
+ TOPIC Altera o tópico do canal
+ BANTYPE Ajusta com os services devem fazer o ban
+ KEEPTOPIC Mantem o tópico quando o canal
+ não está em uso
+ TOPICLOCK O tópico pode ser mudado apenas
+ com o TOPIC
+ MLOCK Liga ou desliga a trava dos modos do canal
+ PRIVATE Esconde o canal do comando LIST
+ RESTRICTED Acesso restrito ao canal
+ SECURE Ativa os recursos de segurança do %S
+ SECUREOPS Rigoroso o controle de status de OP
+ SECUREFOUNDER Controle restrito do fundador do canal
+ SIGNKICK Assinatura dos kicks usados pelo comando kick
+ OPNOTICE Envia uma notice quando os comandos OP/DEOP
+ são usados
+
+ Digite /msg %S HELP SET opções para maiores informações
+ sobre uma opção em particular.
+
+CHAN_HELP_SET_FOUNDER
+ Sintaxe: SET canal FOUNDER nick
+
+ Muda o fundador do canal. O novo nick deve estar
+ registrado.
+
+CHAN_HELP_SET_SUCCESSOR
+ Sintaxe: SET canal SUCCESSOR nick
+
+ Muda o sucessor de um canal. Se o nick do founder expirar
+ ou estiver dropado enquanto o canal ainda estiver registrado,
+ o sucessor se tornará o novo founder do canal.
+ No entanto, se o sucessor possuir muitos canais registrados
+ (%d), o canal será dropado, como se nenhum sucessor tivesse
+ sido ajustado. O novo nick deverá estar registrado.
+
+CHAN_HELP_SET_PASSWORD
+ Sintaxe: SET canal PASSWORD senha
+
+ Ajusta a senha utilizada para identificação do
+ fundador do canal.
+
+CHAN_HELP_SET_DESC
+ Sintaxe: SET canal DESC descrição
+
+ Ajusta a descrição para o canal, que são mostradas com
+ os comandos LIST e INFO.
+
+CHAN_HELP_SET_URL
+ Sintaxe: SET canal URL [url]
+
+ Associa uma URL ao canal. Esta URL será mostrada
+ sempre que alguem solicitar informação sobre o canal
+ com o comando INFO. Se nenhum parâmetro for fornecido,
+ apaga qualquer URL atualmente designada para o canal.
+
+CHAN_HELP_SET_EMAIL
+ Sintaxe: SET canal EMAIL [endereco]
+
+ Associa um endereço de e-mail fornecido ao canal.
+ Este endereço será mostrado sempre que alguem solicitar
+ informação sobre o canal com o comando INFO. Se nenhum
+ parâmetro for fornecido, apaga qualquer endereço de e-mail
+ do canal.
+
+CHAN_HELP_SET_ENTRYMSG
+ Sintaxe: SET canal ENTRYMSG [mensagem]
+
+ Ajusta a mensagem na qual será enviada via /notice para
+ os usuários quando eles entrarem no canal. Se nenhum
+ parâmetro é fornecido, nenhuma mensagem será enviada
+ ao se entrar no canal.
+
+CHAN_HELP_SET_BANTYPE
+ Sintaxe: SET canal BANTYPE tipo-do-ban
+
+ Seleciona o tipo do ban sempre que os Services precisarem
+ banir alguém do seu canal.
+
+ O tipo do ban é um número entre 0 e 3 que significa:
+
+ 0: ban na forma *!user@host
+ 1: ban na forma *!*user@host
+ 2: ban na forma *!*@host
+ 3: ban na forma *!*user@*.domain
+
+CHAN_HELP_SET_KEEPTOPIC
+ Sintaxe: SET canal KEEPTOPIC {ON|OFF}
+
+ Ativa ou desativa a opção de retenção de tópico para
+ um canal. Quando a retenção de tópico está acionada,
+ o tópico para o canal será relembrado pelo %S
+ mesmo depois que os usuários deixarem o canal, e será
+ restaurado na próxima vez que o canal for re-aberto.
+
+CHAN_HELP_SET_TOPICLOCK
+ Sintaxe: SET canal TOPICLOCK {ON|OFF}
+
+ Ativa ou desativa a opção de trava do tópico de um canal.
+ Quando a Trava do tópico está ativada, o %S não
+ permitirá a mudança do tópico do canal exceto pelo comando
+ TOPIC.
+
+CHAN_HELP_SET_MLOCK
+ Sintaxe: SET canal MLOCK modos
+
+ Ajusta o parâmetro da trava do modo para um canal. O
+ %S permite que você defina certos modos no canal
+ a serem sempre ativos (ou desativos). Os modos podem
+ ser i, k, l, m, n, p, s e t; cada um desses travado
+ como ativo, desativo ou não travado. O parâmetro
+ modos e usado exatamente do mesmo modo como o comando
+ /MODE; isto é, modos seguidos de + são travados como
+ ativos, e modos seguidos de - são travados como desativos.
+
+ Cuidado: Se você trava uma senha, como no segundo exemplo
+ abaixo, você deveria também ajustar a opção RESTRICTED para
+ o canal (veja HELP SET RESTRICTED), ou qualquer usuário
+ que entra no canal que está vazio será capaz de ver a senha!
+
+ Exemplos:
+
+ SET #canal MLOCK +nt-iklps
+ Trava os modos n e t ativados, e os modos i, k, l, p,
+ e s desligados. Modo m é livremente deixado para se
+ ligado(on)ou desligado(off).
+
+ SET #canal MLOCK +knst-ilmp minha-senha
+ Trava os modos k, n, s, t como ligados e os modos i,
+ l, m, p como desligados. Também trava a senha do canal
+ como "minha-senha".
+
+ SET #canal MLOCK +
+ Elimina a trava do modos; todos os modos do canal
+ ficam livres para ser ativados ou desativados.
+
+CHAN_HELP_SET_PEACE
+ Syntax: SET channel PEACE {ON | OFF}
+
+ Enables or disables the peace option for a channel.
+ When peace is set, an user won't be able to kick,
+ ban or remove a channel status of an user that has
+ a level superior or equal to his via %S commands.
+
+CHAN_HELP_SET_PRIVATE
+ Sintaxe: SET canal PRIVATE {ON|OFF}
+
+ Ativa ou desativa a opção private para um canal. Quando
+ private está ativada, um /msg %S LIST não irá incluir
+ o canal em qualquer listagem.
+
+CHAN_HELP_SET_RESTRICTED
+ Sintaxe: SET canal RESTRICTED {ON|OFF}
+
+ Ativa ou desativa a opção de acesso restrito para um canal.
+ Quando o acesso restrito estiver ativado, usuários que
+ normalmente não possuem privilegios de OP no canal
+ (usuários com nível negativo de acesso e, se secure ops
+ estiver ativado, usuários que não pertence a lista de
+ acesso) serão imediatamente kickados e banidos do canal.
+
+CHAN_HELP_SET_SECURE
+ Sintaxe: SET canal SECURE {ON|OFF}
+
+ Ativa ou desativa os recursos de segurança do %S
+ para um canal. Quando o SECURE estiver ativo, somente
+ usuários que possuirem seus nicks registrados no %s
+ e identificados com sua senha poderão entrar no canal
+ controlado pela lista de acesso.
+
+CHAN_HELP_SET_SECUREOPS
+ Sintaxe: SET canal SECUREOPS {ON|OFF}
+
+ Ativa ou desativa a opção de segurança de ops para um canal.
+ Quando secure-ops estiver ativada, os usuários que nao
+ estiverem na lista de acesso não poderão ter o status de OP.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Syntax: SET canal SECUREFOUNDER {ON | OFF}
+
+ Habilita ou desabilitada a opção secure founder para um canal.
+ Quando o secure founder está ligado, apenas o verdadeiro founder
+ poderá dar DROP no canal, mudar sua senha, seu founder e seu
+ successor, e não aqueles que estiverem com IDENTIFY no %S.
+
+CHAN_HELP_SET_SIGNKICK
+ Sintaxe: SET canal SIGNKICK {ON | LEVEL | OFF}
+
+ Habilita ou desabilita a assinatura nos kicks para um
+ canal. Quando o SIGNKICK está habilitado, kicks através
+ do comando %S KICK terão o nick que usou o comando no motivo
+ do kick.
+
+ Se você usar LEVEL, aqueles que tiverem um level igual ou
+ superior ao level do SIGNKICK não terão o nick aparecendo no
+ motivo. Veja /msg %S HELP LEVELS para maiores informações.
+
+CHAN_HELP_SET_XOP
+ Syntax: SET channel XOP {ON | OFF}
+
+ Enables or disables the xOP lists system for a channel.
+ When XOP is set, you have to use the AOP/SOP/VOP
+ commands in order to give channel privileges to
+ users, else you have to use the ACCESS command.
+
+ Technical Note: when you switch from access list to xOP
+ lists system, your level definitions and user levels will be
+ changed, so you won't find the same values if you
+ switch back to access system!
+
+ You should also check that your users are in the good xOP
+ list after the switch from access to xOP lists, because the
+ guess is not always perfect... in fact, it is not recommended
+ to use the xOP lists if you changed level definitions with
+ the LEVELS command.
+
+ Switching from xOP lists system to access list system
+ causes no problem though.
+
+CHAN_HELP_SET_OPNOTICE
+ Sintaxe: SET canal OPNOTICE {ON | OFF}
+
+ Ativa e desativa a opção Op-Notice para um canal. Quando
+ Op-Notice estiver ativado, o %S enviará uma notice para
+ o canal sempre que os comandos OP ou DEOP forem usados em um
+ usuário no canal.
+
+CHAN_HELP_AOP
+ Syntax: AOP channel ADD nick
+ AOP channel DEL {nick | entry-num | list}
+ AOP channel LIST [mask | list]
+ AOP channel CLEAR
+
+ Maintains the AOP (AutoOP) list for a channel. The AOP
+ list gives users the right to be auto-opped on your channel,
+ to unban or invite themselves if needed, to have their
+ greet message showed on join, and so on.
+
+ The AOP ADD command adds the given nickname to the
+ AOP list.
+
+ The AOP DEL command removes the given nick from the
+ AOP list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The AOP LIST command displays the AOP list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ AOP #channel LIST 2-5,7-9
+ Lists AOP entries numbered 2 through 5 and
+ 7 through 9.
+
+ The AOP CLEAR command clears all entries of the
+ AOP list.
+
+ The AOP ADD and AOP DEL commands are limited to
+ SOPs or above, while the AOP CLEAR command can only
+ be used by the channel founder. However, any user on the
+ AOP list may use the AOP LIST command.
+
+ This command may have been disabled for your channel, and
+ in that case you need to use the access list. See
+ /msg %S HELP ACCESS for information about the access list,
+ and /msg %S HELP SET XOP to know how to toggle between
+ the access list and xOP list systems.
+
+CHAN_HELP_HOP
+ Syntax: HOP channel ADD nick
+ HOP channel DEL {nick | entry-num | list}
+ HOP channel LIST [mask | list]
+ HOP channel CLEAR
+
+ Maintains the HOP (HalfOP) list for a channel. The HOP
+ list gives users the right to be auto-halfopped on your
+ channel.
+
+ The HOP ADD command adds the given nickname to the
+ HOP list.
+
+ The HOP DEL command removes the given nick from the
+ HOP list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The HOP LIST command displays the HOP list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ HOP #channel LIST 2-5,7-9
+ Lists HOP entries numbered 2 through 5 and
+ 7 through 9.
+
+ The HOP CLEAR command clears all entries of the
+ HOP list.
+
+ The HOP ADD, HOP DEL and HOP LIST commands are
+ limited to AOPs or above, while the HOP CLEAR command
+ can only be used by the channel founder.
+
+ This command may have been disabled for your channel, and
+ in that case you need to use the access list. See
+ /msg %S HELP ACCESS for information about the access list,
+ and /msg %S HELP SET XOP to know how to toggle between
+ the access list and xOP list systems.
+
+CHAN_HELP_SOP
+ Syntax: SOP channel ADD nick
+ SOP channel DEL {nick | entry-num | list}
+ SOP channel LIST [mask | list]
+ SOP channel CLEAR
+
+ Maintains the SOP (SuperOP) list for a channel. The SOP
+ list gives users all rights given by the AOP list, and adds
+ those needed to use the AutoKick and the BadWords lists,
+ to send and read channel memos, and so on.
+
+ The SOP ADD command adds the given nickname to the
+ SOP list.
+
+ The SOP DEL command removes the given nick from the
+ SOP list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The SOP LIST command displays the SOP list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ SOP #channel LIST 2-5,7-9
+ Lists AOP entries numbered 2 through 5 and
+ 7 through 9.
+
+ The SOP CLEAR command clears all entries of the
+ SOP list.
+
+ The SOP ADD, SOP DEL and SOP CLEAR commands are
+ limited to the channel founder. However, any user on the
+ AOP list may use the SOP LIST command.
+
+ This command may have been disabled for your channel, and
+ in that case you need to use the access list. See
+ /msg %S HELP ACCESS for information about the access list,
+ and /msg %S HELP SET XOP to know how to toggle between
+ the access list and xOP list systems.
+
+CHAN_HELP_VOP
+ Syntax: VOP channel ADD nick
+ VOP channel DEL {nick | entry-num | list}
+ VOP channel LIST [mask | list]
+ VOP channel CLEAR
+
+ Maintains the VOP (VOicePeople) list for a channel.
+ The VOP list allows users to be auto-voiced and to voice
+ themselves if they aren't.
+
+ The VOP ADD command adds the given nickname to the
+ VOP list.
+
+ The VOP DEL command removes the given nick from the
+ VOP list. If a list of entry numbers is given, those
+ entries are deleted. (See the example for LIST below.)
+
+ The VOP LIST command displays the VOP list. If
+ a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ VOP #channel LIST 2-5,7-9
+ Lists VOP entries numbered 2 through 5 and
+ 7 through 9.
+
+ The VOP CLEAR command clears all entries of the
+ VOP list.
+
+ The VOP ADD, VOP DEL and VOP LIST commands are
+ limited to AOPs or above, while the VOP CLEAR command
+ can only be used by the channel founder.
+
+ This command may have been disabled for your channel, and
+ in that case you need to use the access list. See
+ /msg %S HELP ACCESS for information about the access list,
+ and /msg %S HELP SET XOP to know how to toggle between
+ the access list and xOP list systems.
+
+CHAN_HELP_ACCESS
+ Sintaxe: ACCESS canal ADD nick nível
+ ACCESS canal DEL {nick | entry-num | list}
+ ACCESS canal LIST [máscara | list]
+
+ Faz manutenção da lista de acesso de um canal. A lista
+ de acesso especifica que usuários tem permissão para
+ 0 status de OP ou tem acesso aos comandos do %S em
+ um canal. Níveis diferentes de usuários permitem acesso
+ a diferentes subníveis de privilégios; /msg %S HELP
+ ACCESS LEVELS para mais informações específicas. Por
+ padrão, qualquer nick não presente na lista de acesso
+ possui nivel 0.
+
+ O comando ACCESS ADD adiciona um nick ou máscara de um
+ usuário na lista de acesso com o nível especificado; se o
+ nick ou máscara já estiver presente na lista, seu nível de
+ acesso será alterado para o nível especificado. O nivel
+ especificado deve ser menor do que o usuário que emitiu o
+ comando.
+
+ O comando ACCESS DEL remove um nick especificado da lista
+ de acesso. Se uma lista de números é fornecida, essas
+ entradas são apagadas. (Veja o exemplo para LIST abaixo.)
+
+ O comando ACCESS LIST mostra a lista de acesso do canal.
+ Se uma máscara for fornecida, somente aquelas entradas que
+ combinarem com o padrão especificado na máscara serão
+ mostradas. Se uma lista de números é fornecida, somente
+ essas entradas serão mostradas, por exemplo:
+
+ ACCESS #canal LIST 2-5,7-9
+ Lista as entradas de acesso numeradas de 2 a 5 e 7 a 9.
+
+CHAN_HELP_ACCESS_LEVELS
+ Níveis de Acesso do Usuário
+
+ Por padrão, os seguintes níveis de acesso são definidos:
+
+ Founder Acesso total as funções do %S; OP automático
+ quando entrar no canal. Note que de somente uma
+ pessoa pode ter o status fundador (isto não pode
+ ser dado usando o comando ACCESS).
+  10 Acesso ao comando AKICK; OP automático.
+  5 OP automático.
+  3 Voice automático.
+  0 Sem privilégios especiais; pode se tornar OP
+ através de outros ops (a menos que secure-ops
+ esteja ativada).
+  <0 Não pode ser OP.
+
+ Esses níveis podem ser mudados, ou adicionar novos, usando o
+ comando LEVELS; digite /msg %S HELP LEVELS para informações.
+
+CHAN_HELP_AKICK
+ Sintaxe: AKICK canal ADD máscara [razão]
+ AKICK canal DEL máscara
+ AKICK canal LIST [máscara]
+ AKICK canal ENFORCE
+
+ Faz a manutenção da lista de Autokick de um canal.
+ Se um usuário que estiver na lista de AutoKick tentar
+ entrar no canal, o %S banirá este usuário do
+ canal, e depois kickará o usuário.
+
+ O comando AKICK ADD adiciona o usuário especificado ou
+ máscara na lista de Autokick. Se uma razão é dada com
+ o comando, esta razão será usada quando o usuário for
+ kickado; se não, a razão padrão será "Você foi banido
+ deste canal" via o %S.
+
+ O comando AKICK DEL remove um nick ou máscara da lista
+ de AutoKick. Isso, entretanto, não remove qualquer ban
+ colocado pelo AutoKick; estes devem ser removidos
+ manualmente.
+
+ O comando AKICK LIST mostra a lista de AutoKick, ou
+ opcionalmente, só os registros de AutoKick que se
+ encaixam com o padrão de uma máscara dada.
+
+ O comando AKICK ENFORCE obriga o %S a verificar
+ a lista de AKICKs para remover os usuários conectados que
+ sejam compatíveis com a máscara dada.
+
+CHAN_HELP_LEVELS
+ Sintaxe: LEVELS canal SET tipo nível
+ LEVELS canal {DIS | DISABLE} tipo
+ LEVELS canal LIST
+ LEVELS canal RESET
+
+ O comando LEVELS permite ajuste detalhado sobre o
+ significado numérico dos níveis de acesso usados pelos
+ canais. Com esse comando, você pode definir o nível de
+ acesso requerido pela maioria das funções do %S.
+ (Os comandos SET FOUNDER e SET PASSWORD, assim como
+ este comando, são sempre restritos ao fundador do canal).
+
+ LEVELS SET permite que o nível de acesso para uma função ou
+ grupo de funções sejam alterados. LEVELS DISABLE (ou DIS
+ para encurtar) desabilita automaticamente os dispositivos ou
+ não permite o acesso a funções para qualquer outra pessoa que
+ não seja o fundador do canal. LEVELS LIST mostra os níveis
+ atuais para cada função ou para um grupo de funções. LEVELS
+ RESET recoloca os níveis de acordo com o padrão de um canal
+ recem-criado (veja HELP ACCESS LEVELS).
+
+ Para lista de recursos e funções cujos níveis podem ser
+ ajustados, veja HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ A seguinte característica/função são entendidas. Note que
+ estes níveis para AUTODEOP e NOJOIN são os níveis máximos,
+ enquanto que todos os outros são níveis mínimos.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Sintaxe: INFO canal [ALL]
+
+ Lista os dados referentes ao canal registrado dado,
+ incluindo seu fundador, data do registro, última vez que
+ foi usado, descrição, e trava dos modos (se existirem).
+ Se você está identificado como fundador do canal que está
+ solicitando informações e a opção ALL é especificada,
+ informações sobre a mensagem de entrada e sobre o sucessor
+ do canal também será mostrada.
+
+CHAN_HELP_LIST
+ Sintaxe: LIST padrão
+
+ Lista todos os canais registrados que combinam com o padrão
+ dado. (Canais com opção PRIVATE ativada não serão listados).
+
+CHAN_HELP_OP
+ Sintaxe: OP #canal nick
+
+ Atribui status de Operador (modo +o) para o nick dado em
+ um determinado canal. Limitado aos usuários de nível 5, no
+ mínimo, do canal especificado.
+
+CHAN_HELP_DEOP
+ Sintaxe: DEOP #canal nick
+
+ Remove o status de Operador (modo +o) do nick dado para
+ um determinado canal. Limitado aos usuários de nível 5,
+ no mínimo, do canal especificado.
+
+CHAN_HELP_VOICE
+ Sintaxe: VOICE [#canal [nick]]
+
+ Dá voice para um determinado nick no canal.
+
+CHAN_HELP_DEVOICE
+ Sintaxe: DEVOICE [#canal [nick]]
+
+ Tira o voice de um determinado nick no canal.
+
+CHAN_HELP_HALFOP
+ Sintaxe: HALFOP [#canal [nick]]
+
+ Halfop um nick em um determinado canal.
+
+CHAN_HELP_DEHALFOP
+ Sintaxe: DEHALFOP [#canal [nick]]
+
+ Dehalfop um nick em um determinado canal.
+
+CHAN_HELP_PROTECT
+ Sintaxe: PROTECT [#canal [nick]]
+
+ Protege um determinado nick no canal.
+
+CHAN_HELP_DEPROTECT
+ Sintaxe: DEPROTECT [#canal [nick]]
+
+ Desprotege um nick em um determinado canal.
+
+CHAN_HELP_OWNER
+ Syntax: OWNER [#channel]
+
+ Gives you owner status on channel. If channel is not
+ given, it will give you owner status on all channels you're
+ on, provided you have the rights to.
+
+ Limited to those with founder access on the channel.
+
+CHAN_HELP_DEOWNER
+ Syntax: DEOWNER [#channel]
+
+ Removes your owner status on channel. If channel is
+ not given, it will remove your owner status on all channels
+ you're on, provided you have the rights to.
+
+ Limited to those with founder access on the channel.
+
+CHAN_HELP_INVITE
+ Sintaxe: INVITE #canal
+
+ Manda o %S dar um invite em você para o canal dado.
+ Somente funcionará se seu nível de acesso for maior
+ que zero.
+
+CHAN_HELP_UNBAN
+ Sintaxe: UNBAN #canal
+
+ Diz ao %S para remover todos os bans permitindo que
+ você entre em um canal. Por padrão, somente funciona se
+ seu nível de acesso no canal for maior que zero.
+
+CHAN_HELP_KICK
+ Sintaxe: KICK [#canal [nick [motivo]]]
+
+ Kicka um determinado nick no canal.
+
+CHAN_HELP_BAN
+ Syntax: BAN [#channel [nick [reason]]]
+
+ Bans a selected nick on a channel. If nick is not given,
+ it will ban you. If channel and nick are not given,
+ it will ban you on all channels you're on, provided you
+ have the rights to.
+
+ By default, limited to AOPs or those with level 5 access
+ and above on the channel.
+
+CHAN_HELP_TOPIC
+ Syntax: TOPIC channel [topic]
+
+ Causes %S to set the channel topic to the one
+ specified. If topic is not given, then an empty topic
+ is set. This command is most useful in conjunction
+ with SET TOPICLOCK. See /msg %S HELP SET TOPICLOCK
+ for more information.
+
+ By default, limited to those with founder access on the
+ channel.
+
+CHAN_HELP_CLEAR
+ Sintaxe: CLEAR canal opção
+
+ Diz ao %S para remover certas colocações de um canal.
+ A opção pode ser uma das seguintes:
+
+ MODES Anula todos os modos do canal (isto é, remove
+ os modos i,k,l,m,n,p,s,t).
+ BANS Remove todos os bans do canal.
+ EXCEPTS Remove todos os excepts do canal.
+ OPS Remove o status de Operador do canal (mode +o)
+ de todos os Operadores do canal.
+ VOICES Remove o status "voice" (mode +v) de qualquer
+ pessoa que tenha esse modo.
+ USERS Remove (kicka) todos os usuários do canal.
+
+ Por padrão, seu nível de acesso no canal dever ser no
+ mínimo 10 para usar este comando.
+
+CHAN_HELP_GETKEY
+ Sintaxe: GETKEY canal
+
+ Retorna a key de um determinado canal. Este comando é
+ geralmente usado por bots e/ou scripts, da seguinte forma:
+
+ KEY <canal> <key>
+
+ key é "NENHUM KEY" se nenhuma key estiver gravada.
+
+CHAN_HELP_SENDPASS
+ Sintaxe: SENDPASS canal
+
+ Envia a senha de um determinado canal para o email gravado
+ como email do canal no ChanServ. Este comando é realmente
+ útil quando se trata de senhas perdidas.
+
+ Pode estar limitado aos IRC operators em algumas Redes.
+
+ Este comando só funciona se o modo de encriptação não estiver
+ ligado.
+
+CHAN_SERVADMIN_HELP
+
+ Os seguintes comandos estao disponíveis para
+ os Administradores dos Services:
+
+ GETPASS Recupera a senha de um canal
+ (caso mode de encriptação não seja usado)
+ FORBID Previne um canal de ser registrado/usado
+ STATUS Fornece o atual nível de acesso de um
+ usuário em um canal
+ CLIST Mostra todos canais que um determinado user
+ é founder.
+
+ Os Administradores dos Services podem também usar o comando
+ DROP mesmo sem se identificarem como donos do cnaal, e podem
+ também ver as listas de acesso, AKICK, e levels de qualquer
+ canal.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Sintaxe: LOGOUT canal [nick]
+
+ Faz com que um determinado nick não esteja mais identificado
+ em um determinado canal.
+
+ Se você for o founder do canal pode usar este comando em
+ qualquer usuário e em si mesmo.
+
+CHAN_SERVADMIN_HELP_DROP
+ Sintaxe: DROP canal
+
+ Cancela o registro de um canal. Somente Administradores dos
+ Services podem cancelar canais que pertencem a outros usuários.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Administradores dos Services também pode ajustar a opção
+ NOEXPIRE, fazendo com que canais sejam impedidos de ter
+ seu registro expirado. AdministradoresRoot dos Services
+ ainda podem ajustar opções para qualquer canal de outros usuários.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Sintaxe: SET canal NOEXPIRE {ON | OFF}
+
+ Determina se o canal poderá ter seu registro expirado.
+ Ajustando para ON, evita que o canal seja desregistrado
+ por passar do tempo de expiração.
+
+ Limitado aos Administradores dos Services.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Administradores de Services podem usar o comando ALL com qualquer canal.
+
+CHAN_SERVADMIN_HELP_LIST
+ Sintaxe: LIST padrao
+
+ Lista todos os canais registrados que combinam com o
+ padrão fornecido. Canais com opção PRIVATE ativada
+ só serão mostrados aos Administradores dos Services.
+
+ Sintaxe: GETPASS canal
+
+ Retorna a senha de um canal. Note que toda vez que esse
+ este comando for usado, uma mensagem incluindo o nick da
+ pessoa que emitiu o comando e o canal que foi dado serão
+ gravados e enviados para WALLOPS/GLOBOPS.
+
+ Limitado aos Administradores dos Services.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Syntax: GETPASS channel
+
+ Returns the password for the given channel. Note that
+ whenever this command is used, a message including the
+ person who issued the command and the channel it was used
+ on will be logged and sent out as a WALLOPS/GLOBOPS.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Sintaxe: FORBID canal
+
+ Proibe que qualquer pessoa registre e utilize o canal
+ dado. Pode ser cancelado pelo desregistro do canal.
+
+ Limitado aos Administradores dos Services.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND channel [reason]
+
+ Disallows anyone from registering or using the given
+ channel. May be cancelled by using the UNSUSPEND
+ command to preserve all previous channel data/settings.
+
+ Reason may be required on certain networks.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Releases a suspended channel. All data and settings
+ are preserved from before the suspension.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Retorna o nível de acesso atual de um determinado nick em um
+ determinado canal. A resposta será no formato:
+
+ STATUS canal nick nível-de-acesso
+
+ Se um erro ocorrer, a resposta será no formato:
+
+ STATUS ERROR mensagem-de-erro
+
+ Limitado aos Administradores dos Services
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S eh um utilitario que permite aos usuarios de IRC
+ enviar curtas mensagens a outros usuarios, mesmo
+ que eles estejam conectados no momento ou nao; ou
+ nos canais(*). Ambos, destinatarios e remetentes,
+ devem possuir seu nick (ou canal) registrados para
+ que possam enviar uma mensagem (memo).
+ Os comandos do %S sao:
+
+ SEND Envia uma mensagem para um nick ou para um canal
+ CANCEL Cancela o último memo enviado por você
+ LIST Lista suas mensagens
+ READ Le a(s) mensagem(ns)
+ DEL Apaga a(s) mensagem(ns)
+ SET Ajusta opcoes relacionadas as mensagens
+ INFO Displays information about your memos
+
+MEMO_HELP_ADMIN
+ SENDALL Send a memo to all registered users
+
+MEMO_HELP_OPER
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_FOOTER
+
+ Type /msg %S HELP command for help on any of the
+ above commands.
+
+ (*) By default, any user with at least level 10 access on a
+ channel can read that channel's memos. This can be
+ changed with the %s LEVELS command.
+
+MEMO_HELP_SEND
+ Sintaxe: SEND {nick | canal} mensagem
+
+ Envia um memo ao nick ou ao canal determinado contendo
+ a mensagem. Quando enviada para o destinatario, este
+ recebera um aviso que possui uma nova mensagem. O nick/
+ /canal de destino devera estar registrado.
+
+MEMO_HELP_CANCEL
+ Sintaxe: CANCEL {nick | canal}
+
+ Cancela a última mensagem enviada para um determinado nick ou
+ canal caso ele ainda não tenha lido no momento que este comando
+ for usado.
+
+MEMO_HELP_LIST
+ Sintaxe: LIST [canal] [list | NEW]
+
+ Lista quaisquer mensagens que voce tiver. Com NEW, lista apenas
+ as novas mensagens(nao lidas). Mesangem nao lidas sao marcadas
+ com "*" a esquerda do numero. Voce tambem pode especificar uma
+ lista de numeros, como no exemplo abaixo:
+
+ LIST 2-5,7-9
+ Lista mensagens numeradas de 2 a 5 e 7 a 9.
+
+MEMO_HELP_READ
+ Sintaxe: READ [canal] {num | list | LAST | NEW}
+
+ Mostra as mensagens especificadas. Se LAST eh fornecido, envia
+ a voce a mensagem recebida mais recentemente. Se NEW eh fornecido,
+ envia a voce todas as suas novas mensagens. Caso contrario, envia
+ a voce uma mensagem numerada. Voce tambem pode fornecer uma lista
+ de numeros, como por exemplo:
+
+ READ 2-5,7-9
+ Mostra as mensagens numeradas de 2 a 5 e 7 a 9.
+
+MEMO_HELP_DEL
+ Sintaxe: DEL [canal] {num | list | LAST | ALL}
+
+ Apaga a(s) mensagem(ns) especificada(s). Voce pode fornecer
+ varios numeros de mensagens ou sequencias de numeros ao inves
+ de um unico numero, como no segundo exemplo abaixo.
+
+ If LAST is given, the last memo will be deleted.
+ Se ALL eh fornecido, apaga todas suas mensagens.
+
+ Exemplos:
+
+ DEL 1
+ Apaga sua primeira mensagem.
+
+ DEL 2-5,7-9
+ Apaga mensagens numeradas de 2 a 5 e de 7 a 9.
+
+MEMO_HELP_SET
+ Sintaxe: SET opcao parametros
+
+ Ajusta varias opcoes de mensagens. opcao pode ser uma dessas:
+
+ NOTIFY Muda quando voce for notificado sobre novas
+ mensagens (so para nicks)
+ LIMIT Ajusta o numero maximo de mensagens que voce
+ pode receber.
+
+ Digite /msg %S HELP SET <comando>, para mais informacoes sobre
+ um comando especifico.
+
+MEMO_HELP_SET_NOTIFY
+ Sintaxe: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Mudancas que ocorrem quando voce for notificado sobre novas
+ mensagens:
+
+ ON Voce soh sera notificado sobre mensagens quando voce
+ conectar, quando voltar de um /AWAY e quando
+ sao enviadas a voce.
+ LOGON Voce soh sera notificado sobre mensagens quando voce
+ conectar ou quando voltar de um /AWAY.
+ NEW Voce soh sera notificado sobre mensagens quando
+ estiverem enviando para voce.
+ OFF Voce nao recebera nenhuma notificacao sobre mensagens.
+
+ ON eh essencialmente a combinacao LOGON e NEW.
+
+MEMO_HELP_SET_LIMIT
+ Sintaxe: SET LIMIT [canal] limite
+
+ Ajusta o numero maximo de mensagens que voce pode ter
+ (ou do canal fornecido). Se voce ajustar para 0, ninguem
+ sera capaz de enviar mensagens para voce. Entretanto,
+ voce nao pode ajustar este limite para mais que %d.
+
+MEMO_HELP_INFO
+ Sintaxe: INFO [canal]
+
+ Informa o numero de mensagens que voce tem, quantas
+ mensagens nao foram lidas, e o total de quantas
+ mensagens voce pode receber.
+ Com o parametro, mostra a mesma informacao para o canal
+ fornecido.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Sintaxe: SET LIMIT [usuario | canal] {limite | NONE} [HARD]
+
+ Ajusta o numero maximo de mensagens que um nick ou canal podem
+ ter. Ajustando o limite para 0, previne o usuario de receber
+ qualquer mensagem; colocando o limite em NONE permite que o
+ usuario receba e mantenha quantas mensagens quiser. Se voce
+ nao fornecer o nick ou canal, seu proprio limite sera ajustado.
+
+ Adicionando HARD previne que o usuario mude o limite.
+ Nao colocar HARD tem o efeito contrario, permitindo
+ que o usuario mude o limite (mesmo se um limite anterior
+ foi ajustado com HARD).
+
+ O uso do comando SET LIMIT eh limitado aos Administradores
+ dos Services. Outros usuarios somente ajustarao seus
+ proprios limites ou de um canal onde tenham privilegios
+ para isso, nao podem remover seu proprio limite, nao
+ podem ajustar o limite acima de %d, e nao podem ajustar
+ um limite maximo (HARD).
+
+MEMO_SERVADMIN_HELP_INFO
+ Sintaxe: INFO [nick | canal]
+
+ Sem um parametro, informa o numero de mensagens que voce
+ tem, quantas mensagens ainda nao foram lidas, e o total
+ de quantas mensagens voce pode receber.
+
+ Com o parametro do canal, mostra a mesma informacao sobre
+ um canal.
+
+ Com o parametro de nick, mostra a mesma informacao sobre
+ um nick. Esta derivacao do comando eh limitada aos
+ Administradores dos Services.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Syntax: STAFF memo-text
+
+ Sends all services staff a memo containing memo-text.
+ Note: If you have opers on both the oper list and the
+ admin list they will recive the memo twice. The same
+ applies for oper's on the Root list as well as other
+ lists.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL memo-text
+
+ Sends all registered users a memo containing memo-text.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ Comandos do %S:
+ GLOBAL Envia uma mensagem para todos usuários
+ STATS Mostra estatísticas dos Services e da Rede
+ OPER LIST Lista todos os Operadores dos Services
+ ADMIN LIST Lista todos os Administradores dos Services
+ STAFF Display Services staff and online status
+
+OPER_HELP_OPER_CMD
+ Comandos disponíveis para Operadores e Admins dos Services:
+ MODE Muda o modo de um canal
+ KICK Kicka um usuário de um canal
+ CLEARMODES Limpa os modos de um canal
+ AKILL Manipula a Lista de AKILL
+ SGLINE Manipula a lista de SGLINE
+ SZLINE Manipula a lista de SZLINE
+
+OPER_HELP_ADMIN_CMD
+ Comandos disponíveis para os Administradores dos Services:
+ SESSION Mostra a lista de conexões
+ EXCEPTION Modifica a lista de limite de sessões
+ KILLCLONES Derruba todos os usuário de um mesmo host
+ CHANLIST Lista todos os records de um canal
+ USERLIST Lista todos os records dos usuários
+ OPER Modifica a lista de Operadores dos Services
+ LOGONNEWS Define mensagens a serem mostradas na conexão
+ OPERNEWS Defini mensagens a serem mostradas aos ircops
+ NOOP Remove temporariamente as O:lines de um
+ determinado server remotamente
+ JUPE Jupa um servidor
+ SET Configura varias opções globais dos Services
+ UPDATE Salva os dados atuais
+ RELOAD Recarrega o arquivo de configuração
+ QUIT Retira os services da rede sem salvar os dados
+ RESTART Salva os dados e reinicia os Services
+ SHUTDOWN Termina os Services salvando os dados
+
+ Comandos disponíveis para Super usuários dos Services:
+ ADMIN Modifica lista de Administradores dos Services
+
+OPER_HELP_ROOT_CMD
+ Commands available to Serivces Roots only:
+ MODLOAD Load a module
+ MODUNLOAD Un-Load a module
+ MODLIST List loaded modules
+ MODINFO Info about a loaded module
+
+OPER_HELP_LOGGED
+ Atenção: Todos os comandos enviados para o %S são logados!
+
+OPER_HELP_GLOBAL
+ Sintaxe: GLOBAL mensagens
+
+ Permite que os IRCops enviem mensagens para todos os usuários
+ da Rede. A menssagen sera enviada por %s.
+
+OPER_HELP_STATS
+ Sintaxe: STATS [AKILL | ALL]
+
+ Sem nenhuma opcao, mostra o numero atual de usuarios e
+ IRCops online (excluindo Services), o numero maximo de
+ usuarios online conectados simultaneamente e o tempo
+ de duracao desde que a secao dos Services comecou a funcionar.
+
+ Com a opcao AKILL, mostra o tamanho atual da lista de
+ AKILL e o tempo default para um AKILL expirar.
+
+ A opcao ALL eh disponivel somente para os Administradores
+ dos Services, e mostra informacoes sobre o consumo de memoria
+ dos Services. Usando este comando, pode-se congelar os
+ Services por um curto periodo de tempo em redes grandes,
+ entao nao abuse deste comando!
+
+ UPTIME pode ser usado como um sinonimo para STATS.
+
+OPER_HELP_OPER
+ Sintaxe: OPER ADD nick
+ OPER DEL nick
+ OPER LIST
+
+ Permite os Administradores dos Services adicionar ou remover
+ nicks da lista de Operadores dos Services. O usuario que
+ tem o nick na lista de Operadores dos Services e que esta
+ identificado no %s eh capaz de acessar os comandos de
+ Operador dos Services.
+
+ Qualquer IRCop pode usar o OPER LIST.
+ Todos as outras derivacoes do comando OPER sao limitados
+ aos Administradores dos Services.
+
+OPER_HELP_ADMIN
+ Sintaxe: ADMIN ADD nick
+ ADMIN DEL nick
+ ADMIN LIST
+
+ Permite que os super-usuarios dos Services adicionem ou
+ removam nicks da lista de Administradores dos Services.
+ O usuario que tem o nick na lista de Administradores dos
+ Services e que ja tenham se identificado no %s sera
+ capaz de ter acesso aos comandos de Administradores dos
+ Services.
+
+ Qualquer IRCop pode usar o comando ADMIN LIST.
+ Todas as outras derivacoes do ADMIN sao limitadas ao
+ Super-usuario (root) dos Services
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST} [time] [nick]
+
+ Allows Services Admins to make Services ignore an user for
+ a certain time or until the next restart. The default time
+ format is seconds. You can specify it by using units. Valid
+ units are: s for seconds, m for minutes, h for hours and
+ d for days. Combinations of these units are not permitted. To
+ make Services permanently ignore the user type 0 as time.
+
+OPER_HELP_MODE
+ Sintaxe: MODE canal modos
+
+ Permite que os Operadores dos Services ajustem os modos de
+ qualquer canal. Os parametros sao os mesmos que o do
+ comando /MODE padrao.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user modes
+
+ Allows Services admins to set user modes for any user.
+ Parameters are the same as for the standard /MODE
+ command.
+
+ Limited to Services admins.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Allows Services admins to give Operflags to any user.
+ Flags have to be prefixed with a "+" or a "-". To
+ remove all flags simply type a "-" instead of any flags.
+
+ Limited to Services admins.
+
+OPER_HELP_CLEARMODES
+ Sintaxe: CLEARMODES canal [ALL]
+
+ Limpa todos os modos binarios (i,k,l,m,n,p,s,t) e bans de um
+ canal. Se ALL eh fornecido, limpa tambem todos os ops e
+ voices (modos +o e +v) de um canal.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_KICK
+ Sintaxe: KICK canal usuario razao
+
+ Permite IRCops kickar qualquer usuario de um canal.
+ Paramentros sao os mesmos que comando /KICK padrao.
+ A mensagem do kick tem o nick do IRCop que envia o
+ comando KICK, por exemplo:
+
+ *** SpamMan has been kicked off from channel #bras por %S (Bras (Flood))
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick newnick
+
+ Forcefully changes a user's nickname from nick to newnick.
+
+ Limited to Services admins
+
+OPER_HELP_AKILL
+ Sintaxe: AKILL ADD [+tempo] mascara razao
+ AKILL DEL mascara
+ AKILL LIST [mascara]
+ AKILL VIEW [mascara]
+
+ Permite que Operadores dos Services manipulem a lista de
+ AKILL. Se um usuario que tenta conectar possui uma mascara
+ prevista na lista de AKILL, os Services emitem um KILL para
+ aquele usuario, para servidores que suporta, e instrui todos
+ os servidores da rede a adicionar um ban (K-line) para a
+ mascara do usuario encontrado.
+
+ AKILL ADD adiciona uma mascara ident@host na lista de AKILL
+ para uma dada razao (deve ser posta obrigatoriamente).
+ AKILL DEL remove uma dada mascara da lista de AKILL, se esta
+ estiver presente. AKILL LIST mostra todos os AKILLs atuais;
+ se uma mascara opcional for fornecida, a listagem sera
+ limitada aquela mascara. AKILL VIEW eh uma versao mais
+ detalhada do AKILL LIST e mostrara quem adicionou o AKILL, a
+ data que foi adicionado, e quando sera expirado, como tambem
+ a mascara (ident@host) e a razao.
+
+ Opcionalmente, um tempo para o akill expirar pode ser
+ fornecido com o comando AKILL ADD. O tempo precede a
+ mascara ident@host, e eh especificado como um numero inteiro
+ seguido por um dos d (dias), h (horas) ou m (minutos).
+ Combinacoes (como de 1h30m) nao sao permitidas. Se uma
+ unidade especifica nao eh incluida, o default e em dias
+ (entao +30 significa 30 dias). Para adicionar um AKILL que
+ nao expira, use +0. Se a mascara a ser adicionada comecar
+ com um +, o tempo do AKILL deve ser fornecido, ate mesmo se
+ este tempo for igual ao default. O atual tempo de expiracao
+ de AKILLs pode ser encontrado com o comando STATS AKILL.
+
+ A razao existe apenas para uso dos IRCops, e nao sera
+ mostrada aos usuarios nas mensagens de KILL.
+
+ Este comando eh limitado aos Operadores dos Services.
+
+OPER_HELP_SGLINE
+ Sintaxe: SGLINE ADD [+tempo] máscara:motivo
+ SGLINE DEL {máscara | núm-entrada | lista}
+ SGLINE LIST [máscara | lista]
+ SGLINE VIEW [máscara | lista]
+ SGLINE CLEAR
+
+ Permite que os Operadores dos Services manipulem a lista de
+ SGLINE. Se um user estiver com a mesma máscara do SGLINE tentar
+ conectar, os Services não permitirão tal feito.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_SQLINE
+ Syntax: SQLINE ADD [+expiry] mask reason
+ SQLINE DEL {mask | entry-num | list}
+ SQLINE LIST [mask | list]
+ SQLINE VIEW [mask | list]
+ SQLINE CLEAR
+
+ Allows Services operators to manipulate the SQLINE list. If
+ a user with a nick matching an SQLINE mask attempts to
+ connect, Services will not allow it to pursue his IRC
+ session.
+
+ If the first character of the mask is #, services will
+ prevent the use of matching channels (on IRCds that
+ support it).
+
+ SQLINE ADD adds the given mask to the SQLINE
+ list for the given reason (which must be given).
+ expiry is specified as an integer followed by one of d
+ (days), h (hours), or m (minutes). Combinations (such as
+ 1h30m) are not permitted. If a unit specifier is not
+ included, the default is days (so +30 by itself means 30
+ days). To add an SQLINE which does not expire, use +0.
+ If the mask to be added starts with a +, an expiry time
+ must be given, even if it is the same as the default. The
+ current SQLINE default expiry time can be found with the
+ STATS AKILL command.
+
+ The SQLINE DEL command removes the given mask from the
+ SQLINE list if it is present. If a list of entry numbers is
+ given, those entries are deleted. (See the example for LIST
+ below.)
+
+ The SQLINE LIST command displays the SQLINE list.
+ If a wildcard mask is given, only those entries matching the
+ mask are displayed. If a list of entry numbers is given,
+ only those entries are shown; for example:
+
+ SQLINE LIST 2-5,7-9
+ Lists SQLINE entries numbered 2 through 5 and 7
+ through 9.
+
+ SQLINE VIEW is a more verbose version of SQLINE LIST, and
+ will show who added an SQLINE, the date it was added, and when
+ it expires, as well as the mask and reason.
+
+ SQLINE CLEAR clears all entries of the SQLINE list.
+
+ Limited to Services operators.
+
+OPER_HELP_SZLINE
+ Sintaxe: SZLINE ADD [+tempo] máscara motivo
+ SZLINE DEL {máscara | núm-entrada | lista}
+ SZLINE LIST [máscara | lista]
+ SZLINE VIEW [máscara | lista]
+ SZLINE CLEAR
+
+ Permite que os Operadores dos Services manipulem a lista
+ de SZLINE. Se um usuário com o mesmo IP do SZLINE tentar
+ conectar, os Services não permitirão tal feito.
+
+ Limitado aos Operadores dos Services.
+
+OPER_HELP_SET
+ Sintaxe: SET opcao selecao
+
+ Ajusta varias opcoes globais dos Services. Nomes de opcao
+ atualmente definidas sao:
+ READONLY Determina o modo read-only ou read-write
+ LOGCHAN Ativa ou desativa reported de log a um canal
+ DEBUG Ativa ou desativa o modo de depuracao (debug)
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_SET_READONLY
+ Sintaxe: SET READONLY {ON | OFF}
+
+ Ativa ou desativa o modo read-only. No modo read-only,
+ usuarios normais nao serao capazes de modificar nenhum dado
+ nos Services, incluindo lista de acesso de canais e nick,
+ etc. IRCops com privilegios suficientes nos Services serao
+ capazes de mudar a lista de AKILL e de proibir e cancelar o
+ registro de canais ou nicks, embora quaisquer mudancas nao
+ serao salvas no banco de dados a menos que o modo read-only
+ seja desativado antes dos Services serem terminados ou
+ reiniciados.
+
+ Esta opcao eh equivalente a opcao da linha de comando
+ "-readonly".
+
+OPER_HELP_SET_LOGCHAN
+ Sintaxe: SET LOGCHAN {ON | OFF}
+
+ No modo on, Services enviam todo o log para o canal especificado.
+ LogChannel tem q estar definido na configuracion dos Services para
+ poder usar esta opcao.
+
+ Nota: O canal deve estar apropriadamente seguro, e so permitir
+ ingresso a Administradores.
+
+OPER_HELP_SET_DEBUG
+ Sintaxe: SET DEBUG {ON | OFF | numero}
+
+ Ativa ou desativa o modo de depuracao (debug). No modo de
+ depuracao, todos os dados enviados para os Services, assim
+ como todas as outras mensagens de depuracao sao enviadas a
+ um arquivo de log. Se num eh fornecido, o modo de depuracao
+ eh ativado, com nivel de debug fornecido.
+
+ Esta opcao eh equivalente a opcao da linha de comando
+ "-debug".
+
+OPER_HELP_SET_NOEXPIRE
+ Sintaxe: SET NOEXPIRE {ON | OFF}
+
+ Ativa ou desativa o modo NOEXPIRE. Se estiver ativado, os nicks
+ canais, akills e lista de sessões não irão expirar enquanto a
+ opção não for desativada.
+
+OPER_HELP_SET_SUPERADMIN
+ Syntax: SET SUPERADMIN {ON | OFF}
+
+ Setting this will grant you extra privlages such as the
+ ability to be "founder" on all channel's etc...
+
+ This opion is _NOT_ persistant, and should only be used when
+ needed, and set back to OFF when no longer needed.
+
+
+OPER_HELP_NOOP
+ Sintaxe: NOOP SET servidor
+ NOOP REVOKE servidor
+
+ NOOP SET Adiciona NOOP em um servidor
+
+ NOOP REVOKE Remove NOOP de um servidor
+
+ Lembrete: O servidor nunca é checado pelos Services.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_JUPE
+ Sintaxe: JUPE servidor
+
+ Diz aos Services para "jupar" um servidor -- isto eh, criar
+ um falso servidor conectado aos Services que previne que o
+ servidor real com aquele nome se conecte na rede. O jupe
+ pode ser removido usando um simples SQUIT.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_RAW
+ Sintaxe: RAW texto
+
+ Envia uma serie de texto diretamente ao servidor onde os
+ Services estao conectados. Este comando tem varias
+ limitacoes de uso, e pode criar confusoes e problemas na
+ rede se usado impropriamente. NAO USE ESTE COMANDO a menos
+ que voce tenha a certeza do que esta fazendo!
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_UPDATE
+ Sintaxe: UPDATE
+
+ Faz com que os Services atualizem o banco de dados logo que
+ voce envia este comando.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_RELOAD
+ Syntax: RELOAD
+
+ Faz com que os Services recarreguem seu arquivo de configuração.
+ Repare que algumas mudanças serão necessárias que os Services
+ sejam reinicados para ter efeito.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_QUIT
+ Sintaxe: QUIT
+
+ Faz com que deligue os Services imediatamente; o banco de
+ dados nao eh salvo. Este comando nao deve ser usado a menos
+ que haja um dano da copia do banco de dados na memoria e por
+ isso nao eles nao devem ser salvos. Para desligar
+ normalmente, use o comando SHUTDOWN.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_SHUTDOWN
+ Sintaxe: SHUTDOWN
+
+ Salva o banco de dados dos Services e os desliga.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_RESTART
+ Sintaxe: RESTART
+
+ Salva o banco de dados dos Services e os reinicia.
+ (sai e roda imediatamente o executavel).
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_KILLCLONES
+ Sintaxe: KILLCLONES nick
+
+ Expulsa ("killa") todos os usuarios que tenham os mesmos
+ hosts que o nick especificado, adicionando *@host.com como
+ AKILL temporario para prevenir que usuarios indesejados
+ reconectem imediatamente. Uma mensagem em WallOps eh tambem
+ enviada para indicar quem usou o comando, quais hosts foram
+ afetados e quantos usuarios foram expulsos ("killados").
+ Eh usado para remover varios clones da rede.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_CHANLIST
+ Sintaxe: CHANLIST [{padrão | nick} [SECRET]]
+
+ Lista todos os canais em uso na Rede, sejam eles registrados ou não.
+
+ Limitado aos Administradores dos Services.
+
+OPER_HELP_USERLIST
+ Sintaxe: USERLIST [{padrão | canal} [INVISIBLE]]
+
+ Lista todos os usuários online na Rede, sejam eles registrados
+ ou não.
+
+ Limitado aos Administradores dos Services.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_CACHE
+ Syntax: CACHE DEL hostname
+ CACHE LIST pattern [QUEUED | ALL]
+
+ The CACHE DEL command deletes the specified hostname from
+ the cache. This is meant for debug purpose only.
+
+ The CACHE LIST command lists all found proxies that match the
+ given pattern. If the QUEUED option is given, it will list
+ the queued or in progress scans instead, and if the ALL option
+ is given, it will list all cached hostnames.
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD FileName
+
+ This command loads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ This command unloads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO FileName
+
+ This command lists information about the specified loaded module
+
+ Limited to Services Roots.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S permite que você tenha um bot no seu canal.
+ Foi criado para usuários que não tem como hospedar
+ ou configurar um bot, ou para Redes que não permitem
+ os usuários terem um bot. Os comandos disponíveis
+ estão listados abaixo; para usá-los, digite
+ /msg %S comando. Para informações mais específicas
+ sobre um comando, digite /msg %S HELP comando.
+
+ BOTLIST Lista os bots disponíveis
+ ASSIGN Associa um bot ao canal
+ SET Configura as opções do bot
+ KICK Configura os kickers
+ BADWORDS Configura os palavrões
+
+ Outros comandos: ACT INFO SAY UNASSIGN
+
+ O bot irá entrar no canal sempre que tiver ao menos
+ %d usuário(s) nele.
+
+BOT_HELP_BOTLIST
+ Sintaxe: BOTLIST
+
+ Lista todos os bots disponíveis nesta Rede.
+
+BOT_HELP_ASSIGN
+ Sintaxe: ASSIGN canal nick-bot
+
+ Associa o nick de um bot a um canal. Você poderá então
+ configurar o bot para o canal de acordo com as suas
+ necessidades.
+
+BOT_HELP_UNASSIGN
+ Sintaxe: UNASSIGN canal
+
+ Desassocia um bot de um canal. Quando você usa este comando,
+ o bot não irá entrar mais no canal. Entretando, será mantido
+ a configuração do bot para aquele canal, para que você possa
+ sempre poder associá-lo aquele canal mais tarde sem ter que
+ configurar tudo novamente.
+
+BOT_HELP_INFO
+ Sintaxe: INFO {canal | nick}
+
+ Permite que você possas ver as informações do %S sobre um
+ canal ou bot. Se a opção for um canal, então você terá
+ informações tais como kickers ativos. Se tiver sido um nick,
+ você terá informações sobre o bot, como o horário de criação
+ ou número do canal.
+
+BOT_HELP_SET
+ Sintaxe: SET canal opção parâmetros
+
+ Configura as opções do bot. opção pode ser:
+
+ DONTKICKOPS Protege os ops contra kicks
+ DONTKICKVOICES Protege os voices contra kicks
+ GREET Habilita a mensagem de entrada
+ FANTASY Habilita os comandos Fantasia
+ SYMBIOSIS Permite que o bot seja um bot real
+
+ Digite /msg %S HELP SET opção para maiores informações
+ sobre uma opção específica.
+
+ Atenção: o acesso a este comando é controlado pela opção
+ level SET.
+
+BOT_HELP_SET_DONTKICKOPS
+ Sintaxe: SET canal DONTKICKOPS {ON|OFF}
+
+ Ativa ou desativa o modo de proteção de ops em um canal.
+ Quando estiver ativado, os ops não serão kickados pelo bot.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Sintaxe: SET canal DONTKICKVOICES {ON|OFF}
+
+ Ativa ou desativa o modo de proteção de voices em um canal.
+ Quando estiver ativado, os voices não serão kickados pelo bot.
+
+BOT_HELP_SET_FANTASY
+ Sintaxe: SET canal FANTASY {ON|OFF}
+
+ Ativa ou desativa o modo fantasia em um canal.
+ Quando estiver ativado, os usuários poderão usar
+ comandos como !op, !deop, !voice, !devoice,
+ !kick, !kb, !unban, !seen em um canal.
+
+ Note que os usuários que quiserem usar esses
+ comandos DEVEM ter um nível suficiente tanto para
+ o FANTASIA quando para outro nível dependendo
+ do comando usado (por exemplo, para usar !op, o
+ usuário deve ter acesso aos comandos OP e DEOP).
+
+BOT_HELP_SET_GREET
+ Sintaxe: SET canal GREET {ON|OFF}
+
+ Ativa ou desativa o modo greet em um canal.
+ Quando ativado, o bot irá mostrar mensagens de
+ entradas dos usuários quando eles entrarem no
+ canal, caso eles tenham nível de acessosuficiente.
+
+BOT_HELP_SET_SYMBIOSIS
+ Sintaxe: SET canal SYMBIOSIS {ON|OFF}
+
+ Ativa ou desativa o modo symbiosis em um canal.
+ Quando ativado, o bot fará tudo aquilo que
+ normalmente é feito pelo %s nos canais, como as
+ mudanças de modos, kicks, e inclusive a mensagem
+ de entrada (entrymsg).
+
+BOT_HELP_KICK
+ Sintaxe: KICK canal opção parâmetros
+
+ Configura os kicks do bot. opção pode ser:
+
+ BOLDS Seleciona se o bot kicka por negrito
+ BADWORDS Seleciona se o bot kicka por palavrões
+ CAPS Seleciona se o bot kicka por caps
+ COLORS Seleciona se o bot kicka por cores
+ FLOOD Seleciona se o bot kicka por flood
+ REPEAT Seleciona se o bot kicka por repetição
+ REVERSES Seleciona se o bot kicka por reversos
+ UNDERLINES Seleciona se o bot kicka por sublinhado
+
+ Digite /msg %S HELP KICK opção para maiores informações
+ sobre uma opção específica.
+
+ Nota: o acesso a esse comando é controlado pelo level SET.
+
+BOT_HELP_KICK_BOLDS
+ Sintaxe: KICK canal BOLDS {ON|OFF} [ttb]
+
+ Ativa ou desativa o kick por negrito. Quando ativado
+ o bot irá kickar os usuários que usarem negrito.
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido.
+
+BOT_HELP_KICK_COLORS
+ Sintaxe: KICK canal COLORS {ON|OFF} [ttb]
+
+ Ativa ou desativa o kick por cores. Quando ativado
+ o bot irá kickar os usuários que usarem cores.
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido.
+
+BOT_HELP_KICK_REVERSES
+ Sintaxe: KICK canal REVERSES {ON|OFF} [ttb]
+
+ Ativa ou desativa o kick por reverso. Quando ativado
+ o bot irá kickar os usuários que usarem reverso.
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido.
+
+BOT_HELP_KICK_UNDERLINES
+ Sintaxe: KICK canal UNDERLINES {ON|OFF} [ttb]
+
+ Ativa ou desativa o kick por sublinhado. Quando ativado
+ o bot irá kickar os usuários que usarem sublinhado.
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido.
+
+BOT_HELP_KICK_CAPS
+ Sintaxe: KICK canal CAPS {ON|OFF} [ttb [min [porcent]]]
+
+ Ativa ou desativa o kick por caps. Quando ativado
+ o bot irá kickar os usuários que usarem caps.
+
+ O bot irá kickar apenas se tiver pelo menos min caps
+ e eles constituírem pelo menos porcent%% do total
+ do texto (se não for especificado, o padrão é 10 caracteres
+ e 25%%).
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido.
+
+BOT_HELP_KICK_FLOOD
+ Sintaxe: KICK canal FLOOD {ON|OFF} [ttb [linhas [segs]]]
+
+ Ativa ou desativa o kick por flood. Quando ativado o
+ o bot irá kickar por flood no canal desde que sejam
+ pelo menos linhas linhas em segs segundos.
+ (se não for especificado, o padrão é 6 linhas em
+ 10 segundos).
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido.
+
+BOT_HELP_KICK_REPEAT
+ Sintaxe: KICK #canal REPEAT {ON|OFF} [ttb [núm]]
+
+ Ativa ou desativa o kick por repetição. Quando ativado
+ o bot irá kickar os usuários que repetirem (onde
+ núm é o número de repetições para kick).
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido.
+
+BOT_HELP_KICK_BADWORDS
+ Sintaxe: KICK #canal BADWORDS {ON|OFF} [ttb]
+
+ Ativa ou desativa o kick por sublinhado. Quando ativado
+ o bot irá kickar os usuários que usarem sublinhado.
+
+ ttb é o número de vezes que o usuário será kickado
+ antes de ser banido.
+
+ Você pode definir os palavrões para um canal usando o
+ comando BADWORDS. Digite /msg %S HELP BADWORDS para
+ maiores informações.
+
+BOT_HELP_BADWORDS
+ Sintaxe: BADWORDS canal ADD palavra [SINGLE | START | END]
+ BADWORDS canal DEL {palavra | núm-entrada | lista}
+ BADWORDS canal LIST [máscara | lista]
+ BADWORDS canal CLEAR
+
+ Faz a manutenção da lista de palavrões em um canal. Essa lista
+ determina quais são as palvras que deverão ser motivo de kick
+ em um canal quando a opção BADWORDS estiver ativada. Para maiores
+ informações, digite /msg %S HELP KICK BADWORDS.
+
+ O comando BADWORDS ADD adiciona a palavra na lista de
+ palavrões. A opção SINGLE quando ativada só kicka o usuário
+ se ele escrever a palavra inteira. A opção START quando
+ ativada irá kickar o usuário que escrever uma palavra que comece
+ com a palavra. A opção END se tiver sido ativada só kicka
+ o usuário que escrever uma palavra que termine com a
+ palavra. Se você não especificar nada o bot irá kickar sempre
+ que a palavra for escrita pelo usuário.
+
+ O comando BADWORDS DEL remove uma palavra da lista de
+ palavrões de um determinado canal.
+
+ O comando BADWORDS LIST mostra a lista de palavrões.
+ Se forem usados wildcards, apenas aquelas entradas com
+ as determinadas máscaras serão mostradas. Se uma lista
+ de números de entrada for dada, apenas aquelas entradas
+ serão mostradas; por exemplo:
+
+ BADWORDS #canal LIST 2-5,7-9
+ Lista as entradas dos palavrões numeradas de 2 a 5 e
+ 7 a 9.
+
+ O comando BADWORDS CLEAR limpa todas entradas da lista.
+
+BOT_HELP_SAY
+ Sintaxe: SAY canal texto
+
+ Faz com que o bot diga determinado texto no determinado canal.
+
+BOT_HELP_ACT
+ Sintaxe: ACT canal texto
+
+ Faz com que o bot faça o mesmo que o comando "/me"
+ em um determinado canal com o determinado texto.
+
+BOT_SERVADMIN_HELP
+
+ Os seguintes comandos podem ser usados por Admins dos Services:
+
+ BOT Mantém a lista de bots da Rede
+
+BOT_SERVADMIN_HELP_BOT
+ Sintaxe: BOT ADD nick user host real
+ BOT CHANGE oldnick novonick [user [host [real]]]
+ BOT DEL nick
+ BOT LIST
+
+ Permite que os Administradores dos Services criem,
+ modifiquem, e apaguem bots que os usuários poderão usar
+ em seus próprios canais.
+
+ BOT ADD adiciona um bot com um determinado nick, username,
+ hostname e realname.
+ BOT CHANGE permite alterar o nick, username, hostname
+ ou realname de um bot sem que seja necessário apagá-lo (e
+ todas as informações nele contidas).
+ BOT DEL remove um bot da lista de bots.
+ BOT LIST é um an alias de BOTLIST e apenas lista todos
+ os bots disponíveis na Rede.
+
+ Nota: se você criar um bot que use um nick registrado
+ no NickServ, este será dropado. E se tiver um usuário
+ usando o nick na hora, este será killado.
+
+BOT_SERVADMIN_HELP_SET
+
+ Essas opções são reservadas aos Administradores dos Services:
+
+ NOBOT Previne um bot de ser associado a
+ um canal
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Sintaxe: SET canal NOBOT {ON|OFF}
+
+ Este comando faz com que um determinado canal não possa ser
+ associado a um bot. Se já houver um bot associado a este
+ canal, este será automaticamente desassociado quando você
+ ativar essa opção.
+
+ Limitado aos Administradores dos Services.
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Syntax: SET bot-nick PRIVATE {ON|OFF}
+
+ This option prevents a bot from being assigned to a
+ channel by users that aren't IRC operators.
+
+ Limited to Services admins.
+
+###########################################################################
+#
+# HostServ messages
+#
+###########################################################################
+HOST_EMPTY
+ The vhost list is empty.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ vhost for %s set to %s.
+HOST_IDENT_SET
+ vhost for %s set to %s@%s.
+HOST_SETALL
+ vhost for group %s set to %s.
+HOST_DELALL
+ vhosts for group %s have been removed.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost for group %s set to %s@%s.
+HOST_SET_ERROR
+ Error! A vhost can only contain A-Z, a-z, 0-9, '.' and '-'.
+HOST_SET_IDENT_ERROR
+ A vhost ident must be in the format of a valid ident
+HOST_SET_TOOLONG
+ Error! The vhost is too long, please use a host shorter than %d characters.
+HOST_SET_IDENTTOOLONG
+ Error! The Ident is too long, please use an ident shorter than %d characters.
+HOST_NOREG
+ User %s not found in the nickserv db.
+HOST_SET_SYNTAX
+ Syntax /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Access Denied.
+HOST_NOT_ASSIGNED
+ Please contact an Operator to get a vhost assigned to this nick.
+HOST_ACTIVATED
+ Your vhost of %s is now activated.
+HOST_IDENT_ACTIVATED
+ Your vhost of %s@%s is now activated.
+HOST_ID
+ Please identify to services first.
+HOST_NOT_REGED
+ You need to register before a vhost can be assigned to you.
+HOST_DEL
+ vhost for %s removed.
+HOST_DEL_SYNTAX
+ Syntax: /msg %s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Your vhost was removed. To re-enable the standard host cloaking, type /mode %s +x
+HOST_NO_VIDENT
+ Your IRCD does not support vIdent's, if this is incorrect, please report this as a possible bug
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_GROUP
+ All vhost's in the group %s have been set to %s
+HOST_IDENT_GROUP
+ All vhost's in the group %s have been set to %s@%s
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_LIST_FOOTER
+ Displayed all records (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Displayed records from %d to %d
+HOST_LIST_KEY_FOOTER
+ Displayed records matching key %s (Count: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ %S commands:
+ ON Activates your assigned vhost
+ OFF Deactivates your assigned vhost
+
+HOST_OPER_HELP
+ Commands available to services operators only:
+ SET Set the vhost of another user
+ SETALL Set the vhost for all nicks in a group
+ DEL Delete the vhost of another user
+ LIST Displays one or more vhost entries.
+
+HOST_ADMIN_HELP
+ Commands available to services admins only:
+
+HOST_HELP_ON
+ Syntax: ON
+
+ Activates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see the vhost instead of your real IP address.
+
+HOST_HELP_SET
+ Syntax: SET <nick> <hostmask>.
+
+ Sets the vhost for the given nick to that of the given
+ hostmask. If your IRCD supports vIdents, then using
+ SET <nick> <ident>@<hostmask> set idents for users as
+ well as vhosts.
+
+ Limited to Services operators.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Deletes the vhost for all nick's in the same group as
+ that of the given nick.
+
+ Limited to Host Removers.
+
+
+HOST_HELP_SETALL
+ Syntax: SETALL <nick> <hostmask>.
+
+ Sets the vhost for all nicks in the same group as that
+ of the given nick. If your IRCD supports vIdents, then
+ using SETALL <nick> <ident>@<hostmask> will set idents
+ for users as well as vhosts.
+
+ * NOTE, this will not update the vhost for any nick's
+ added to the group after this command was used.
+
+ Limited to Services operators.
+
+HOST_HELP_OFF
+ Syntax: OFF
+
+ Deactivates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see your real IP address.
+
+HOST_HELP_DEL
+ Syntax: DEL <nick>
+
+ Deletes the vhost assigned to the given nick from the
+ database.
+
+ Limited to Services operators.
+
+HOST_HELP_LIST
+ Syntax: LIST [<key>|<#X-Y>]
+
+ This command lists registered vhosts to the operator
+ if a Key is specified, only entries whos nick or vhost match
+ the pattern given in <key> are displayed e.g. Rob* for all
+ entries beginning with "Rob"
+
+ If a #X-Y style is used, only entries between the range of X
+ and Y will be displayed, e.g. #1-3 will display the first 3
+ nick/vhost entries.
+
+ The list uses the value of NSListMax as a hard limit for the
+ number of items to display to a operator at any 1 time.
+
+ Limited to Services operators.
+
+HOST_HELP_GROUP
+ Syntax: GROUP
+
+ This command allows users to set the vhost of thier
+ CURRENT nick to be the vhost for all nicks in the same
+ group.
diff --git a/lang/ru.l b/lang/ru.l
new file mode 100644
index 000000000..7a54f420c
--- /dev/null
+++ b/lang/ru.l
@@ -0,0 +1,5951 @@
+# Russian language file for Anope 1.5.10.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# Translated by Oleg Nikolaev aka Isot <isot@complife.ru>
+# - Special thanks to Mishgan and Leeho for testing
+#
+# Translated: 7.12.2003
+# Charaster set is cp1251
+#
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ Ðóññêèé (Russian)
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %b %d %H:%M:%S %Y %Z
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %b %d %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %b %d %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Âñê
+ Ïí
+ Âò
+ Ñð
+ ×ò
+ Ïò
+ Ñá
+# %A
+STRFTIME_DAYS_LONG
+ Âîñêðåñåíüå
+ Ïîíåäåëüíèê
+ Âòîðíèê
+ Ñðåäà
+ ×åòâåðã
+ Ïÿòíèöà
+ Ñóááîòà
+# %b
+STRFTIME_MONTHS_SHORT
+ ßíâ
+ Ôåâ
+ Ìàð
+ Àïð
+ Ìàé
+ Èþí
+ Èþë
+ Àâã
+ Ñåí
+ Îêò
+ Íîÿ
+ Äåê
+# %B
+STRFTIME_MONTHS_LONG
+ ßíâàðü
+ Ôåâðàëü
+ Ìàðò
+ Àïðåëü
+ Ìàé
+ Èþíü
+ Èþëü
+ Àâãóñò
+ Ñåíòÿáðü
+ Îêòÿáðü
+ Íîÿáðü
+ Äåêàáðü
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Âíóòðåííÿÿ îøèáêà - íåâîçìîæíî âûïîëíèòü çàïðîñ.
+UNKNOWN_COMMAND
+ Íåèçâåñòíàÿ êîìàíäà %s.
+UNKNOWN_COMMAND_HELP
+ Íåèçâåñòíàÿ êîìàíäà %s. "/msg %s HELP" ÷òîáû ïîëó÷èòü ïîìîùü ïî êîìàíäàì.
+SYNTAX_ERROR
+ Ñèíòàêñèñ: %s
+MORE_INFO
+ /msg %s HELP %s äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+NO_HELP_AVAILABLE
+ Íåò ïîìîùè ïî %s.
+OBSOLETE_COMMAND
+ Äàííàÿ êîìàíäà óñòàðåëà; èñïîëüçóéòå âìåñòî íåå %s.
+
+BAD_USERHOST_MASK
+ Ìàñêà äîëæíà áûòü â ôîðìàòå user@host.
+BAD_EXPIRY_TIME
+ Íåâåðíîå âðåìÿ èñòåêàíèÿ.
+USERHOST_MASK_TOO_WIDE
+ Ãðàíèöû %s ñëèøêîì øèðîêè; Ïîæàëóéñòà óòî÷íèòå ìàñêó.
+
+SERVICE_OFFLINE
+ %s ñåé÷àñ â îôôëàéíå.
+READ_ONLY_MODE
+ Ïðèìå÷àíèå: ñåé÷àñ ñåðâèñû ðàáîòàþò â ðåæèìå òîëüêî-÷òåíèå; èçìåíåíèÿ ÍÅ áóäóò ñîõðàíåíû!
+PASSWORD_INCORRECT
+ Íåâåðíûé ïàðîëü.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Äîñòóï çàïðåùåí.
+PERMISSION_DENIED
+ Íåäîñòàòî÷íî ïðàâ äëÿ äîñòóïà.
+RAW_DISABLED
+ Îïöèÿ RAW îòêëþ÷åíà. Åñëè Âû æåëàåòå èñïîëüçîâàòü åå, ñêîíôèãóðèðóéòå äèðåêòèâó DisableRaw â ôàéëå êîíôèãóðàöèè ñåðâèñîâ.
+
+MORE_OBSCURE_PASSWORD
+ Ïîæàëóéñòà ïîïðîáóéòå ñíîâà ñ áîëåå ñëîæíûì ïàðîëåì. Ïàðîëü äîëæåí èìåòü äëèíó íå ìåíåå 5 ñèìâîëîâ, äîëæåí ñîñòîÿòü òîëüêî èç ëàòèíñêèõ áóêâ, íå äîëæåí áûòü ëåãêî îòãàäûâàåìûì (ò.å. Âàøèì èìåíåì èëè Âàøèì íèêîì), è íå äîëæåí ñîäåðæàòü ïðîáåëîâ è òàáóëÿöèé.
+PASSWORD_TRUNCATED
+ Ñîîáùåíèå: Âàø ïàðîëü áûë óñå÷åí äî %d ñèìâîëîâ.
+
+NICK_NOT_REGISTERED
+ Âàø íèê íå çàðåãèñòðèðîâàí.
+NICK_NOT_REGISTERED_HELP
+ Âàø íèê íå çàðåãèñòðèðîâàí. Íàïèøèòå /msg %s HELP äëÿ ïîëó÷åíèÿ èíôîðìàöèè î òîì, êàê çàðåãèñòðèðîâàòü íèê.
+NICK_X_NOT_REGISTERED
+ Íèê %s íå çàðåãèñòðèðîâàí.
+NICK_X_IN_USE
+ Íèê %s óæå èñïîëüçóåòñÿ.
+NICK_X_NOT_IN_USE
+ Íèê %s â äàííûé ìîìåíò íå èñïîëüçóåòñÿ.
+NICK_X_NOT_ON_CHAN
+ %s íå ïðèñóòñòâóåò â äàííûé ìîìåíò íà êàíàëå %s.
+NICK_X_FORBIDDEN
+ Íèê %s íå ìîæåò áûòü çàðåãèñòðèðîâàí èëè èñïîëüçîâàí.
+NICK_X_FORBIDDEN_OPER
+ Íèê %s áûë çàïðåùåí ê èñïîëüçîâàíèþ %s:
+ %s
+NICK_X_ILLEGAL
+ Íèê %s ÿâëÿåòñÿ íåäîïóñòèìûì è íå ìîæåò áûòü èñïîëüçîâàí.
+NICK_X_TRUNCATED
+ Íèê %s áûë óñå÷åí äî %d ñèìâîëîâ.
+CHAN_X_NOT_REGISTERED
+ Êàíàë %s íå çàðåãèñòðèðîâàí.
+CHAN_X_NOT_IN_USE
+ Êàíàë %s íå ñóùåñòâóåò.
+CHAN_X_FORBIDDEN
+ Êàíàë %s íå ìîæåò áûòü çàðåãèñòðèðîâàí èëè èñïîëüçîâàí.
+CHAN_X_FORBIDDEN_OPER
+ Êàíàë %s çàïðåùåí ê èñïîëüçîâàíèþ %s:
+ %s
+CHAN_X_SUSPENDED
+ Ïðèîñòàíîâëåíî: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Äëÿ âûïîëíåíèÿ äàííîé êîìàíäû Âû äîëæíû èäåíòèôèöèðîâàòüñÿ. Ïîïðîáóéòå ñíîâà ïîñëå òîãî,
+ êàê íàïèøåòå êîìàíäó /msg %s IDENTIFY password.
+CHAN_IDENTIFY_REQUIRED
+ Äëÿ âûïîëíåíèÿ äàííîé êîìàíäû Âû äîëæíû èäåíòèôèöèðîâàòüñÿ. Ïîïðîáóéòå ñíîâà ïîñëå òîãî,
+ êàê íàïèøåòå êîìàíäó /msg %s IDENTIFY %s password.
+
+MAIL_DISABLED
+ Ñåðâèñû íå ñêîíôèãóðèðîâàíû äëÿ îòïðàâêè ïî÷òû.
+MAIL_INVALID
+ Àäðåñ ýëåêòðîííîé ïî÷òû %s íåâåðåí.
+MAIL_X_INVALID
+ %s íå ÿâëÿåòñÿ ïðàâèëüíûì àäðåñîì email.
+MAIL_LATER
+ Íå óäàåòñÿ îòïðàâèòü email; ïîïðîáóéòå, ïîæàëóéñòà, ïîææå.
+MAIL_DELAYED
+ Ïîäîæäèòå ïîæàëóéñòà %d ñåêóíä è ïîâòîðèòå.
+
+NO_REASON
+ Íåò ïðè÷èíû
+UNKNOWN
+ <íåèçâåñòíî>
+
+# Duration system
+DURATION_DAY
+ 1 äåíü
+DURATION_DAYS
+ %d äíåé
+DURATION_HOUR
+ 1 ÷àñ
+DURATION_HOURS
+ %d ÷àñîâ
+DURATION_MINUTE
+ 1 ìèíóòà
+DURATION_MINUTES
+ %d ìèíóò
+DURATION_SECOND
+ 1 ñåêóíäà
+DURATION_SECONDS
+ %d ñåêóíä
+
+# Human readable expiration
+NO_EXPIRE
+ íèêîãäà íå èñòå÷åò
+EXPIRES_SOON
+ èñòåêàåò ïðè áëèæàéøåì îáíîâëåíèè áàçû äàííûõ
+EXPIRES_M
+ èñòå÷åò ÷åðåç %d ìèíóò
+EXPIRES_1M
+ èñòå÷åò ÷åðåç %d ìèíóò
+EXPIRES_HM
+ èñòå÷åò ÷åðåç %d ÷àñîâ, %d ìèíóò
+EXPIRES_H1M
+ èñòå÷åò ÷åðåç %d ÷àñîâ, %d ìèíóò
+EXPIRES_1HM
+ èñòå÷åò ÷åðåç %d ÷àñîâ, %d ìèíóò
+EXPIRES_1H1M
+ èñòå÷åò ÷åðåç %d ÷àñîâ %d ìèíóò
+EXPIRES_D
+ èñòå÷åò ÷åðåç %d äíåé
+EXPIRES_1D
+ èñòå÷åò ÷åðåç %d äíåé
+
+# Generic Footer message
+END_OF_ANY_LIST
+ Êîíåö ñïèñêà %s.
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Ýòîò íèê çàðåãèñòðèðîâàí è èñïîëüçóåòñÿ. Âûáåðèòå, ïîæàëóéñòà, äðóãîé íèê.
+ (Åñëè ýòî Âàø íèê, íàïèøèòå êîìàíäó /msg %s IDENTIFY password.)
+NICK_IS_SECURE
+ Ýòîò íèê çàðåãèñòðèðîâàí è çàùèùåí. Åñëè ýòî âàø íèê, íàïèøèòå
+ êîìàíäó /msg %s IDENTIFY password.  èíîì ñëó÷àå,
+ âûáåðèòå, ïîæàëóéñòà, äðóãîé íèê.
+NICK_MAY_NOT_BE_USED
+ Ýòîò íèê íå ìîæåò áûòü èñïîëüçîâàí. Ïîæàëóéñòà âûáåðèòå ëþáîé äðóãîé.
+FORCENICKCHANGE_IN_1_MINUTE
+ Åñëè âû íå âûïîëíèòå óêàçàííûå ðåêîìåíäàöèè, Âàø íèê áóäåò ïðèíóäèòåëüíî èçìåíåí â òå÷åíèè ìèíóòû.
+FORCENICKCHANGE_IN_20_SECONDS
+ Åñëè âû íå âûïîëíèòå óêàçàííûå ðåêîìåíäàöèè, Âàø íèê áóäåò ïðèíóäèòåëüíî èçìåíåí â òå÷åíèè 20 ñåêóíä.
+FORCENICKCHANGE_NOW
+ Ýòîò íèê áûë çàðåãèñòðèðîâàí; Âû íå ìîæåòå åãî èñïîëüçîâàòü.
+FORCENICKCHANGE_CHANGING
+ Âàø íèê áûë èçìåíåí íà %s
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER password [email]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER password email
+NICK_REGISTRATION_DISABLED
+ Èçâèíèòå, ðåãèñòðàöèÿ íèêîâ âðåìåííî ïðèîñòàíîâëåíà.
+NICK_REGISTRATION_FAILED
+ Èçâèíèòå, îøèáêà ðåãèñòðàöèè.
+NICK_REG_PLEASE_WAIT
+ Ïîæàëóéñòà ïîäîæäèòå %d ñåêóíä ïåðåä ïîâòîðíûì èñïîëüçîâàíèåì êîìàíäû REGISTER.
+NICK_CANNOT_BE_REGISTERED
+ Íèê %s íå ìîæåò áûòü çàðåãèñòðèðîâàí.
+NICK_ALREADY_REGISTERED
+ Íèê %s óæå çàðåãèñòðèðîâàí!
+NICK_REGISTERED
+ Íèê %s çàðåãèñòðèðîâàí íà Âàøó ó÷åòíóþ çàïèñü: %s
+NICK_PASSWORD_IS
+ Âàø ïàðîëü - %s - èñïîëüçóéòå åãî â äàëüíåéøåì è íå çàáûâàéòå.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP target password
+NICK_GROUP_DISABLED
+ Èçâèíèòå, ãðóïïèðîâàíèå íèêîâ âðåìåííî íåäîñòóïíî.
+NICK_GROUP_FAILED
+ Èçâèíèòå, îøèáêà ãðóïïèðîâàíèÿ íèêîâ.
+NICK_GROUP_PLEASE_WAIT
+ Ïîæàëóéñòà ïîäîæäèòå %d ñåêóíä ïåðåä ïîâòîðíûì èñïîëüçîâàíèåì êîìàíäû GROUP.
+NICK_GROUP_CHANGE_DISABLED
+ Âàø íèê óæå çàðåãèñòðèðîâàí; Ñíà÷àëà óäàëèòå íèê êîìàíäîé /msg %s DROP.
+NICK_GROUP_SAME
+ Âû óæå ÿâëÿåòåñü ÷ëåíîì ãðóïïû %s.
+NICK_GROUP_TOO_MANY
+ Ñëèøêîì ìíîãî íèêîâ â ãðóïïå %s's ; ïðîñìîòðèòå ñïèñîê è óäàëèòå ÷àñòü.
+ Íàïèøèòå /msg %s HELP GLIST è /msg %s HELP DROP
+ äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+NICK_GROUP_JOINED
+ Âû óñïåøíî âíåñåíû â ãðóïïó %s.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY password
+NICK_IDENTIFY_FAILED
+ Èçâèíèòå, íî ïîïûòêà èäåíòèôèêàöèè íåóäà÷íà.
+NICK_IDENTIFY_SUCCEEDED
+ Ïàðîëü ïðèíÿò - âû ïðèçíàíû êàê âëàäåëåö íèêà.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Ñíà÷àëà Âû äîëæíû óêàçàòü Âàø e-mail. Ïðàâèëüíûé e-mail ïîçâîëèò Âàì ïîëó÷èòü íà íåãî ïàðîëü,
+ åñëè Âû åãî çàáóäåòå.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Íàïèøèòå êîìàíäó /msg %S SET EMAIL e-mail ÷òîáû óñòàíîâèòü e-mail. Âàøà ïðèâàòíîñòü çàùèùåíà;
+ ýòîò e-mail íå ìîæåò áûòü óçíàí òðåòüèì ëèöîì.
+NICK_ALREADY_IDENTIFIED
+ Âû óæå èäåíòèôèöèðîâàíû.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Ñòàòóñ îáíîâëåí (ìåìêè, âèðóòàëüíûå õîñòû, ðåæèìû íà êàíàëàõ, ôëàãè).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Äåèäåíòèôèêàöèÿ âûïîëíåíà óñïåøíî.
+NICK_LOGOUT_X_SUCCEEDED
+ Íèê %s áûë äåèäåíòèôèöèðîâàí.
+NICK_LOGOUT_SERVICESADMIN
+ Íåâîçìîæíî îòëîãèíèòü %s, òàê êàê ýòî àäìèíèñòðàòîð ñåðâèñîâ.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Èçâèíèòå, íèê âðåìåííî íå ìîæåò áûòü ðàçðåãèñòðèðîâàí.
+NICK_DROPPED
+ Âàø íèê áûë óäàëåí èç áàçû äàííûõ.
+NICK_X_DROPPED
+ Íèê %s áûë óäàëåí èç áàçû äàííûõ.
+
+# SET responses
+NICK_SET_SYNTAX
+ SET option parameters
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] option parameters
+NICK_SET_DISABLED
+ Èçâèíèòå, óñòàíîâêà ïàðàìåòðîâ íèêà âðåìåííî íåäîñòóïíà.
+NICK_SET_UNKNOWN_OPTION
+ Íåèçâåñòíûé SET ïàðàìåòð %s.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ Íåèçâåñòíûé SET ïàðàìåòð %s, èëè íèê íå çàðåãèñòðèðîâàí.
+NICK_SET_OPTION_DISABLED
+ Ïàðàìåòð %s íå ìîæåò áûòü óñòàíîâëåí â ýòîé IRC ñåòè.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ Íîâûé îñíîâíîé íèê, ÄÎËÆÅÍ áûòü çàðåãèñòðèðîâàííûì íèêîì èëè íèêîì â Âàøåé ãðóïïå!
+NICK_SET_DISPLAY_CHANGED
+ Íîâûé îñíîâíîé íèê èçìåíåí íà %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Èçâèíèòå, íåâîçìîæíî èçìåíèòü ïàðîëü.
+NICK_SET_PASSWORD_CHANGED
+ Ïàðîëü èçìåíåí.
+NICK_SET_PASSWORD_CHANGED_TO
+ Ïàðîëü èçìåíåí íà %s.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE íîìåð
+NICK_SET_LANGUAGE_UNKNOWN
+ íåèçâåñòíûé íîìåð ÿçûêà %d. Íàïèøèòå /msg %s HELP SET LANGUAGE äëÿ ïîëó÷åíèÿ ñïèñêà äîñòóïíûõ ÿçûêîâ.
+NICK_SET_LANGUAGE_CHANGED
+ ßçûê èçìåíåí íà Ðóññêèé.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL èçìåíåí íà %s.
+NICK_SET_URL_UNSET
+ URL óäàëåí.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ Àäðåñ E-mail èçìåíåí íà %s.
+NICK_SET_EMAIL_UNSET
+ Àäðåñ E-mail óäàëåí.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ Âû íå ìîæåòå îòêëþ÷èòü àäðåñ email â ýòîé IRC ñåòè.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ Íîìåð ICQ óñòàíîâëåí: %s.
+NICK_SET_ICQ_UNSET
+ Íîìåð ICQ óäàëåí.
+NICK_SET_ICQ_INVALID
+ %s íå ÿâëÿåòñÿ ïðàâèëüíûì íîìåðîì.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Ïðèâåòñòâåííîå ñîîáùåíèå èçìåíåíî íà %s.
+NICK_SET_GREET_UNSET
+ Ïðèâåòñòâåííîå ñîîáùåíèå óäàëåíî.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ Çàùèòà îò çàõâàòà íèêà: ÂÊËÞ×ÅÍÀ.
+NICK_SET_KILL_QUICK
+ Çàùèòà îò çàõâàòà íèêà: ÂÊËÞ×ÅÍÀ, ñ íåáîëüøîé çàäåðæêîé.
+NICK_SET_KILL_IMMED
+ Çàùèòà îò çàõâàòà íèêà: ÂÊËÞ×ÅÍÀ, áåç çàäåðæêè.
+NICK_SET_KILL_IMMED_DISABLED
+ Ïàðàìåòð IMMED íåäîñòóïåí â ýòîé IRC ñåòè.
+NICK_SET_KILL_OFF
+ Çàùèòà îò çàõâàòà íèêà: ÂÛÊËÞ×ÅÍÀ.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ Áåçîïàñíîñòü: ÂÊËÞ×ÅÍÀ.
+NICK_SET_SECURE_OFF
+ Áåçîïàñíîñòü: ÂÛÊËÞ×ÅÍÀ.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ Ïðèâàòíîñòü: ÂÊËÞ×ÅÍÀ.
+NICK_SET_PRIVATE_OFF
+ Ïðèâàòíîñòü: ÂÛÊËÞ×ÅÍÀ.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Òåïåðü Âàø email áóäåò ñêðûò èç çàïðîñà %s INFO.
+NICK_SET_HIDE_EMAIL_OFF
+ Òåïåðü Âàø email áóäåò ïîêàçûâàòüñÿ ïî çàïðîñó %s INFO.
+NICK_SET_HIDE_MASK_ON
+ Òåïåðü Âàøà ïîñëåäíÿÿ ìàñêà user@host áóäåò ñêðûòà èç çàïðîñà %s INFO.
+NICK_SET_HIDE_MASK_OFF
+ Òåïåðü Âàøà ïîñëåäíÿÿ ìàñêà user@host áóäåò ïîêàçàíà ïî çàïðîñó %s INFO.
+NICK_SET_HIDE_QUIT_ON
+ Âàøå ïîñëåäíåå ñîîáùåíèå ïðè âûõîäå áóäåò ñêðûòî èç çàïðîñà %s INFO.
+NICK_SET_HIDE_QUIT_OFF
+ Âàøå ïîñëåäíåå ñîîáùåíèå ïðè âûõîäå áóäåò ïîêàçàíî ïî çàïðîñó %s INFO.
+
+# SET MSG responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Òåïåðü ñåðâèñû áóäóò îòâå÷àòü Âàì ïîñðåäñòâîì ïðèâàòà.
+NICK_SET_MSG_OFF
+ Òåïåðü ñåðâèñû áóäóò îòâå÷àòü Âàì ïîñðåäñòâîì íîòèñîâ.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nickname] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ Íèê %s íèêîãäà íå èñòå÷åò.
+NICK_SET_NOEXPIRE_OFF
+ Íèê %s ìîæåò èñòåêàòü.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mask]
+NICK_ACCESS_ALREADY_PRESENT
+ Ìàñêà %s óæå åñòü â âàøåì ñïèñêå äîñòóïà.
+NICK_ACCESS_REACHED_LIMIT
+ Èçâèíèòå, âû ìîæåòå èìåòü òîëüêî %d çàïèñåé â ñïèñêå äîñòóïà.
+NICK_ACCESS_ADDED
+ %s äîáàâëåíî â âàø ñïèñîê äîñòóïà.
+NICK_ACCESS_NOT_FOUND
+ %s íå íàéäåíî â âàøåì ñïèñêå äîñòóïà.
+NICK_ACCESS_DELETED
+ %s óäàëåíî èç ñïèñêà äîñòóïà.
+NICK_ACCESS_LIST
+ Ñïèñîê äîñòóïà:
+NICK_ACCESS_LIST_X
+ Ñïèñîê äîñòóïà äëÿ %s:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s ýòî %s
+NICK_INFO_SERVICES_OPER
+ %s îïåðàòîð ñåðâèñîâ.
+NICK_INFO_SERVICES_ADMIN
+ %s àäìèíèñòðàòîð ñåðâèñîâ.
+NICK_INFO_ADDRESS
+ Ïîñëåäíÿÿ ìàñêà: %s
+NICK_INFO_ADDRESS_ONLINE
+ Ñåé÷àñ â îíëàéíå c ìàñêîé: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s ñåé÷àñ â îíëàéíå.
+NICK_INFO_TIME_REGGED
+ Çàðåãèñòðèðîâàí: %s
+NICK_INFO_LAST_SEEN
+ Ïîñëåäíèé ðàç çàìå÷åí: %s
+NICK_INFO_LAST_QUIT
+ Ïîñëåäíåå ñîîáùåíèå ïðè âûõîäå: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ àäðåñ E-mail: %s
+NICK_INFO_VHOST
+ Âèðòóàëüíûé õîñò: %s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Ñîîáùåíèå ïðèâåòñòâèÿ: %s
+NICK_INFO_OPTIONS
+ Ïàðàìåòðû: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Çàùèòà
+NICK_INFO_OPT_SECURE
+ Áåçîïàñíîñòü
+NICK_INFO_OPT_PRIVATE
+ Ïðèâàòíîñòü
+NICK_INFO_OPT_MSG
+ Ðåæèì ïðèâàòíûõ ñîîáùåíèé
+NICK_INFO_OPT_NONE
+ íåò
+NICK_INFO_NO_EXPIRE
+ Ýòîò íèê íèêîãäà íå èñòå÷åò.
+NICK_INFO_FOR_MORE
+ Äëÿ ïîëó÷åíèÿ áîëåå ïîäðîáíîé èíôîðìàöèè íàïèøèòå /msg %s INFO %s ALL.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST ìàñêà
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST ìàñêà [FORBIDDEN] [NOEXPIRE] [UNCONFIRMED]
+NICK_LIST_HEADER
+ Ñïèñîê, ñîäåðæàùèé %s:
+NICK_LIST_RESULTS
+ Êîíåö ñïèñêà - %d/%d çàïèñåé.
+
+# ALIST responses
+NICK_ALIST_SYNTAX
+ ALIST íèê
+NICK_ALIST_HEADER
+ Êàíàëû, íà êîòîðûõ ó Âàñ åñòü óðîâíè äîñòóïà:
+ Íîìåð Êàíàë Óðîâåíü Îïèñàíèå
+NICK_ALIST_HEADER_X
+ Êàíàëû, íà êîòîðûõ ó %s åñòü óðîâíè äîñòóïà:
+ Íîìåð Êàíàë Óðîâåíü Îïèñàíèå
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ Êîíåö ñïèñêà - %d/%d êàíàëîâ íàéäåíî.
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Ñïèñîê íèêîâ â Âàøåé ãðóïïå:
+NICK_GLIST_HEADER_X
+ Ñïèñîê íèêîâ â ãðóïïå %s:
+NICK_GLIST_FOOTER
+ %d íèêîâ â ãðóïïå.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER íèê [ïàðîëü]
+NICK_NO_RECOVER_SELF
+ Âû íå ìîæåòå âîññòàíîâèòü ñàìîãî ñåáÿ!
+NICK_RECOVERED
+ Ïî òðåáîâàíèþ ïîëüçîâàòåëÿ Âàø íèê áûë óáèò. Íàïèøèòå /msg %s RELEASE %s
+ â òå÷åíèå ìèíóòû, ÷òîáû Âû ñìîãëè åãî èñïîëüçîâàòü.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE íèê [ïàðîëü]
+NICK_RELEASE_NOT_HELD
+ Íèê %s íå áûë óäåðæàí.
+NICK_RELEASED
+ Ñåðâèñû óäåðæàëè Âàø íèê è îñâîáîäèëè.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST íèê [ïàðîëü]
+NICK_NO_GHOST_SELF
+ Âû íå ìîæåòå âûøèáèòü ñàìîãî ñåáÿ!
+NICK_GHOST_KILLED
+ Âàø çàâèñøèé íèê áûë óáèò.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nickname
+NICK_GETPASS_UNAVAILABLE
+ êîìàíäà GETPASS íåäîñòóïíà òàê êàê âêëþ÷åíî øèôðîâàíèå.
+NICK_GETPASS_PASSWORD_IS
+ Ïàðîëü %s - %s.
+
+# GETEMAIL responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host íå èñïîëüçóéòå ñèìâîëüíûå ìàñêè !!
+NICK_GETEMAIL_EMAILS_ARE
+ Email'û ïîäõîäÿùèå ïîä %s: %s.
+NICK_GETEMAIL_NOT_USED
+ Íåò Email'îâ äëÿ %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS íèê
+NICK_SENDPASS_UNAVAILABLE
+ êîìàíäà SENDPASS íåäîñòóïíà òàê êàê âêëþ÷åíî øèôðîâàíèå.
+NICK_SENDPASS_SUBJECT
+ Ïàðîëü íà íèê (%s)
+NICK_SENDPASS_HEAD
+ Hi,
+NICK_SENDPASS_LINE_1
+ Âû ïðîñèëè %s âûñëàòü ïàðîëü îò Âàøåãî íèêà íà e-mail.
+NICK_SENDPASS_LINE_2
+ Âàø ïàðîëü %s. Äëÿ áîëüøåé áåçîïàñíîñòè, Âàì ðåêîìåíäóåòñÿ èçìåíèòü êàê ìîæíî ñêîðåå.
+NICK_SENDPASS_LINE_3
+ Åñëè Âû íå çàïðàøèâàëè ýòî ïèñüìî, ïîæàëóéñòà ïðîèãíîðèðóéòå åãî.
+NICK_SENDPASS_LINE_4
+ ÏÎÆÀËÓÉÑÒÀ ÍÅ ÎÒÂÅ×ÀÉÒÅ ÍÀ ÝÒÎ ÏÈÑÜÌÎ!
+NICK_SENDPASS_LINE_5
+ Àäìèíèñòðàòîðû %s.
+NICK_SENDPASS_OK
+ Ïàðîëü %s áûë îòïðàâëåí.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID íèê [ïðè÷èíà]
+NICK_FORBID_SYNTAX_REASON
+ FORBID íèê ïðè÷èíà
+NICK_FORBID_SUCCEEDED
+ Íèê %s çàïðåùåí ê èñïîëüçîâàíèþ.
+NICK_FORBID_FAILED
+ Íå óäàëîñü çàïðåòèòü íèê %s!
+
+# Nick Registraion responses
+NICK_REQUESTED
+ Ýòîò íèê óæå çàïðàøèâàë ðåãèñòðàöèþ, ïîæàëóéñòà ïðîâåðüòå Âàø e-mail íà ïðåäìåò ïîëó÷åíèÿ ïàðîëÿ
+NICK_REG_RESENT
+ Âàø ïàðîëü áûë ñíîâà îòïðàâëåí íà %s.
+NICK_REG_UNABLE
+ Íèê ÍÅ ÇÀÐÅÃÈÑÒÐÈÐÎÂÀÍ, ïîïðîáóéòå, ïîæàëóéñòà, ïîçäíåå.
+NICK_IS_PREREG
+ Ýòîò íèê îæèäàåò ïîäòâåðæäåíèÿ ïî e-mail ïåðåä çàâåðøåíèåì ðåãèñòðàöèè.
+NICK_ENTER_REG_CODE
+ Ïàðîëü áûë âûñëàí íà %s, ïîæàëóéñòà íàïèøèòå êîìàíäó /msg %s confirm <ïàðîëü> äëÿ çàâåðøåíèÿ ðåãèñòðàöèè
+NICK_CONFIRM_NOT_FOUND
+ Âðåìÿ ïåðâîé ÷àñòè ðåãèñòðàöèè èñòåêëî, ïîæàëóéñòà èñïîëüçóéòå ñíà÷àëà "/msg %s register <ïàðîëü> <email>" .
+NICK_CONFIRM_INVALID
+ Áûë ââåäåí íåâåðíûé ïàðîëü, ïîæàëóéñòà ïðîâåðüòå Âàø e-mail ñíîâà, è ïîïðîáóéòå åùå ðàç
+NICK_REG_MAIL_SUBJECT
+ Ðåãèñòðàöèÿ íèêà (%s)
+NICK_REG_MAIL_HEAD
+ Hi,
+NICK_REG_MAIL_LINE_1
+ Âû õîòåëè çàðåãèñòðèðîâàòü Âàø íèê íà %s.
+NICK_REG_MAIL_LINE_2
+ Ïîæàëóéñòà íàïèøèòå êîìàíäó " /msg %s confirm %s " ÷òîáû çàâåðøèòü ðåãèñòðàöèþ.
+NICK_REG_MAIL_LINE_3
+ Åñëè Âû íå çàïðàøèâàëè ýòî ïèñüìî, ïîæàëóéñòà ïðîèãíîðèðóéòå åãî.
+NICK_REG_MAIL_LINE_4
+ ÏÎÆÀËÓÉÑÒÀ ÍÅ ÎÒÂÅ×ÀÉÒÅ ÍÀ ÝÒÎ ÏÈÑÜÌÎ!
+NICK_REG_MAIL_LINE_5
+ Àäìèíèñòðàòîðû %s.
+NICK_GETPASS_PASSCODE_IS
+ Ïàðîëü %s - %s.
+NICK_FORCE_REG
+ Íèê %s ïîäòâåðäèë ðåãèñòðàöèþ
+
+
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Àâòîìàòè÷åñêè óñòàíàâëèâàåò ñòàòóñ îïåðàòîðà êàíàëà
+CHAN_LEVEL_AUTOVOICE
+ Àâòîìàòè÷åñêè ñòàâèò ðåæèì +v
+CHAN_LEVEL_AUTOHALFOP
+ Àâòîìàòè÷åñêè ñòàâèò ðåæèì +h
+CHAN_LEVEL_AUTOPROTECT
+ Àâòîìàòè÷åñêè ñòàâèò ðåæèì +a
+CHAN_LEVEL_AUTODEOP
+ Ñòàòóñ îïåðàòîðà êàíàëà çàïðåùåí
+CHAN_LEVEL_NOJOIN
+ Íåâîçìîæíî çàéòè â êàíàë: äîñòóï îãðàíè÷åí
+CHAN_LEVEL_INVITE
+ Ìîæíî èñïîëüçîâàòü êîìàíäó INVITE
+CHAN_LEVEL_AKICK
+ Ìîæíî èñïîëüçîâàòü êîìàíäó AKICK
+CHAN_LEVEL_SET
+ Ìîæíî èñïîëüçîâàòü êîìàíäó SET (êðîìå FOUNDER/PASSWORD)
+CHAN_LEVEL_CLEAR
+ Ìîæíî èñïîëüçîâàòü êîìàíäó CLEAR
+CHAN_LEVEL_UNBAN
+ Ìîæíî èñïîëüçîâàòü êîìàíäó UNBAN
+CHAN_LEVEL_OPDEOP
+ Ìîæíî èñïîëüçîâàòü êîìàíäû OP/DEOP
+CHAN_LEVEL_ACCESS_LIST
+ Ìîæíî ïðîñìàòðèâàòü ñïèñîê äîñòóïà
+CHAN_LEVEL_ACCESS_CHANGE
+ Ìîæíî ìîäèôèöèðîâàòü ñïèñîê äîñòóïà
+CHAN_LEVEL_MEMO
+ Ìîæíî ÷èòàòü ñîîáùåíèÿ äëÿ êàíàëà
+CHAN_LEVEL_ASSIGN
+ Ìîæíî äîáàâëÿòü/óáèðàòü áîòà
+CHAN_LEVEL_BADWORDS
+ Ìîæíî èñïîëüçîâàòü êîìàíäó BADWORDS
+CHAN_LEVEL_NOKICK
+ Íèêîãäà íå áóäåò êèêíóò áîòîì
+CHAN_LEVEL_FANTASIA
+ Ìîæíî èñïîëüçîâàòü fantaisist êîìàíäû BotServ'a
+CHAN_LEVEL_SAY
+ Ìîæíî èñïîëüçîâàòü êîìàíäû SAY è ACT
+CHAN_LEVEL_GREET
+ Ïîêàçûâàòü ïðèâåòñòâåííîå ñîîáùåíèå
+CHAN_LEVEL_VOICEME
+ Ìîæíî èñïîëüçîâàòü êîìàíäó (de)voice íà ñåáÿ
+CHAN_LEVEL_VOICE
+ Ìîæíî èñïîëüçîâàòü êîìàíäû VOICE/DEVOICE
+CHAN_LEVEL_GETKEY
+ Ìîæíî èñïîëüçîâàòü êîìàíäó GETKEY
+CHAN_LEVEL_OPDEOPME
+ Ìîæíî èñïîëüçîâàòü êîìàíäû OP/DEOP íà ñåáÿ
+CHAN_LEVEL_HALFOPME
+ Ìîæíî èñïîëüçîâàòü êîìàíäû HALFOP/DEHALFOP íà ñåáÿ
+CHAN_LEVEL_HALFOP
+ Ìîæíî èñïîëüçîâàòü êîìàíäû HALFOP/DEHALFOP
+CHAN_LEVEL_PROTECTME
+ Ìîæíî èñïîëüçîâàòü êîìàíäó PROTECT/DEPROTECT íà ñåáÿ
+CHAN_LEVEL_PROTECT
+ Ìîæíî èñïîëüçîâàòü êîìàíäû PROTECT/DEPROTECT
+CHAN_LEVEL_KICKME
+ Ìîæíî èñïîëüçîâàòü êîìàíäó KICK íà ñåáÿ
+CHAN_LEVEL_KICK
+ Ìîæíî èñïîëüçîâàòü KICK
+CHAN_LEVEL_SIGNKICK
+ Íåâîçìîæíî êèêàòü, êîãäà èñïîëüçóåòñÿ SIGNKICK LEVEL
+CHAN_LEVEL_BANME
+ Ìîæíî èñïîëüçîâàòü êîìàíäó BAN íà ñåáÿ
+CHAN_LEVEL_BAN
+ Ìîæíî èñïîëüçîâàòü êîìàíäó BAN
+CHAN_LEVEL_TOPIC
+ Ìîæíî èñïîëüçîâàòü êîìàíäó TOPIC
+CHAN_LEVEL_INFO
+ Ìîæíî èñïîëüçîâàòü êîìàíäó INFO ñ ïàðàìåòðîì ALL
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Ýòîò êàíàë áûë çàðåãèñòðèðîâàí %s.
+CHAN_NOT_ALLOWED_OP
+ Âû äîëæíû áûòü îïåðàòîðîì êàíàëà %s.
+CHAN_MAY_NOT_BE_USED
+ Ýòîò êàíàë íåëüçÿ èñïîëüçîâàòü.
+CHAN_NOT_ALLOWED_TO_JOIN
+ Âàì íå ðàçðåøåíî íàõîäèòüñÿ íà ýòîì êàíàëå.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER #êàíàë ïàðîëü îïèñàíèå
+CHAN_REGISTER_DISABLED
+ Èçâèíèòå, ðåãèñòðàöèÿ êàíàëîâ âðåìåííî ïðèîñòàíîâëåíà.
+CHAN_REGISTER_NOT_LOCAL
+ Ëîêàëüíûå êàíàëû íå ìîãóò áûòü çàðåãèñòðèðîâàíû.
+CHAN_MUST_REGISTER_NICK
+ Ñíà÷àëà Âû äîëæíû çàðåãèñòðèðîâàòü ñâîé íèê. Íàïèøèòå /msg %s HELP äëÿ ïîëó÷åíèÿ èíôîðìàöèè î òîì, êàê çàðåãèñòðèðîâàòü íèê.
+CHAN_MUST_IDENTIFY_NICK
+ Ñïåðâà èäåíòèôèöèðóéòåñü ïîæàëóéñòà íà %s, èñïîëüçóÿ êîìàíäó:
+ /msg %s IDENTIFY ïàðîëü
+CHAN_MAY_NOT_BE_REGISTERED
+ Êàíàë %s íå ìîæåò áûòü çàðåãèñòðèðîâàí.
+CHAN_ALREADY_REGISTERED
+ Êàíàë %s óæå çàðåãèñòðèðîâàí!
+CHAN_MUST_BE_CHANOP
+ Âû äîëæíû áûòü îïåðàòîðîì íà êàíàëå, ÷òîáû çàðåãèñòðèðîâàòü åãî.
+CHAN_REACHED_CHANNEL_LIMIT
+ Èçâèíèòå, Âû óæå çàðåãèñòðèðîâàëè %d êàíàëîâ, áîëüøå, ê ñîæàëåíèþ, íåëüçÿ.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ Èçâèíèòå, Âû óæå ïðåâûñèëè ëèìèò (%d) çàðåãèñòðèðîâàííûõ êàíàëîâ.
+CHAN_REGISTRATION_FAILED
+ Èçâèíèòå, îøèáêà ðåãèñòðàöèè.
+CHAN_REGISTERED
+ Êàíàë %s çàðåãèñòðèðîâàí íà Âàñ: %s
+CHAN_PASSWORD_IS
+ Ïàðîëü Âàøåãî êàíàëà - %s - íå çàáûâàéòå åãî!
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY #êàíàë ïàðîëü
+CHAN_IDENTIFY_FAILED
+ Íåâåðíûé ïàðîëü.
+CHAN_IDENTIFY_SUCCEEDED
+ Ïàðîëü ïðèíÿò - Òåïåðü Âàø óðîâåíü äîñòóïà íà %s - âëàäåëåö.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT #êàíàë íèê
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT #êàíàë [íèê]
+CHAN_LOGOUT_SUCCEEDED
+ Ïîëüçîâàòåëü %s üûë äåèäåíòèôèöèðîâàí íà êàíàë %s.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Âñå èäåíòèôèöèðîâàííûå ïîëüçîâàòåëè áûëè äåèäåíòèôèöèðîâàíû íà êàíàë %s.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP #êàíàë
+CHAN_DROP_DISABLED
+ Èçâèíèòå, óäàëåíèå êàíàëà âðåìåííî íåâîçìîæíî.
+CHAN_DROPPED
+ Êàíàë %s áûë óäàëåí.
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET #êàíàë îïöèÿ ïàðàìåòð
+CHAN_SET_DISABLED
+ Èçâèíèòå, óñòàíîâêà îïöèé äëÿ êàíàëîâ âðåìåííî íåäîñòóïíà.
+CHAN_SET_UNKNOWN_OPTION
+ Íåèçâåñòíàÿ îïöèÿ SET %s.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ Ó %s ñëèøêîì ìíîãî çàðåãèñòðèðîâàííûõ êàíàëîâ.
+CHAN_FOUNDER_CHANGED
+ Âëàäåëåö êàíàëà %s èçìåíåí íà %s.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ Íàñëåäíèê êàíàëà %s èçìåíåí íà %s.
+CHAN_SUCCESSOR_UNSET
+ Íàñëåäíèê %s óäàëåí.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s íå ìîæåò áûòü íàñëåäíèêîì êàíàëà %s, òàê êàê îí åãî âëàäåëåö.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Èçâèíèòå, íåâîçìîæíî óñòàíîâèòü ïàðîëü.
+CHAN_PASSWORD_CHANGED
+ Ïàðîëü %s èçìåíåí.
+CHAN_PASSWORD_CHANGED_TO
+ Ïàðîëü êàíàëà %s èçìåíåí íà %s.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ Îïèñàíèå êàíàëà %s èçìåíåíî íà %s.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ URL êàíàëà %s èçìåíåí íà %s.
+CHAN_URL_UNSET
+ URL íà êàíàë %s óäàëåí.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ Àäðåñ E-mail äëÿ êàíàëà %s èçìåíåí íà %s.
+CHAN_EMAIL_UNSET
+ Àäðåñ E-mail äëÿ êàíàëà %s óäàëåí.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ Ñîîáùåíèå ïðè âõîäå íà êàíàë for %s èçìåíåíî.
+CHAN_ENTRY_MSG_UNSET
+ Ñîîáùåíèå ïðè âõîäå íà êàíàë %s óäàëåíî.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s íå ÿâëÿåòñÿ âåðíûì òèïîì áàíà.
+CHAN_SET_BANTYPE_CHANGED
+ Òèï áàíà íà êàíàëå %s òåïåðü #%d.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Íåèçâåñòíûé ðåæèì %c - ïðîèãíîðèðîâàí.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ Ðåæèì %c íå óñòàíîâëåí, òàê êàê Âû íå ìîæåòå çàáëîêèðîâàòü åãî.
+CHAN_SET_MLOCK_L_REQUIRED
+ ×òîáû çàáëîêèðîâàòü ðåæèì +l Âû äîëæíû òàêæå çàáëîêèðîâàòü è ðåæèì +L.
+CHAN_SET_MLOCK_K_REQUIRED
+ òîáû çàáëîêèðîâàòü ðåæèì +i Âû äîëæíû òàêæå çàáëîêèðîâàòü è ðåæèì +K.
+CHAN_MLOCK_CHANGED
+ Çàáëîêèðîâàííûå ðåæèìû íà êàíàëå %s èçìåíåíû íà %s.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET #êàíàë KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Óäåðæèâàíèå òîïèêà ÂÊËÞ×ÅÍÎ.
+CHAN_SET_KEEPTOPIC_OFF
+ Óäåðæèâàíèå òîïèêà ÂÛÊËÞ×ÅÍÎ.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET #êàíàë TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Áëîêèðîâàíèå òîïèêà ÂÊËÞ×ÅÍÎ.
+CHAN_SET_TOPICLOCK_OFF
+ Áëîêèðîâàíèå òîïèêà ÂÛÊËÞ×ÅÍÎ.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET #êàíàë PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Îïöèÿ ñïîêîéñòâèÿ ÂÊËÞ×ÅÍÀ.
+CHAN_SET_PEACE_OFF
+ Îïöèÿ ñïîêîéñòâèÿ ÂÛÊËÞ×ÅÍÀ.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET #êàíàë PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Ïðèâàòíîñòü êàíàëà ÂÊËÞ×ÅÍÀ.
+CHAN_SET_PRIVATE_OFF
+ Ïðèâàòíîñòü êàíàëà ÂÛÊËÞ×ÅÍÀ.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET #êàíàë SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Áåçîïàñíîñòü ñòàòóñà îïåðàòîðà êàíàëà ÂÊËÞ×ÅÍÀ.
+CHAN_SET_SECUREOPS_OFF
+ Áåçîïàñíîñòü ñòàòóñà îïåðàòîðà êàíàëà ÂÛÊËÞ×ÅÍÀ.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET #êàíàë SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Áåçîïàñíîñòü âëàäåëüöà ÂÊËÞ×ÅÍÀ.
+CHAN_SET_SECUREFOUNDER_OFF
+ Áåçðïàñíîñòü âëàäåëüöà ÂÛÊËÞ×ÅÍÀ.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET #êàíàë RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Îãðàíè÷åííûé äîñòóï íà êàíàë ÂÊËÞ×ÅÍ.
+CHAN_SET_RESTRICTED_OFF
+ Îãðàíè÷åííûé äîñòóï íà êàíàë ÂÛÊËÞ×ÅÍ.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET #êàíàë SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Áåçîïàñíîñòü ÂÊËÞ×ÅÍÀ.
+CHAN_SET_SECURE_OFF
+ Áåçîïàñíîñòü ÂÛÊËÞ×ÅÍÀ.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET #êàíàë SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Ïîäïèñü êèêîâ íà êàíàëå ÂÊËÞ×ÅÍÀ.
+CHAN_SET_SIGNKICK_LEVEL
+ Ïîäïèñü êèêîâ íà êàíàëå ÂÊËÞ×ÅÍÀ, íî çàâèñèò îò óðîâíÿ ïîëüçîâàòåëÿ,
+ èñïîëüçîâøåãî äàííóþ êîìàíäó.
+CHAN_SET_SIGNKICK_OFF
+ Ïîäïèñü êèêîâ íà êàíàëå ÂÛÊËÞ×ÅÍÀ.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET #êàíàë OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Óâåäîìëåíèå îá èñïîëüçîâàíèè êîìàíäû OP ÂÊËÞ×ÅÍÎ.
+CHAN_SET_OPNOTICE_OFF
+ Óâåäîìëåíèå îá èñïîëüçîâàíèè êîìàíäû OP ÂÛÊËÞ×ÅÍÎ.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET #êàíàë XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ Òèï ñïèñêà äîñòóïà xOP ÂÊËÞ×ÅÍ.
+CHAN_SET_XOP_OFF
+ Òèï ñïèñêà äîñòóïà xOP ÂÛÊËÞ×ÅÍ.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET #êàíàë NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ Êàíàë %s íèêîãäà íå èñòå÷åò.
+CHAN_SET_NOEXPIRE_OFF
+ Êàíàë %s ìîæåò èñòåêàòü.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Èçâèíèòå, Âû ìîæåòå èñïîëüçîâàòü òîëüêî %d AOP/SOP/VOP íà êàíàëå.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Âû íå ìîæåòå èñïîëüçîâàò ýòó êîìàíäó. Âìåñòî íåå èñïîëüçóéòå êîìàíäó ACCESS.
+ Íàïèøèòå /msg %s HELP ACCESS äëÿ ïîëó÷åíèÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP #êàíàë {ADD|DEL|LIST|CLEAR} [íèê | íîìåðà çàïèñåé]
+CHAN_AOP_DISABLED
+ Èçâèíèòå, ìîäèôèêàöèÿ ñïèñêà AOP'îâ âðåìåííî íåäîñòóïíà.
+CHAN_AOP_NICKS_ONLY
+ Ñïèñîê AOP ìîæåò âêëþ÷àòü òîëüêî çàðåãèñòðèðîâàííûå íèêè.
+CHAN_AOP_ADDED
+ %s äîáàâëåí â AOP'û êàíàëà %s.
+CHAN_AOP_MOVED
+ %s ïåðåìåùåí â AOP'û %s.
+CHAN_AOP_NO_SUCH_ENTRY
+ Íåò òàêîé çàïèñè (#%d) â AOP'àõ %s.
+CHAN_AOP_NOT_FOUND
+ %s íå íàéäåí â AOP'àõ %s.
+CHAN_AOP_NO_MATCH
+ Íåò òàêèõ çàïèñåé â AOP'àõ êàíàëà %s.
+CHAN_AOP_DELETED
+ %s óäàëåí èç AOP'îâ êàíàëà %s.
+CHAN_AOP_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç AOP'îâ êàíàëà %s.
+CHAN_AOP_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç AOP'îâ êàíàëà %s.
+CHAN_AOP_LIST_EMPTY
+ Ñïèñîê AOP'îâ êàíàëà %s ïóñò.
+CHAN_AOP_LIST_HEADER
+ Ñïèñîê AOP'îâ êàíàëà %s:
+ Íîìåð Íèê
+CHAN_AOP_CLEAR
+ Ñïèñîê AOP'îâ êàíàëà áûë î÷èùåí.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP #êàíàë {ADD|DEL|LIST|CLEAR} [íèê | íîìåðà çàïèñåé]
+CHAN_HOP_DISABLED
+ Èçâèíèòå, ìîäèôèêàöèÿ ñïèñêà HOP'îâ âðåìåííî íåäîñòóïíà.
+CHAN_HOP_NICKS_ONLY
+ Ñïèñîê HOP ìîæåò âêëþ÷àòü òîëüêî çàðåãèñòðèðîâàííûå íèêè.
+CHAN_HOP_ADDED
+ %s äîáàâëåí â HOP'û êàíàëà %s.
+CHAN_HOP_MOVED
+ %s ïåðåìåùåí â HOP'û %s.
+CHAN_HOP_NO_SUCH_ENTRY
+ Íåò òàêîé çàïèñè (#%d) â HOP'àõ %s.
+CHAN_HOP_NOT_FOUND
+ %s íå íàéäåí â HOP'àõ %s.
+CHAN_HOP_NO_MATCH
+ Íåò òàêèõ çàïèñåé â HOP'àõ êàíàëà %s.
+CHAN_HOP_DELETED
+ %s óäàëåí èç HOP'îâ êàíàëà %s.
+CHAN_HOP_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç HOP'îâ êàíàëà %s.
+CHAN_HOP_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç HOP'îâ êàíàëà %s.
+CHAN_HOP_LIST_EMPTY
+ Ñïèñîê HOP'îâ êàíàëà %s ïóñò.
+CHAN_HOP_LIST_HEADER
+ Ñïèñîê HOP'îâ êàíàëà %s:
+ Íîìåð Íèê
+CHAN_HOP_CLEAR
+ Ñïèñîê HOP'îâ êàíàëà áûë î÷èùåí.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP #êàíàë {ADD|DEL|LIST|CLEAR} [íèê | íîìåðà çàïèñåé]
+CHAN_SOP_DISABLED
+ Èçâèíèòå, ìîäèôèêàöèÿ ñïèñêà SOP'îâ âðåìåííî íåäîñòóïíà.
+CHAN_SOP_NICKS_ONLY
+ Ñïèñîê SOP ìîæåò âêëþ÷àòü òîëüêî çàðåãèñòðèðîâàííûå íèêè.
+CHAN_SOP_ADDED
+ %s äîáàâëåí â SOP'û êàíàëà %s.
+CHAN_SOP_MOVED
+ %s ïåðåìåùåí â SOP'û %s.
+CHAN_SOP_NO_SUCH_ENTRY
+ Íåò òàêîé çàïèñè (#%d) â SOP'àõ %s.
+CHAN_SOP_NOT_FOUND
+ %s íå íàéäåí â SOP'àõ %s.
+CHAN_SOP_NO_MATCH
+ Íåò òàêèõ çàïèñåé â SOP'àõ êàíàëà %s.
+CHAN_SOP_DELETED
+ %s óäàëåí èç SOP'îâ êàíàëà %s.
+CHAN_SOP_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç SOP'îâ êàíàëà %s.
+CHAN_SOP_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç SOP'îâ êàíàëà %s.
+CHAN_SOP_LIST_EMPTY
+ Ñïèñîê SOP'îâ êàíàëà %s ïóñò.
+CHAN_SOP_LIST_HEADER
+ Ñïèñîê SOP'îâ êàíàëà %s:
+ Íîìåð Íèê
+CHAN_SOP_CLEAR
+ Ñïèñîê SOP'îâ êàíàëà áûë î÷èùåí.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP #êàíàë {ADD|DEL|LIST|CLEAR} [íèê | íîìåðà çàïèñåé]
+CHAN_VOP_DISABLED
+ Èçâèíèòå, ìîäèôèêàöèÿ ñïèñêà VOP'îâ âðåìåííî íåäîñòóïíà.
+CHAN_VOP_NICKS_ONLY
+ Ñïèñîê VOP ìîæåò âêëþ÷àòü òîëüêî çàðåãèñòðèðîâàííûå íèêè.
+CHAN_VOP_ADDED
+ %s äîáàâëåí â VOP'û êàíàëà %s.
+CHAN_VOP_MOVED
+ %s ïåðåìåùåí â VOP'û %s.
+CHAN_VOP_NO_SUCH_ENTRY
+ Íåò òàêîé çàïèñè (#%d) â VOP'àõ %s.
+CHAN_VOP_NOT_FOUND
+ %s íå íàéäåí â VOP'àõ %s.
+CHAN_VOP_NO_MATCH
+ Íåò òàêèõ çàïèñåé â VOP'àõ êàíàëà %s.
+CHAN_VOP_DELETED
+ %s óäàëåí èç VOP'îâ êàíàëà %s.
+CHAN_VOP_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç VOP'îâ êàíàëà %s.
+CHAN_VOP_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç VOP'îâ êàíàëà %s.
+CHAN_VOP_LIST_EMPTY
+ Ñïèñîê VOP'îâ êàíàëà %s ïóñò.
+CHAN_VOP_LIST_HEADER
+ Ñïèñîê VOP'îâ êàíàëà %s:
+ Íîìåð Íèê
+CHAN_VOP_CLEAR
+ Ñïèñîê VOP'îâ êàíàëà áûë î÷èùåí.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS #êàíàë {ADD|DEL|LIST|CLEAR} [íèê [óðîâåíü] | ñïèñîê çàïèñåé]
+CHAN_ACCESS_XOP
+ Âû íå ìîæåòå èñïîëüçîâàòü ýòó êîìàíäó. Èñïîëüçóéòå êîìàíäû AOP, SOP è VOP âìåñòî íåå.
+ Íàïèøèòå /msg %s HELP êîìàíäà äëÿ ïîëó÷åíèÿ
+ áîëåå ïîäðîáíîé èíôîðìàöèè.
+CHAN_ACCESS_DISABLED
+ Èçâèíèòå, ìîäèôèêàöèÿ ñïèñêà äîñòóïà êàíàëà âðåìåííî íåäîñòóïíà.
+CHAN_ACCESS_LEVEL_NONZERO
+ Óðîâåíü äîñòóïà äîëæåí áûòü îòëè÷åí îò íóëÿ.
+CHAN_ACCESS_LEVEL_RANGE
+ Óðîâåíü äîñòóïà äîëæåí áûòü ìåæäó %d è %d âêëþ÷èòåëüíî.
+CHAN_ACCESS_NICKS_ONLY
+ Ñïèñîê äîñòóïà êàíàëà ìîæåò âêëþ÷àòü òîëüêî çàðåãèñòðèðîâàííûå íèêè.
+CHAN_ACCESS_REACHED_LIMIT
+ Èçâèíèòå, â ñïèñêå äîñòóïà êàíàëà ìîæåò áûòü íå áîëåå %d çàïèñåé.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ Óðîâåíü äîñòóïà äëÿ %s íà êàíàë %s îñòàëñÿ ïðåæíèì - %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ Óðîâåíü äîñòóïà äëÿ %s íà êàíàë %s èçìåíåí íà %d.
+CHAN_ACCESS_ADDED
+ %s äîáàâëåí â ñïèñîê äîñòóïà êàíàëà %s ñ óðîâíåì äîñòóïà %d.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ Íåò çàïèñè (#%d) â ñïèñêå äîñòóïà êàíàëà %s.
+CHAN_ACCESS_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå äîñòóïà êàíàëà %s.
+CHAN_ACCESS_NO_MATCH
+ Íåò òàêèõ çàïèñåé â ñïèñêå äîñòóïà êàíàëà %s.
+CHAN_ACCESS_DELETED
+ %s óäàëåí èç ñïèñêà äîñòóïà êàíàëà %s.
+CHAN_ACCESS_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèñêà äîñòóïà êàíàëà %s.
+CHAN_ACCESS_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà äîñòóïà êàíàëà %s.
+CHAN_ACCESS_LIST_EMPTY
+ Ñïèñîê äîñòóïà êàíàëà %s ïóñò.
+CHAN_ACCESS_LIST_HEADER
+ Ñïèñîê äîñòóïà êàíàëà %s:
+ Íîìåð Óðîâåíü Íèê
+CHAN_ACCESS_LIST_FOOTER
+ Êîíåö ñïèñêà äîñòóïà.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ Ñïèñîê äîñòóïà êàíàëà î÷èùåí.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK #êàíàë {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [íèê-èëè-ìàñêà-ïîëüçîâàòåëÿ] [ïðè÷èíà]
+CHAN_AKICK_DISABLED
+ Èçâèíèòå, ìîäèôèêàöèÿ ñïèñêà àâòîêèêîâ êàíàëà âðåìåííî íåäîñòóïíà.
+CHAN_AKICK_ALREADY_EXISTS
+ %s óæå åñòü â ñïèñêå àâòîêèêîâ êàíàëà %s.
+CHAN_AKICK_REACHED_LIMIT
+ Èçâèíèòå, Âû ìîæåòå èñïîëüçîâàòü äëÿ àâòîêèêà òîëüêî ìàñêè %d íà êàíàëå.
+CHAN_AKICK_ADDED
+ %s äîáàâëåí â ñïèñîê àâòîêèêîâ êàíàëà %s.
+CHAN_AKICK_NO_SUCH_ENTRY
+ Íåò òàêîé çàïèñè (#%d) â ñïèñêå àâòîêèêîâ êàíàëà %s.
+CHAN_AKICK_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå àâòîêèêîâ êàíàëà %s.
+CHAN_AKICK_NO_MATCH
+ Íåò òàêèõ çíà÷åíèå â ñïèñêå àâòîêèêîâ êàíàëà %s.
+CHAN_AKICK_STUCK
+ %s òåïåðü âñåãäà àêòèâåí íà êàíàëå %s.
+CHAN_AKICK_UNSTUCK
+ %s áîëüøå íå àêòèâåí íà êàíàëå %s.
+CHAN_AKICK_DELETED
+ %s óäàëåí èç ñïèñêà àâòîêèêîâ êàíàëà %s.
+CHAN_AKICK_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèñêà àâòîêèêîâ êàíàëà %s.
+CHAN_AKICK_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà àêòîêèêîâ êàíàëà %s.
+CHAN_AKICK_LIST_EMPTY
+ Ñïèñîê àâòîêèêîâ êàíàëà %s ïóñò.
+CHAN_AKICK_LIST_HEADER
+ Ñïèñîê àâòîêèêîâ íà êàíàë %s:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (by %s on %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (ïåðìàíåíòíûé) (by %s on %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ AKICK ENFORCE íà êàíàëå %s çàâåðøåí; %d ïîëüçîâàòåëåé âûêèíóòî.
+CHAN_AKICK_CLEAR
+ Ñïèñîê àâòîêèêîâ íà êàíàë î÷èùåí.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS #êàíàë {SET | DIS[ABLE] | LIST | RESET} [ïóíêò [óðîâåíü]]
+CHAN_LEVELS_XOP
+ Ýòà êîìàíäà íå ìîæåò áûòü èñïîëüçîâàíà â äàííîì ðåæèìå.
+CHAN_LEVELS_RANGE
+ Óðîâåíü äîëæåí áûòü öèôðîé ìåæäó %d è %d âêëþ÷èòåëüíî.
+CHAN_LEVELS_CHANGED
+ Óðîâåíü %s íà êàíàëå %s èçìåíåí íà %d.
+CHAN_LEVELS_UNKNOWN
+ Íåèçâåñòíûé ïàðàìåòð %s. Íàïèøèòå /msg %s HELP LEVELS DESC äëÿ ïîëó÷åíèÿ ñïèñêà âîçìîæíûõ çíà÷åíèé.
+CHAN_LEVELS_DISABLED
+ %s îòêëþ÷åí íà êàíàëå %s.
+CHAN_LEVELS_LIST_HEADER
+ Óñòàíîâêè ñïèñêà äîñòóïà äëÿ êàíàëà %s:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (îòêëþ÷åíî)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (òîëüêî äëÿ âëàäåëüöà)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ Óðîâíè äîñòóïà äëÿ êàíàëà %s ñáðîøåíû íà çíà÷åíèÿ ïî óìîë÷àíèþ.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO #êàíàë [ALL]
+CHAN_INFO_HEADER
+ Èíôîðìàöèÿ î êàíàëå %s:
+CHAN_INFO_FOUNDER
+ Âëàäåëåö: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Âëàäåëåö: %s
+CHAN_INFO_SUCCESSOR
+ Íàñëåäíèê: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Íàñëåäíèê: %s
+CHAN_INFO_DESCRIPTION
+ Îïèñàíèå: %s
+CHAN_INFO_ENTRYMSG
+ Ñîîáùåíèå ïðè âõîäå: %s
+CHAN_INFO_TIME_REGGED
+ Çàðåãèñòðèðîâàí: %s
+CHAN_INFO_LAST_USED
+ Ïîñëåäíèé ðàç èñïîëüçîâàí: %s
+CHAN_INFO_LAST_TOPIC
+ Ïîñëåäíèé òîïèê: %s
+CHAN_INFO_TOPIC_SET_BY
+ Òîïèê óñòàíîâèë: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ Àäðåñ E-mail: %s
+CHAN_INFO_BANTYPE
+ Òèï áàíà: %d
+CHAN_INFO_OPTIONS
+ Îïöèè: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Óäåðæèâàíèå Òîïèêà
+CHAN_INFO_OPT_OPNOTICE
+ OP Óâåäîìëåíèå
+CHAN_INFO_OPT_PEACE
+ Ñïîêîéñòâèå
+CHAN_INFO_OPT_PRIVATE
+ Ïðèâàòíûé
+CHAN_INFO_OPT_RESTRICTED
+ Îãðàíè÷åííûé Äîñòóï
+CHAN_INFO_OPT_SECURE
+ Áåçîïàñíîñòü
+CHAN_INFO_OPT_SECUREOPS
+ Áåçîïàñíîòü Ñòàòóñà Îïà
+CHAN_INFO_OPT_SECUREFOUNDER
+ Áåçîïàñíîñòü Âëàäåëüöà
+CHAN_INFO_OPT_SIGNKICK
+ Ïîäïèñàííûå Êèêè
+CHAN_INFO_OPT_TOPICLOCK
+ Áëîêèðîâêà Òîïèêà
+CHAN_INFO_OPT_XOP
+ Ñèñòåìà Ñïèñêà Äîñòóïà xOP
+CHAN_INFO_OPT_NONE
+ Íåò
+CHAN_INFO_MODE_LOCK
+ Áëîêèðîâêà ðåæèìîâ: %s
+CHAN_INFO_NO_EXPIRE
+ Ýòîò êàíàë íèêîãäà íå èñòå÷åò.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST øàáëîí
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST øàáëîí [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+CHAN_LIST_HEADER
+ Ñïèñîê çàïèñåé, ñîäåðæàùèé %s:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Êîíåö ñïèñêà - íàéäåíî %d/%d çàïèñåé.
+
+# INVITE responses
+CHAN_INVITE_SYNTAX
+ INVITE #êàíàë
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN #êàíàë
+CHAN_UNBANNED
+ Âû áûëè ðàçáàíåíû íà êàíàëå %s.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC #êàíàë [òîïèê]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR #êàíàë îïöèÿ
+CHAN_CLEARED_BANS
+ Âñå áàíû íà êàíàëå %s áûëè óäàëåíû.
+CHAN_CLEARED_EXCEPTS
+ Âñå èñêëþ÷åíèÿ èç áàíîâ íà êàíàëå %s áûëè óäàëåíû.
+CHAN_CLEARED_MODES
+ Âñå ðåæèìû íà êàíàëå %s áûëè ñáðîøåíû.
+CHAN_CLEARED_OPS
+ Âñå îïû áûëè ñíÿòû íà êàíàëå %s.
+CHAN_CLEARED_VOICES
+ Âñå âîéñû áûëè ñíÿòû íà êàíàëå %s.
+CHAN_CLEARED_USERS
+ Âñå ïîëüçîâàòåëè áûëè âûêèíóòû ñ êàíàëà %s.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS #êàíàë
+CHAN_GETPASS_UNAVAILABLE
+ Êîìàíäà GETPASS íåäîñòóïíà ïðè âêëþ÷åííîì øèôðîâàíèè.
+CHAN_GETPASS_PASSWORD_IS
+ Ïàðîëü íà êàíàë %s - %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS #êàíàë
+CHAN_SENDPASS_UNAVAILABLE
+ Êîìàíäà SENDPASS íåäîñòóïíà ïðè âêëþ÷åííîì øèôðîâàíèè.
+CHAN_SENDPASS_SUBJECT
+ Ïàðîëü êàíàëà (%s)
+CHAN_SENDPASS_HEAD
+ Hi,
+CHAN_SENDPASS_LINE_1
+ Âû ïðîñèëè %s âûñëàòü ïàðîëü îò Âàøåãî êàíàëà íà e-mail.
+CHAN_SENDPASS_LINE_2
+ Ïàðîëü Âàøåãî êàíàëà %s. Äëÿ áîëüøåé áåçîïàñíîñòè, Âàì ðåêîìåíäóåòñÿ èçìåíèòü êàê ìîæíî ñêîðåå.
+CHAN_SENDPASS_LINE_3
+ Åñëè Âû íå çàïðàøèâàëè ýòî ïèñüìî, ïîæàëóéñòà ïðîèãíîðèðóéòå åãî.
+CHAN_SENDPASS_LINE_4
+ ÏÎÆÀËÓÉÑÒÀ ÍÅ ÎÒÂÅ×ÀÉÒÅ ÍÀ ÝÒÎ ÏÈÑÜÌÎ!
+CHAN_SENDPASS_LINE_5
+ Àäìèíèñòðàòîðû %s.
+CHAN_SENDPASS_OK
+ Ïàðîëü êàíàëà %s áûë îòïðàâëåí.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID #êàíàë [ïðè÷èíà]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID #êàíàë ïðè÷èíà
+CHAN_FORBID_SUCCEEDED
+ Êàíàë %s òåïåðü çàïðåùåí ê èñïîëüçîâàíèþ.
+CHAN_FORBID_FAILED
+ Íåâîçìîæíî çàïðåòèòü èñïîëüçîâàòü êàíàë %s!
+CHAN_FORBID_REASON
+ Ýòîò êàíàë çàïðåùåí ê èñïîëüçîâàíèþ.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND #êàíàë [ïðè÷èíà]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND #êàíàë ïðè÷èíà
+CHAN_SUSPEND_SUCCEEDED
+ Êàíàë %s ïðèîñòàíîâëåí.
+CHAN_SUSPEND_FAILED
+ Íåâîçìîæíî ïðèîñòàíîâèòü êàíàë %s!
+CHAN_SUSPEND_REASON
+ Ýòîò êàíàë áûë ïðèîñòàíîâëåí.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND #êàíàë
+CHAN_UNSUSPEND_ERROR
+ Îòñóòñòâóåò # ïåðåä íàçâàíèåì êàíàëà.
+CHAN_UNSUSPEND_SUCCEEDED
+ Êàíàë %s âîññòàíîâëåí.
+CHAN_UNSUSPEND_FAILED
+ Íåâîçìîæíî âîññòàíîâèòü êàíàë %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ Çíà÷åíèÿ %s èñêëþ÷åíû íà %s è íå ìîãóò áûòü çàáàíåíû ïîêà èñêëþ÷åíèÿ íå áóäóò óäàëåíû.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ Âàì ïðèøëî 1 íîâîå ñîîáùåíèå.
+MEMO_HAVE_NEW_MEMOS
+ Âàì ïðèøëî %d íîâûõ ñîîáùåíèé.
+MEMO_TYPE_READ_LAST
+ Íàïèøèòå /msg %s READ LAST ÷òîáû ïðî÷èòàòü åãî.
+MEMO_TYPE_READ_NUM
+ Íàïèøèòå /msg %s READ %d ÷òîáû ïðî÷èòàòü åãî.
+MEMO_TYPE_LIST_NEW
+ Íàïèøèòå /msg %s LIST NEW ÷òîáû ïîñìîòðåòü ñïèñîê ñîîùåíèé.
+MEMO_AT_LIMIT
+ Âíèìàíèå: Âàø ïî÷òîâûé ÿùèê äëÿ ñîîáùåíèé ïåðåïîëíåí! Ó Âàñ óæå (%d) ñîîáùåíèé. Âû íå ñìîæåòå ïðèíèìàòü íîâûå ñîîáùåíèÿ, ïîêà Âû íå óäàëèòå ÷àñòü ñîîáùåíèé èç ÿùèêà.
+MEMO_OVER_LIMIT
+ Âíèìàíèå: Âàø ïî÷òîâûé ÿùèê äëÿ ñîîáùåíèé ïåðåïîëíåí! Ó Âàñ óæå (%d) ñîîáùåíèé. Âû íå ñìîæåòå ïðèíèìàòü íîâûå ñîîáùåíèÿ, ïîêà Âû íå óäàëèòå ÷àñòü ñîîáùåíèé èç ÿùèêà.
+MEMO_X_MANY_NOTICE
+ %d ñîîáùåíèé íà êàíàëå %s.
+MEMO_X_ONE_NOTICE
+ %d ñîîáùåíèå íà êàíàëå %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ Íà êàíàëå %s íîâîå ñîîáùåíèå.
+ Íàïèøèòå /msg %s READ %s %d ÷òîáû ïðî÷èòàòü åãî.
+MEMO_NEW_MEMO_ARRIVED
+ Âàì ïðèøëî íîâîå ñîîáùåíèå îò %s.
+ Íàïèøèòå /msg %s READ %d ÷òîáû ïðî÷èòàòü åãî.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ Ó âàñ íåò ñîîáùåíèé.
+MEMO_X_HAS_NO_MEMOS
+ Ó %s íåò ñîîáùåíèé.
+MEMO_DOES_NOT_EXIST
+ Ñîîáùåíèÿ %d íå ñóùåñòâóåò!
+MEMO_LIST_NOT_FOUND
+ Òàêèå ñîîáùåíèÿ íå íàéäåíû.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {íèê | #êàíàë} òåêñò ñîîáùåíèÿ
+MEMO_SEND_DISABLED
+ Èçâèíèòå, îòïðàâêà ñîîáùåíèé âðåìåííî ïðèîñòàíîâëåíà.
+MEMO_SEND_PLEASE_WAIT
+ Ïîæàëóéñòà ïîäîæäèòå %d ñåêóíä ïåðåä òåì, êàê èñïîëüçîâàòü êîìàíäó SEND ñíîâà.
+MEMO_X_GETS_NO_MEMOS
+ %s íå ìîæåò ïðèíèìàòü ñîîáùåíèÿ.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ Ó %s ïåðåïîëíåí ÿùèê è â äàííûé ìîìåíò îí íå ìîæåò ïðèíèìàòü ñîîáùåíèÿ.
+MEMO_SENT
+ Ñîîáùåíèå îòïðàâëåíî %s.
+MEMO_MASS_SENT
+ Ìàññîâîå ñîîáùåíèå áûëî îòïðàâëåíî âñåì çàðãåèñòðèðîâàííûì ïîëüçîâàòåëÿì.
+
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {íèê | #êàíàë}
+MEMO_CANCEL_DISABLED
+ Èçâèíèòå, îòìåíà ñîîáùåíèé âðåìåííî íåäîñòóïíà.
+MEMO_CANCEL_NONE
+ Íåò ñîîáùåíèé, äîñòóïíûõ äë îòìåíû.
+MEMO_CANCELLED
+ Ïîñëåäíåå ñîîáùåíèå äëÿ %s áûëî îòìåíåíî.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [#êàíàë] [list | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ Ó âàñ íåò íîâûõ ñîîáùåíèé.
+MEMO_X_HAS_NO_NEW_MEMOS
+ Ó %s íåò íîâûõ ñîîáùåíèé.
+MEMO_LIST_MEMOS
+ Ñîîáùåíèÿ äëÿ %s. ×òîáû ïðî÷åñòü èõ, íàïèøèòå: /msg %s READ íîìåð ñîîáùåíèÿ
+MEMO_LIST_NEW_MEMOS
+ Íîâûå ñîîáùåíèÿ äëÿ %s. ×òîáû ïðî÷åñòü èõ, íàïèøèòå: /msg %s READ íîìåð ñîîáùåíèÿ
+MEMO_LIST_CHAN_MEMOS
+ Ñîîáùåíèÿ äëÿ %s. ×òîáû ïðî÷åñòü èõ, íàïèøèòå: /msg %s READ %s íîìåð ñîîáùåíèÿ
+MEMO_LIST_CHAN_NEW_MEMOS
+ Íîâûå ñîîáùåíèÿ äëÿ %s. ×òîáû ïðî÷åñòü èõ, íàïèøèòå: /msg %s READ %s íîìåð ñîîáùåíèÿ
+MEMO_LIST_HEADER
+ Íîìåð Îòïðàâèòåëü Äàòà/Âðåìÿ
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [#êàíàë] {list | LAST | NEW}
+MEMO_HEADER
+ Ñîîáùåíèå %d îò %s (%s). ×òîáû óäàëèòü åãî, íàïèøèòå êîìàíäó: /msg %s DEL %d
+MEMO_CHAN_HEADER
+ Ñîîáùåíèå %d îò %s (%s). ×òîáû óäàëèòü åãî, íàïèøèòå êîìàíäó: /msg %s DEL %s %d
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [#êàíàë] {íîìåð ñîîáùåíèÿ | list | ALL}
+MEMO_DELETED_NONE
+ Íåò ñîîáùåíèé äëÿ óäàëåíèÿ.
+MEMO_DELETED_ONE
+ Ñîîáùåíèå %d áûëî óäàëåíî.
+MEMO_DELETED_SEVERAL
+ Ñîîáùåíèÿ %s áûëè óäàëåíû.
+MEMO_DELETED_ALL
+ Âñå Âàøè âîîáùåíèÿ áûëè óäàëåíû.
+MEMO_CHAN_DELETED_ALL
+ Âñå ñîîáùåíèÿ äëÿ êàíàëà %s áûëè óäàëåíû.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET îïöèÿ ïàðàìåòð
+MEMO_SET_DISABLED
+ Èçâèíèòå, óñòàíîâêà îïöèé äëÿ ñëóæáû ñîîáùåíèé âðåìåííî íåâîçìîæíà.
+MEMO_SET_UNKNOWN_OPTION
+ Íåèçâåñòíàÿ îïóèÿ SET %s.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s áóäåò óâåäîìëÿòü Âàñ î íîâûõ ñîîáùåíèÿõ, êîãäà Âû çàéäåòå â ñåòü è êîãäà ñîîáùåíèÿ áóäóò îòïðàâëåíû Âàì.
+MEMO_SET_NOTIFY_LOGON
+ %s áóäåò óâåäîìëÿòü Âàñ î íîâûõ ñîîáùåíèÿõ, êîãäà Âû çàéäåòå â ñåòü èëè ñíèìåòå ñ ñåáÿ ôëàã /AWAY.
+MEMO_SET_NOTIFY_NEW
+ %s áóäåò óâåäîìëÿòü Âàñ î íîâûõ ñîîáùåíèÿõ, êîãäà îíè áóäåò îòïðàâëåíû Âàì.
+MEMO_SET_NOTIFY_OFF
+ %s íå áóäåò óâåäîìëÿòü Âàñ î íîâûõ ñîîáùåíèÿõ.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [#êàíàë] limit
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [ïîëüçîâàòåëü | #êàíàë] {limit | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Âû íå ìîæåòå èçìåíèòü ëèìèò ñîîáùåíèé äëÿ Âàñ.
+MEMO_SET_LIMIT_FORBIDDEN
+ Ëèìèò ñîîáùåíèé äëÿ %s áûë èçìåíåí.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ Âû íå ìîæåòå óñòàíîâèòü ëèìèò ñîîáùåíèé áîëüøå, ÷åì %d.
+MEMO_SET_LIMIT_TOO_HIGH
+ Âû íå ìîæåòå óñòàíîâèòü ëèìèò ñîîáùåíèé äëÿ %s áîëüøå ÷åì %d.
+MEMO_SET_LIMIT_OVERFLOW
+ Ëèìèò ñîîáùåíèé ÷åðåñ÷óð âåëèê; óìåíüøèòå åãî äî %d.
+MEMO_SET_YOUR_LIMIT
+ Ëèìèò ñîîáùåíèé áûë óñòàíîâëåí â %d.
+MEMO_SET_YOUR_LIMIT_ZERO
+ Âû áîëüøå íå áóäåòå ïðèíèìàòü ñîîáùåíèÿ.
+MEMO_UNSET_YOUR_LIMIT
+ Ëèìèò ñîîáùåíèé äëÿ Âàñ îòêëþ÷åí.
+MEMO_SET_LIMIT
+ Ëèìèò ñîáùåíèé äëÿ %s óñòàíîâëåí ðàâíûì %d.
+MEMO_SET_LIMIT_ZERO
+ Ëèìèò ñîîáùåíèé äëÿ %s óñòàíîâëåí ðàâíûì 0.
+MEMO_UNSET_LIMIT
+ Ëèìèò ñîîáùåíèé äëÿ %s îòêëþ÷åí.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [#êàíàë]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [íèê | #êàíàë]
+MEMO_INFO_NO_MEMOS
+ Íà äàííûé ìîìåíò ó Âàñ íåò ñîîáùåíèé.
+MEMO_INFO_MEMO
+ Íà äàííûé ìîìåíò ó Âàñ åñòü 1 ñîîáùåíèå.
+MEMO_INFO_MEMO_UNREAD
+ Íà äàííûé ìîìåíò ó Âàñ åñòü 1 ñîîáùåíèé, è îíè âñå åùå íå ïðî÷èòàíû Âàìè.
+MEMO_INFO_MEMOS
+ Íà äàííûé ìîìåíò ó Âàñ åñòü %d ñîîáùåíèé.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Íà äàííûé ìîìåíò ó Âàñ åñòü %d ñîîáùåíèé, èç íèõ 1 íåïðî÷èòàííîå.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Íà äàííûé ìîìåíò ó Âàñ åñòü %d ñîîáùåíèé, èç íèõ %d íåïðî÷èòàííûõ.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Íà äàííûé ìîìåíò ó Âàñ åñòü %d ñîîáùåíèé; âñå îíè íå ïðî÷èòàíû Âàìè.
+MEMO_INFO_LIMIT
+ Âàø ëèìèò ñîîáùåíèé ðàâåí %d.
+MEMO_INFO_HARD_LIMIT
+ Âàø ëèìèò ñîîáùåíèé ðàâåí %d, è íå ìîæåò áûòü èçìåíåí.
+MEMO_INFO_LIMIT_ZERO
+ Âàø ëèìèò ñîîáùåíèé ðàâåí 0; Âû íå áóäåòå ïðèíèìàòü ëþáûå íîâûå ñîîáùåíèÿ.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Âàø ëèìèò ñîîáùåíèé ðàâåí 0; Âû íå áóäåòå ïðèíèìàòü ëþáûå íîâûå ñîîáùåíèÿ. Âû íå ìîæåòå èçìåíèòü ýòîò ëèìèò.
+MEMO_INFO_NO_LIMIT
+ Ó âàñ íåò îãðàíè÷åèíÿ íà êîëè÷åñòâî õðàíèìûõ ñîîáùåíèé.
+MEMO_INFO_NOTIFY_OFF
+ Âû íå áóäåòå óâåäîìëÿòüñÿ î íîâûõ ñîáùåíèÿõ.
+MEMO_INFO_NOTIFY_ON
+ Âû áóäåòå óâåäîìëÿòüñÿ î íîâûõ ñîîáùåíèÿõ ïðè âõîäå â ñåòü è ïî ìåðå ïðèõîäà íîâûõ ñîîáùåíèé.
+MEMO_INFO_NOTIFY_RECEIVE
+ Âû áóäåòå óâåäîâëÿòüñÿ ñðàçó ïî ïðèõîäå íîâûõ ñîîáùåíèé.
+MEMO_INFO_NOTIFY_SIGNON
+ Âû áóäåòå óâåäîìëÿòüñÿ î ïðèõîäå íîâûõ ñîîáùåíèé ïîñëå âõîäà â ñåòü.
+MEMO_INFO_X_NO_MEMOS
+ %s ñåé÷àñ íå èìååò ñîîáùåíèé.
+MEMO_INFO_X_MEMO
+ %s ñåé÷àñ èìååò 1 ñîîáùåíèå.
+MEMO_INFO_X_MEMO_UNREAD
+ %s ñåé÷àñ èìååò 1 ñîîáùåíèé, è îíè íå áûëè ïðî÷èòàíû.
+MEMO_INFO_X_MEMOS
+ %s ñåé÷àñ èìååò %d ñîîáùåíèé.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s ñåé÷àñ èìååò %d ñîîáùåíèé, 1 èç êîòîðûõ íå ïðî÷èòàíî.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s ñåé÷àñ èìååò %d ñîîáùåíèé, %d èç êîòîðûõ íå ïðî÷èòàíû.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s ñåé÷àñ èìååò %d ñîîáùåíèé; âñå îíè íå ïðî÷èòàíû.
+MEMO_INFO_X_LIMIT
+ Ëèìèò ñîîáùåíèé äëÿ %s ðàâåí %d.
+MEMO_INFO_X_HARD_LIMIT
+ Ëèìèò ñîáùåíèé äëÿ %s ðàâåí %d, è íå ìîæåò áûòü èçìåíåí.
+MEMO_INFO_X_NO_LIMIT
+ Ó %s íåò îãðàíè÷åíèÿ êîëè÷åñòâà ñîîáùåíèé.
+MEMO_INFO_X_NOTIFY_OFF
+ %s íå óâåäîìëÿåòñÿ î íîâûõ ñîáùåíèÿõ.
+MEMO_INFO_X_NOTIFY_ON
+ %s óâåäîìëÿåòñÿ î íîâûõ ñîîáùåíèÿõ ïîñëå âõîäà â ñåòü è ïî ìåðå ïðèõîäà ñîáùåíèé.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s óâåäîìëÿåòñÿ î íîâûõ ñîîáùåíèÿõ ïî ìåðå èõ ïðèõîäà.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s óâåäîìëÿåòñÿ î íîâûõ ñîîáùåíèÿõ ïîñëå çàõîäà â ñåòü.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Áîò %s íå ñóùåñòâóåò.
+BOT_NOT_ASSIGNED
+ Âû äîëæíû íàçíà÷èòü áîòà íà êàíàë ïåðåä òåì, êàê èñïîëüçîâàòü ýòó êîìàíäó.
+ Íàïèøèòå /msg %S HELP ASSIGN äëÿ ïîëó÷åíèÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+BOT_NOT_ON_CHANNEL
+ Áîòà íåò íà êàíàëå %s.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ Çàïðåùåíî èñïîëüçîâàòü ñëîâî %s íà ýòîì êàíàëå!
+BOT_REASON_BADWORD_GENTLE
+ Ñëåäè çà ñâîèì ÿçûêîì!
+BOT_REASON_BOLD
+ Íå èñïîëüçóéòå æèðíûé øðèôò íà ýòîì êàíàëå!
+BOT_REASON_CAPS
+ Âûêëþ÷èòå CapsLOCK!
+BOT_REASON_COLOR
+ Íå èñïîëüçóéòå âûäåëåíèå öâåòîì íà ýòîì êàíàëå!
+BOT_REASON_FLOOD
+ Õâàòèò ôëóäèòü!
+BOT_REASON_REPEAT
+ Õâàòèòü ïîâòîðîâ!
+BOT_REASON_REVERSE
+ Íå èñïîëüçóéòå èíâåðñèþ íà ýòîì êàíàëå!
+BOT_REASON_UNDERLINE
+ Íå èñïîëüçóéòå öâåòà íà ýòîì êàíàëå!
+
+# !seen replies
+BOT_SEEN_BOT
+ Òû íàøåë ìåíÿ, %s!
+BOT_SEEN_YOU
+ Ëþáóåøüñÿ ñîáîé, %s?
+BOT_SEEN_ON_CHANNEL
+ %s íà êàíàëå ïðÿìî ñåé÷àñ!
+BOT_SEEN_ON_CHANNEL_AS
+ %s íà êàíàëå ïðÿìî ñåé÷àñ (ïîä íèêîì %s) !
+BOT_SEEN_ON
+ %s ïîñëåäíèé ðàç áûë %s íàçàä.
+BOT_SEEN_NEVER
+ ß íèêîãäà íå âèäåë %s íà êàíàëå.
+BOT_SEEN_UNKNOWN
+ ß íå çíàþ êòî òàêîé %s.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD íèê èäåíò õîñò ðåàëüíîå èìÿ
+ BOT CHANGE ñòàðûé íèê íîâûé íèê [èäåíò [õîñò [ðåàëüíîå èìÿ]]]
+ BOT DEL íèê
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ Áîò %s óæå ñóùåñòâóåò.
+BOT_BOT_CREATION_FAILED
+ Èçâèíèòå, îøèáêà ñîçäàíèÿ áîòà.
+BOT_BOT_READONLY
+ Èçâèíèòå, èçìåíåíèå íàòðîåê áîòà âðåìåííî íåâîçâîæíî.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) äîáàâëåí â ñïèñîê áîòîâ.
+BOT_BOT_ANY_CHANGES
+ Ñòàðàÿ èíôîðìàöèÿ ýêâèâàëåíòíà íîâîé.
+BOT_BOT_CHANGED
+ Áîò %s áûë èçìåíåí íà %s!%s@%s (%s)
+BOT_BOT_DELETED
+ Áîò %s áûë óäàëåí.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Ñïèñîê áîòîâ:
+BOT_BOTLIST_PRIVATE_HEADER
+ Áîòû, çàðåçåðâèðîâàííûå äëÿ IRC Îïåðàòîðîâ:
+BOT_BOTLIST_FOOTER
+ %d áîòîâ äîñòóïíî.
+BOT_BOTLIST_EMPTY
+ Ñåé÷àñ íåò äîñòóïíûõ áîòîâ.
+ Ïîïðîñèòå Àäìèíèñòðàòîðà ñåðâèñîâ ñîçäàòü õîòÿ áû îäíîãî!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN chan nick
+BOT_ASSIGN_READONLY
+ Èçâèíèòå, íàçíà÷åíèå áîòîâ íà êàíàë âðåìåííî íåäîñòóïíî.
+BOT_ASSIGN_ALREADY
+ Áîò %s óæå íàçíà÷åí íà êàíàë %s.
+BOT_ASSIGN_ASSIGNED
+ Áîò %s áûë íàçíà÷åí íà %s.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN #êàíàë
+BOT_UNASSIGN_UNASSIGNED
+ Áîòû ñ êàíàëà %s óäàëåíû.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {#êàíàë | íèê}
+BOT_INFO_NOT_FOUND
+ %s íå ÿâëÿåòñÿ áîòîì èëè çàðåãèñòðèðîâàííûì êàíàëîì.
+BOT_INFO_BOT_HEADER
+ Èíôîðìàöèÿ î áîòå %s:
+BOT_INFO_BOT_MASK
+ Ìàñêà : %s@%s
+BOT_INFO_BOT_REALNAME
+ Ðåàëüíîå èìÿ : %s
+BOT_INFO_BOT_CREATED
+ Ñîçäàí : %s
+BOT_INFO_BOT_USAGE
+ Èñïîëüçóåòñÿ íà : %d channel(s)
+BOT_INFO_BOT_OPTIONS
+ Îïöèè : %s
+BOT_INFO_OPT_PRIVATE
+ ×àñòíûé
+BOT_INFO_CHAN_HEADER
+ Èíôîðìàöèÿ î êàíàëå %s:
+BOT_INFO_CHAN_BOT
+ Íèê áîòà : %s
+BOT_INFO_CHAN_BOT_NONE
+ Íèê áîòà : áîò íå íàçíà÷åí.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Öåíçîð ïëîõèõ ñëîâ : %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Öåíçîð ïëîõèõ ñëîâ : %s (%d êèêîâ äî áàíà)
+BOT_INFO_CHAN_KICK_BOLDS
+ Öåíçîð æèðíûõ áóêâ : %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Öåíçîð æèðíûõ áóêâ : %s (%d êèêîâ äî áàíà)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Öåíçîð CapsLOCK : %s (ìèíèìóì %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Öåíçîð CapsLOCK : %s (%d êèêîâ äî áàíà; ìèíèìóì %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Öåíçîð CapsLOCK : %s
+BOT_INFO_CHAN_KICK_COLORS
+ Öåíçîð öâåòîâ : %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Öåíçîð öâåòîâ : %s (%d êèêîâ äî áàíà)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Öåíçîð ôëóäà : %s (%d ëèíèé çà %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Öåíçîð ôëóäà : %s (%d êèêîâ äî áàíà; %d ëèíèé èç %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Öåíçîð ôëóäà : %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Öåíçîð ïîâòîðîâ : %s (%d ðàç)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Öåíçîð ïîâòîðîâ : %s (%d êèêîâ äî áàíà; %d ðàç)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Öåíçîð ïîâòîðîâ : %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Öåíçîð èíâåðñèé : %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Öåíçîð èíâåðñèé : %s (%d êèêîâ äî áàíà)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Öåíçîð ïîä÷åðêèâàíèé : %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Öåíçîð ïîä÷åðêèâàíèé : %s (%d êèêîâ äî áàíà)
+BOT_INFO_ACTIVE
+ âêëþ÷åí
+BOT_INFO_INACTIVE
+ âûêëþ÷åí
+BOT_INFO_CHAN_OPTIONS
+ Îïöèè : %s
+BOT_INFO_OPT_DONTKICKOPS
+ Çàùèòà îïåðàòîðîâ
+BOT_INFO_OPT_DONTKICKVOICES
+ Çàùèòà âîéñîâ
+BOT_INFO_OPT_FANTASY
+ Ôàíòàçèÿ
+BOT_INFO_OPT_GREET
+ Ïðèâåòñòâèå
+BOT_INFO_OPT_NOBOT
+ Áåç-áîòà
+BOT_INFO_OPT_SYMBIOSIS
+ Ñèìáèîç
+BOT_INFO_OPT_NONE
+ Íåò
+
+# SET responses
+BOT_SET_SYNTAX
+ SET #êàíàë îïöèÿ ïàðàìåòð
+BOT_SET_DISABLED
+ Èçâèíèòå, óñòàíîâêà îïöèé áîòà âðåìåííî íåäîñòóïíà.
+BOT_SET_UNKNOWN
+ Íåèçâåñòíàÿ îïöèÿ %s.
+ Íàïèøèòå /msg %S HELP SET äëÿ áîëåå ïîëíîé èíôîðìàöèè.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET #êàíàë DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Áîò íå áóäåò êèêàòü îïåðàòîðîâ êàíàëà %s.
+BOT_SET_DONTKICKOPS_OFF
+ Áîò áóäåò êèêàòü îïåðàòîðîâ êàíàëà %s.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET #êàíàë DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Áîò íå áóäåò êèêàòü âîéñîâ êàíàëà %s.
+BOT_SET_DONTKICKVOICES_OFF
+ Áîò áóäåò êèêàòü âîéñîâ êàíàëà %s.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET #êàíàë FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Ðåæèì Ôàíòàçèè ÂÊËÞ×ÅÍÛ íà êàíàëå %s.
+BOT_SET_FANTASY_OFF
+ Ðåæèì Ôàíòàçèè ÂÛÊËÞ×ÅÍ íà êàíàëå %s.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET #êàíàë GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Ðåæèì ïðèâåòñòâèé on channel %s ÂÊËÞ×ÅÍ.
+BOT_SET_GREET_OFF
+ Ðåæèì ïðèâåòñòâèé on channel %s ÂÛÊËÞ×ÅÍ.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET #êàíàë NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ Ðåæèì Áåç-áîòà ÂÊËÞ×ÅÍ íà êàíàëå %s.
+BOT_SET_NOBOT_OFF
+ Ðåæèì Áåç-áîòà ÂÛÊËÞ×ÅÍ íà êàíàëå %s.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET #êàíàë PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ ×àñòíûé ðåæèì íà êàíàëå %s is now ÂÊËÞ×ÅÍ.
+BOT_SET_PRIVATE_OFF
+ ×àñòíûé ðåæèì íà êàíàëå %s is now ÂÛÊËÞ×ÅÍ.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET #êàíàë SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ Ðåæèì Ñèìáèîçà ÂÊËÞ×ÅÍ íà êàíàëå %s.
+BOT_SET_SYMBIOSIS_OFF
+ Ðåæèì Ñèìáèîçà ÂÛÊËÞ×ÅÍ íà êàíàëå %s.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK #êàíàë îïöèÿ {ON|OFF} [ïàðàìåòðû]
+BOT_KICK_DISABLED
+ Èçâèíèòå, êîíôèãóðàöèÿ êèêîâ âðåìåííî íåâîçìîæíà.
+BOT_KICK_UNKNOWN
+ Íåèçâåñòíàÿ îïöèÿ %s.
+ Íàïèøèòå /msg %S HELP KICK äëÿ ïîëó÷åíèÿ áîëåå ïîëíîé èíôîðìàöèè.
+BOT_KICK_BAD_TTB
+ %s íå ìîæåò áûòü çàáàíåí ñåé÷àñ.
+
+BOT_KICK_BADWORDS_ON
+ Áîò áóäåò êèêàòü çà ïëîõèå ñëîâà. Èñïîëüçóéòå êîìàíäó BADWORDS
+ ÷òîáû äîáàâèòü èëè óäàëèòü ïëîõîå ñëîâî.
+BOT_KICK_BADWORDS_ON_BAN
+ Òåïåðü áîò áóäåò êèêàòü çà ïëîõèå ñëîâà, è áàíèòü ÷åðåç
+ %d êèêîâ äàííîãî ïîëüçîâàòåëÿ. Èñïîëüçóéòå êîìàíäó BADWORDS
+ ÷òîáû äîáàâèòü èëè óäàëèòü ïëîõîå ñëîâî.
+BOT_KICK_BADWORDS_OFF
+ Áîò íå áóäåò êèêàòü çà ïëîõèå ñëîâà.
+BOT_KICK_BOLDS_ON
+ Áîò áóäåò êèêàòü çà èñïîëüçîâàíèå æèðíîãî øðèôòà.
+BOT_KICK_BOLDS_ON_BAN
+ Áîò áóäåò êèêàòü çà èñïîëüçîâàíèå æèðíîãî øðèôòà, è áóäåò áàíèòü ÷åðåç
+ %d êèêîâ äàííîãî ïîëüçîâàòåëÿ.
+BOT_KICK_BOLDS_OFF
+ Áîò íå áóäåò êèêàòü çà èñïîëüçîâàíèå æèðíîãî øðèôòà.
+BOT_KICK_CAPS_ON
+ Áîò áóäåò êèêàòü çà èñïîëüçîâàíèå CapsLOCK (ôðàçà äîëæíà ñîäåðæàòü
+ %d áîëüøèõ ñèìâîëîâ èëè îíè äîëæíû ñîñòàâëÿòü íå ìåíåå %d%% îò âñåãî ñîîáùåíèÿ).
+BOT_KICK_CAPS_ON_BAN
+ Áîò áóäåò êèêàòü çà èñïîëüçîâàíèå CapsLOCK ôðàçà äîëæíà ñîäåðæàòü
+ %d áîëüøèõ ñèìâîëîâ èëè îíè äîëæíû ñîñòàâëÿòü íå ìåíåå %d%% îò âñåãî ñîîáùåíèÿ), è áàíèòü
+ ïîñëå %d êèêîâ äàííîãî ïîëüçîâàòåëÿ.
+BOT_KICK_CAPS_OFF
+ Áîò íå áóäåò êèêàòü çà èñïîëüçîâàíèå CapsLOCK.
+BOT_KICK_COLORS_ON
+ Áîò áóäåò êèêàòü çà èñïîëüçîâàíèå âûäåëåíèÿ öâåòîì
+BOT_KICK_COLORS_ON_BAN
+ Áîò áóäåò êèêàòü çà èñïîëüçîâàíèå âûäåëåíèÿ öâåòîì, è áàíèòü ïîñëå %d
+ êèêîâ äàííîãî ïîëüçîâàòåëÿ.
+BOT_KICK_COLORS_OFF
+ Áîò íå áóäåò êèêàòü çà èñïîëüçîâàíèå âûäåëåíèÿ öâåòîì
+BOT_KICK_FLOOD_ON
+ Áîò áóäåò êèêàòü çà ôëóä (%d ëèíèé çà %d ñåêóíä).
+BOT_KICK_FLOOD_ON_BAN
+ Áîò áóäåò êèêàòü çà ôëóä (%d ëèíèé çà %d ñåêóíä), è áàíèòü
+ ïîñëå %d êèêîâ äàííîãî ïîëüçîâàòåëÿ.
+BOT_KICK_FLOOD_OFF
+ Áîò íå áóäåò êèêàòü çà ôëóä.
+BOT_KICK_REPEAT_ON
+ Áîò áóäåò êèêàòü çà ïîâòîðû (ïîëüçîâàòåëü äîëæåí ïîâòîðèòü ôðàçó
+ %d ðàç ïîäðÿä).
+BOT_KICK_REPEAT_ON_BAN
+ Áîò áóäåò êèêàòü çà ïîâòîðû (ïîëüçîâàòåëü äîëæåí ïîâòîðèòü ôðàçó
+ %d ðàç ïîäðÿä), è áàíèòü ïîñëå %d
+ êèêîâ äàííîãî ïîëüçîâàòåëÿ.
+BOT_KICK_REPEAT_OFF
+ Áîò íå áóäåò êèêàòü çà ïîâòîðû.
+BOT_KICK_REVERSES_ON
+ Áîò áóäåò êèêàòü çà èíâåðñèè.
+BOT_KICK_REVERSES_ON_BAN
+ Áîò áóäåò êèêàòü çà èíâåðñèè, è áàíèòü ÷åðåç %d
+ êèêîâ äàííîãî ïîëüçîâàòåëÿ.
+BOT_KICK_REVERSES_OFF
+ Áîò íå áóäåò êèêàòü çà èíâåðñèè.
+BOT_KICK_UNDERLINES_ON
+ Áîò áóäåò êèêàòü çà èñïîëüçîâàíèå ïîä÷åðêèâàíèÿ.
+BOT_KICK_UNDERLINES_ON_BAN
+ Áîò áóäåò êèêàòü çà èñïîëüçîâàíèå ïîä÷åðêèâàíèÿ., è áàíèòü ïîñëå %d
+ êèêîâ äàííîãî ïîëüçîâàòåëÿ.
+BOT_KICK_UNDERLINES_OFF
+ Áîò íå áóäåò êèêàòü çà èñïîëüçîâàíèå ïîä÷åðêèâàíèÿ.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS #êàíàë {ADD|DEL|LIST|CLEAR} [ñëîâî | íîìåð çàïèñè] [SINGLE|START|END]
+BOT_BADWORDS_DISABLED
+ Èçâèíèòå, èçìåíåíèå áàçû äàííûõ ïî ïëîõèì ñëîâàì âðåìåííî íåâîçìîæíî.
+BOT_BADWORDS_REACHED_LIMIT
+ Èçâèíèòå, áàçà äàííûõ ïëîõèõ ñëîâ ìîæåò ñîäåðæàòü òîëüêî %d çàïèñåé íà êàíàë.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s óæå åñòü â ñïèñêå ïëîõèõ ñëîâ %s.
+BOT_BADWORDS_ADDED
+ %s äîáàâëåíî â ñïèñîê ïëîõèõ ñëîâ %s.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ Íåò òàêîé çàïèñè (#%d) â ñïèñêå ïëîõèõ ñëîâ %s.
+BOT_BADWORDS_NOT_FOUND
+ %s íå íàéäåíî â ñïèñêå ïëîõèõ ñëîâ %s.
+BOT_BADWORDS_NO_MATCH
+ Íåò òàêèõ çíà÷åíèé â ñïèñêå ïëîõèõ ñëîâ %s.
+BOT_BADWORDS_DELETED
+ %s óäàëåíî èç ñïèñêà ïëîõèõ ñëîâ %s.
+BOT_BADWORDS_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèñêà ïëîõèõ ñëîâ %s.
+BOT_BADWORDS_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà ïëîõèõ ñëîâ %s.
+BOT_BADWORDS_LIST_EMPTY
+ Ñïèñîê ïëîõèõ ñëîâ %s ïóñò.
+BOT_BADWORDS_LIST_HEADER
+ Ñïèñîê ïëîõèõ ñëîâ %s:
+ Íîìåð Ñëîâî Òèï
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ Òåïåðü ñïèñîê ïëîõèõ ñëîâ ïóñò.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY #êàíàë òåêñò
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT #êàíàë òåêñò
+
+# Errors
+BOT_EXCEPT
+ Ïîëüçîâàòåëü ñîîòâåòñòâóåò èñêëþ÷åíèþ êàíàëà.
+BOT_BAD_NICK
+ Íèê áîòà äîëæåí ñîäåðæàòü òîëüêî äîïóñòèìûå ñèìâîëû.
+BOT_BAD_HOST
+ Õîñò áîòà äîëæåí ñîäåðæàòü òîëüêî äîïóñòèìûå ñèìâîëû äëÿ õîñòà.
+BOT_BAD_IDENT
+ Èäåíò áîòà äîëæåí ñîäåðæàòü òîëüêî äîïóñòèìûå ñèìâîëû äëÿ èäåíòà.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Ñåðâèñû íå ìîãóò èçìåíÿòü ðåæèìû. Âû óâåðåíû, ÷òî Âàøè ñåðâåðû ñêîíôèãóðèðîâàíû ïðàâèëüíî?
+OPER_BOUNCY_MODES_U_LINE
+ Ñåðâèñû íå ìîãóò èçìåíÿòü ðåæèìû. Âû óâåðåíû, ÷òî U:lines ñêîíôèãóðèðîâàíû ïðàâèëüíî?
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL ñîîáùåíèå
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Íåèçâåñòíàÿ îïöèÿ STATS %s.
+OPER_STATS_CURRENT_USERS
+ Ïîëüçîâàòåëè: %d (%d Îïåðàòîðîâ)
+OPER_STATS_MAX_USERS
+ Ìàêñèìóì ïîëüçîâàòåëåé: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Ñåðâèñû ðàáîòàþò %d äíåé, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Ñåðâèñû ðàáîòàþò %d äåíü, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Ñåðâèñû ðàáîòàþò %d ÷àñîâ, %d ìèíóò
+OPER_STATS_UPTIME_HM1S
+ Ñåðâèñû ðàáîòàþò %d ÷àñîâ, %d ìèíóò
+OPER_STATS_UPTIME_H1MS
+ Ñåðâèñû ðàáîòàþò %d ÷àñ, %d ìèíóò
+OPER_STATS_UPTIME_H1M1S
+ Ñåðâèñû ðàáîòàþò %d ÷àñîâ, %d ìèíóòó
+OPER_STATS_UPTIME_1HMS
+ Ñåðâèñû ðàáîòàþò %d ÷àñ, %d ìèíóò
+OPER_STATS_UPTIME_1HM1S
+ Ñåðâèñû ðàáîòàþò %d ÷àñ, %d ìèíóò
+OPER_STATS_UPTIME_1H1MS
+ Ñåðâèñû ðàáîòàþò %d ÷àñ, %d ìèíóòó
+OPER_STATS_UPTIME_1H1M1S
+ Ñåðâèñû ðàáîòàþò %d ÷àñ, %d ìèíóòó
+OPER_STATS_UPTIME_MS
+ Ñåðâèñû ðàáîòàþò %d ìèíóò, %d ñåêóíä
+OPER_STATS_UPTIME_M1S
+ Ñåðâèñû ðàáîòàþò %d ìèíóò, %d ñåêóíäó
+OPER_STATS_UPTIME_1MS
+ Ñåðâèñû ðàáîòàþò %d ìèíóòó, %d ñåêóíä
+OPER_STATS_UPTIME_1M1S
+ Ñåðâèñû ðàáîòàþò %d ìèíóòó, %d ñåêóíäó
+OPER_STATS_BYTES_READ
+ Áàéò ïðî÷èòàíî : %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Áàéò çàïèñàíî : %5d kB
+OPER_STATS_USER_MEM
+ Ïîëüçîâàòåëè : %6d çàïèñåé, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Êàíàëû : %6d çàïèñåé, %5d kB
+OPER_STATS_GROUPS_MEM
+ Ãðóïï íèêîâ : %6d çàïèñåé, %5d kB
+OPER_STATS_ALIASES_MEM
+ Àëèàñîâ íèêîâ : %6d çàïèñåé, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d çàïèñåé, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d çàïèñåé, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d çàïèñåé, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Ñåññèè : %6d çàïèñåé, %5d kB
+OPER_STATS_PROXY_MEM
+ Ïðîêñè : %6d çàïèñåé, %5d kB
+OPER_STATS_AKILL_COUNT
+ Êîëè÷åñòâî AKILL'îâ : %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Âðåìÿ èñòå÷åíèÿ AKILL'à ïî óìîë÷àíèþ : %d äíåé
+OPER_STATS_AKILL_EXPIRE_DAY
+ Âðåìÿ èñòå÷åíèÿ AKILL'à ïî óìîë÷àíèþ : 1 äåíü
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Âðåìÿ èñòå÷åíèÿ AKILL'à ïî óìîë÷àíèþ : %d ÷àñîâ
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Âðåìÿ èñòå÷åíèÿ AKILL'à ïî óìîë÷àíèþ : 1 ÷àñ
+OPER_STATS_AKILL_EXPIRE_MINS
+ Âðåìÿ èñòå÷åíèÿ AKILL'à ïî óìîë÷àíèþ : %d ìèíóò
+OPER_STATS_AKILL_EXPIRE_MIN
+ Âðåìÿ èñòå÷åíèÿ AKILL'à ïî óìîë÷àíèþ : 1 ìèíóòà
+OPER_STATS_AKILL_EXPIRE_NONE
+ Âðåìÿ èñòå÷åíèÿ AKILL'à ïî óìîë÷àíèþ : Íå èñòåêàåò
+OPER_STATS_SGLINE_COUNT
+ Êîëè÷åñòâî SGLINEs : %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Âðåìÿ èñòå÷åíèÿ SGLINE'à ïî óìîë÷àíèþ : %d äíåé
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Âðåìÿ èñòå÷åíèÿ SGLINE'à ïî óìîë÷àíèþ : 1 äåíü
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Âðåìÿ èñòå÷åíèÿ SGLINE'à ïî óìîë÷àíèþ : %d ÷àñîâ
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Âðåìÿ èñòå÷åíèÿ SGLINE'à ïî óìîë÷àíèþ : 1 ÷àñ
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Âðåìÿ èñòå÷åíèÿ SGLINE'à ïî óìîë÷àíèþ : %d ìèíóò
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Âðåìÿ èñòå÷åíèÿ SGLINE'à ïî óìîë÷àíèþ : 1 ìèíóòà
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Âðåìÿ èñòå÷åíèÿ SGLINE'à ïî óìîë÷àíèþ : Íå èñòåêàåò
+OPER_STATS_SQLINE_COUNT
+ Êîëè÷åñòâî SQLINE'îâ : %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Âðåìÿ èñòå÷åíèÿ SQGLINE'à ïî óìîë÷àíèþ: %d äíåé
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Âðåìÿ èñòå÷åíèÿ SQGLINE'à ïî óìîë÷àíèþ: 1 äåíü
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Âðåìÿ èñòå÷åíèÿ SQGLINE'à ïî óìîë÷àíèþ: %d ÷àñîâ
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Âðåìÿ èñòå÷åíèÿ SQGLINE'à ïî óìîë÷àíèþ: 1 ÷àñ
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Âðåìÿ èñòå÷åíèÿ SQGLINE'à ïî óìîë÷àíèþ: %d ìèíóò
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Âðåìÿ èñòå÷åíèÿ SQGLINE'à ïî óìîë÷àíèþ: 1 ìèíóòà
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Âðåìÿ èñòå÷åíèÿ SQGLINE'à ïî óìîë÷àíèþ: Íå èñòåêàåò
+OPER_STATS_SZLINE_COUNT
+ Êîëè÷åñòâî SZLINE'îâ : %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Âðåìÿ èñòå÷åíèÿ SZLINE'à ïî óìîë÷àíèþ : %d äíåé
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Âðåìÿ èñòå÷åíèÿ SZLINE'à ïî óìîë÷àíèþ : 1 äåíü
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Âðåìÿ èñòå÷åíèÿ SZLINE'à ïî óìîë÷àíèþ : %d ÷àñîâ
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Âðåìÿ èñòå÷åíèÿ SZLINE'à ïî óìîë÷àíèþ : 1 ÷àñ
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Âðåìÿ èñòå÷åíèÿ SZLINE'à ïî óìîë÷àíèþ : %d ìèíóò
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Âðåìÿ èñòå÷åíèÿ SZLINE'à ïî óìîë÷àíèþ : 1 ìèíóòà
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Âðåìÿ èñòå÷åíèÿ SZLINE'à ïî óìîë÷àíèþ : Íå èñòåêàåò
+OPER_STATS_RESET
+ Ñòàòèñòèêà ñáðîøåíà.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE #êàíàë ðåæèìû
+
+# UMODE respondes
+OPER_UMODE_SYNTAX
+ UMODE íèê ðåæèìû
+OPER_UMODE_SUCCESS
+ Ðåæèìû èçìåíåíû %s.
+OPER_UMODE_CHANGED
+ %s èçìåíèë Âàøè ðåæèìû ïîëüçîâàòåëÿ.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE íèê ôëàãè
+OPER_OLINE_SUCCESS
+ Îïåðôëàãè %s áûëè äîáàâëåíû äëÿ %s.
+OPER_OLINE_IRCOP
+ Òåïåðü Âû IRC Îïåðàòîð.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES #êàíàë [ALL]
+OPER_CLEARMODES_DONE
+ Äâîè÷íûå ðåæèìû è áàíû î÷èùåíû íà êàíàëå %s.
+OPER_CLEARMODES_ALL_DONE
+ Âñå ðåæèìû î÷èùåíû íà êàíàëå %s.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK #êàíàë ïîëüçîâàòåëü ïðè÷èíà
+
+# SVSNICK responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK íèê íîâûé íèê
+OPER_SVSNICK_NEWNICK
+ Íèê %s áûë èçìåíåí íà %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [íèê | íîìåð çàïèñè]
+OPER_ADMIN_SKELETON
+ Ñåðâèñû ðàáîòàþò â ðåæèìå skeleton; êîìàíäà ADMIN íåäîñòóïíà.
+OPER_ADMIN_EXISTS
+ %s óæå åñòü â ñïèñêàõ Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+OPER_ADMIN_REACHED_LIMIT
+ Èçâèíèòå, â Âàñ ìîæåò áûòü òîëüêî %d Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+OPER_ADMIN_ADDED
+ %s äîáàâëåí â ñïèñîê Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+OPER_ADMIN_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+OPER_ADMIN_NO_MATCH
+ Íåò òàêèõ çíà÷åíèé â ñïèñêå Àäìèíèñòðàòîðîâ ñåðâèñîê.
+OPER_ADMIN_DELETED
+ %s óäàëåí èç ñïèñêà Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+OPER_ADMIN_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèñêà Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+OPER_ADMIN_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+OPER_ADMIN_LIST_EMPTY
+ Ñïèñîê Àäìèíèñòðàòîðîâ ñåðâèñîâ ïóñò.
+OPER_ADMIN_LIST_HEADER
+ Ñïèñîê Àäìèíèñòðàòîðîâ ñåðâèñîâ:
+ Íîìåð Íèê
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Ñïèñîê Àäìèíèñòðàòîðîâ ñåðâèñîâ î÷èùåí.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [íèê | íîìåð çàïèñè]
+OPER_OPER_SKELETON
+ Ñåðâèñû ðàáîòàþò â ðåæèìå skeleton; êîìàíäà OPER íåäîñòóïíà.
+OPER_OPER_EXISTS
+ %s óæå åñòü â ñïèñêàõ Îïåðàòîðîâ ñåðâèñîâ.
+OPER_OPER_REACHED_LIMIT
+ Èçâèíèòå, â Âàñ ìîæåò áûòü òîëüêî %d Îïåðàòîðîâ ñåðâèñîâ.
+OPER_OPER_ADDED
+ %s äîáàâëåí â ñïèñîê Îïåðàòîðîâ ñåðâèñîâ.
+OPER_OPER_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå Îïåðàòîðîâ ñåðâèñîâ.
+OPER_OPER_NO_MATCH
+ Íåò òàêèõ çíà÷åíèé â ñïèñêå Îïåðàòîðîâ ñåðâèñîê.
+OPER_OPER_DELETED
+ %s óäàëåí èç ñïèñêà Îïåðàòîðîâ ñåðâèñîâ.
+OPER_OPER_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèñêà Îïåðàòîðîâ ñåðâèñîâ.
+OPER_OPER_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà Îïåðàòîðîâ ñåðâèñîâ.
+OPER_OPER_LIST_EMPTY
+ Ñïèñîê Îïåðàòîðîâ ñåðâèñîâ ïóñò.
+OPER_OPER_LIST_HEADER
+ Ñïèñîê Îïåðàòîðîâ ñåðâèñîâ:
+ Íîìåð Íèê
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ Ñïèñîê Îïåðàòîðîâ ñåðâèñîâ î÷èùåí.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+âðåìÿ èñòå÷åíèÿ] {ìàñêà | íîìåð çàïèñè} [ïðè÷èíà]]
+OPER_AKILL_EXISTS
+ %s óæå åñòü â ñïèñêå AKILL'îâ.
+OPER_AKILL_ALREADY_COVERED
+ %s óæå ïðèêðûò %s.
+OPER_AKILL_REACHED_LIMIT
+ Èçâèíèòå, Âû ìîæåòå èìåòü òîëüêî %d AKILL'îâ.
+OPER_AKILL_NO_NICK
+ Ïîìíèòå: ìàñêà AKILL'à íå ìîæåò ñîäåðæàòü íèêè; óäîñòîâåðüòåñü, ÷òî íèê íå íå âêëþ÷åí â óêàçàííóþ Âàìè ìàñêó.
+OPER_AKILL_ADDED
+ %s äîáàâëåí â ñïèñîê AKILL'îâ.
+OPER_AKILL_CHANGED
+ Âðåìÿ èñòå÷åíèÿ %s èçìåíåíî.
+OPER_AKILL_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå AKILL'îâ.
+OPER_AKILL_NO_MATCH
+ Íåò òàêèõ çàïèñåé â ñïèñêå AKILL'îâ.
+OPER_AKILL_DELETED
+ %s óäàëåí èç ñïèñêà AKILL'îâ.
+OPER_AKILL_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèêà AKILL'îâ.
+OPER_AKILL_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà AKILL'îâ.
+OPER_AKILL_LIST_EMPTY
+ Ñïèñîê AKILL'îâ ïóñò.
+OPER_AKILL_LIST_HEADER
+ Òåêóùèé ñïèñîê AKILL'îâ:
+ Íîìåð Ìàñêà Ïðè÷èíà
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Òåêóùèé ñïèñîê AKILL'îâ:
+# íîìåð, ìàñêà, êåì ïîñòàâëåí, êîãäà ïîñòàâëåí, êîãäà èñòåêàåò, ïðè÷èíà
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_AKILL_CLEAR
+ Ñïèñîê AKILL'îâ î÷èùåí.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+âðåìÿ èñòå÷åíèÿ] {ìàñêà | íîìåð çàïèñè}[:ïðè÷èíà]]
+OPER_SGLINE_UNSUPPORTED
+ Èçâèíèòå, èñïîëüçîâàíèå SGLINE íåäîñòóïíî â ýòîé ñåòè.
+OPER_SGLINE_EXISTS
+ %s óæå åñòü â ñïèñêå SGLINE'îâ.
+OPER_SGLINE_ALREADY_COVERED
+ %s óæå ïðèêðûò %s.
+OPER_SGLINE_REACHED_LIMIT
+ Èçâèíèòå, Âû ìîæåòå èìåòü òîëüêî %d SGLINE'îâ.
+OPER_SGLINE_ADDED
+ %s äîáàâëåí â ñïèñîê SGLINE'îâ.
+OPER_SGLINE_CHANGED
+ Âðåìÿ èñòå÷åíèÿ %s èçìåíåíî.
+OPER_SGLINE_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå SGLINE'îâ.
+OPER_SGLINE_NO_MATCH
+ Íåò òàêèõ çàïèñåé â ñïèñêå SGLINE'îâ.
+OPER_SGLINE_DELETED
+ %s óäàëåí èç ñïèñêà SGLINE'îâ.
+OPER_SGLINE_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèêà SGLINE'îâ.
+OPER_SGLINE_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà SGLINE'îâ.
+OPER_SGLINE_LIST_EMPTY
+ Ñïèñîê SGLINE'îâ ïóñò.
+OPER_SGLINE_LIST_HEADER
+ Òåêóùèé ñïèñîê SGLINE'îâ:
+ Íîìåð Ìàñêà Ïðè÷èíà
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Òåêóùèé ñïèñîê SGLINE'îâ:
+# íîìåð, ìàñêà, êåì ïîñòàâëåí, êîãäà ïîñòàâëåí, êîãäà èñòåêàåò, ïðè÷èíà
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ Ñïèñîê SGLINE'îâ î÷èùåí.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+âðåìÿ èñòå÷åíèÿ] {ìàñêà | íîìåð çàïèñè} [ïðè÷èíà]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ Èçâèíèòå, èñïîëüçîâàíèå SQLINE íåäîñòóïíî â ýòîé ñåòè.
+OPER_SQLINE_EXISTS
+ %s óæå åñòü â ñïèñêå SQLINE'îâ.
+OPER_SQLINE_ALREADY_COVERED
+ %s óæå ïðèêðûò %s.
+OPER_SQLINE_REACHED_LIMIT
+ Èçâèíèòå, Âû ìîæåòå èìåòü òîëüêî %d SQLINE'îâ.
+OPER_SQLINE_ADDED
+ %s äîáàâëåí â ñïèñîê SQLINE'îâ.
+OPER_SQLINE_CHANGED
+ Âðåìÿ èñòå÷åíèÿ %s èçìåíåíî.
+OPER_SQLINE_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå SQLINE'îâ.
+OPER_SQLINE_NO_MATCH
+ Íåò òàêèõ çàïèñåé â ñïèñêå SQLINE'îâ.
+OPER_SQLINE_DELETED
+ %s óäàëåí èç ñïèñêà SQLINE'îâ.
+OPER_SQLINE_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèêà SQLINE'îâ.
+OPER_SQLINE_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà SQLINE'îâ.
+OPER_SQLINE_LIST_EMPTY
+ Ñïèñîê SQLINE'îâ ïóñò.
+OPER_SQLINE_LIST_HEADER
+ Òåêóùèé ñïèñîê SQLINE'îâ:
+ Íîìåð Ìàñêà Ïðè÷èíà
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Òåêóùèé ñïèñîê SQLINE'îâ:
+# íîìåð, ìàñêà, êåì ïîñòàâëåí, êîãäà ïîñòàâëåí, êîãäà èñòåêàåò, ïðè÷èíà
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ Ñïèñîê SQLINE'îâ î÷èùåí.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+âðåìÿ èñòå÷åíèÿ] {ìàñêà | íîìåð çàïèñè} [ïðè÷èíà]]
+OPER_SZLINE_UNSUPPORTED
+ Èçâèíèòå, èñïîëüçîâàíèå SZLINE íåäîñòóïíî â ýòîé ñåòè.
+OPER_SZLINE_EXISTS
+ %s óæå åñòü â ñïèñêå SZLINE'îâ.
+OPER_SZLINE_ALREADY_COVERED
+ %s óæå ïðèêðûò %s.
+OPER_SZLINE_REACHED_LIMIT
+ Èçâèíèòå, Âû ìîæåòå èìåòü òîëüêî %d SZLINE'îâ.
+OPER_SZLINE_ONLY_IPS
+ Ïîìíèòå: Âû ìîæåòå äîáàâëÿòü òîëüêî IP ìàñêè â ñïèñîê SZLINE'îâ.
+OPER_SZLINE_ADDED
+ %s äîáàâëåí â ñïèñîê SZLINE'îâ.
+OPER_SZLINE_CHANGED
+ Âðåìÿ èñòå÷åíèÿ %s èçìåíåíî.
+OPER_SZLINE_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå SZLINE'îâ.
+OPER_SZLINE_NO_MATCH
+ Íåò òàêèõ çàïèñåé â ñïèñêå SZLINE'îâ.
+OPER_SZLINE_DELETED
+ %s óäàëåí èç ñïèñêà SZLINE'îâ.
+OPER_SZLINE_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèêà SZLINE'îâ.
+OPER_SZLINE_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà SZLINE'îâ.
+OPER_SZLINE_LIST_EMPTY
+ Ñïèñîê SZLINE'îâ ïóñò.
+OPER_SZLINE_LIST_HEADER
+ Òåêóùèé ñïèñîê SZLINE'îâ:
+ Íîìåð Ìàñêà Ïðè÷èíà
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Òåêóùèé ñïèñîê SZLINE'îâ:
+# íîìåð, ìàñêà, êåì ïîñòàâëåí, êîãäà ïîñòàâëåí, êîãäà èñòåêàåò, ïðè÷èíà
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ Ñïèñîê SZLINE'îâ î÷èùåí.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET îïöèÿ ïàðàìåòðû
+OPER_SET_IGNORE_ON
+ Êîä èãíîðèðîâàíèÿ áóäåò èñïîëüçîâàí.
+OPER_SET_IGNORE_OFF
+ Êîä èãíîðèðîâàíèÿ íå áóäåò èñïîëüçîâàí.
+OPER_SET_IGNORE_ERROR
+ Îïöèÿ IGNORE äîëæíà èìåòü çíà÷åíèÿ òîëüêî ON èëè OFF.
+OPER_SET_READONLY_ON
+ Ñåðâèñû ñåé÷àñ â ðåæèìå òîëüêî ÷òåíèå.
+OPER_SET_READONLY_OFF
+ Ñåðâèñû ñåé÷àñ â ðåæèìå ÷òåíèÿ-çàïèñè.
+OPER_SET_READONLY_ERROR
+ Îïöèÿ READONLY äîëæíà èìåòü çíà÷åíèÿ òîëüêî ON èëè OFF.
+OPER_SET_LOGCHAN_ON
+ Òåïåðü ñåðâèñû áóäóò âåñòè ëîã â êàíàë %s.
+OPER_SET_LOGCHAN_OFF
+ Ñåðâèñû áîëüøå íå áóäóò âåñòè ëîã â êàíàë.
+OPER_SET_LOGCHAN_ERROR
+ Îïöèÿ LOGCHAN äîëæíà èìåòü çíà÷åíèÿ òîëüêî ON èëè OFF è äîëæåí áûòü îïðåäåëåí ïàðàìåòð LogChannel â êîíôèãóðàöèè ñåðâèñîâ.
+OPER_SET_DEBUG_ON
+ Ñåðâèñû íàõîäÿòñÿ â ðåæèìå îòëàäêè.
+OPER_SET_DEBUG_OFF
+ Ñåðâèñû áîëüøå íå íàõîäÿòñÿ â ðåæèìå îòëàäêè.
+OPER_SET_DEBUG_LEVEL
+ Ñåðâèñû íàõîäÿòñÿ â ðåæèìå îòëàäêè (óðîâåíü %d).
+OPER_SET_DEBUG_ERROR
+ Îïöèÿ DEBUG äîëæíà èìåòü çíà÷åíèÿ òîëüêî ON, OFF, èëè ïîëîçèòåëüíîå ÷èñëî.
+OPER_SET_NOEXPIRE_ON
+ Ñåðâèñû íàõîäÿòñÿ â ðåæèìå íå èñòå÷åíèÿ.
+OPER_SET_NOEXPIRE_OFF
+ Ñåðâèñû òåïåðü íàõîäÿòñÿ â ðåæèìå èñòå÷åíèÿ.
+OPER_SET_NOEXPIRE_ERROR
+ Îïöèÿ NOEXPIRE äîëæíà èìåòü çíà÷åíèÿ òîëüêî ON èëè OFF.
+OPER_SET_UNKNOWN_OPTION
+ Íåèçâåñòíàÿ îïöèÿ %s.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} ñåðâåð
+OPER_NOOP_SET
+ Âñå O:lines íà %s óäàëåíû.
+OPER_NOOP_REVOKE
+ Âñå O:lines íà %s âîññòàíîâëåíû.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE èìÿ ñåðâåðà [ïðè÷èíà]
+OPER_JUPE_HOST_ERROR
+ Ïîæàëóéñòà èñïîëüçóéòå äåéñòâèòåëüíîå èìÿ ñåðâåðà ïðè äæóïèíãå.
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW òåêñò
+
+# UPDATE responses
+OPER_UPDATING
+ Îáíîâëåíèå áàç äàííûõ.
+
+# RELOAD responses
+OPER_RELOAD
+ Êîíôèãóðàöèîííûé ôàéë ñåðâèñîâ áûë ñ÷èòàí çàíîâî.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN íå îïðåäåëåí; ïåðåçàïóñê íåâîçìîæåí. Çàïóñòèòå ñêðèïò \2configure\2 îòêîìïèëèðóéòå ñåðâèñû, ÷òîáû âêëþ÷èòü êîìàíäó RESTART.
+
+# IGNORE respondes
+OPER_IGNORE_SYNTAX
+ Ñèíòàêñòñ: IGNORE {ADD|DEL|LIST|CLEAR} [âðåìÿ] [íèê]
+OPER_IGNORE_VALID_TIME
+ Âû äîëæíû ïðàâèëüíî ââåñòè âðåìÿ.
+OPER_IGNORE_TIME_DONE
+ Íèê %s òåïåðü áóäåò èãíîðèðîâàòüñÿ â òå÷åíèå %s.
+OPER_IGNORE_PERM_DONE
+ Íèê %s áóäåò ïîñòîÿííî èãíîðèðîâàòüñÿ.
+OPER_IGNORE_DEL_DONE
+ Íèê %s áîëüøå íå áóäåò èãíîðèðîâàòüñÿ.
+OPER_IGNORE_LIST
+ Ñïèñîê èãíîðèðóåìûõ íèêîâ:
+OPER_IGNORE_LIST_NOMATCH
+ Íèê %s íå íàéäåí â ñïèñêå èãíîðèðóåìûõ.
+OPER_IGNORE_LIST_EMPTY
+ Ñïèñîê èãíîðèðóåìûõ íèêîâ ïóñò.
+OPER_IGNORE_LIST_CLEARED
+ Ñïèñîê èãíîðèðóåìûõ íèêîâ î÷èùåí.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES íèê
+OPER_KILLCLONES_UNKNOWN_NICK
+ Íå íàéäåí ïîëüçîâàòåëü %s.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Ñïèñîê êàíàëîâ:
+ Èìÿ Ïîëüçîâàòåëè Ðåæèìû Òîïèê
+OPER_CHANLIST_HEADER_USER
+ %s ñïèñîê êàíàëîâ:
+ Èìÿ Ïîëüçîâàòåëè Ðåæèìû Òîïèê
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ Êîíåö ñïèñêà êàíàëîâ.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Ñïèñîê ïîëüçîâàòåëåé:
+ Íèê Ìàñêà
+OPER_USERLIST_HEADER_CHAN
+ %s ñïèñîê ïîëüçîâàòåëåé:
+ Íèê Ìàñêà
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Êîíåö ñïèñêà ïîëüçîâàòåëåé.
+
+# CACHE responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {èìÿ õîñòà | ñèìâîëüíàÿ ìàñêà} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Äåòåêòîð ïðîêñè îòêëþ÷åí.
+OPER_CACHE_NOT_FOUND
+ %s íå íàéäåí â êýøå.
+OPER_CACHE_REMOVED
+ %s óäàëåí èç êýøà.
+OPER_CACHE_HEADER
+ Èìÿ õîñòà Ñòàòóñ
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ Êîíåö ñïèñêà - %d/%d çàïèñåé íàéäåíî.
+OPER_CACHE_QUEUED
+ Î÷åðåäü
+OPER_CACHE_PROGRESS
+ Âûïîëíÿåòñÿ
+OPER_CACHE_NORMAL
+ Normal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ HTTP ïðîêñè
+OPER_SUPER_ADMIN_ON
+ Òåïåðü Âû Ñóïåð-Àäìèí
+OPER_SUPER_ADMIN_OFF
+ Âû áîëüøå íå Ñóïåðàäìèí
+OPER_SUPER_ADMIN_SYNTAX
+ Îïöèÿ SuperAdmin ìîæåò áûòü òîëüêî ON èëè OFF (äîëæíî áûòü âêëþ÷åíî â services.conf)
+OPER_SUPER_ADMIN_WALL_ON
+ %s òåïåðü Ñóïåð-Àäìèí
+OPER_SUPER_ADMIN_WALL_OFF
+ %s áîëüøå íå Ñóïåð-Àäìèí
+OPER_SUPER_ADMIN_ONLY
+ Òîëüêî Ñóïåð-Àäìèíû ìîãóò èñïîëüçîâàòü ýòó êîìàíäó.
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Ñèíòàêñèñ: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ Ñåðâèñû òåïåðü ðàáîòàþò â ðåæèìå Defcon, Ïîæàëóéñòà, ïîïûòàéòåñü ïîçæå.
+OPER_DEFCON_NO_CONF
+ Ðåæèì Defcon äîëæåí áûòü âêëþ÷åí â ôàéëå services.conf
+OPER_DEFCON_CHANGED
+ Ñåé÷àñ ñåðâèñû â ðåæèìå DEFCON %d
+OPER_DEFCON_WALL
+ %s Èçìåíèë óðîâåíü DEFCON íà %d
+DEFCON_GLOBAL
+ Óðîâåíü Defcon òåïåðü ðàâåí: %d
+
+# Module strings
+
+OPER_MODULE_LOADED
+ Ìîäóëü %s çàãðóæåí
+OPER_MODULE_UNLOADED
+ Ìîäåëü %s âûãðóæåí
+OPER_MODULE_LOAD_FAIL
+ Íåâîçìîæíî çàãðóçèòü ìîäóëü %s
+OPER_MODULE_REMOVE_FAIL
+ Íåâîçìîæíî âûãðóçèòü ìîäóëü %s
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD ÈìÿÔàéëà
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD ÈìÿÔàéëà
+OPER_MODULE_LIST
+ Ìîäóëü: %s
+OPER_MODULE_INFO_LIST
+ Ìîäóëü: %s Âåðñèÿ: %s Àâòîð: %s çàãðóæåí: %s
+OPER_MODULE_CMD_LIST
+ Äîïóñòèìûå êîìàíäû: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Äîïóñòèìû IRCD çàãîëîâêè äëÿ: %s
+OPER_MODULE_NO_LIST
+ Íå çàãðóæåíî íè îäíîãî ìîäóëÿ
+OPER_MODULE_NO_INFO
+ Íåò äîñòóïíîé èíôîðìàöèè î ìîäóëå %s
+OPER_MODULE_INFO_SYNTAX
+ MODINFO ÈìÿÔàéëà
+MODULE_HELP_HEADER
+ Íèæåñëåäóþùèå êîìàíäû ïîääåðæèâàþòñÿ äàííûì ìîäóëåì:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [ïàðàìåòðû]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+âðåìÿ èñòå÷åíèÿ] ìàñêà ëèìèò ïðè÷èíà
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {ìàñêà | list}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE íîìåð ïîçèöèÿ
+OPER_EXCEPTION_DISABLED
+ Îãðàíè÷åíèå ñåññèé îòêëþ÷åíî.
+OPER_EXCEPTION_ALREADY_PRESENT
+ Ìàñêà %s óæå åñòü â ñïèñêå èñêëþ÷åíèé.
+OPER_EXCEPTION_TOO_MANY
+ Ñïèñîê èñêëþ÷åíèé èç ëèìèòà ñåññèé ïåðåïîëíåí!
+OPER_EXCEPTION_ADDED
+ Ëèìèò ñåññèé äëÿ %s óñòàíîâëåí â %d.
+OPER_EXCEPTION_MOVED
+ Èñêëþ÷åíèå äëÿ %s (#%d) ïåðåìåùåíî â ïîçèöèþ %d.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ Íåò òàêîé çàïèñè (#%d) â ñïèñêå èñêëþ÷åíèé èç ëèìèòâ ñåññèé.
+OPER_EXCEPTION_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå èñêëþ÷åíèé èç ëèìèò ñåññèé.
+OPER_EXCEPTION_NO_MATCH
+ Íåò òàêèõ çíà÷åíèé â ñïèñêå èñêëþ÷åíèé èç ëèìèòà ñåññèé.
+OPER_EXCEPTION_DELETED
+ %s óäàëåí èç ñïèñêà èñêëþ÷åíèé èç ëèìèòà ñåññèé.
+OPER_EXCEPTION_DELETED_ONE
+ Óäàëåíà 1 çàïèñü èç ñïèñêà èñêëþ÷åíèé èç ëèìèòà ñåññèé.
+OPER_EXCEPTION_DELETED_SEVERAL
+ Óäàëåíî %d çàïèñåé èç ñïèñêà èñêëþ÷åíèé èç ëèìèòà ñåññèé.
+OPER_EXCEPTION_LIST_HEADER
+ Òåêóùèé ñïèñîê èñêëþ÷åíèé èç ëèìèòà ñåññèé:
+# ìàñêà, ëèìèò
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Íîìåð Ëèìèò Õîñò
+# ìåñêà, êåì óñòàíîâëåíî, êîãäà óñòàíîâëåíî, êîãäà èñòåêàåò, ëèìèò, ïðè÷èíà
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (by %s on %s; %s)
+ Ëèìèò: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Íåêîððåêòíûé ëèìèò ñåññèé. Îí äîëæåí áûòü öåëûì ÷èñëîì áîëüøå èëè ðàâíûì íóëÿ è ìåíüøå %d.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Íåêîððåêòíàÿ õîñòìàñêà. Òîëüêî ðåàëüíàÿ õîñòìàñêà ìîæåò áûòü äîáàâëåíà â èñêëþ÷åíèÿ, îíà íå äîëæíà ñîäåðæàòü íèêîâ èëè èìåí ïîëüçîâàòåëåé.
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST ëèìèò | VIEW õîñò}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST ëèìèò
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW õîñò
+OPER_SESSION_DISABLED
+ Îãðàíè÷åíèå ñåññèé îòêëþ÷åíî.
+OPER_SESSION_INVALID_THRESHOLD
+ Íåâåðíîå ïîðîãîâîå çíà÷åíèå. Îíî äîëæíî áûòü öåëûì ÷èñëîì áîëüøå 1.
+OPER_SESSION_NOT_FOUND
+ %s íå íàéäåí â ñïèñêå ñåññèé.
+OPER_SESSION_LIST_HEADER
+ Õîñòû ñ ìåíüøèì ÷åì %d êîëè÷åñòâîì ñåññèé:
+OPER_SESSION_LIST_COLHEAD
+ Ñåññèÿ Õîñò
+# ëèìèò, õîñò
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ Õîñò %s ñåé÷àñ èñïîëüçóåò %d ñåññèé èç %d ìàêñèìàëüíî äîïóñòèìûõ.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Ñèíòàêñèñ: EXCEPTION ADD [+âðåìÿ èñòå÷åíèÿ] ìàñêà ëèìèò ïðè÷èíà
+ EXCEPTION DEL {ìàñêà | list}
+ EXCEPTION MOVE íîìåð ïîçèöèÿ
+ EXCEPTION LIST [ìàñêà | list]
+ EXCEPTION VIEW [ìàñêà | list]
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì õîñòîâ,
+ èìåþùèõ îòäåëüíûå îãðàíè÷åíèÿ íà êîëè÷åñòâî ñåññèé - ðàçðåøèò îïðåäåëåíûì ìàøèíàì,
+ íàïðèìåð øåëë-ñåðâåðàì, èìåòü áÎëüøåå êîëè÷åñòâî êëèåíòîâ îäíîâðåìåííî, ÷åì
+ ðàçðåøåíî ïî óìîë÷àíèþ. Êàê òîëüêî êîëè÷åñòâî ñåññèé ñ õîñòà äîñòèãíåò ëèìèòà,
+ âñå ïîñëåäóþùèå êëèåíòû, ïûòàþùèåñÿ êîííåêòèòüñÿ ñ äàííîãî õîñòà áóäóò
+ ïðèáèâàòüñÿ. Ïåðåä îòñîåäèíåíèåì ïîëüçîâàòåëÿ, îí áóäåò óâåäîìëåí
+ /NOTICE îò %S, ÷òî ñ äàííîãî õîñòà ïðåâûøåí ëèìèò
+ ñåññèé. Ñîäåðæàíèå ýòîãî óâåäîìëåíèÿ íàñòðàèâàåòñÿ â êîíôèãóðàöèè.
+
+ EXCEPTION ADD äîáàâëÿåò óêàçàííóþ ìàñêó â ñïèñîê èñêëþ÷åíèé.
+ Ïðèìå÷àíèå: ìàñêè íèê!èäåíò@õîñò è èäåíò@õîñò íåêîððåêòíû!
+ Òîëüêî ðåàëüíûå õîñòìàñêè, íàïðèìåð box.host.dom è *.host.dom,
+ ðàçðåøåíî èñïîëüçîâàòü, òàê êàê îãðàíè÷åíèå ñåññèé íå èñïîëüçóåò
+ íè íèêè íè èäåíòû. ëèìèò äîëæåí áûòü öåëûì ÷èñëîì áîëüøå èëè
+ ðàâíûì íóëÿ. Ýòî îïðåäåëÿåò êàê ìíîãî ñåññèé äàííûé õîñò
+ èñïîëüçîâàòü îäíîâðåìåííî. Óñòàíîâêà ýòîãî çíà÷åíèÿ ðàâíûì 0 ïîçâîëèò õîñòó
+ èìåòü íåîãðàíè÷åííîå ÷èñëî ñåññèé. Ñì. AKILL help äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè
+ î ôîðìàòå ïàðàìåòðà âðåìÿ èñòå÷åíèÿ.
+ EXCEPTION DEL óäàëÿò óêàçàííóþ ìàñêó èç ñïèñêà èñêëþ÷åíèé.
+ EXCEPTION MOVE ïåðåìåñòèò èñêëþ÷åíèå ïîä íîìåðîì íîìåð â ïîçèöèþ ïîçèöèÿ.
+ Èíòåðâàë èñêëþ÷åíèé áóäåò ñäâèíóò ââåðõ èëè âíèç, çàïîëíÿÿ ïóñòîé ïðîìåæóòîê.
+ EXCEPTION LIST è EXCEPTION VIEW ïîêàæåò âñå òåêóùèå
+ èñêëþ÷åíèÿ; åñëè óêàçàíà ìàñêà, ñïèñîê èñêëþ÷åíèé áóäåò ïîêàçàí
+ òîëüêî äëÿ ñîâïàäàþùèõ ñ óêàçàííîé ìàñîê. EXCEPTION VIEW ïîêàæåò
+ áîëåå ïîäðîáíóþ èíôîðìàöèþ, ïîêàæåò èìÿ ïîëüçîâàòåëÿ è òîãî,
+ êòî äîáàâèë äàííîå èñêëþ÷åíèå, îãðàíè÷åíèå ñåññèé, ïðè÷èíó,
+ õîñòìàñêó, à òàêæå äàòó è âðåìÿ èñòå÷åíèÿ èñêëþ÷åíèÿ.
+
+ Ïðèìå÷àíèå: êîííåêòÿùèéñÿ êëèåíò áóäåò "èñïîëüçîâàòü" ïåðâîå â ñïèñêå èñêëþ÷åíèå,
+ ñîäåðæàùåå åãî õîñò. Áîëüøèå ñïèñêè èñêëþ÷åíèé ñ ìàëîñïåöèôè÷íûìè ìàñêàìè
+ èñêëþ÷åíèé ìîãóò ñíèçèòü ïðîèçâîäèòåëüíîñòü ñåðâèñîâ.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_SESSION
+ Ñèíòàêñèñ: SESSION LIST ïîðîã
+ SESSION VIEW õîñò
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ ïðîñìîòðåòü ñïèñîê ñåññèé.
+
+ SESSION LIST ïîêàæåò õîñòû ñ ìåíüøèì, ÷åì ïîðîã êîëè÷åñòâîì ñåññèé.
+ Ïîðîã äîëæåí áûòü öåëûì áîëüøå 1. Ýòî ïðåäîõðàíèò
+ îò ñëó÷àéíîé âûäà÷è ñïèñêà ñ áîëüøèì ÷èñëîì åäèíè÷íûõ
+ ñåññèé.
+ SESSION VIEW ïîêàæåò äåòàëüíóþ èíôîðìàöèþ îá óêàçàííîì
+ õîñòå - âêëþ÷àÿ òåêóùèé ñ÷åò÷èê ñåññèé è ëèìèò ñåññèé.
+ host íå ìîæåò âêëþ÷àòü â ñåáÿ ñèìâîëüíûå ìàñêè (*, ? è ò.ï.).
+
+ Ñì. EXCEPTION help äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î ëèìèòèðîâàíèè
+ ñåññèé, êàê óñòàíîâèòü îòäåëüíûé ëèìèò ñåññèé äëÿ îïðåäåëåííîãî
+ õîñòà èëè ãðóïïû õîñòîâ.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_STAFF
+ Ñèíòàêñèñ: STAFF
+
+ Ïîêàçûâàåò âñåõ, ïðîïèñàííûõ íà ñåðâèñàõ (Îïåðàòîðîâ, Àäìèíèñòðàòîðîâ..)
+ âêëþ÷àÿ èõ óðîâåíü è îíëàéí ñòàòóñ.
+
+OPER_HELP_DEFCON
+ Ñèíòàêñèñ: DEFCON [1|2|3|4|5]
+
+ Ñèñòåìà defcon ìîæåò áûòü èñïîëüçîâàíà äëÿ îñóùåñòâëåíèÿ ðàçëè÷íûõ
+ ñåðâèñíûõ äåéñòâèé, óäîáíî èñïîëüçîâàòü ïðè ïîïûòêàõ
+ àòàêè íà ñåòü.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * Íåëüçÿ ðåãèñòðèðîâàòü êàíàëû
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * Íåëüçÿ ðåãèñòðèðîâàòü íèêè
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * Íåëüçÿ èçìåíÿòü MLOCK
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Ôîðñèðîâàííî óñòàíîâèòü ðåæèìû (%s) íà âñå êàíàëû
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Óìåíüøèòü ëèìèò ñåññèé äî %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Ïðèáèâàòü âñåõ êîííåêòÿùèõñÿ êëèåíòîâ
+OPER_HELP_DEFCON_OPER_ONLY
+ * Èãíîðèðîâàòü ëþáûå ñîîáùåíèÿ îò íå-îïåðàòîðîâ
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Ìîë÷à èãíîðèðîâàòü íå-îïåðàòîðîâ
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * Äîáàâëÿòü AKILL âñåì êîííåêòÿùèìñÿ êëèåíòàì
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * Çàïðåò îòïðàâëÿòü ìåìêè
+OPER_HELP_CHANKILL
+ Ñèíòàêñèñ: CHANKILL [+èñòå÷åíèå] #êàíàë ïðè÷èíà
+
+ Óñòàíîâèòü AKILL äëÿ êàæäîãî íèêà, çàøåäøåãî íà îïðåäåëåííûé êàíàë. Áóäåò
+ èñïîëüçîâàí ïîëíîñòüþ ðåàëüíûé ident@host äëÿ êàæäîãî íèêà,
+ êîòîðûé ïîäïàäåò ïîä äàííûé AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Íîâîñòü - %s] %s
+NEWS_OPER_TEXT
+ [Íîâîñòè äëÿ Îïåðàòîðîâ - %s] %s
+NEWS_RANDOM_TEXT
+ [Ñëó÷àéíàÿ íîâîñòü - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Ñèíòàêñèñ: LOGONNEWS {ADD|DEL|LIST} [òåêñò|íîìåð]
+NEWS_LOGON_LIST_HEADER
+ Òåêóùèå íîâîñòè:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ Íîâîñòåé íåò.
+NEWS_LOGON_ADD_SYNTAX
+ Ñèíòàêñèñ: LOGONNEWS ADD òåêñò
+NEWS_LOGON_ADD_FULL
+ Ñïèñîê íîâîñòåé ïåðåïîëíåí!
+NEWS_LOGON_ADDED
+ Äîáàâëåíà î÷åðåäíàÿ íîâîñòü (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Ñèíòàêñèñ: LOGONNEWS DEL {íîìåð | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Íîâîñòü ïîä íîìåðîì #%d íå íàéäåíà!
+NEWS_LOGON_DELETED
+ Íîâîñòü ïîä íîìåðîì #%d óäàëåíà.
+NEWS_LOGON_DEL_NONE
+ Íåò íîâîñòåé, ïîäëåæàùèõ óäàëåíèþ!
+NEWS_LOGON_DELETED_ALL
+ Âñå íîâîñòè óäàëåíû.
+
+NEWS_OPER_SYNTAX
+ Ñèíòàêñèñ: OPERNEWS {ADD|DEL|LIST} [òåêñò|íîìåð]
+NEWS_OPER_LIST_HEADER
+ Ñïèñîê íîâîñòåé äëÿ Îïåðàòîðîâ:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_OPER_LIST_NONE
+ Íåò íîâîñòåé äëÿ Îïåðàòîðîâ.
+NEWS_OPER_ADD_SYNTAX
+ Ñèíòàêñèñ: OPERNEWS ADD òåêñò
+NEWS_OPER_ADD_FULL
+ Ñïèñîê íîâîñòåé ïåðåïîëíåí!
+NEWS_OPER_ADDED
+ Äîáàâëåíà î÷åðåäíàÿ íîâîñòü äëÿ Îïåðàòîðîâ (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Ñèíòàêñèñ: OPERNEWS DEL {íîìåð | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Íîâîñòü äëÿ Îïåðàòîðîâ ïîä íîìåðîì #%d íå íàéäåíà!
+NEWS_OPER_DELETED
+ Íîâîñòü äëÿ Îïåðàòîðîâ ïîä íîìåðîì #%d óäàëåíà.
+NEWS_OPER_DEL_NONE
+ Íåò íîâîñòåé äëÿ Îïåðàòîðîâ, ïîäëåæàùèõ óäàëåíèþ!
+NEWS_OPER_DELETED_ALL
+ Âñå íîâîñòè äëÿ Îïåðàòîðîâ óäàëåíû.
+
+NEWS_RANDOM_SYNTAX
+ Ñèíòàêñèñ: RANDOMNEWS {ADD|DEL|LIST} [òåêñò|íîìåð]
+NEWS_RANDOM_LIST_HEADER
+ Ñïèñîê ñëó÷àéíûõ íîâîñòåé:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Íåò ñëó÷àéíûõ íîâîñòåé.
+NEWS_RANDOM_ADD_SYNTAX
+ Ñèíòàêñèñ: RANDOMNEWS ADD òåêñò
+NEWS_RANDOM_ADD_FULL
+ Ñïèñîê íîâîñòåé ïåðåïîëíåí!
+NEWS_RANDOM_ADDED
+ Äîáàâëåíà î÷åðåäíàÿ ñëó÷àéíàÿ íîâîñòü (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Ñèíòàêñèñ: RANDOMNEWS DEL {íîìåð | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ Ñëó÷àéíàÿ íîâîñòü ïîä íîìåðîì #%d íå íàéäåíà!
+NEWS_RANDOM_DELETED
+ Ñëó÷àéíàÿ íîâîñòü ïîä íîìåðîì #%d óäàëåíà.
+NEWS_RANDOM_DEL_NONE
+ Íåò ñëó÷àéíûõ íîâîñòåé, ïîäëåæàùèõ óäàëåíèþ!
+NEWS_RANDOM_DELETED_ALL
+ Âñå ñëó÷àéíûå íîâîñòè óäàëåíû.
+
+NEWS_HELP_LOGON
+ Ñèíòàêñèñ: LOGONNEWS ADD òåêñò
+ LOGONNEWS DEL {íîìåð | ALL}
+ LOGONNEWS LIST
+
+ Óïðàâëåíèå ñïèñêîì íîâîñòåé. Êîãäà ïîëüçîâàòåëü
+ çàõîäèò â IRC ñåòü, ýòè íîâîñòè áóäóò îòïðàâëåíû
+ åìó. (Òåì íå ìåíåå, íå áîëåå òðåõ ñîîáùåíèé áóäåò
+ îòïðàâëåíî, ÷òîáû íå äîïóñòèòü ôëóäà. Åñëè ó Âàñ íîâîñòåé
+ áîëüøå òðåõ, òîëüêî òðè ïîñëåäíèå íîâîñòè
+ áóäóò ïîñëàíû.)
+
+ Êîìàíäà LOGONNEWS LIST ìîæåò áûòü èñïîëüçîâàíà ëþáûì IRC Îïåðàòîðîì äëÿ ïðîñìîòðà
+ òåêóùèõ íîâîñòåé. Êîìàíäû ADD è DEL ìîãóò èñïîëüçîâàòü òîëüêî
+ Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+NEWS_HELP_OPER
+ Ñèíòàêñèñ: OPERNEWS ADD òåêñò
+ OPERNEWS DEL {íîìåð | ALL}
+ OPERNEWS LIST
+
+ Óïðàâëåíèå ñïèñêîì íîâîñòåé äëÿ Îïåðàòîðîâ. Êîãäà ïîëüçîâàòåëü
+ ñòàíåò IRC Îïåðàòîðîì (èñïîëüçîâàâ êîìàíäó /OPER), ýòè ñîîáùåíèÿ
+ áóäóò åìó îòïðàâëåíû. (Òåì íå ìåíåå, íå áîëåå òðåõ ñîîáùåíèé áóäåò
+ îòïðàâëåíî, ÷òîáû íå äîïóñòèòü ôëóäà. Åñëè ó Âàñ íîâîñòåé
+ áîëüøå òðåõ, òîëüêî òðè ïîñëåäíèå íîâîñòè
+ áóäóò ïîñëàíû.)
+
+ Êîìàíäà OPERNEWS LIST ìîæåò áûòü èñïîëüçîâàíà ëþáûì IRC Îïåðàòîðîì äëÿ ïðîñìîòðà
+ òåêóùèõ íîâîñòåé. Êîìàíäû ADD è DEL ìîãóò èñïîëüçîâàòü òîëüêî
+ Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+NEWS_HELP_RANDOM
+ Ñèíòàêñèñ: RANDOMNEWS ADD òåêñò
+ RANDOMNEWS DEL {òåêñò | ALL}
+ RANDOMNEWS LIST
+
+ Óïðàâëåíèå ñïèñêîì ñëó÷àéíûõ íîâîñòåé. Êîãäà ïîëüçîâàòåëü
+ çàõîäèò â IRC ñåòü, îäíà (è òîëüêî îäíà) èç
+ ñëó÷àéíûõ íîâîñòåé áóäåò âûáðàíà íàóãàä è îòïðàâëåíà åìó.
+
+ Êîìàíäà RANDOMNEWS LIST ìîæåò áûòü èñïîëüçîâàíà ëþáûì IRC Îïåðàòîðîì äëÿ ïðîñìîòðà
+ òåêóùèõ íîâîñòåé. Êîìàíäû ADD è DEL ìîãóò èñïîëüçîâàòü òîëüêî
+ Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S ñîîáùèò âàì èíôîðìàöèþ î ñåðâèñàõ.
+ Íà÷íèòå ðàáîòó ñ ñåðâèñàìè ñ êîìàíä:
+
+ /msg %s HELP
+ èíôîðìàöèÿ î ðåãèñòðàöèè íèêîâ
+
+ /msg %s HELP
+ èíôîðìàöèÿ î ðåãèñòðàöèè êàíàëîâ è óïðàâëåíèè èìè
+
+ /msg %s HELP
+ èíôîðìàöèÿ î òîì, êàê îñòàâëÿòü ñîîáùåíèÿ ïîëüçîâàòåëÿì,
+ êîòîðûå â äàííûé ìîìåíò â îôôëàéíå.
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ èíôîðìàöèÿ î òîì, êàê óñòàíîâèòü ñåðâèñâíîãî áîòà íà ñâîé êàíàë
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ %S ýòî ñåðâèñ, ïðåäíàçíà÷åííûé äëÿ "ðåãèñòðàöèè" Âàøåãî íèêà è åãî çàùèòû
+ îò èñïîëüçîâàíèÿ êåì-ëèáî, êðîìå Âàñ. Ñóùåñòâóåò íåñêîëüêî êîìàíä äëÿ
+ ðåãèñòðàöèè íèêà è ðàçëè÷íûõ íàñòðîåê; ÷òîáû èñïîëüçîâàòü
+ äàííûå êîìàíäû, íàïèøèòå /msg %S êîìàíäà.
+ Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè ïî êàêîé-ëèáî
+ êîìàíäå íàïèøèòå: /msg %S HELP êîìàíäà.
+
+ REGISTER Ðåãèñòðàöèÿ íèêà
+ GROUP Îáúåäèíåíèå íèêîâ â ãðóïïû
+ IDENTIFY Èäåíòèôèêàöèÿ Âàñ êàê âëàäåëüöà íèêà
+ ACCESS Óïðàâëåíèå ñïèñêîì äîñòóïà
+ SET Óñòàíîâêà ïàðàìåòðîâ, âêëþ÷àÿ çàùèòó kill'îì
+ DROP Îòìåíà ðåãèñòðàöèè íèêà
+ RECOVER Âûáðîñèòü èç ÷àòà ïîëüçîâàòåëÿ, âçÿâøåãî Âàø íèê
+ RELEASE Âîññòàíîâëåíèå èñïîëüçîâàíèÿ Âàøåãî íèêà ïîñëå êîìàíäû RECOVER
+ SENDPASS Çàáûëè ïàðîëü? Ïîïðîáóéòå ýòó êîìàíäó
+
+ Äðóãèå êîìàíäû: GHOST, ALIST, GLIST, INFO, LIST, LOGOUT,
+ STATUS
+
+ ÂÀÆÍÎ: Äàííûé ñåðâèñ ïðåäíàçíà÷åí äëÿ òîãî, ÷òîáû ïîëüçîâàòåëè IRC
+ ìîãëè âîñïîëüçîâàòüñÿ ìíîãèìè óäîáíûìè âîçìîæíîñòÿìè.
+ NickServ ÍÅ ïðåäíàçíà÷åí äëÿ îáëåã÷åíèÿ "âîðîâñòâà" íèêîâ,
+ "êèáåðñêâîòòèíãà" (çàõâàòà áîëüøîãî êîëè÷åñòâà íèêîâ) èëè äðóãèõ çëîâðåäíûõ äåéñòâèé.
+ Çëîóïîòðåáëåíèå %S ïðèâåäåò, êàê ìèíèìóì, ê óíè÷òîæåíèþ Âàøåãî íèêà(íèêîâ).
+
+NICK_HELP_EXPIRES
+
+ Íåèñïîëüçóåìûå â òå÷åíèå äëèòåëüíîãî âðåìåíè íèêè àâòîìàòè÷åñêè
+ óäàëÿþòñÿ èç áàçû äàííûõ - íèê áóäåò óäàëåí, åñëè åãî íå èñïîëüçîâàòü
+ â òå÷åíèå %d äíåé.
+
+NICK_HELP_REGISTER
+ Ñèíòàêñèñ: REGISTER ïàðîëü [email]
+
+ Ðåãèñòðèðóåò Âàø íèê â áàçå äàííûõ %S. Ïîñëå òîãî, êàê Âû
+ çàðåãèñòðèðîâàëè íèê, âû ìîæåòå èñïîëüçîâàòü êîìàíäû SET è ACCESS,
+ ÷òîáû ñêîíôèãóðèðîâàòü ïàðàìåòðû Âàøåãî íèêà ïî Âàøåìó âêóñó.
+ Íå çàáûâàéòå ïàðîëü, êîòîðûé Âû óêàæåòå ïðè ðåãèñòðàöèè! Íå èñïîëüçóéòå
+ ïàðîëè, ÿâëÿþùèåñÿ Âàøèì íèêîì èëè Âàøèì èìåíåì. Ïîìíèòå, ÷òî ðåãèñòð ñèìâîëîâ
+ â ïàðîëå - ðàçëè÷àåòñÿ.
+ (Ïðèìå÷àíèå: ïàðîëè ÷óâñòâèòåëüíû ê ðåãèñòðó! MYPASSWORD, MyPassword, è mypassword - ýòî ÐÀÇÍÛÅ ïàðîëè!)
+ Ïðèíöèïû âûáîðà ïàðîëÿ:
+
+ Ïàðîëè íå äîëæíû áûòü ëåãêî óãàäûâàåìû. Íàïðèìåð,
+ èñïîëüçîâàíèå Âàøåãî ðåàëüíîãî èìåíè â êà÷åñòâå ïàðîëÿ - ïëîõàÿ èäåÿ.
+
+ Ïàðîëü íå äîëæåí ëåãêî óãàäûâàòüñÿ - íàïðèìåð ÿâëÿòüñÿ Âàøèì íèêîì èëè ïàðîëåì,
+ è %S íå äîïóñòèò èõ èñïîëüçîâàòü. Òàêæå,
+ êîðîòêèå ïàðîëè î÷åíü ëåãêî ïîäáèðàþòñÿ ïðîñòûì
+ ïåðåáîðîì, ïîýòîìó äëèíà ïàðîëÿ äîëæíà áûòü
+ áîëüøå 5 ñèìâîëîâ.Ïðîáåëû è çíàêè òàáóëÿöèè â ïàðîëå
+ íåäîïóñòèìû. Èñïîëüçóéòå â êà÷åñòâå ïàðîëÿ òîëüêî
+ ëàòèíñêèå áóêâû.
+
+ Ïàðàìåòð email ÿâëÿåòñÿ íåîáÿçàòåëüíûì.
+ Íî, òåì íå ìåíåå, åãî òðåáóåòñÿ óêàçûâàòü
+ â áîëüøèíñòâå ñåòåé.
+ Âàøà ïðèâàòíîñòü áóäåò ñîáëþäåíà; ýòîò e-mail íå áóäåò
+ ïåðåäàí òðåòüèì ëèöàì.
+
+ Ýòà êîìàíäà òàêæå ñîçäàåò íîâóþ ãðóïïó äëÿ Âàøåãî íèêà, èñïîëüçîâàíèå êîòîðîé ïîçâîëèò ðåãèñòðèðîâàòü äðóãèå íèêè, âñå èç íèõ
+ áóäóò ÿâëÿòüñÿ ÷àñòüþ ãëàâíîãî íèêà - â ãðóïïó êîòîðîãî âû ðåãèñòðèðóåòå äðóãèå íèêè;
+ ñîîòâåòñòâåííî ïîä ëþáûì è íèõ ìîæíî áóäåò ïîëó÷èòü êîðîòêîå ñîîáùåíèå, áóäóò ñîõðàíåíû âñå íàñòðîéêè ãëàâíîãî íèêà ãðóïïû, è ó Âàñ áóäóò âñå ïðèâèëåãèè íà êàíàëàõ,
+ íà êîòîðûõ Âû ïðîïèñàíû â ñïèñêå äîñòóïà. Äëÿ ïîëó÷åíèÿ áîëåå ïîëíîé èíôîðìàöèè
+ íàïèøèòå /msg %S HELP GROUP.
+
+NICK_HELP_GROUP
+ Ñèíòàêñèñ: GROUP ãëàâíûé_íèê ïàðîëü
+
+ Ýòà êîìàíäà ïîçâîëÿåò Âàì ïðèñîåäèíèòü Âàø íèê ê ãðóïïå ãëàâíîãî_íèêà
+ ïàðîëü - ýòî ïàðîëü ãëàâíîãî íèêà.
+
+ Èñïîëüçîâàíèå ãðóïï ïîçâîëèò Âàì îáúåäèíèòü Âàøè íàñòðîéêè,
+ ïîëó÷àòü è îòïðàâëÿòü êîðîòêèå ñîîáùåíèÿ è ïðèâèëåãèè íà êàíàëàõ ñî âñåìè íèêàìè ãðóïïû è
+ ìíîãîå äðóãîå!
+
+ Ãðóïïà ñóùåñòâóåò äî òåõ ïîð, ïîêà èñïîëüçóåòñÿ.
+ åñëè Âû óäàëèòå (äðîïíåòå) îäèí èç íèêîâ â ãðóïïå, Âû íå ïîòåðÿåòå
+ ðåãèñòðàöèþ ïî êðàéíåé ìåðå äî òåõ ïîð, ïîêà,
+ â ãðóïïå îñòàåòñÿ õîòÿ áû 1 íèê.
+
+ Âû ìîæåòå èñïîëüçîâàòü ýòó êîìàíäó, äàæå åñëè Âû âñå åùå íå çàðåãèñòðèðîâàëè
+ Âàø íèê. Åñëè Âàø íèê óæå çàðåãèñòðèðîâàí, Âàì íåîáõîäèìî
+ ïðîèäåíòèôèöèðîâàòüñÿ ïåðåä èñïîëüçîâàíèåì ýòîé êîìàíäû. Íàïèøèòå
+ /msg %S HELP IDENTIFY äëÿ ïîëó÷åíèÿ áîëåå ïîëíîé èíôîðìàöèè. Âïðî÷åì, åñòü âåðîÿòíîñòü,
+ ÷òî â Âàøåé IRC ñåòè ýòî áóäåò íåâîçìîæíî.
+
+ Îäíàêî, ðåêîìåíäóåòñÿ èñïîëüçîâàòü ýòó êîìàíäó ñ íåçàðåãèñòðèðîâàííîãî
+ íèêà, ïîòîìó ÷òî îí àâòîìàòè÷åñêè çàðåãèñòðèðóåòñÿ ïðè óñïåøíîì èñïîëüçîâàíèè
+ äàííîé êîìàíäû. Âû òàêæå ìîæåòå èñïîëüçîâàòü ýòó êîìàíäó ñ çàðåãèñòðèðîâàííîãî íèêà (÷òîáû
+ ïåðåéòè â äðóãóþ ãðóïïó) òîëüêî åñëè àäìèíèñòðàòîðû Âàøåé IRC ñåòè ýòî
+ ðàçðåøèëè.
+
+ Âû ìîæíî áûòü òîëüêî â îäíîé ãðóïïå îäíîâðåèåííî. Ñëèÿíèå ãðóïï
+ íåâîçìîæíî.
+
+ Ïðèìå÷àíèå: Ó âñåõ íèêîâ â ãðóïïå åäèíûé ïàðîëü.
+
+NICK_HELP_IDENTIFY
+ Ñèíòàêñèñ: IDENTIFY ïàðîëü
+
+ Ñîîáùàåò %S ÷òî Âû äåéñòâèòåëüíî ÿâëÿåòåñü âëàäåëüöåì
+ íèêà. Ìíîãèå êîìàíäû òðåáóþò èäåíòèôèêàöèè, áåç ýòîãî
+ Âû íå ñìîæåòå èõ èñïîëüçîâàòü. Ïàðîëü äîëæåí áûòü
+ ïîëíîñòüþ èäåíòè÷åí òîìó, êîòîðûé âû óêàçûâàëè êîãäà
+ èñïîëüçîâàëè êîìàíäó REGISTER.
+
+NICK_HELP_UPDATE
+ Ñèíòàêñèñ: UPDATE
+
+ Îáíîâëÿåò Âàø òåêóùèé ñòàòóñ, ò.å. ïðîâåðÿåò íàëè÷èå íîâûõ ìåìîê,
+ óñòàíàâëèâàåò íåîáõîäèìûå ðåæèìû íà êàíàëàõ (ModeonID) è îáíîâëÿåò âàøè
+ âèðòóàëüíûå õîñòû è ôëàãè (à òàêæå ïîñëåäíåå âðåìÿ ïîñåùåíèÿ IRC, è ò.ä.).
+
+NICK_HELP_LOGOUT
+ Ñèíòàêñèñ: LOGOUT
+
+ Ýòà êîìàíäà èìååò ýôôåêò, îáðàòíûé ýôôåêòó êîìàíäû IDENTIFY, ò.å.
+ ñíèìàåò ñ Âàñ ñòàòóñ âëàäåëüöà íèêà.
+ Ïðèìå÷àíèå: òåì íå ìåíåå, äàííàÿ êîìàíäà íå áóäåò òðåáîâàòü, ÷òîáû âû
+ èäåíòèôèöàèðîâàëè ñåáÿ.
+
+NICK_HELP_DROP
+ Ñèíòàêñèñ: DROP [nickname]
+
+ Óäàëÿåò âàø íèê èç áàçû äàííûõ %S. Óäàëåííûé òàêèì îáðàçîì íèê
+ ñòàíîâèòñÿ ñâîáîäíûì äëÿ ðåãèñòðàöèè ëþáûì ÷åëîâåêîì.
+
+ Âû ìîæåòå óäàëÿòü íèê â ïðåäåëàõ Âàøåé ãðóïïû, ïðè ýòîì åñëè âû óäàëÿåòå íå ãëàâíûé íèê,
+ òî îí îñòàåòñÿ âìåñòå ñ ãðóïïîé, óäàëÿåòñÿ òîëüêî Âàø òåêóùèé íèê.
+
+ Ïîðÿäîê èñïîëüçîâàíèÿ äàííîé êîìàíäû: ñíà÷àëà Âû äîëæíû èäåíòèôèöèðîâàòüñÿ
+ íà NickServ (/msg %S HELP IDENTIFY äëÿ áîëåå ïîëíîé
+ èíôîðìàöèè).
+
+NICK_HELP_ACCESS
+ Ñèíòàêñèñ: ACCESS ADD mask
+ ACCESS DEL mask
+ ACCESS LIST
+
+ Èçìåíÿåò èëè ïîêàçûâàåò ñïèñîê ìàñîê äîñòóïà íà Âàø íèê. Èìååòñÿ â âèäó
+ ñïèñîê àäðåñîâ, êîòîðûå áóäóò àâòîìàòè÷åñêè èäåíòèôèöèðîâàíû
+ %S êàê àäðåñà, ñ êîòîðûõ äîïóñòèìî èñïîëüçîâàòü Âàø íèê. Åñëè
+ Âû õîòèòå èñïîëüçîâàòü íèê ñ ðàçëè÷íûõ àäðåñîâ, Âàì íîáõîäèìî
+ èñïîëüçîâàòü êîìàíäó IDENTIFY ÷òîáû %S
+ èäåíòèôèöèðîâàë Âàñ.
+
+ Ïðèìåðû:
+
+ ACCESS ADD anyone@*.bepeg.com
+ Ðàçðåøàåò äîñòóï ïîëüçîâàòåëþ anyone ñ ëþáîãî êîìïüþòåðà
+ â äîìåíå bepeg.com.
+
+ ACCESS DEL anyone@*.bepeg.com
+ Àíòîíèì ïðåäûäóùåé êîìàíäû.
+
+ ACCESS LIST
+ Ïîêàæåò òåêóùèé ñïèñîê àäðåñîâ äîñòóïà.
+
+NICK_HELP_SET
+ Ñèíòàêñèñ: SET îïöèÿ ïàðàìåòðû
+
+ Óñòàíàâëèâàåò ðàçëè÷íûå îïöèè íèêà. îïöèÿ ìîæåò áûòü:
+
+ DISPLAY Óñòàíîâèòü ãëàâíûé íèê ãðóïïû
+ PASSWORD Óñòàíîâèòü èëè èçìåíèòü ïàðîëü íà íèê
+ LANGUAGE Óñòàíîâèòü ÿçûê, íà êîòîðîì ñåðâèñû áóäóò
+ ïîñûëàòü Âàì ñîîáùåíèÿ
+ URL Àññîöèèðîâàòü URL ñ Âàøèì íèêîì
+ EMAIL Àññîöèèðîâàòü E-mail ñ Âàøèì íèêîì
+ ICQ Àññîöèèðîâàòü íîìåð ICQ ñ Âàøèì íèêîì
+ GREET Àññîöèèðîâàòü ïðèâåòñòâèå ñ Âàøèì íèêîì
+ KILL Âêëþ÷åí èëè âûêëþ÷èòü è âûáðàòü òèï çàùèòû,
+ SECURE Âêëþ÷èòü èëè âûêëþ÷èòü ðåæèì áåçîïàñíîñòè íèêà
+ PRIVATE Ïðåäîõðàíèòü âàø íèê îò ïîÿâëåíèÿ â
+ /msg %S LIST
+ HIDE Ñêðûòü ÷àñòü èíôîðìàöèè î Âàñ
+ MSG Âûáðàòü ìåòîä îáùåíèÿ ñåðâèñîâ ñ Âàìè - ïðèâàò èëè íîòèñû
+
+ Ïåðåä óñòàíîâêîé ëþáîé îïöèè, Âû äîëæíû ñíà÷àëà èäåíòèôèöèðîâàòüñÿ
+ ñ Âàøèì ïàðîëåì (/msg %S HELP IDENTIFY äëÿ áîëåå ïîäðîáíîé
+ èíôîðìàöèè).
+
+ Íàïèøèòå /msg %S HELP SET îïöèÿ äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè
+ ïî êîíêðåòíîé îïöèè.
+
+NICK_HELP_SET_DISPLAY
+ Ñèíòàêñèñ: SET DISPLAY íîâûé_ãëàâíûé_íèê
+
+ Èçìåíÿåò Âàø ãëàâíûé íèê â ãðóïïå.
+ Íîâûé ãëàâíûé íèê äîëæåí ïðèñóòñòâîâàòü â Âàøå ãðóïïå.
+
+NICK_HELP_SET_PASSWORD
+ Ñèíòàêñèñ: SET PASSWORD íîâûé_ïàðîëü
+
+ Èçìåíÿåò ïàðîëü, êîòîðûé âû èñïîëüçóåòå äëÿ èäåíòèôèêàöèè
+ Âàøåãî íèêà.
+
+NICK_HELP_SET_LANGUAGE
+ Ñèíòàêñèñ: SET LANGUAGE íîìåð
+
+ Èçìåíÿåò ÿçûê, íà êîòîðîì ñåðâèñû áóäóò ïîñûëàòü Âàì
+ ñîîáùåíèÿ (íàïðèìåð, ïðè îòâåòå íà ïîñëàííóþ Âàìè êîìàíäó).
+ íîìåð äîëæåí áûòü âûáðàí èç íèæåñëåäóþùåãî ñïèñêà
+ ïîääåðæèâàåìûõ ÿçûêîâ:
+
+
+NICK_HELP_SET_URL
+ Ñèíòàêñèñ: SET URL url
+
+ Àññîöèèðóåò URL ñ Âàøèì íèêîì. Ýòîò URL
+ áóäåò ïîêàçàí, êîãäà êòî-ëèáî çàïðîñèò èíôîðìàöèþ
+ î Âàøåì íèêå ñ ïîìîùüþ êîìàíäû INFO.
+
+NICK_HELP_SET_EMAIL
+ Ñèíòàêñèñ: SET EMAIL àäðåc@email
+
+ Àññîöèèðóåò àäðåñ E-mail ñ Âàøèì íèêîì. Ýòîò àäðåñ
+ áóäåò ïîêàçàí, êîãäà êòî-ëèáî çàïðîñèò èíôîðìàöèþ
+ î Âàøåì íèêå ñ ïîìîùüþ êîìàíäû INFO.
+
+NICK_HELP_SET_ICQ
+ Ñèíòàêñèñ: SET ICQ íîìåð ICQ
+
+ Àññîöèèðóåò íîìåð ICQ ñ Âàøèì íèêîì. Ýòîò íîìåð
+ áóäåò ïîêàçàí, êîãäà êòî-ëèáî çàïðîñèò èíôîðìàöèþ
+ î Âàøåì íèêå ñ ïîìîùüþ êîìàíäû INFO.
+
+NICK_HELP_SET_GREET
+ Ñèíòàêñèñ: SET GREET ñîîáùåíèå
+
+ Ñîçäàåò ïðèâåòñâèå äëÿ Âàøåãî íèêà, êîòîðîå
+ áóäåò ïîêàçûâàòüñÿ ïðè çàõîäå íà êàíàë íà êîòîðîì âêëþ÷åíà îïöèÿ GREET;
+ ó÷òèòå, ÷òî Âàì ïîíàäîáèòñÿ íåîáõîäèìûé óðîâåíü
+ äîñòóïà íà ýòîò êàíàë, ÷òîáû èñïîëüçîâàòü ïðèâåòñòâèå.
+
+NICK_HELP_SET_KILL
+ Ñèíòàêñèñ: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Ïåðåêëþ÷àåò àâòîìàòè÷åñêóþ çàùèòó äëÿ Âàøåãî íèêà:
+ âêëþ÷àåò èëè âûêëþ÷àåò. Êîãäà çàùèòà â ñîñòîÿíèè ON, åñëè äðóãîé ïîëüçîâàòåëü
+ ïîïûòàåòñÿ âçÿòü âàø íèê, ó íåãî áóäåò 1 ìèíóòà äëÿ òîãî, ÷òîáû
+ âûáðàòü ñåáå äðóãîé íèê, ïîñëå ýòîãî %S èçìåíèò
+ åãî íèê.
+
+ Åñëè Âû âûáåðåòå QUICK, ó ïîëüçîâàòåëÿ áóäåò òîëüêî 20 ñåêóíä
+ ÿòîáû ñìåíèòü íèê. Åñëè âû âûáåðåòå
+ IMMED, íèê ïîëüçîâàòåëÿ áóäåò èçìåíåí íåìåäëåííî áåç áåç
+ ïðåäóïðåæäåíèÿ è øàíñà ñìåíèòü íèê; ïîæàëóéñòà
+ íå èñïîëüçóéòå ýòó îïöèþ áåç íåîáõîäèìîñòè. Òàêæå, àäìèíèñòðàòîð
+ âàøåé IRC ñåòè ìîæåò îòêëþ÷èòü ýòó îïöèþ.
+
+NICK_HELP_SET_SECURE
+ Ñèíòàêñèñ: SET SECURE {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îïöèþ Áåçîïàñíîñòü íà %S äëÿ Âàøåãî
+ íèêà. Ïðè âêëþ÷åííîì SECURE, Âû äîëæíû èäåíòèôèöèðîâàòüñÿ íà NickServ
+ ÷òîáû ïîäòâåðäèòü, ÷òî èìåííî Âû âëàäåëåö äàííîãî íèêà,
+ ïðè ýòîì íà ñïèñîê äîñòóïà ñåðâèñû íå îáðàùàþò âíèìàíèÿ.
+ Òåì íå ìåíåå, åñëè Âû åñòü â ñïèñêå äîñòóïà, %S
+ íå áóäåò àâòîìàòè÷åñêè îòñîåäèíÿòü Âàñ íå îáðàùàÿ âíèìàíèÿ íà óñòàíîâêó
+ îïöèè KILL.
+
+NICK_HELP_SET_PRIVATE
+ Ñèíòàêñèñ: SET PRIVATE {ON | OFF}
+
+ Ïåðåêëþ÷àåò %S îïöè ïðèâàòíîñòè â ïîëîæåíèå on èëè off äëÿ Âàøåãî íèêà.
+ Êîãäà PRIVATE âêëþ÷åíà, Âàø íèê íå áóäåò ïîêàçûâàòüñÿ
+ ïî êîìàíäå %S's LIST.
+ (Òåì íå ìåíåå, ëþáîé, êòî çíàåò Âàø íèê èìååò âîçìîæíîñòü ïîëó÷èòü
+ èíôîðìàöèþ î Âàñ, èñïîëüçóÿ êîìàíäó INFO.)
+
+NICK_HELP_SET_HIDE
+ Ñèíòàêñèñ: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Ïîçâîëÿåò Âàì ñêðûòü ÷àñòü èíôîðìàöèè î Âàñ, êîòîðàÿ
+ áóäåò ïîêàçûâàòüñÿ ïî êîìàíäå %S INFO íà Âàø íèê.
+ Âû ìîæåòå ñêðûòü Âàø àäðåñ email (EMAIL), âðåìÿ ïîñëåäíåãî çàõîäà â ñåòü
+ è ìàñêó ñ êîòîðîé Âû çàõîäèëè (USERMASK) è ïîñëåäíåå ñîîáùåíèå âûõîäà (QUIT).
+ Âòîðîé ïàðàìåòð îïðåäåëÿåò áóäåò ëè ýòà èíôîðìàöèÿ
+ ïîêàçûâàòüñÿ (OFF) èëè ñêðûâàòüñÿ (ON).
+
+NICK_HELP_SET_MSG
+ Ñèíòàêñèñ: SET MSG {ON | OFF}
+
+ Ïîçâîëÿåò Âàì âûáðàòü ñïîñîá îáùåíèÿ ñåðâèñîâ ñ Âàìè.
+ Åñëè óñòàíîâèòü ðåæèì MSG, ñåðâèñû áóäóò èñïîëüçîâàòü ñîáùåíèÿ â ïðèâàò, â èíîì ñëó÷àå
+ áóäóò èñïîëüçîâàòü íîòèñû.
+
+NICK_HELP_RECOVER
+ Ñèíòàêñèñ: RECOVER íèê [ïàðîëü]
+
+ Ïîçâîëÿåò Âàì âåðíóòü Âàø íèê, åñëè êòî-òî åùå
+ âçÿë åãî; %S áóäåò äåëàòü ýòî àâòîìàòè÷åñêè
+ åñëè ó âàñ óñòàíîâëåíà àâòîìàòè÷åñêàÿ çàùèòà.
+
+ Ïðè èñïîëüçîâàíèè äàííîé êîìàíäû, %S ñîçäàåò ïñåâäîïîëüçîâàòåëÿ
+ ñ óêàçàííûì íèêîì. Ýòî çàñòàâèò IRC ñåðâåð îòêëþ÷èòü
+ äðóãîãî ïîëüçîâàòåëÿ ñ äàííûì íèêîì. Ýòîò ïñåâäîïîëüçîâàòåëü
+ áóäåò îñòàâàòüñÿ â îíëàéíå â òå÷åíèè ìèíóòû, ÷òîáû ãàðàíòèðîâàòü,
+ ÷òî äðóãîé ïîëüçîâàòåëü íå ñìîæåò íåìåäëåííî ñíîâà âçÿòü ýòîò íèê;
+ ÷åðåç ìèíóòó âû ìîæåòå âåðíóòü ñåáå Âàø íèê. Òàêæå, âû ìîæåòå èñïîëüçîâàòü
+ êîìàíäó RELEASE (/msg %S HELP RELEASE) ÷òîáû âåðíóòü ñâîé íèê
+ ðàíüøå.
+
+ Ïðè èñïîëüçîâàíèè êîìàíäû RECOVER, Âàø òåêóùèé àäðåñ, êîòîðûé
+ ïîêàçûâàåòñÿ â /WHOIS äîëæåí áûòü â ñïèñêå äîñòóïà,
+ âû äîëæíû áûòü èäåíòèôèöèðîâàíû, êàê âëàäåëåö ãðóïïû íèêà,
+ êîòîðûé âîçâðàùàåòå, èëè âû äîëæíû óêàçàòü âåðíûé ïàðîëü íà
+ äàííûé íèê.
+
+NICK_HELP_RELEASE
+ Ñèíòàêñèñ: RELEASE íèê [ïàðîëü]
+
+ Ïðèêàçûâàåò %S óäàëèòü ëþáîãî, óäåðæèâàþùåãî íèê ïîëüçîâàòåëÿ,
+ âêëþ÷àÿ çàùèòó íèêà èëè èñïîëüçóÿ êîìàíäó RECOVER.
+ Ïî óìîë÷àíèþ, óäåðæèâàåòñÿ â òå÷åíèè ìèíóòû;
+ ýòà êîìàíäà îñâîáîæäàåò íèê äîâîëüíî áûñòðî.
+
+ Ïîðÿäîê èñïîëüçîâàíèÿ êîìàíäû RELEASE äëÿ íèêà: Âàø
+ òåêóùèé àäðåñ, êîòîðûé âèäåí ïî êîìàíäå /WHOIS äîëæåí áûòü îäíèì èç àäðåñîâ
+ â ñïèñêå äîñòóïà, âû äîëæíû áûòü èäåíòèôèöèðîâàíû è íàõîäèòüñÿ â ãðóïïå
+ ýòîãî íèêà, èëè Âû äîëæíû ââåñòè âåðíûé ïàðîëü íà
+ ýòîò íèê.
+
+NICK_HELP_GHOST
+ Ñèíòàêñèñ: GHOST íèê [ïàðîëü]
+
+ Óíè÷òîæàåò "ìåðòâîå" IRC ñîåäèíåíèå, èñïîëüçóþùåå Âàø íèê.
+ "ìåðòâîå" ñîåäèíåíèå - ýòî êîãäà ðåàëüíî åãî íå ñóùåñòâóåò,
+ íî êîãäà IRC ñåðâåð äóìàåò, ÷òî îíî âñå åùå îíëàéí.
+ Îáû÷íî ýòî ïðîèñõîäèò, åñëè Âàø êîìïüþòåð ïåðåçàãðóçèëñÿ,
+ èëè Âàøå ñîåäèíåíèå ñ ëîêàëüíîé ñåòüþ èëè Èíòåðíåò
+ îáîðâàëîñü â òîò ìîìåíò, êîãäà Âû áûëè â IRC.
+
+ Ïîðÿäîê èñïîëüçîâàíèÿ êîìàíäû GHOST äëÿ íèêà: Âàø
+ òåêóùèé àäðåñ, êîòîðûé âèäåí ïî êîìàíäå /WHOIS äîëæåí áûòü îäíèì èç àäðåñîâ
+ â ñïèñêå äîñòóïà, âû äîëæíû áûòü èäåíòèôèöèðîâàíû è íàõîäèòüñÿ â ãðóïïå
+ ýòîãî íèêà, èëè Âû äîëæíû ââåñòè âåðíûé ïàðîëü íà
+ ýòîò íèê.
+
+NICK_HELP_INFO
+ Ñèíòàêñèñ: INFO íèê [ALL]
+
+ Ïîêàçûâàåò èíôîðìàöèþ î íèêå, âëàäåëüöà
+ íèêà, åãî ïîñëåäíþþ ìàñêó è âðåìÿ, êîãäà îí çàõîäèë â IRC,
+ ïàðàìåòðû íèêà. Åñëè Âû èäåíòèôèöèðîâàëè Âàø íèê, Âû
+ ïîëó÷èòå áîëüøå èíôîðìàöèè è åñëè Âû óêàæåòå ïàðàìåòð ALL, Âû
+ óâèäèòå âñþ äîñòóïíóþ èíôîðìàöèþ; íå îáðàùàÿ âíèìàíèÿ íà òî ñêðûòà îíà
+ èëè íåò.
+
+NICK_HELP_LIST
+ Ñèíòàêñèñ: LIST ìàñêà
+
+ Ïîêàçûâàåò ñïèñîê âñåõ çàðåãèñòðèðîâàííûõ íèêîâ, êîòîðûå ñîäåðæàò
+ ââåäåííóþ ìàñêó, â ôîðìàòå nick!user@host. Íèêè, ó êîòîðûõ âêëþ÷åíà îïöèÿ
+ PRIVATE íå áóäóò ïîêàçàíû.
+
+ Ïðèìåðû:
+
+ LIST *!joeuser@foo.com
+ Ïîêàæåò âñå íèêè, âëàäåëüöû êîòîðûõ èìåþò ìàñêó joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Ïîêàæåò âñå çàðåãèñòðèðîâàííûå íèêè ñî ñëîâîì Bot â èõ
+ íèêå (ðåãèñòð íåâàæåí).
+
+ LIST *!*@*.bar.org
+ Ïîêàæåò âñå íèêè, ïðèíàäëåæàùèå ïîëüçîâàòåëÿì
+ â äîìåíå bar.org.
+
+NICK_HELP_ALIST
+ Ñèíòàêñèñ: ALIST [level]
+
+ Ïîêàæåò âñå êàíàëû, â ñïèñêàõ äîñòóïà êîòîðûõ Âû ÷èñëèòåñü. Îïöèîíàëüíî, Âû ìîæåòå âûáðàòü
+ îïðåäåëåííûé óðîâåíü â ôîðìàòå XOP èëè ACCESS. Ðåçóëüòèðóþùèé ñïèñîê
+ âûâåäåò êàíàëû, íà êîòîðûõ ó Âàñ åñòü ñîîòâåòñòâóþùèé óðîâåíü.
+
+ Ïðèìåðû:
+ ALIST Founder
+ Ïîêàæåò âñå êàíàëû, íà êîòîðûõ Âû ÿâëÿåòåñü
+ ôàóíäåðîì (âëàäåëüöåì).
+
+ ALIST AOP
+ Ïîêàæåò âñå êàíàëû, íà êîòîðûõ Âû ÿâëÿåòåñü àîïîì
+ èëè âûøå.
+
+ ALIST 10
+ Ïîêàæåò âñå êàíàëû, íà êîòîðûõ Âàø óðîâåíü ðàâåí 10
+ èëè âûøå.
+
+ Êàíàëû, ïîìå÷åííûå êàê NOEXPIRE áóäóò ïîêàçàíû ñ âîñêëèöàòåëüíûì çíàêîì
+ â êà÷åñòâå ïðåôèêñà.
+
+NICK_HELP_GLIST
+ Syntax: GLIST
+
+ Ïîêàçûâàåò âñå íèêè â Âàøåé ãðóïïå.
+
+NICK_HELP_STATUS
+ Ñèíòàêñèñ: STATUS íèê...
+
+ Âîçâðàùàåò èíôîðìàöèþ î äàííîì íèêå
+ èäåíòèôèöèðîâàëñÿ ëè îí êàê âëàäåëåö íèêà. Îòâåò âûâîäèòñÿ
+ â ôîðìàòå:
+
+ íèê êîä-ñòàòóñà
+
+ ãäå íèê ýòî íèê, êîòîðûé Âû ïîñëàëè ïðè ââîäå êîìàíäû, è
+ êîä-ñòàòóñà ìîæåò áûòü îäíèì èç:
+
+ 0 - òàêîãî ïîëüçîâàòåëÿ íåò â îíëàéíå èëè ýòîò íèê íå çàðåãèñòðèðîâàí
+ 1 - ïîëüçîâàòåëü íå èäåíòèôèöèðîâàí êàê âëàäåëåö íèêà
+ 2 - ïîëüçîâàòåëü èäåíòèôèöèðîâàí êàê âëàäåëåö íèêà òîëüêî ïî ñïèñêó äîñòóïà
+ 3 - ïîëüçîâàòåëü èäåíòèôèöèðîâàí êàê âëàäåëåö íèêà ÷åðåç èäåíòèôèêàöèþ ïàðîëåì
+
+ Äî 16 íèêîâ ñðàçó ìîæåò áûòü çàïðîøåíî ýòîé êîìàíäîé;
+ îñòàëüíûå áóäóò ïðîèãíîðèðîâàíû. Ñîîáùåíèå îá îøèáêå íå áóäåò ãåíåðèðîâàòüñÿ, åñëè
+ íèê íå îòïðàâëåí â êà÷åñòâå ïàðàìåòðà êîìàíäû.
+
+NICK_HELP_SENDPASS
+ Ñèíòàêñèñ: SENDPASS nickname
+
+ Îòïðàâëÿåò ïàðîëü íèêà íà àäðåñ e-mail
+ óêàçàííûé ïðè ðåãèñòðàöèè íèêà. Ýòó êîìàíäó ó÷åíü óäîáíî èñïîëüçîâàòü
+ ÷òîáû âîññòàíîâèòü çàáûòûé ïàðîëü.
+
+ Ìîæåò áûòü îãðàíè÷åíà ê èñïîëüçîâàíèþ òîëüêî äëÿ IRC îïåðàòîðîâ â äàííîé ñåòè.
+
+ Ïðè âêëþ÷åííîì øèôðîâàíèè ïàðîëåé ýòà êîìàíäà íåäîñòóïíà.
+
+NICK_SERVADMIN_HELP
+
+ Äîñòóïíûå êîìàíäû äëÿ Àäìèíèñòðàòîðîâ ñåðâèñîâ:
+
+ GETPASS Âîçâðàùàåò ïàðîëü íèêà
+ (òîëüêî åñëè øèôðîâàíèå âûêëþ÷åíî)
+ FORBID Ïðåäîõðàíÿåò íèê îò èñïîëüçîâàíèÿ
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò òàêæå óäàëèòü ëþáîé íèê áåç èäåíòèôèêàöèè
+ äëÿ íåãî, è ìîãóò ñìîòðåòü ñïèñîê äîñòóïà äëÿ ëþáîãî íèêà
+ (/msg %S ACCESS LIST íèê).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Ñèíòàêñèñ: LOGOUT [íèê [REVALIDATE]]
+
+ Áåç ïàðàìåòðîâ, ñîâåðøàåò îáðàòíûé IDENTIFY ýôôåêò,
+ ò.å. äåëàåò Âàñ íåèäåíòèôèöèðîâàííûì êàê âëàäåëüöà íèêà.
+ Ïðèìå÷àíèå, îäíàêî, Âàñ íå áóäóò ïðîñèòü èäåíòèôèöèðîâàòü
+ ñåáÿ.
+
+ ñ ïàðàìåòðîì, äåëàåò òîæå ñàìîå ñ ââåäåííûì íèêîì. Åñëè Âû
+ óêàæåòå åùå è REVALIDATE, ñåðâèñû ïîïðîñÿò äàííûé íèê ïåðåèäåíòèôèöèðîâàòü
+ ñåáÿ. Ýòî ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_DROP
+ Ñèíòàêñèñ: DROP [íèê]
+
+ Áåç ïàðàìåòðîâ, óäàëÿåò Âàø íèê èç
+ áàçû äàííûõ %S.
+
+ Ñ ïàðàìåòðîì, óäàëÿåò âûáðàííûé íèí èç áàçû äàííûõ.
+ Âû ìîæåòå óäàëèòü ëþáîé íèê èç Âàøåé ãðóïïû íå èìÿ êàêèõ-ëèáî
+ îñîáûõ ïðèâèëåãèé. Óäàëèòü ëþáîé íèê ìîãóò òîëüêî
+ Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_SET
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ ìîãó òàêæå ñòàâèòü ïàðàìåòð NOEXPIRE, ñ
+ íèêè ïðåäîõðàíÿþòñÿ îò èñòå÷åíèÿ.
+ Êðîìå òîãî, àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò óñòàíàâëèâàòü îïöèè äëÿ ëþáîãî íèêà
+ áåç ââîäà ïàðîëÿ íèêà, èñïîëüçóÿ ôîðìàò
+ SET íèê îïöèÿ ïàðàìåòðû.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Ñèíòàêñèñ: SET [íèê] NOEXPIRE {ON | OFF}
+
+ Óñòàíàâëèâàåò îñîáûé ðåæèì äëÿ äàííîãî íèêà - íèêîãäà íå èñòåêàòü. Óñòàíàâëèâàÿ ýòî,
+ â ïîëîæåíèå ON ïðåäîõðàíÿåò íèê îò èñòå÷åíèÿ. Åñëè íèê
+ íå óêàçàí, òî íå-èñòå÷åíèå áóäåò óñòàíîâëåíî íà Âàø íèê.
+
+ Ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ ìîãó èñïîëüçîâàòü ïàðàìåòð ALL äëÿ ëþáîãî íèêà.
+
+NICK_SERVADMIN_HELP_LIST
+ Ñèíòàêñèñ: LIST ìàñêà [FORBIDDEN] [NOEXPIRE]
+
+ Ïîêàçûâàåò ñïèñîê âñåõ çàðåãèñòðèðîâàííûõ íèêîâ which êîòîðûå ñîäåðæàò
+ ââåäåííóþ ìàñêó, â ôîðìàòå nick!user@host. Íèêè, ó êîòîðûõ âêëþ÷åíà îïöèÿ
+ PRIVATE áóäóò ïîêàçàíû òîëüêî Àäìèíèñòðàòîðàì ñåðâèñîâ. Íèêè
+ ñ âêëþ÷åííûì ïàðàìåòðîì NOEXPIRE áóäóò ïîêàçàíû ñ ïðåôèêñîì ! ïåðåä
+ íèêîì.
+
+ Åñëè óêàçàí ïàðàìåòð FORBIDDEN èëè NOEXPIRE, áóäóò ïîêàçàíû òîëüêî
+ íèêè, èìåþùèå âêëþ÷åííûå îïöèè FORBIDden èëè NOEXPIRE.
+ Åñëè óêàçàíû âñå îïöèè - âñå
+ òèïû íèêîâ áóäóò ïîêàçàíû. Ýòè îïöèè ìîãóò èñïîëüçîâàòü òîëüêî
+ Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+ Ïðèìåðû:
+
+ LIST *!joeuser@foo.com
+ Ïîêàæåò âñå çàðåãèñòðèðîâàííûå íèêè, âëàäåëåö êîòîðûõ ÿâëÿåòñÿ joeuser@foo.com.
+
+ LIST *Bot*!*@*
+ Ïîêàæåò âñå çàðåãèñòðèðîâàííûå íèêè, â êîòîðûõ åñòü ñëîâî Bot
+ (íå çàâèñèò îò ðåãèñòðà).
+
+ LIST * NOEXPIRE
+ Ïîêàæåò âñå çàðåãèñòðèðîâàííûå íèêè ó êîòîðûõ âêëþ÷åíà îïöèÿ
+ NOEXPIRE.
+
+NICK_SERVADMIN_HELP_ALIST
+ Ñèíòàêñèñ: ALIST [íèê] [óðîâåíü]
+
+ Áåç ïàðàìåòðîâ ïîêàæåò ñïèñîê êàíàëîâ, íà êîòîðûõ Âû ïðîïèñàíû. Ñ
+ ïåðâûì ïàðàìåòðîì, ïîêàæåò êàíàëû, íà êîòîðûõ ïðîïèñàí nickname.
+ Ñ äâóìÿ ïàðàìåòðàìè ïîêàæåò êàíàëû, ãäå ïðîïèñàí nickname ñ óðîâíåì
+ level èëè âûøå.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_GLIST
+ Ñèíòàêñèñ: GLIST [íèê]
+
+ Áåç ïàðàìåòðîâ, ïîêàæåò ñïèñîê íèêîâ
+ â Âàøåé ãðóïïå.
+
+ Ñ ïàðàìåòðîì, ïîêàæåò âñå íèêè, íàõîäÿùèåñÿ â
+ ãðóïïå óêàçàííîãî íèêà.
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Ñèíòàêñèñ: GETPASS íèê
+
+ Âîçâðàùàåò ïàðîëü óêàçàííîãî íèêà. ÏÐèìå÷àíèå ïðè
+ èñïîëüçîâàíèè äàííîé êîìàíäû, ñîîáùåíèå, âêëþ÷àþùåå íèê,
+ âûçâàâøèé äàííóþ êîìàíäó è íèê, íà êîòîðûé áûë çàïðîøåí ïàðîëü
+ áóäåò çàïèñàí â ëîã è îòïðàâëåí â WALLOPS/GLOBOPS.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+ Ýòà êîìàíäà íåäîñòóïíà, åñëè øèôðîâàíèå âêëþ÷åíî.
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Ñèíòàêñèñ: GETEMAIL user@emailhost
+
+ Âîçâðàùàåò íèêè, ó êîòîðûõ â íàñòðîéêàõ ñòîèò óêàçàííûé email. Âíèìàíèå
+ çàïðåùåíî èñïîëüçîâàòü ñèìâîëüíûå ìàñêè íè äëÿ user íè äëÿ emailhost. Êàæäûé ðàç
+ ïðè èñïîëüçîâàíèè äàííîé êîìàíäû, ñîîáùåíèå, âêëþ÷àþùåå ÷åëîâåêà, âûçâàâøåãî
+ êîìàíäó è óêàçàííûé email áóäåò çàïèñàíî â ëîã.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+NICK_SERVADMIN_HELP_FORBID
+ Ñèíòàêñèñ: FORBID íèê [ïðè÷èíà]
+
+ Çàïðåùàåò ðåãèñòðèðîâàòü èëè èñïîëçîâàòü íèê
+ Ìîæåò áûòü îòìåíåíî ïóòåì óäàëåíèÿ íèêà (DROP).
+
+  íåêîòîðûõ ñåòÿõ ïðè÷èíà ÿâëÿåòñÿ íåîáõîäèìûì ïàðàìåòðîì.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ %S ïîçâîëÿåò Âàì ðåãèñòðèðîâàòü êàíàë è óïðàâëÿòü
+ êàíàëîì. %S ìîæåò ïðåäîõðàíèòü
+ îò çëîáíûõ ïîëüçîâàòåëåé, æåëàþùèõ "çàõâàòèòü" êàíàë, èñïîëüçóÿ
+ îãðàíè÷åíèå âîçìîæíîñòè ïîëó÷åíèÿ îïà íà êàíàëå. Äîñòóïíûå
+ êîìàíäû ïîêàçàíû íèæå; ÷òîáû èñïîëüçîâàòü èõ ïèøèòå
+ /msg %S êîìàíäà. Äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè î êîíêðåòíîé
+ êîìàíäå, íàïèøèòå /msg %S HELP êîìàíäà.
+
+ REGISTER Ðåãèñòðàöèÿ êàíàëà
+ IDENTIFY Èäåíòèôèöèðîâàòüñÿ êàê âëàäåëåö êàíàëà
+ SET Óñòàíîâèòü èíôîðìàöèþ î êàíàëå è îïöèè êàíàëà
+ AOP Ìîäèôèöèðîâàòü ñïèñîê AOP'îâ
+ SOP Ìîäèôèöèðîâàòü ñïèñîê SOP'îâ
+ ACCESS Ìîäèôèöèðîâàòü ñïèñîê ïðèâèëåãèðîâàííûõ ïîëüçîâàòåëåé
+ LEVELS Ïåðåóñòàíîâèòü çíà÷åíèÿ óðîâíåé äîñòóïà
+ AKICK Óïðàâëåíèå ñïèñêîì àâòîêèêîâ
+ DROP Óäàëèòü êàíàë èç áàçû äàííûõ ChanServ
+ SENDPASS Ïîìîæåò âîññòàíîâèòü çàáûòûé ïàðîëü
+
+ Äðóãèå êîìàíäû: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO,
+ INVITE, KICK, LIST, LOGOUT, OP, TOPIC,
+ UNBAN, VOICE, VOP
+
+CHAN_HELP_UNREAL
+
+ Â äàííîé ñåòè òàêæå äîñòóïíû êîìàíäû:
+ DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER,
+ PROTECT
+
+CHAN_HELP_ULTIMATE
+
+ Â ýòîé ñåòè òàêæå äîñòóïíû êîìàíäû:
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ Ýòè êîìàíäû òàêæå äîñòóïíû â Âàøåé ñåòè:
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Ïîìíèòå, ÷òî ëþáîé êàíàë, íå èñïîëüçóþùèéñÿ â òå÷åíèå %d äíåé
+ (ò.å. íè îäèí ïîëüçîâàòåëü, ïðîïèñàííûé â ñïèñêå äîñòóïà êàíàëà
+ íå ïîñåòèò êàíàë â òå÷åíèè äàííîãî âðåìåíè) áóäåò àâòîìàòè÷åñêè óäàëåí.
+
+CHAN_HELP_REGISTER
+ Ñèíòàêñèñ: REGISTER #êàíàë ïàðîëü îïèñàíèå
+
+ Ðåãèñòðèðóåò êàíàë â áàçå äàííûõ %S. ×òîáû èñïîëüçîâàòü ýòó êîìàíäó
+ Âû äîëæíû áûòü îïåðàòîðîì êàíàëà, êîòîðûé Âû
+ ïûòàåòåñü çàðåãèñòðèðîâàòü. Ïàðîëü äîëæåí áûòü
+ èñïîëüçîâàí ñ êîìàíäîé IDENTIFY, ÷òîáû èìåòü âîçìîæíîñòü
+ èçìåíÿòü ðàçëè÷íûå ïàðàìåòðû êàíàëà.
+ Ïîñëåäíèé ïàðàìåòð (îïèñàíèå), êîòîðûé îáÿçàòåëüíî äîëæåí ïðèñóòñòâîâàòü,
+ ÿâëÿåòñÿ îïèñàíèåì êàíàëà è, âîçìîæíî, åãî òåìàòèêîé.
+
+ Êîãäà Âû çàðåãèñòðèðóåòå êàíàë, Âû áóäåòå çàïèñàíû â ñïèñîê äîñòóïà êàíàëà
+ êàê "âëàäåëåö" êàíàëà. Âëàäåëåö êàíàëà ìîæåò
+ èçìåíÿòü ëþáûå ïàðàìåòðû êàíàëà;
+ %S òàêæå àâòîìàòè÷åñêè äàñò ñòàòóñ îïåðàòîðà êàíàëà
+ âëàäåëüöó ïðè çàõîäå åãî íà êàíàë.
+ Èñïîëüçóéòå êîìàíäó ACCESS (/msg %S HELP ACCESS) äëÿ
+ äëÿ ïîëó÷åíèÿ èíôîðìàöèè î òîì, êàê äàâàòü äîïîëíèòåëüíûå ïðèâèëåãèè
+ íà êàíàëå äëÿ äðóãèõ ïîëüçîâàòåëåé.
+
+ ÏÐÈÌÅ×ÀÍÈÅ: ×òîáû çàðåãèñòðèðîâàòü êàíàë, ñïåðâà
+ Âû äîëæíû çàðåãèñòðèðîâàòü Âàø íèê. Åñëè Âû ýòîãî åùå íå ñäåëàëè,
+ /msg %s HELP äëÿ ïîëó÷åíèÿ èíôîðìàöèè î òîì, êàê çàðåãèñòðèðîâàòü íèê.
+
+CHAN_HELP_IDENTIFY
+ Ñèíòàêñèñ: IDENTIFY #êàíàë ïàðîëü
+
+ Èäåíòèôèöèðóåò Âàñ íà %S êàê âëàäåëüöà äàííîãî
+ êàíàëà. Ìíîãèå êîìàíäû äëÿ êàíàëà íåäîñòóïíû, ïîêà Âû íå
+ èäåíòèôèöèðóåòåñü. Ïàðîëü äîëæåí áûòü òåì ïàðîëåì, êîòîðûé
+ Âû óêàçûâàëè, êîãäà èñïîëüçîâàëè êîìàíäó REGISTER.
+
+CHAN_HELP_LOGOUT
+ Ñèíòàêñèñ: LOGOUT #êàíàë íèê
+
+ Ýòà êîìàíäà äåëàåò óêàçàííûé íèê íåèäåíòèôèöèðîâàííûì êàê
+ âëàäåëåö äàííîãî êàíàëà.
+
+ Åñëè Âû ÿâëÿåòåñü âëàäåëüöåì, Âû ìîæåòå äåèäåíòèôèöèðîâàòü êîãî óãîäíî,
+ â èíîì ñëó÷àå òîëüêî ñåáÿ.
+
+CHAN_HELP_DROP
+ Ñèíòàêñèñ: DROP #êàíàë
+
+ Óäàëÿåò óêàçàííûé êàíàë. Êîìàíäà ìîæåò áûòü èñïîëüçîâàíà òîëüêî
+ âëàäåëüöåì êàíàëà, êîòîðûé äîëæåí ñíà÷àëà äàòü êîìàíäó IDENTIFY.
+
+CHAN_HELP_SET
+ Ñèíòàêñèñ: SET #êàíàë îïöèÿ ïàðàìåòðû
+
+ Ïîçâîëÿåò âëàäåëüöó êàíàëà ìåíÿòü ðàçëè÷íûå íàñòðîéêè
+ êàíàëà è äðóãîå.
+
+ Äîñòóïíûå îïöèè:
+
+ FOUNDER Óñòàíîâèòü âëàäåëüöà êàíàëà
+ SUCCESSOR Óñòàíîâèòü íàñëåäíèêà êàíàëà
+ PASSWORD Óñòàíîâèòü ïàðîëü âëàäåëüöà
+ DESC Óñòàíîâèòü îïèñàíèå êàíàëà
+ URL Óñòàíîâèòü URL êàíàëà
+ EMAIL Óñòàíîâèòü àäðåñ E-mail äëÿ êàíàëà
+ ENTRYMSG Óñòàíîâèòü ñîîáùåíèå, êîòîðîå áóäåò îòïðàâëåíî
+ ïîëüçîâàòåëÿì, âîøåäøèì â êàíàë
+ BANTYPE Óñòàíîâèòü òèï áàíîâ ñåðâèñîâ íà êàíàëå
+ MLOCK Âêëþ÷èòü èëè âûêëþ÷èòü áëîêèðîâêó ðåæèìîâ êàíàëà
+ KEEPTOPIC Õðàíèòü òîïèê, åñëè âñå ïîêèíóëè êàíàë
+ OPNOTICE Óâåäîìëÿòü îá èñïîëüçîâàíèè êîìàíä OP/DEOP
+ PEACE Ðåãóëèðîâàòü èñïîëüçîâàíèå êðèòè÷åñêèõ êîìàíä
+ PRIVATE Ñêðûòü êàíàë èç ïîêàçûâàåìûõ ïî êîìàíäå LIST
+ RESTRICTED Îãðàíè÷èòü äîñòóï íà êàíàë
+ SECURE Àêòèâèðîâàòü äîïîëíèòåëüíûå âîçìîæíîñòè %S'à ïî áåçîïàñíîñòè.
+ SECUREOPS Îãðàíè÷èòü ïîëó÷åíèå ñòàòóñà îïåðàòîðà êàíàëà
+ SECUREFOUNDER Îãðàíè÷èòü ïîëó÷åíèå ñòàòóñà âëàäåëüöà êàíàëà
+ SIGNKICK Ïîäïèñûâàòü èëè íåò êèê ïðè èñïîëüçîâàíèè êîìàíäû KICK
+ TOPICLOCK Èçìåíÿòü òîïèê òîëüêî ñ ïîìîùüþ êîìàíäû TOPIC
+ XOP Âûáðàòü ñèñòåìó ïðèâèëåãèé
+
+ Íàïèøèòå /msg %S HELP îïöèÿ äëÿ ïîëó÷åíèÿ áîëåå ïîäðîáíîé èíôîðìàöèè
+ î êîíêðåòíîé îïöèè.
+
+CHAN_HELP_SET_FOUNDER
+ Ñèíòàêñèñ: SET #êàíàë FOUNDER íèê
+
+ Èçìåíÿåò âëàäåëüöà êàíàëà. Íèê íîâîãî âëàäåëüöà äîëæåí
+ áûòü çàðåãèñòðèðîâàííûì.
+
+CHAN_HELP_SET_SUCCESSOR
+ Ñèíòàêñèñ: SET #êàíàë SUCCESSOR íèê
+
+ Óñòàíîâèòü íàñëåäíèêà êàíàëà. Åñëè íèê âëàäåëüöà èñòå÷åò
+ èëè áóäåò óäàëåí, ïîêà êàíàë ñóùåñòâóåò,
+ íàñëåäíèê ñòàíåò íîâûì âëàäåëüöåì êàíàëà.
+ Òåì íå ìåíåå, åñëè íàñëåäíèê óæå çàðåãèñòðèðîâàë
+ ÷åðåñ÷óð ìíîãî êàíàëîâ (áîëåå %d), êàíàë áóäåò óäàëåí,
+ òàê æå, êàê åñëè áû íàñëåäíèê íå áûë óêàçàí. Íèê íàñëåäíèêà
+ êàíàëà äîëæåí áûòü çàðåãèñòðèðîâàííûì.
+
+CHAN_HELP_SET_PASSWORD
+ Ñèíòàêñèñ: SET #êàíàë PASSWORD ïàðîëü
+
+ Óñòàíîâèòü ïàðîëü, èñïîëüçóåìûé äëÿ èäåíòèôèêàöèè
+ íà êàíàëå êàê åãî âëàäåëåö.
+
+CHAN_HELP_SET_DESC
+ Ñèíòàêñèñ: SET #êàíàë DESC îïèñàíèå
+
+ Óñòàíàâëèâàåò îïèñàíèå êàíàëà, êîòîðîå áóäåò ïîêàçàíî ïðè èñïîëüçîâàíèè
+ êîìàíä LIST è INFO.
+
+CHAN_HELP_SET_URL
+ Ñèíòàêñèñ: SET #êàíàë URL [http://àäðåñ.ñòðàíè÷êè]
+
+ Óñòàíîâèòü URL êàíàëà. Ýòîò URL
+ áóäåò ïîêàçàí, êîãäà êòî-ëèáî çàïðîñèò èíôîðìàöèþ î êàíàëå
+ ñ ïîìîùüþ êîàíäû INFO. Åñëè êîìàíäó äàòü áåç ïàðàìåòðîâ,
+ óäàëèò òåêóùèé URL êàíàëà.
+
+CHAN_HELP_SET_EMAIL
+ Ñèíòàêñèñ: SET #êàíàë EMAIL [àäðåñ@ïî÷òû]
+
+ Óñòàíîâèòü àäðåñ ýëåêòðîííîé ïî÷òû êàíàëà.
+ Ýòîò àäðåñ áóäåò ïîêàçàí, êîãäà êòî-ëèáî çàïðîñèò
+ èíôîðìàöèþ î êàíàëå ñ ïîìîùüþ êîìàíäû INFO. Åñëè êîìàíäó
+ äàòü áåç ïàðàìåòðîâ, óäàëèò òåêóùèé email
+ êàíàëà.
+
+CHAN_HELP_SET_ENTRYMSG
+ Ñèíòàêñèñ: SET #êàíàë ENTRYMSG [ñîîáùåíèå]
+
+ Óñòàíîâèòü ñîîáùåíèå, êîòîðîå áóäåò îòïðàâëåíî íîòèñîì
+ êàæäîìó âîøåäøåìó íà êàíàë ïîëüçîâàòåëþ. Åñëè êîìàíäó äàòü áåç ïàðàìåòðîâ,
+ óäàëèò ñîîáùåíèå âõîäà.
+
+CHAN_HELP_SET_BANTYPE
+ Ñèíòàêñèñ: SET #êàíàë BANTYPE òèï áàíà
+
+ Óñòàíîâèòü òèï áàíà, êîòîðûé áóäåò èñïîëüçîâàí, êîãäà
+ êòî-òî áóäåò çàáàíåí ñåðâèñàìè íà Âàøåì êàíàëå.
+
+ òèï áàíà äîëæåí áûòü íîìåðîì ìåæäó 0 è 3 âêëþ÷èòåëüíî:
+
+ 0: áàí âèäà *!user@host
+ 1: áàí âèäà *!*user@host
+ 2: áàí âèäà *!*@host
+ 3: áàí âèäà *!*user@*.domain
+
+CHAN_HELP_SET_KEEPTOPIC
+ Ñèíòàêñèñ: SET #êàíàë KEEPTOPIC {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îïöèþ õðàíåíèÿ òîïèêà íà
+ êàíàëå. Êîãäà õðàíåíèå òîïèêà âêëþ÷åíî, òîïèê êàíàëå
+ áóäåò õðàíèòñÿ ñ ïîìîùüþ %S äàæå ïîñëå òîãî, êàê
+ ïîñëåäíèé ïîëüçîâàòåëü ïîêèíåò êàíàë, è áóäåò âîññòàíîâëåí
+ êàê òîëüêî íà êàíàë êòî-ëèáî ñíîâà çàéäåò.
+
+CHAN_HELP_SET_TOPICLOCK
+ Ñèíòàêñèñ: SET #êàíàë TOPICLOCK {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îïöèþ áëîêèðîâàòü òîïèê íà êàíàëå.
+ Êîãäà áëîêèðîâàíèå òîïèêà âêëþ÷åíî, %S ðàçðåøèò ìåíÿòü
+ òîïèê êàíàëà òîëüêî èñïîëüçóÿ êîìàíäó
+ TOPIC.
+
+CHAN_HELP_SET_MLOCK
+ Ñèíòàêñèñ: SET #êàíàë MLOCK ðåæèìû
+
+ Óñòàíàâëèâàåò è áëîêèðóåò îïðåäåëåííûå ðåæèìû êàíàëà. %S
+ ïîçâîëÿåò Âàì óñòàíîâèòü ðåæèìû êàíàëà, êîòîðûå Âû õîòèòå
+ âêëþ÷èòü, âûêëþ÷èòü, èëè ñäåëàòü ñâîáîäíûìè äëÿ âêëþ÷åíèÿ/âûêëþ÷åíèÿ.
+
+ Ïàðàìåòð ðåæèìû â ïðíöèïå íàïîìèíàåò êîìàíäó
+ /MODE; ðåæèìû, íà÷èíàþùèåñÿ ñ + áëîêèðóþòñÿ â
+ ñîñòîÿíèè âêëþ÷åíî, à ðåæèìû, íà÷èíàþùèåñÿ ñ - â ñîñòîÿíèè âûêëþ÷åíî. Ïðèìå÷àíèå:
+ òåì íå ìåíåå, ýòî íå òî æå ñàìîå, êòî êîìàíäà /MODE, èñïîëüçîâàíèå
+ SET MLOCK óäàëèò âñå ïðåäûäóùèå ðåæèìû
+ è çàìåíèò èõ íîâûìè!
+
+ Âíèìàíèå: Åñëè âû óñòàíîâèëè è çàáëîêèðîâàëè êëþ÷ êàíàëà, êàê âî âòîðîì
+ ïðèìåðå íèæå, âû äîëæíû òàêæå óñòàíîâèòü îïöèþ RESTRICTED
+ íà êàíàë (ñì. HELP SET RESTRICTED), èëè ëþáîé, êòî çàéäåò íà êàíàë
+ êîãäà òîò áóäåò ïóñò ñìîæåò óâèäåòü êëþ÷!
+
+ Ïðèìåðû:
+
+ SET #êàíàë MLOCK +nt-iklps
+ Áëîêèðóåò âêëþ÷åííûìè ðåæèìû n è t, è âûêëþ÷åííûìè i, k, l, p, è s.
+ Ðåæèì m îñòàåòñÿ ñâîáîäíûì ê âêëþ÷åíèþ/âûêëþ÷åíèþ ëþáûì îïåðàòîðîì.
+
+ SET #êàíàë MLOCK +knst-ilmp ìîé-êëþ÷-ïàðîëü
+ Áëîêèðóåò âêëþ÷åííûì ðåæèìû k, n, s, è t, è âûêëþ÷åííûìè i, l, m, è p.
+ Òàêæå óñòàíàâëèâàåò êëþ÷ äëÿ âõîäà íà êàíàë
+ "ìîé-êëþ÷-ïàðîëü".
+
+ SET #êàíàë MLOCK +
+ Óäàëÿåò áëîêèðîâêó ðåæèìîâ; Âñå ðåæèìû êàíàëîâ ñâîáîäíî ìîãóò áûòü
+ èçìåíåíû ëþáûì îïåðàòîðîì êàíàëà.
+
+CHAN_HELP_SET_PEACE
+ Ñèíòàêñèñ: SET #êàíàë PEACE {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îïöèþ ñïîêîéñòâèÿ íà êàíàëå.
+ Êîãäà ñïîêîéñòâèå âêëþ÷åíî, ïîëüçîâàòåëü íå ìîæåò êèêàòü,
+ áàíèòü èëè óäàëÿòü ñòàòóñ íà êàíàëå ñ äðóãîãî ïîëüçîâàòåëÿ ñ óðîâíåì
+ âûøå èëè ðàâíûì êîìàíäàìè %S.
+
+CHAN_HELP_SET_PRIVATE
+ Ñèíòàêñèñ: SET #êàíàë PRIVATE {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îïöèþ ïðèâàòíîñòè íà êàíàëå.
+ Êîãäà ïðèâàòíîñòü âêëþ÷åíà, èñïîëüçîâàíèå /msg %S LIST íå ïîêàæåò
+ äàííûé êàíàë â ñïèñêå.
+
+CHAN_HELP_SET_RESTRICTED
+ Ñèíòàêñèñ: SET #êàíàë RESTRICTED {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îãðàíè÷åííûé äîñòóï íà
+ êàíàë. Êîãäà îãðàíè÷åííûé äîñòóï âêëþ÷åí, ïîëüçîâàòåëè,
+ íå èìåþùèå ïðàâà íà ïîëó÷åíèå ñòàòóñà îïåðàòîðà êàíàëà
+ (ïîëüçîâàòåëè ñ îòðèöàòåëüíûìè óðîâíÿìè äîñòóïà, è, åñëè
+ áåçîïàñíîñòü ñòàòóñà îïà âêëþ÷åíà è ïîëüçîâàòåëÿ íåò â ñïèñêå äîñòóïà) áóäóò
+ íåìåäëåííî çàáàíåíû è âûêèíóòû ñ êàíàëà.
+
+CHAN_HELP_SET_SECURE
+ Ñèíòàêñèñ: SET #êàíàë SECURE {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îïöèè áåçîïàñíîñòè %S äëÿ
+ êàíàëà. Êîãäà SECURE âêëþ÷åíî, òîëüêî ïîëüçîâàòåëè
+ ñ çàðåãèñòðèðîâàííûìè íèêàìè, ïðîèäåíòèôèöèðîâàâøèåñÿ
+ íà %s è âêëþ÷åííûå â ñïèñîê äîñòóïà êàíàëà
+ ñìîãóò âîéòè íà êàíàë.
+
+CHAN_HELP_SET_SECUREOPS
+ Ñèíòàêñèñ: SET #êàíàë SECUREOPS {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò áåçîïàñíîñòü ñòàòóñà îïåðàòîðà êàíàëà.
+ Êîãäà áåçîïàñíîñòü ñòàòóñà îïåðàòîðà âêëþ÷åíà, ïîëüçîâàòåëè, íå ïðîïèñàííûå îïåðàòîðàìè
+ â ñïèñêå äîñòóïà íå ìîãóò ïîëó÷èòü ñòàòóñ îïà íà êàíàëå.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Ñèíòàêñèñ: SET #êàíàë SECUREFOUNDER {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò áåçîïàñíîñòü âëàäåëüöà íà êàíàëå.
+ Êîãäà áåçîïàñíîñòü âëàäåëüöà âêëþ÷åíà, òîëüêî íàñòîÿùèé âëàäåëåö
+ ìîæåò óäàëèòü êàíàë, èçìåíèòü åãî ïàðîëü, åãî âëàäåëüöà è åãî
+ íàñëåäíèêà, à íå ëþáîé, êòî èäåíòèôèöèðóåòñÿ íà %S.
+
+CHAN_HELP_SET_SIGNKICK
+ Ñèíòàêñèñ: SET #êàíàë SIGNKICK {ON | LEVEL | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò ïîäïèñàííûå êèêè
+ íà êàíàëå. Êîãäà SIGNKICK âêëþ÷åí, êèêè ÷åðåç êîìàíäó
+ %S KICK áóäóò "ïîäïèñàíû" òåì, êòî èñïîüçîâàë ýòó êîìàíäó
+ ñ óêàçàíèåì ïðè÷èíû.
+
+ Åñëè Âû èñïîëüçóåòå LEVEL, òîò, ó êîãî óðîâåíü âûøå èëè ðàâåí
+ Âàì (åñëè Âû ïûòàåòåñü åãî êèêíóòü) òî
+ êèê íå ïðîèçîéäåò. Ñì. /msg %S HELP LEVELS äëÿ ïîëó÷åíèÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+
+CHAN_HELP_SET_XOP
+ Ñèíòàêñèñ: SET #êàíàë XOP {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò ñèñòåìó ñïèñêà äîñòóïà xOP íà êàíàëå.
+ Êîãäà XOP âêëþ÷åí, Âû ìîæåòå èñïîëüçîâàòü òîëüêî êîìàíäû AOP/SOP/VOP
+ ÷òîáû èçìåíÿòü ïðèâèëåãèè ïîëüçîâàòåëåé íà êàíàëå,
+ â ïðîòèâîïîëîæíîì ñëó÷àå, âû ìîæåòå èñïîëüçîâàòü êîìàíäó ACCESS.
+
+ Òåõíè÷åñêîå ïðèìå÷àíèå: êîãäà Âû ïåðåêëþ÷èòå ñèñòåìó ïðèâèëåãèé â xOP,
+ âàøè óñòàíîâêè óðîâíåé äëà êàíàëà è ïîëüçîâàòåëåé áóäóò èçìåíåíû,
+ è Âû íå ñìîæåòå âåðíóòü ýòè çíà÷åíèå, ïåðåêëþ÷èâøèñü
+ îáðàòíî â ñèñòåìó ïðèâèëåãèé ACCESS!
+
+ Òàêæå, Âû äîëæíû óäîñòîâåðèòüñÿ â òîì, ÷òî Âàøè ïîëëüçîâàòåëè ïðàâèëüíî ïðîïèñàíû â xOP
+ ëèñòå ïîñëå ïåðåêëþ÷åíèÿ èç ñèñòåìû ACCESS â xOP, ïîòîìó ÷òî
+ ýòî ìîæåò ïðîéòè âîâñå íå áåçóïðå÷íî... âîîáùå, êðàéíå íå ðåêîìåíäóåòñÿ
+ èñïîëüçîâàòü ñèñòåìó xOP åñëè Âû èçìåíèëè çíà÷åíèÿ óðîâíåé, èñïîëüçóÿ
+ êîìàíäó LEVELS.
+
+ Ïåðåêëþ÷åíèå èç ñèñòåìû xOP â ñèñòåìó ACCESS îáû÷íî
+ ïðîõîäèò áåç ïðîáëåì.
+
+CHAN_HELP_SET_OPNOTICE
+ Ñèíòàêñèñ: SET #êàíàë OPNOTICE {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò îï-óâåäîìëåíèå íà êàíàëå.
+ Êîãäà îï-óâåäîìëåíèå âêëþ÷åíî, %S áóäåò ïîñûëàòü íîòèñ
+ íà êàíàë êîãäà êòî-ëèáî èñïîëüçóåò êîìàíäó OP èëè DEOP
+ íà êàíàëå.
+
+CHAN_HELP_AOP
+ Ñèíòàêñèñ: AOP #êàíàë ADD íèê
+ AOP #êàíàë DEL {nick | íîìåð-çàïèñè | list}
+ AOP #êàíàë LIST [ìàñêà | list]
+ AOP #êàíàë CLEAR
+
+ Ïîääåðæèâàåò ñïèñîê AOP (ÀâòîÎïåðàòîðîâ) êàíàëà. AOP
+ äàåò âîçìîæíîñòü ïîëüçîâàòåëþ ïîëó÷èòü îïà ïðè âõîäå íà êàíàë,
+ ñíèìàòü ñ ñåáÿ áàíû, ïðèãëàøàòü ïî íåîáõîäèìîñòè, èìåòü ïðèâåòñòâåííîå
+ ñîîáùåíèå âõîäà íà êàíàë, è ìíîãîå äðóãîå.
+
+ Êîìàíäà AOP ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê
+ AOP'îâ.
+
+ Êîìàíäà AOP DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà
+ AOP'îâ. Åñëè ïàðàìåòð óêàçûâàåò íà íîìåð çàïèñè, äàííûå
+ çàïèñè áóäóò óäàëåíû. (Ñì. ïðèìåðû êîìàíäû LIST íèæå.)
+
+ Êîìàíäà AOP LIST ïîêàçûâàåò ñïèñîê AOP'îâ. Åñëè
+ èñïîëüçîâàòü ñèìâîëüíóþ ìàñêó, òîëüêî ñîâïàäàþùèå ñ íåé çàïèñè
+ áóäóò ïîêàçàíû. Åñëè óêàçàí ñïèñîê íîìåðîâ çàïèñåé,
+ òîëüêî ýòè çàïèñè áóäóò ïîêàçàíû; íàïðèìåð:
+
+ AOP #êàíàë LIST 2-5,7-9
+ Ïîêàæåò AOP'îâ, çàïèñè ñî 2 äî 5 è ñ
+ 7 äî 9.
+
+ Êîìàíäà AOP CLEAR óäàëÿåò âñå çàïèñè èç ñïèñêà
+ AOP'îâ.
+
+ Êîìàíäû AOP ADD è AOP DEL ìîãóò èñïîëüçîâàòü òîëüêî
+ SOP'û èëè âûøå, à êîìàíäó AOP CLEAR ìîæåò èñïîëüçîâàòü òîëüêî
+ âëàäåëåö êàíàëà. Òåì íå ìåíåå, ëþáîé ïîëüçîâàòåëü èç ñïèñêà
+ AOP'îâ ìîæåò èñïîëüçîâàòü êîìàíäó AOP LIST.
+
+ Ýòà êîìàíäà ìîæåò áûòü îòêëþ÷åíà íà Âàøåì êàíàëå, è
+ òîãäà âû äîëæåí èñïîëüçîâàòü êîìàíäû ñïèñêà äîñòóïà (access list). Ñì.
+ /msg %S HELP ACCESS äëÿ ïîëó÷åíèÿ èíôîðìàöèè îá èñïîëüçîâàíèè ñïèñêà äîñòóïà,
+ è /msg %S HELP SET XOP ÷òîáû óçíàòü êàê ïåðåêëþ÷èòüñÿ ìåæäó ñèñòåìàìè
+ ñïèñîê äîñòóïà è ñèñòåìîé xOP.
+
+CHAN_HELP_HOP
+ Ñèíòàêñèñ: HOP #êàíàë ADD íèê
+ HOP #êàíàë DEL {íèê | íîìåð çàïèñè | list}
+ HOP #êàíàë LIST [ìàñêà | list]
+ HOP #êàíàë CLEAR
+
+ Ïîääåðæèâàåò ñïèñîê HOP (ÏîëóÎïåðàòîðîâ) êàíàëà. Ñïèñîê HOP
+ âêëþ÷àåò ïîëüçîâàòåëåé, êîòîðûå ìîãó ïîëó÷èòü ñòàòóñ ïîëóîïåðàòîðà
+ íà êàíàëå.
+
+ Êîìàíäà HOP ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê
+ HOP'îâ.
+
+ Êîìàíäà HOP DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà
+ HOP'îâ. Åñëè ïàðàìåòð óêàçûâàåò íà íîìåð çàïèñè, äàííûå
+ çàïèñè áóäóò óäàëåíû. (Ñì. ïðèìåðû êîìàíäû LIST íèæå.)
+
+ Êîìàíäà HOP LIST ïîêàçûâàåò ñïèñîê HOP'îâ. Åñëè
+ èñïîëüçîâàòü ñèìâîëüíóþ ìàñêó, òîëüêî ñîâïàäàþùèå ñ íåé çàïèñè
+ áóäóò ïîêàçàíû. Åñëè óêàçàí ñïèñîê íîìåðîâ çàïèñåé,
+ òîëüêî ýòè çàïèñè áóäóò ïîêàçàíû; íàïðèìåð:
+
+ HOP #êàíàë LIST 2-5,7-9
+ Ïîêàæåò çàïèñè HOP'îâ ñ íîìåðàìè ñ 2 äî 5 è ñ
+ 7 ïî 9.
+
+ Êîìàíäà HOP CLEAR óäàëÿåò âñå çàïèñè èç ñïèñêà
+ HOP'îâ.
+
+ Êîìàíäû HOP ADD è HOP DEL ìîãóò èñïîëüçîâàòü òîëüêî
+ AOP'û èëè âûøå, à êîìàíäó HOP CLEAR ìîæåò èñïîëüçîâàòü òîëüêî
+ âëàäåëåö êàíàëà.
+
+ Ýòà êîìàíäà ìîæåò áûòü îòêëþ÷åíà íà Âàøåì êàíàëå, è
+ òîãäà âû äîëæåí èñïîëüçîâàòü êîìàíäû ñïèñêà äîñòóïà (access list). Ñì.
+ /msg %S HELP ACCESS äëÿ ïîëó÷åíèÿ èíôîðìàöèè îá èñïîëüçîâàíèè ñïèñêà äîñòóïà,
+ è /msg %S HELP SET XOP ÷òîáû óçíàòü êàê ïåðåêëþ÷èòüñÿ ìåæäó ñèñòåìàìè
+ ñïèñîê äîñòóïà è ñèñòåìîé xOP.
+
+CHAN_HELP_SOP
+ Ñèíòàêñèñ: SOP #êàíàë ADD íèê
+ SOP #êàíàë DEL {íèê | íîìåð çàïèñè | list}
+ SOP #êàíàë LIST [ìàñêà | list]
+ SOP #êàíàë CLEAR
+
+ Âêëþ÷àåò ñïèñîê SOP (ÑóïåðÎïåðàòîðîâ) êàíàëà. Ñïèñîê SOP'îâ
+ âêëþ÷àåò ïîëüçîâàòåëåé, ó êîòîðûõ åñòü âñå ïðàâà AOP'îâ, è êðîìå òîãî
+ îíè ìîãóò èñïîëüçîâàòü àâòîêèê è öåíçóðó ñëîâ,
+ îòïðàâëÿòü è ÷èòàòü ñîîáùåíèÿ êàíàë, è ìíîãîå äðóãîå.
+
+ Êîìàíäà SOP ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê
+ SOP'îâ.
+
+ Êîìàíäà SOP DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà
+ SOP'îâ. Åñëè ïàðàìåòð óêàçûâàåò íà íîìåð çàïèñè, äàííûå
+ çàïèñè áóäóò óäàëåíû. (Ñì. ïðèìåðû êîìàíäû LIST íèæå.)
+
+ Êîìàíäà SOP LIST ïîêàçûâàåò ñïèñîê SOP'îâ. Åñëè
+ èñïîëüçîâàòü ñèìâîëüíóþ ìàñêó, òîëüêî ñîâïàäàþùèå ñ íåé çàïèñè
+ áóäóò ïîêàçàíû. Åñëè óêàçàí ñïèñîê íîìåðîâ çàïèñåé,
+ òîëüêî ýòè çàïèñè áóäóò ïîêàçàíû; íàïðèìåð:
+
+ SOP #êàíàë LIST 2-5,7-9
+ Ïîêàæåò ñïèñîê AOP'îâ ñ íîìåðàìè çàïèñåé îò 2 äî 5 è îò
+ 7 äî 9.
+
+ Êîìàíäà SOP CLEAR óäàëèò âñå çàïèñè èç ñïèñêà
+ SOP'îâ.
+
+ Êîìàíäû SOP ADD, SOP DEL è SOP CLEAR ìîãóò áûòü èñïîëüçîâàíû
+ òîëüêî âëàäåëüöåì êàíàëà. Òåì íå ìåíåå, ëþáîé ïîëüçîâàòåëü èç ñïèñêà
+ AOP'îâ ìîæåò èñïîëüçîâàòü êîìàíäó SOP LIST.
+
+ Ýòà êîìàíäà ìîæåò áûòü îòêëþ÷åíà íà Âàøåì êàíàëå, è
+ òîãäà âû äîëæåí èñïîëüçîâàòü êîìàíäû ñïèñêà äîñòóïà (access list). Ñì.
+ /msg %S HELP ACCESS äëÿ ïîëó÷åíèÿ èíôîðìàöèè îá èñïîëüçîâàíèè ñïèñêà äîñòóïà,
+ è /msg %S HELP SET XOP ÷òîáû óçíàòü êàê ïåðåêëþ÷èòüñÿ ìåæäó ñèñòåìàìè
+ ñïèñîê äîñòóïà è ñèñòåìîé xOP.
+
+CHAN_HELP_VOP
+ Ñèíòàêñèñ: VOP #êàíàë ADD íèê
+ VOP #êàíàë DEL {íèê | íîìåð çàïèñè | list}
+ VOP #êàíàë LIST [ìàñêà | list]
+ VOP #êàíàë CLEAR
+
+ Âêëþ÷àåò ñïèñîê VOP (Âîéñîâ) êàíàëà.
+ Ñïèñîê VOP âêëþ÷àþò ïîëüçîâàòåëåé, êîòîðûå ìîãóò ïîëó÷èòü âîéñ
+ íà êàíàëå ïî íåîáõîäèìîñòè.
+
+ Êîìàíäà VOP ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê
+ VOP'îâ.
+
+ Êîìàíäà VOP DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà
+ VOP'îâ. Åñëè ïàðàìåòð óêàçûâàåò íà íîìåð çàïèñè, äàííûå
+ çàïèñè áóäóò óäàëåíû. (Ñì. ïðèìåðû êîìàíäû LIST íèæå.)
+
+ Êîìàíäà VOP LIST ïîêàçûâàåò ñïèñîê VOP'îâ. Åñëè
+ èñïîëüçîâàòü ñèìâîëüíóþ ìàñêó, òîëüêî ñîâïàäàþùèå ñ íåé çàïèñè
+ áóäóò ïîêàçàíû. Åñëè óêàçàí ñïèñîê íîìåðîâ çàïèñåé,
+ òîëüêî ýòè çàïèñè áóäóò ïîêàçàíû; íàïðèìåð:
+
+ VOP #êàíàë LIST 2-5,7-9
+ Ïîêàæåò ñïèñîê VOP'îâ ñ íîìåðàìè çàïèñåé îò 2 äî 5 è îò
+ 7 äî 9.
+
+ Êîìàíäà VOP CLEAR óäàëèò âñå çàïèñè èç ñïèñêà
+ VOP'îâ.
+
+ Êîìàíäû VOP ADD è VOP DEL ìîãóò èñïîëüçîâàòü òîëüêî
+ AOP'û èëè âûøå, à êîìàíäó VOP CLEAR ìîæåò èñïîëüçîâàòü òîëüêî
+ âëàäåëåö êàíàëà.
+
+ Ýòà êîìàíäà ìîæåò áûòü îòêëþ÷åíà íà Âàøåì êàíàëå, è
+ òîãäà âû äîëæåí èñïîëüçîâàòü êîìàíäû ñïèñêà äîñòóïà (access list). Ñì.
+ /msg %S HELP ACCESS äëÿ ïîëó÷åíèÿ èíôîðìàöèè îá èñïîëüçîâàíèè ñïèñêà äîñòóïà,
+ è /msg %S HELP SET XOP ÷òîáû óçíàòü êàê ïåðåêëþ÷èòüñÿ ìåæäó ñèñòåìàìè
+ ñïèñîê äîñòóïà è ñèñòåìîé xOP.
+
+CHAN_HELP_ACCESS
+ Ñèíòàêñèñ: ACCESS #êàíàë ADD íèê óðîâåíü
+ ACCESS #êàíàë DEL {íèê | íîìåð çàïèñè | list}
+ ACCESS #êàíàë LIST [ìàñêà | list]
+ ACCESS #êàíàë CLEAR
+
+ Óïðàâëÿåò ñïèñêîì äîñòóïà êàíàëà. Ñïèñîê äîñòóïà
+ îïðåäåëÿåò êàêèå ïîëüçîâàòåëè ìîãóò áûòü îïåðàòîðàìè êàíàëà,
+ èìåòü äîñòóï ê êîìàíäàì %S íà êàíàë. Ðàçëè÷íûå óðîâíè äîñòóïà
+ ðàçðåøàþò äîñòóï ê ðàçëè÷íûì íàñòðîéêàì êàíàëà è îïðåäåëÿþò ïîëüçîâàòåëüñêèå
+ ïðèâèëåãèè; /msg %S HELP ACCESS LEVELS äëÿ ïîëó÷åíèÿ áîëåå
+ ïîäðîáíîé èíôîðìàöèè. Ëþáîé, íå âêëþ÷åííûé â ñïèñîê äîñòóïà ïîëüçîâàòåëü
+ ñ÷èòàåòñÿ ïîëüçîâàòåëåì â óðîâíåì äîñòóïà 0.
+
+ Êîìàíäà ACCESS ADD äîáàâëÿåò óêàçàííûé íèê â
+ ñïèñîê äîñòóïà ñ óêàçàííûì æå óðîâíåì; åñëè äàííûé íèê óæå
+ óæå åñòü â ñïèñêå, åãî óðîâåíü áóäåò èçìåíåí íà óêàçàííûé
+ â ýòîé êîìàíäå. Óêàçàííûé óðîâåíü
+ äîëæåí áûòü ìåíüøå ÷åì óðîâåíü ïîëüçîâàòåëÿ, âûçâàâøåãî ýòî êîìàíäó, è
+ åñëè íèê óæå åñòü â ñïèñêå äîñòóïà, òåêóùèé
+ óðîâåíü äîñòóïà äàííîãî íèêà äîëæåí áûòü ìåíüøå, ÷åì óðîâíü äîñòóïà
+ ïîëüçîâàòåëÿ, âûçâàâøåãî ýòó êîìàíäó.
+
+ Êîìàíäà ACCESS DEL óäàëÿåò óêàçàííûé íèê èç
+ ñïèñêà äîñòóïà. åñëè óêàçàíû íîìåðà çàïèñåé, äàííûå çàïèñè
+ áóäóò óäàëåíû. (ñì. ïðèìåð èñïîëüçîâàíèÿ êîìàíäû LIST íèæå.)
+
+ Êîìàíäà ACCESS LIST ïîêàçûâàåò ñïèñîê äîñòóïà. Åñëè
+ óêàçàòü ñèìâîëüíóþ ìàñêó, òîëüêî ñîâïàäàþùèå ñ íåé çíà÷åíèÿ
+ áóäóò ïîêàçàíû. Åñëè óêàçàòü íîìåðà çàïèñåé, òî òîëüêî,
+ ýòè çàïèñè áóäåò ïîêàçàíû; íàïðèìåð:
+
+ ACCESS #êàíàë LIST 2-5,7-9
+ Ïîêàæåò â ñïèñêå äîñòóïà êàíàëà çàïèñè ñî 2 ïî 5 è ñ
+ 7 ïî 9.
+
+ Êîìàíäà ACCESS CLEAR óäàëÿåò âñå çàïèñè èç
+ ñïèñêà äîñòóïà.
+
+CHAN_HELP_ACCESS_LEVELS
+ Óðîâíè äîñòóïà ïîëüçîâàòåëåé
+
+ Ïî óìîë÷àíèþ, îïðåäåëåíû íèæåñëåäóþùèå çíà÷åíèÿ óðîâíåé äîñòóïà:
+
+ Founder Ïîëíûé äîñòóï ê ôóíêöèÿì %S; àâòîìàòè÷åñêîå ïîëó÷åíèå
+ ñòàòóñà îïåðàòîðà ïðè âõîäå íà êàíàë. Ïîìíèòå,
+ ÷òî òîëüêî îäèí ÷åëîâåê ìîæåò èìåòü ñòàòóñ
+ âëàäåëüöà (è ýòî íåëüçÿ íèêàê èçìåíèòü êîìàíäîé
+ ACCESS).
+  10 Äîñòóï ê êîìàíäå AKICK; àâòîîï.
+  5 Àâòîîï.
+  3 Àâòîâîéñ.
+  0 Íèêàêèõ îñîáûõ ïðèâèëåãèé; ìîæåò áûòü îïíóò äðóãèì
+ îïîì (òîëüêî åñëè áåçîïàñíîñòü ñòàòóñà îïà âûêëþ÷åíà).
+  <0 Íå ìîæåò ïîëó÷èü îïà íà êàíàëå.
+
+ Ýòè óðîâíè ìîãóò áûòü èçìåíåíû, âîçìîæíî äîáàâëåíèå íîâûõ óðîâíåé, èñïîëüçóÿ
+ êîìàíäó LEVELS; íàïèøèòå /msg %S HELP LEVELS äëÿ áîëåå ïîëíîé
+ èíôîðìàöèè.
+
+CHAN_HELP_AKICK
+ Ñèíòàêñèñ: AKICK #êàíàë ADD ìàñêà [ïðè÷èíà]
+ AKICK #êàíàë STICK ìàñêà
+ AKICK #êàíàë UNSTICK ìàñêà
+ AKICK #êàíàë DEL ìàñêà
+ AKICK #êàíàë LIST [ìàñêà]
+ AKICK #êàíàë VIEW [ìàñêà]
+ AKICK #êàíàë ENFORCE
+ AKICK #êàíàë CLEAR
+
+ Ïîääåðæèâàåò ñïèñîê àâòîêèêîâ êàíàëà. Åñëè ïîëüçîâàòåëü,
+ âêëþ÷åííûé â ñïèñîê àâòîêèêîâ ïîïûòàåòñÿ çàéòè íà êàíàë,
+ %S çàáàíèò åãî íà êàíàëå, à çàòåì âûêèíåò
+ åãî.
+
+ Êîìàíäà AKICK ADD äîáàâëÿåò íèê èëè ìàñêó
+ â ñïèñîê àâòîêèêîâ. Åñëè óêàçàíà ïðè÷èíà,
+ òî îíà áóäåò èñïîëüçîâàíà, êîãäà ïîëüçîâàòåëü áóäåò
+ êèêíóò; åñëè ïðè÷èíà íå óêàçàíà, áóäåò èñïîëüçîâàíà ïðè÷èíà ïî óìîë÷àíèþ: "You have been
+ banned from the channel".
+
+ Êîìàíäà AKICK STICK ñîçäàåò ïîñòîÿííûé áàí óêàçàííîé ìàñêè
+ íà êàíàëå. Åñëè êòî-òî ïîïûòàåòñÿ óäàëèòü ýòîò áàí, %S
+ àâòîìàòè÷åñêè óñòàíîâèò åãî ñíîâà. Âû ìîæåòå èñïîëüçîâàòü ýòî
+ äëÿ çàðåãèñòðèðîâàííûõ íèêîâ.
+
+ Êîìàíäà AKICK UNSTICK îòìåíÿåò ýôôåêò, âûçûâàåòìûé êîìàíäîé
+ AKICK STICK, íî áàí ñ êàíàëà Âû äîëæíû
+ óäàëèòü âðó÷íóþ.
+
+ Êîìàíäà AKICK DEL óäàëÿåò óêàçàííûé íèê èëè ìàñêó
+ èç ñïèñêà àâòîêèêîâ. Òåì íå ìåíåå, ýòî íå óäàëèò áàíû
+ ñ êàíàëà; îíè äîëæíû áûòü óäàëåíû
+ âðó÷íóþ.
+
+ Êîìàíäà AKICK LIST ïîêàçûâàåò òåêóùèé ñïèñîê àâòîêèêîâ, èëè
+ îïöèîíàëüíî ïîêàçûâàåò àâòîêèêè èç óêàçàííîé
+ ìàñêè.
+
+ Êîìàíäà AKICK VIEW ýòî áîëåå ïîäðîáíàÿ âåðñèÿ êîìàíäû
+ AKICK LIST.
+
+ Êîìàíäà AKICK ENFORCE çàñòàâëÿåò %S íåìåäëåíî
+ ïðîâåðèòü ñïèñîê àêèêîâ è óäàëèòü ñ êàíàëà ïîëüçîâàòåëåé, âêëþ÷åííûõ
+ â íåãî.
+
+ Êîìàíäà AKICK CLEAR óäàëÿåò âñå çàïèñè
+ èç ñïèñêà àâòîêèêîâ.
+
+CHAN_HELP_LEVELS
+ Ñèíòàêñèñ: LEVELS #êàíàë SET òèï óðîâåíü
+ LEVELS #êàíàë {DIS | DISABLE} òèï
+ LEVELS #êàíàë LIST
+ LEVELS #êàíàë RESET
+
+ Êîìàíäà LEVELS ïîçâîëÿåò óäîáíî óïðàâëÿòü óðîâíÿìè
+ äîñòóïà, èñïîëüçóåìûìè äëÿ ñïèñêîâ äîñòóïà. Èñïîëüçóé ýòó
+ êîìàíäó, Âû ìîæåòå îïðåäåëèòü óðîâåíü äîñòóïà, òðåáóåìûé äëÿ áîëüøèíñòâà
+ ôóíêöèé %S'à. (Êîìàíäû SET FOUNDER è SET PASSWORD,
+ òàêæå êàê ýòó êîìàíäà, ìîæåò èñïîëüçîâàòü òîëüêî
+ âëàäåëåö êàíàëà.)
+
+ LEVELS SET óñòàíàâëèâàåò óðîâåíü äîñòóïà äëÿ ôóíêöèè èëè ãðóïïû ôóíêöèé.
+ LEVELS DISABLE (èëè DIS - òàê êîðî÷å ;)
+ îòêëþ÷àåò ôóíêöèþ èëè çàïðåùàåò äîñòóï ê ôóíêöèè
+ âñåì, êðîìå âëàäåëüöà êàíàëà.
+ LEVELS LIST ïîêàæåò òåêóùèå óðîâíè äîñòóïà äëÿ êàæäîé ôóíêöèè èëè
+ ãðóïïû ôóíêöèé. LEVELS RESET ñáðîñèò âñå íàñòðîéêè óðîâíåé
+ äîñòóïà íà íàñòðîéêè ïî óìîë÷àíèþ (ñì.
+ HELP ACCESS LEVELS).
+
+ ×òîáû ïîñìîòðåòü ñïèñîê ôóíêöèé, íà êîòîðûå ìîæíî îïðåäåëÿòü óðîâíè äîñòóïà,
+ ñì. HELP LEVELS DESC.
+
+CHAN_HELP_LEVELS_DESC
+ Ñëåäóþùàÿ ôóíêöèÿ ïðèíÿòà. Ïðèìå÷àíèå:
+ óðîâíè äëÿ Àâòîäåîï è çàïðåòà íà âõîä ÿâëÿþòñÿ ìèíèìàëüíûìè,
+ â òî âðåìÿ êàê âñå îñòàëüíûå ÿâëÿþòñÿ ìàêñèìàëüíûìè.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Ñèíòàêñèñ: INFO #êàíàë [ALL]
+
+ Ïîêàçûâàåò èíôîðìàöèþ îá óêàçàííîì êàíàëå,
+ âêëþ÷àÿ åãî âëàäåëüöà, âðåìÿ ðåãèñòðàöèè, êîãäà áûë ïîñëåäíèé
+ ðàç èñïîëüçîâàí, îïèñàíèå, çàáëîêèðîâàííûå ðåæèìû, åñëè îíè èìåþò ìåñòî áûòü. Åñëè
+ óêàçàí ïàðàìåòð ALL, òàêæå áóäåò ïîêàçàíî ñîîáùåíèå âõîäà è
+ íàñëåäíèê.
+
+ Ïî óìîë÷àíèþ, îïöèþ ALL ìîæåò èñïîëüçîâàòü òîëüêî
+ âëàäåëåö êàíàëà.
+
+CHAN_HELP_LIST
+ Ñèíòàêñèñ: LIST ìàñêà
+
+ Ïîêàæåò âñå çàðåãèñòðèðîâàííûå êàíàëû ïî óêàçàííîé ñèìâîëüíîé ìàñêå.
+ (Êàíàëû ñ âêëþ÷åííîé îïöèåé PRIVATE íå áóäóò ïîêàçàíû.)
+
+CHAN_HELP_OP
+ Ñèíòàêñèñ: OP [#êàíàë [íèê]]
+
+ Äàåò ñòàòóñ îïåðàòîðà êàíàëà óêàçàííîìó íèêó íà óêàçàííîì êàíàëå. Åñëè íèê íå óêàçàí,
+ äàåò ñòàòóñ îïåðàòîðà êàíàëà Âàì. Åñëè êàíàë è íèê íå óêàçàíû,
+ äàåò ñòàòóñ îïåðàòîðà íà âñåõ êàíàëàõ, íà êîòîðûõ ó Âàñ åñòü
+ ñîîòâåòñòâóþùèå ïðàâà äîñòóïà.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîëüçîâàíà AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå.
+
+CHAN_HELP_DEOP
+ Ñèíòàêñèñ: DEOP [#êàíàë [íèê]]
+
+ Ñíèìàåò ñòàòóñ îïåðàòîðà êàíàëà ñ óêàçàííîãî íèêà íà óêàçàííîì êàíàëå. Åñëè íèê íå óêàçàí,
+ ñíèìàåò ñòàòóñ îïåðàòîðà ñ Âàñ. Åñëè íè êàíàë, íè íèê íå óêàçàíû, ñíèìàåò ñòàòóñ,
+ îïåðàòîðà ñ Âàñ íà âñåõ êàíàëõ, íà êîòîðûõ ó Âàñ åñòü ñîîòâåòñòâóþùèå
+ ïðàâà äîñòóïà.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîëüçîâàíà AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå.
+
+CHAN_HELP_VOICE
+ Ñèíòàêñèñ: VOICE [#êàíàë [íèê]]
+
+ Äàåò âîéñ óêàçàííîìó íèêó íà óêàçàííîì êàíàëå. Åñëè íèê íå óêàçàí,
+ äàåò âîéñ Âàì. Åñëè êàíàë è íèê íå óêàçàíû,
+ äàåò âîéñ Âàì íà âñåõ êàíàëàõ, íà êîòîðûõ ó Âàñ åñòü
+ ñîîòâåòñòâóþùèå ïðàâà äîñòóïà.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîëüçîâàíà AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå. Ìîæåò áûòü èñïîëüçîâàíà VOP'àìè (ëèáî ëèöàìè ñ óðîâíåì äîñòóïà áîëüøå 3)
+ ÷òîáû äàòü âîéñ ñàìîìó ñåáå.
+
+CHAN_HELP_DEVOICE
+ Ñèíòàêñèñ: DEVOICE [#êàíàë [íèê]]
+
+ Ñíèìàåò âîéñ ñ óêàçàííîãî íèêà íà óêàçàíîì êàíàëå. Åñëè íèê íå óêàçàí,
+ ñíèìåò âîéñà ñ Âàñ. Åñëè êàíàë è íèê íå óêàçàíû,
+ ñíèìåò âîéñ ñ Âàñ íà âñåõ êàíàëàõ, íà êîòîðûõ ó Âàñ åñòü
+ ñîîòâåòñòâóþùèå ïðàâà äîñòóïà.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîëüçîâàíà AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå. Ìîæåò áûòü èñïîëüçîâàíà VOP'àìè (ëèáî ëèöàìè ñ óðîâíåì äîñòóïà áîëüøå 3)
+ ÷òîáû ñíÿòü âîéñ ñ ñåáÿ.
+
+CHAN_HELP_HALFOP
+ Ñèíòàêñèñ: HALFOP [#êàíàë [íèê]]
+
+ Äàåò ñòàòóñ ïîëóîïåðàòîðà êàíàëà óêàçàííîìó íèêó íà óêàçàííîì êàíàëå. Åñëè íèê íå óêàçàí,
+ äàåò ñòàòóñ ïîëóîïåðàòîðà êàíàëà Âàì. Åñëè êàíàë è íèê íå óêàçàíû,
+ äàåò ñòàòóñ ïîëóîïåðàòîðà íà âñåõ êàíàëàõ, íà êîòîðûõ ó Âàñ åñòü
+ ñîîòâåòñòâóþùèå ïðàâà äîñòóïà.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîëüçîâàíà AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå. Ìîæåò áûòü èñïîëüçîâàíà HOP'àìè (ëèáî ëèöàìè ñ óðîâíåì äîñòóïà áîëüøå 4)
+ ÷òîáû äàòü ñòàòóñ ïîëóîïåðàòîðà ñåáå.
+
+CHAN_HELP_DEHALFOP
+ Ñèíòàêñèñ: DEHALFOP [#êàíàë [íèê]]
+
+ Ñíèìàåò ñòàòóñ ïîëóîïåðàòîðà êàíàëà ñ óêàçàííîãî íèêà íà óêàçàííîì êàíàëå. Åñëè íèê íå óêàçàí,
+ ñíèìàåò ñòàòóñ ïîëóîïåðàòîðà ñ Âàñ. Åñëè íè êàíàë, íè íèê íå óêàçàíû, ñíèìàåò ñòàòóñ,
+ ïîëóîïåðàòîðà ñ Âàñ íà âñåõ êàíàëõ, íà êîòîðûõ ó Âàñ åñòü ñîîòâåòñòâóþùèå
+ ïðàâà äîñòóïà.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîëüçîâàíà AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå. Ìîæåò áûòü èñïîëüçîâàíà HOP'àìè (ëèáî ëèöàìè ñ óðîâíåì äîñòóïà áîëüøå 4)
+ ÷òîáû ñíÿòü ñòàòóñ ïîëóîïåðàòîðà ñ ñåáÿ.
+
+CHAN_HELP_PROTECT
+ Ñèíòàêñèñ: PROTECT [#êàíàë [íèê]]
+
+ Ñòàâèò çàùèòó íà óêàçàííûé íèê íà óêàçàííîì êàíàëå. Åñëè íèê íå óêàçàí,
+ ñòàâèò çàùèòó íà Âàñ. Åñëè êàíàë è íèê íå óêàçàíû,
+ ñòàâèò çàùèòó íà Âàñ íà âñåõ êàíàëàõ, íà êîòîðûõ ó Âàñ åñòü
+ ñîîòâåòñòâóþùèå ïðàâà äîñòóïà.
+
+ Ïî óìîë÷àíèþ ìîæåò áûòü èñïîëüçîâàíà òîëüêî âëàäåëüöåì. SOP'û ëèáî ëèöà ñ óðîâíåì
+ äîñòóïà 10 è ëó÷øå ìîãóò èñïîëüçîâàòü ýòó êîìàíäó òîëüêî íà ñåáÿ.
+
+CHAN_HELP_DEPROTECT
+ Ñèíòàêñèñ: DEPROTECT [#êàíàë [íèê]]
+
+ Ñíèìàåò çàùèòó íà óêàçàííûé íèê íà óêàçàííîì êàíàëå. Åñëè íèê íå óêàçàí,
+ ñíèìàåò çàùèòó ñ Âàñ. Åñëè êàíàë è íèê íå óêàçàíû,
+ ñíèìàåò çàùèòó ñ Âàñ íà âñåõ êàíàëàõ, íà êîòîðûõ ó Âàñ åñòü
+ ñîîòâåòñòâóþùèå ïðàâà äîñòóïà.
+
+ Ïî óìîë÷àíèþ ìîæåò áûòü èñïîëüçîâàíà òîëüêî âëàäåëüöåì. SOP'û ëèáî ëèöà ñ óðîâíåì
+ äîñòóïà 10 è ëó÷øå ìîãóò èñïîëüçîâàòü ýòó êîìàíäó òîëüêî íà ñåáÿ.
+
+CHAN_HELP_OWNER
+ Ñèíòàêñèñ: OWNER [#êàíàë]
+
+ Äàåò Âàì ñòàòóñ âëàäåëüöà êàíàëà. Åñëè êàíàë íå óêàçàí,
+ äàñò Âàì ñòàòóñ âëàäåëüöà íà âñåõ êàíàëàõ, íà êîòîðûõ ó Âàñ
+ åñòü ñîîòâåòñòâóþùèå ïðàâà äîñòóïà.
+
+ Ìîæåò áûòü èñïîëüçîâàíà òîëüêî ÄÅÉÑÒÂÈÒÅËÜÍÛÌ âëàäåëüöåì êàíàëà.
+
+CHAN_HELP_DEOWNER
+ Ñèíòàêñèñ: DEOWNER [#êàíàë]
+
+ Ñíèìàåò ñ Âàñ ñòàòóñ âëàäåëüöà êàíàëà. Åñëè êàíàë íå óêàçàí,
+ ñíèìàåò ñ Âàñ ñòàòóñ âëàäåëüöà íà âñåõ êàíàëàõ, íà êîòîðûõ ó Âàñ
+ åñòü ñîîòâåòñòâóþùèå ïðàâà äîñòóïà.
+
+ Ìîæåò áûòü èñïîëüçîâàíà òîëüêî ÄÅÉÑÒÂÈÒÅËÜÍÛÌ âëàäåëüöåì êàíàëà.
+
+CHAN_HELP_INVITE
+ Ñèíòàêñèñ: INVITE êàíàë
+
+ Çàñòàâèò %S ïðèãëàñèòü Âàñ íà óêàçàííûé êàíàë.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîüçîâàíà òîëüêî AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå.
+
+CHAN_HELP_UNBAN
+ Ñèíòàêñèñ: UNBAN êàíàë
+
+ Çàñòàâèò %S óäàëèòü ñ óêàçàííîãî êàíàëà âñå áàíû, íå ïîçâîëÿþùèå
+ Âàì çàéòè íà íåãî.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîüçîâàíà òîëüêî AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå.
+
+CHAN_HELP_KICK
+ Ñèíòàêñèñ: KICK [#êàíàë [íèê [ïðè÷èíà]]]
+
+ Âûêèäûâàåò óêàçàííîãî ïîëüçîâàòåëÿ ñ óêàçàííîãî êàíàëà. Åñëè íèê íå óêàçàí,
+ âûêèäûâàåò Âàñ. Åñëè êàíàë è íèê íå óêàçàíû,
+ âûêèíåò Âàñ ñî âñåõ êàíàëîâ, íà êîòîðûõ ó Âàñ åñòü ñîîòâåòñòâóþùèå ïðàâà
+ äîñòóïà.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîüçîâàíà òîëüêî AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå.
+
+CHAN_HELP_BAN
+ Ñèíòàêñèñ: BAN [#êàíàë [íèê [ïðè÷èíà]]]
+
+ Áàíèò óêàçàííûé íèê íà óêàçàííîì êàíàëå. Åñëè íèê íå óêàçàí,
+ áàíèò Âàñ. Åñëè êàíàë è íèê íå óêàçàí,
+ áàíèò Âàñ íà âñåõ êàíàëàõ, íà êîòîðûõ ó Âàñ åñòü ñîîòâåòñòâóþùèå
+ ïðàâà äîñòóïà.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîüçîâàíà òîëüêî AOP'àìè èëè ëèöàìè ñ óðîâíåì äîñòóïà 5
+ è âûøå.
+
+CHAN_HELP_TOPIC
+ Ñèíòàêñèñ: TOPIC #êàíàë [òîïèê]
+
+ Çàñòàâèò %S èçìåíèòü òîïèê êàíàëà íà óêàçàííûé
+ Âàìè. Åñëè òîïèê íå óêàçàí, òî îí áóäåò ïîëíîñòüþ
+ óäàëåí. Ýòó êîìàíäó îáû÷íî èñïîëüçóþò äëÿ óñòàíîâêè òîïèêà ïðè âêëþ÷åííîé
+ îïöèè SET TOPICLOCK. Íàïèøèòå /msg %S HELP SET TOPICLOCK
+ äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîëüçîâàíà òîëüêî
+ âëàäåëüöåì êàíàëà.
+
+CHAN_HELP_CLEAR
+ Ñèíòàêñèñ: CLEAR #êàíàë ÷òî_èìåííî
+
+ Çàñòàâëÿåò %S î÷èñòèòü îïðåäåëåííûå ðåæèìû è íàñòðîéêè êàíàëà. ÷òî_èìåííî
+ ìîæåò áûòü îäíèì èç:
+
+ MODES Ñáðîñèòü âñå ðåæèìû êàíàëà (ò.å. óäàëèòü
+ ðåæèìû i,k,l,m,n,p,s,t).
+ BANS Óäàëèòü âñå áàíû íà êàíàëå.
+ EXCEPTS Óäàëèòü âñå èñêëþ÷åíèÿ èç áàíîâ íà êàíàëå.
+ OPS Ñíÿòü ñòàòóñ îïåðàòîðà (ðåæèì +o) ñî
+ âñåõ îïåðàòîðîâ êàíàëà.
+ VOICES Ñíÿòü "âîéñû" (ðåæèì +v) ñî âñåõ,
+ íà êîì óñòàíîâëåí ýòîò ðåæèì.
+ USERS Óäàëèòü (âûêèíóòü) âñåõ ïîëüçîâàòåëåé ñ êàíàëà.
+
+ Ïî óìîë÷àíèþ, ìîæåò áûòü èñïîëüçîâàíà òîëüêî
+ âëàäåëüöåì êàíàëà.
+
+CHAN_HELP_GETKEY
+ Ñèíòàêñèñ: GETKEY #êàíàë
+
+ Âîçâðàùàåò ñåêðåòíûé êëþ÷ (ïàðîëü äëÿ âõîäà) êàíàëà. Ýòà êîìàíäà
+ îáû÷íî èñïîëüçóåòñÿ áîòàìè è/èëè ñêðèïòàìè, êîìàíäà âîçâðàùàåò
+ òàêóþ ñòðîêó:
+
+ KEY <#êàíàë> <ñåêðåòíûé êëþ÷>
+
+ åñëè ñåêðåòíûé êëþ÷ ïîêàçàí êàê "NO KEY" - êëþ÷à íà êàíàëå íåò.
+
+CHAN_HELP_SENDPASS
+ Ñèíòàêñèñ: SENDPASS #êàíàë
+
+ Îòïðàâëÿåò ïàðîëü êàíàëà ïî àäðåñó e-mail,
+ óêàçàííîìó â íàñòðîéêàõ âëàäåëüöà êàíàëà. Ýòó êîìàíäó óäîáíî èñïîëüçîâàòü
+ ÷òîáû âåðíóòü çàáûòûé ïàðîëü.
+
+ Â íåêîòîðûõ ñåòÿõ ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî IRC îïåðàòîðû.
+
+ Ýòà êîìàíäà íåäîñòóïíà ïðè âêëþ÷åííîì øèôðîâàíèè.
+
+CHAN_SERVADMIN_HELP
+
+ Íèæåñëåäóþùèå êîìàíäû äîñòóïíû äëÿ àäìèíèñòðàòîðîâ ñåðâèñîâ:
+
+ GETPASS Ïîëó÷èòü ïàðîëü âëàäåëüöà êàíàëà
+ (òîëüêî åñëè øèôðîâàíèå âûêëþ÷åíî)
+ FORBID Çàïðåòèòü èñïîëüçîâàòü êàíàë
+ SUSPEND Ïðèîñòàíîâèòü ðàáîòó êàíàëà ñ ñîõðàíåíèåì
+ äàííûõ è íàñòðîåê êàíàëà.
+ UNSUSPEND Âîññòàíîâèòü ðàáîòó ïðèîñòàíîâëåííîãî êàíàëà.
+ STATUS Âîçâðàùàåò òåêóùèé óðîâåíü äîñòóïà äëÿ óêàçàííîãî
+ ïîëüçîâàòåëÿ íà êàíàëå.
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò òàêæå óäàëèòü ëþáîé êàíàë áåç
+ èäåíòèôèêàöèè êàê âëàäåëåö êàíàëà, ìîãóò ïðîñìàòðèâàòü ñïèñîê äîñòóïà, ñïèñîê àêèêîâ,
+ è óñòàíîâêè óðîâíåé äîñòóïà íà êàíàëå.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Ñèíòàêñèñ: LOGOUT #êàíàë [íèê]
+
+ Ýòà êîìàíäà äåèäåíòèôèöèðóåò óêàçàííûé íèê
+ íà óêàçàíîì êàíàëå.
+
+ Åñëè Âû âëàäåëåö êàíàëà, âû ìîæåòå äåèäåíòèôèöèðîâàòü ëþáîãî,
+ èíà÷å æå, òîëüêî ñåáÿ.
+
+ Åñëè Âû Àäìèíèñòðàòîð ñåðâèñîâ, âû ìîæåòå äåèäåíòèôèöèðîâàòü
+ ëþáîãî íà ëþáîì êàíàëå áåç êàêîé-ëèáî äîïîëíèòåëüíîé èäåíòèôèêàöèè
+ íà êàíàëå. Òàêæå, åñëè Âû íå óêàæåòå íèê;
+ ýòà êîìàíäà äåèäåíòèôèöèðóåò âñåõ ïîëüçîâàòåëåé íà óêàçàííîì êàíàëå.
+
+CHAN_SERVADMIN_HELP_DROP
+ Ñèíòàêñèñ: DROP #êàíàë
+
+ Óäàëÿåò óêàçàííûé êàíàë. Òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ
+ ìîãóò óäàëèòü êàíàë, íå èäåíòèôèöèðóÿñü íà ChanServ êàê âëàäåëåö.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ òàêæå ìîãóò óñòàíîâèòü îïöèþ NOEXPIRE,
+ åñëè åå âêëþ÷èòü, äàííûé êàíàë íèêîãäà íå èñòå÷åò.
+ Òàêæå, Àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò óñòàíàâëèâàòü ëþáóþ îïöèþ
+ íà ëþáîì êàíàëå áåç êàêîé ëèáî äîïîëíèòåëüíîé èäåíòèôèêàöèè.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Ñèíòàêñèñ: SET #êàíàë NOEXPIRE {ON | OFF}
+
+ Äåëàåò óêàçàííûé êàíàë íåèñòåêàåìûì. Óñòàíîâêà ýòîé îïöèè
+ â ïîëîæåíèå ON ïðåäîõðàíÿåò êàíàë îò èñòåêàíèÿ.
+
+ Ìîæåò áûòü èñïîüçîâàíà òîëüêî Àäìèíèñòðàòîðàìè ñåðâèñîâ.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Àäìèíèñòðàòîðû ñåðâèñîâ ìîãóò èñïîëüçîâàòü ïàðàìåòð ALL äëÿ ëþáîãî êàíàëà.
+
+CHAN_SERVADMIN_HELP_LIST
+ Ñèíòàêñèñ: LIST ìàñêà [FORBIDDEN] [SUSPENDED] [NOEXPIRE]
+
+ Ñïèñîê âñåõ çàðåãèñòðèðîâàííûõ êàíàëîâ ïî óêàçàííîé ìàñêå.
+ Êàíàëû ñ ïàðàìåòðîì PRIVATE áóäóò ïîêàçàíû òîëüêî
+ Àäìèíèñòðàòîðàì ñåðâèñîâ. Êàíàëû ñ ïàðàìåòðîì NOEXPIRE áóäóò
+ ïîêàçàíû ñ ïðåôèêñîì ! ïåðåä èìåíåì êàíàëà.
+
+ Åñëè óêàçàòü îïöèè FORBIDDEN, SUSPENDED èëè NOEXPIRE òî
+ áóäóò ïîêàçàíû òîëüêî êàíàëû ñ ïàðàìåòðàìè FORBID, SUSPEND èëè
+ NOEXPIRE ñîîòâåòñòâåííî. Åñëè óêàçàòü âñå ýòè îïöèè,
+ áóäóò ïîêàçàíû âñå òèïû êàíàëîâ. Ýòè ïàðàìåòðû ìîãóò èñïîëüçîâàòü
+ òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Ñèíòàêñèñ: GETPASS #êàíàë
+
+ Âîçâðàùàåò ïàðîëü óêàçàííîãî êàíàëà. ÏÐèìå÷àíèå ïðè
+ èñïîëüçîâàíèè ýòîé êîìàíäû, ñîîáùåíèå, âêëþ÷àþùåå òîãî,
+ èñïîëüçîâàë ýòó êîìàíäó è êàíàë, ïàðîëü íà êîòîðûé áûë çàïðîøåí,
+ áóäóò çàïèñàíû â ëîã è îòïðàâëåíû WALLOPS/GLOBOPS.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Ñèíòàêñèñ: FORBID #êàíàë [ïðè÷èíà]
+
+ Çàïðåùàåò ðåãèñòðèðîâàòü èëè èñïîëüçîâàòü óêàçàííûé êàíàë.
+ Îòìåíÿåòñÿ ïóòåì óäàëåíèÿ êàíàëà.
+
+  íåêîòîðûõ ñåòÿõ ïðè÷èíà ÿâëÿåòñÿ îáÿçàòåëüíûì ïàðàìåòðîì.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Ñèíòàêñèñ: SUSPEND #êàíàë [ïðè÷èíà]
+
+ Ïðèîñòàíàâëèâàåò ðåãèñòðàöèþ èëè èñïîëüçîâàíèå óêàçàííîãî êàíàëà.
+ Îòìåíÿåòñÿ ïóòåì èñïîëüçîâàíèÿ êîìàíäû UNSUSPEND, êîòîðàÿ
+ âîññòàíàâëèâàåò âñå íàñòðîéêè è äàííûå êàíàëà.
+
+  íåêîòîðûõ ñåòÿõ ïðè÷èíà ÿâëÿåòñÿ îáÿçàòåëüíûì ïàðàìåòðîì.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Ñèíòàêñèñ: UNSUSPEND #êàíàë
+
+ Âîññòàíàâëèâàåò ïðèîñòàíîâëåííûé êàíàë. Âñå äàííûå è íàñòðîéêè
+ êàíàëà áóäóò òàêæå âîññòàíîâëåíû.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Ñèíòàêñèñ: STATUS #êàíàë íèê
+
+ Âîçâðàùàåò òåêóùèé óðîâåíü äîñòóïà óêàçàííîãî íèêà íà
+ óêàçàííîì êàíàëå. Îòâåò ìîæåò áûòü òàêèì:
+
+ STATUS #êàíàë íèê óðîâåíü äîñòóïà
+
+ Åñëè ïðîèçîéäåò îøèáêà, îòâåò áóäåò òàêèì:
+
+ STATUS ERROR ñîîáùåíèå îá îøèáêå
+
+ Ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S ýòî óäîáíûé ñåðâèñ, ïîçâîëÿþùèé ïîëüçîâàòåëÿì IRC îòïðàâëÿòü
+ êîðîòêèå ñîîáùåíèÿ äðóãèì ïîëüçîâàòåëÿì, êîòîðûõ íåò â äàííûé ìîìåíò â ñåòè,
+ èëè íà êàíàëû(*). Íèê îòïðàâèòåëÿ, êàê è
+ íèê ïîëó÷àòåëè èëè èìÿ êàíàëà äîëæíû áûòü
+ çàðåãèñòðèðîâàíû, äëÿ îòïðàâêè ìåìêè.
+
+ %S's âêëþ÷àåò êîìàíäû:
+
+ SEND Îòïðàâèòü ìåìî íà íèê èëè êàíàë
+ CANCEL Îòìåíèòü ïîñëåäíþþ îòïðàâëåííóþ Âàìè ìåìêó
+ LIST Ñïèñîê Âàøèõ ìåìîê
+ READ ×èòàòü ìåìêè
+ DEL Óäàëÿòü ìåìêè
+ SET Óñòàíîâêà îïöèé äëÿ ìåìîê
+ INFO ïîêàçàòü èíôîðìàöèþ î Âàøèõ ìåìêàõ
+
+MEMO_HELP_ADMIN
+ SENDALL îòïðàâëÿåò ìåìêó âñåì çàðåãèñòðèðîâàííûì ïîëüçîâàòåëÿì
+
+MEMO_HELP_OPER
+ STAFF Îòïðàâëÿåò ìåìêó âñåì îïåðàòîðàì/àäìèíèñòðàòîðàì ñåðâèñîâ
+
+MEMO_HELP_FOOTER
+
+ Íàïèøèòå /msg %S HELP êîìàíäà äëÿ ïîëó÷åíèÿ áîëåå ïîäðîáíîé
+ èíôîðìàöèè.
+
+ (*) Ïî óìîë÷àíèþ, ëþáîé ïîëüçîâàòåëü ñ óðîâíåì äîñòóïà íà êàíàëå
+ íå ìåíåå 10 ìîæåò ÷èòàòü ìåìêè, îòïðàâëåííûå êàíàëó. Ýòî ìîæåò áûòü
+ èçìåíåíî èñïîëüçîâàíèåì êîìàíäû %s LEVELS.
+
+MEMO_HELP_SEND
+ Ñèíòàêñèñ: SEND {íèê | #êàíàë} òåêñò ñîîáùåíèÿ
+
+ Îòïðàâëÿåò ñîîáùåíèÿ äëÿ íèêà èëè äëÿ #êàíàëà, ñîäåðæàùåå
+ òåêñò ñîîáùåíèÿ. Åñëè ïîëó÷àòåëü íèê, òî îí áóäåò óâåäîìëåí
+ ÷òî Âû îòïðàâèëè åìó ñîáùåíèå. Ïîëó÷àòåëü, áóäü òî íèê èëè êàíàë,
+ äîëæåí áûòü çàðåãèñòðèðîâàí íà NickServ èëè ChanServ ñîîòâåòñòâåííî.
+
+MEMO_HELP_CANCEL
+ Ñèíòàêñèñ: CANCEL {íèê | #êàíàë}
+
+ Îòìåíÿåò ïîñëåäíåå ñîîáùåíèå, îòïðàâëåííîå âàìè íà íèê èëè êàíàë,
+ ïðåäîõðàíÿÿ åãî îò ïðî÷òåíèÿ àäðåñàòîì.
+
+MEMO_HELP_LIST
+ Ñèíòàêñèñ: LIST [#êàíàë] [list | NEW]
+
+ Ïîêàçûâàåò òåêóùèé ñïèñîê ñîîáùåíèé. Ñ ïàðàìåòðîì NEW, ïîêàæåò òîëüêî
+ íîâûå (íåïðî÷èòàííûå) ñîîáùåíèÿ. Íåïðî÷èòàííûå ñîîáùåíèÿ áóäóò ñ ïîìåòêîé â âèäå "*"
+ ñëåâà îò íîìåðà ñîîáùåíèÿ. Âû ìîæåòå òàêæå óêàçàòü äèàïàçîí
+ íîìåðîâ, íàïðèìåð òàê:
+
+ LIST 2-5,7-9
+ Ïîêàæåò ñîîáùåíèÿ ñî 2 äî 5 è ñ 7 äî 9.
+
+MEMO_HELP_READ
+ Ñèíòàêñèñ: READ [#êàíàë] {íîìåð | list | LAST | NEW}
+
+ Âûâåäåò Âàì òåêñò ñîîáùåíèÿ. Åñëè óêàçàí ïàðàìåòð LAST, òî
+ âûâåäåò ïîñëåäíåå îòïðàâëåííîå Âàì ñîîáùåíèå. Åñëè óêàçàí ïàðàìåòð
+ NEW, âûâåäåò Âàì âñå íåïðî÷èòàííûå ðàíåå ñîîáùåíèÿ. Èíà÷å,
+ âûâåäåò Âàì ñîîáùåíèå ïîä íîìåðîì íîìåð. Âû ìîæåòå çàïðîñèòü ñðàçó íåñêîëüêî
+ ñîîáùåíèé, íàïðèìåð òàê:
+
+ READ 2-5,7-9
+ Ïîêàæåò ñîîáùåíèÿ ñî 2 ïî 5 è ñ 7 ïî 9.
+
+MEMO_HELP_DEL
+ Ñèíòàêñèñ: DEL [#êàíàë] {íîìåð | list | LAST | ALL}
+
+ Óäàëèò óêàçàííîå ñîîáùåíèå. Âû ìîæåòå óêàçàòü
+ íåñêîëüêî íîìåðîâ ñîîáùåíèé èëè äèàïàçîí íîìåðîâ ñîîáùåíèé, íåîáÿçàòåëüíî óêàçûâàòü
+ òîëüêî îäèí íîìåð, êàê âî âòîðîì ïðèìåðå âûøå.
+
+ Åñëè óêàçàí ïàðàìåòð LAST, áóäåò óäàëåíî ïîñëåäíåå ñîîáùåíèå.
+ Åñëè óêàçàí ïàðàìåòð ALL, âñå Âàøè ñîîáùåíèÿ áóäóò óäàëåíû.
+
+ Ïðèìåðû:
+
+ DEL 1
+ Óäàëèòü ñîîáùåíèå ïîä íîìåðîì 1.
+
+ DEL 2-5,7-9
+ Óäàëèòü ñîîáùåíèÿ ñ 2 äî 5 è ñ 7 äî 9.
+
+MEMO_HELP_SET
+ Ñèíòàêñèñ: SET îïöèÿ ïàðàìåòðû
+
+ Óñòàíàâëèâàåò ðàçëè÷íûå ïàðàìåòðû äëÿ ñëóæáû ñîîáùåíèé. îïöèÿ ìîæåò áûòü îäíîé èç:
+
+ NOTIFY Âûáðàòü ñïîñîá óâåäîìëåíèÿ Âàñ
+ î íîâûõ ñîáùåíèÿõ (òîëüêî äëÿ íèêîâ)
+ LIMIT Óñòàíàâëèâàåò îãðàíè÷åíèå íà êîëè÷åñòâî ñîîáùåíèé, êîòîðîå
+ Âû ìîæåòå ïðèíèìàòü
+
+ Íàïèøèòå /msg %S HELP SET îïöèÿ äëÿ ïîëó÷åíèÿ áîëåå ïîäðîáíîé èíôîðìàöèè
+ î êîíêðåòíîé îïöèè.
+
+MEMO_HELP_SET_NOTIFY
+ Ñèíòàêñèñ: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Èçìåíèòü ñïîñîá óâåäîìëåíèÿ Âàñ î íîâûõ ñîîáùåíèÿõ:
+
+ ON Âû áóäåòå óâåäîìëåíû î íîâîì ñîîáùåíèè ïðè âõîäå â ñåòü,
+ êîãäà Âû ñíèìåòå ñ ñåáÿ ôëàã /AWAY, è êàê òîëüêî êòî-òî îòïðàâèò Âàì
+ ñîîáùåíèå.
+ LOGON Âû áóäåòå óâåäîìëåíû î íîâîì ñîîáùåíèè òîëüêî ïðè âõîäå â ñåòü,
+ èëè êîãäà Âû ñíèìåòå ñ ñåáÿ ôëàã /AWAY.
+ NEW Âû áóäåòå óâåäîìëåíû î íîâîì ñîîáùåíèè òîëüêî êîãäà îíè,
+ áóäóò Âàì îòïðàâëåíû.
+ OFF Âû íå áóäåòå óâåäîìëÿòüñÿ î ïîëó÷åíèè íîâûõ ñîîáùåíèé.
+
+ Â ïðèíöèïå, ON ÿâëÿåòñÿ êîìáèíàöèåé LOGON è NEW.
+
+MEMO_HELP_SET_LIMIT
+ Ñèíòàêñèñ: SET LIMIT [#êàíàë] limit
+
+ Îãðàíè÷èâàåò ìàêñèìàëüíîå êîëè÷åñòâî ñîîáùåíèé êîòîðîå Âû (èëè êàíàë)
+ ìîæåòå ïðèíèìàòü. Åñëè Âû óñòàíîâèòå åãî ðàâíûì 0, íèêòî
+ íå ñìîæåò îòïðàâèòü Âàì ñîîáùåíèå. Òàêæå, Âû íå ìîæåòå óñòàíîâèòü îãðàíè÷åíèå
+ áîëüøå, ÷åì %d.
+
+MEMO_HELP_INFO
+ Ñèíòàêñèñ: INFO [#êàíàë]
+
+ Ïîêàçûâàåò èíôîðìàöèþ î êîëè÷åñòâå ñîîáùåíèé äëÿ Âàñ, ñêîëüêî
+ èç íèõ íåïðî÷èòàíî, è ñêîëüêî âñåãî ñîîáùåíèé áûëî Âàìè
+ ïðèíÿòî. Ñ ïàðàìåòðîì, ïîêàæåò òó æå èíôîðìàöèþ
+ äëÿ äàííîãî êàíàëà.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Ñèíòàêñèñ: SET LIMIT [ïîëüçîâàòåëü | #êàíàë] {limit | NONE} [HARD]
+
+ Îãðàíè÷èâàåò ìàêñèìàëüíîå êîëè÷åñòâî ñîîáùåíèé êîòîðîå ïîëüçîâàòåëü (èëè êàíàë)
+ ìîæåò ïðèíèìàòü. Óñòàíîâêà ëèìèòà ðàâíûì 0 íå äàåò âîçìîæíîñòè
+ ïðèíèìàòü ñîîáùåíèÿ âîîáùå; óñòàíîâêà â NONE ðàçðåøàåò
+ ïîëüçîâàòåëþ ïðèíèìàòü è ñîõðàíÿòü ñòîëüêî ñîîáùåíèé, ñêîëüêî îí ïîæåëàåò. Åñëè
+ Âû íå óêàæåòå ïîëüçîâàòåëÿ èëè êàíàë, òî ýòî áóäåò óñòàíîâëåíî äëÿ
+ Âàñ.
+
+ Îïöèÿ HARD íå ïîçâîëèò ïîëüçîâàòåëþ èçìåíèòü ëèìèò. Åñëè
+ HARD íå èäîáàâèòü - áóäåò ïðîòèâîïîëîæíûé ýôôåêò, ò.å. ïîëüçîâàòåëü ñìîæåò
+ èçìåíÿòü ëèìèò (äàæå åñëè ïðåäûäóùèé ëèìèò áûë óñòàíîâëåí ñ ïàðàìåòðîì
+ HARD).
+
+ Äàííóþ êîìàíäó SET LIMIT ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû
+ ñåðâèñîâ. Äðóãèå ïîëüçîâàòåëè ìîãóòü ìåíÿòü ëèìèò òîëüêî äëÿ ñåáÿ
+ èëè äëÿ êàíàëà, íà êîòîðîì ó íèç åñòü ñîîòâåòñòâóþùèå ïðèâèëåãèè, íå ìîãóò
+ óäàëèòü ñâîé ëèìèò, íå ìîãóò óñòàíîâèòü ëèìèò âûøå %d, è íå ìîãóò
+ óñòàíîâèòü îïöèþ HARD.
+
+MEMO_SERVADMIN_HELP_INFO
+ Ñèíòàêñèñ: INFO [íèê | #êàíàë]
+
+ Áåç ïàðàìåòðîâ, ïîêàæåò êîëè÷åñòâî ñîîáùåíèé â Âàøåì ÿùèêå,
+ ñêîëüêî èç íèõ íåïðî÷èòàíî, è ñêîëüêî âñåãî
+ ñîîáùåíèé Âû ìîæåòå ïðèíèìàòü.
+
+ Åñëè óêàçàòü êàíàë, ïîêàæåò òó æå èíôîðìàöèþ
+ î äàííîì êàíàëå.
+
+ Åñëè óêàçàòü íèê, ïîêàæåò òó æå èíôîðìàöèþ
+ î äàííîì íèêå. Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû
+ ñåðâèñîâ.
+
+MEMO_HELP_STAFF
+ Ñèíòàêñèñ: STAFF òåêñò ñîîáùåíèÿ
+
+ Îòïðàâëÿåò âñåì îïåðàòîðàì/àäìèíèñòðàòîðàì ñåðâèñîâ ìåìêó, ñîäåðæàùóþ òåêñò ñîîáùåíèÿ.
+ Âíèìàíèå: Åñëè Âû ïðîïèñàíû äâàæäû, íàïðèìåð êàê îïåðàòîð,è êàê
+ àäìèíèñòðàòîð, Âû ïîëó÷èòå ýòî ñîîáùåíèå äâàæäû. Òî æå
+ ñàìîå ïðîèçîéäåò äëÿ ïðîïèñàííûõ êàê ñóïåðïîëüçîâàòåëè ñåðâèñîâ è
+ â òî æå âðåìÿ â äðóãèõ ëèñòàõ.
+
+MEMO_HELP_SENDALL
+ Ñèíòàêñèñ: SENDALL òåêñò ñîîáùåíèÿ
+
+ Îòïðàâëÿåò âñåì çàðåãèñòðèðîâàííûì ïîëüçîâàòåëÿì òåêñò ñîîáùåíèÿ.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ %S commands:
+ GLOBAL Ïîñëàòü ñîîáùåíèå âñåì ïîëüçîâàòåëÿì
+ STATS Ïîêàçàòü ñòàòèñòèêó ñåðâèñîâ è ñåòè
+ OPER LIST Ñïèñîê Îïåðàòîðîâ ñåðâèñîâ
+ ADMIN LIST Ñïèñîê Àäìèíèñòðàòîðîâ Ñåðâèñîâ
+ STAFF Ñïèñîê âñåõ ïðîïèñàííûõ íà ñåðâèñàõ è èõ îíëàéí-ñòàòóñ
+
+OPER_HELP_OPER_CMD
+ Êîìàíäû, äîñòóïíûå òîëüêî Îïåðàòîðàì è Àäìèíèñòðàòîðàì ñåðâèñîâ è:
+ MODE Èçìåíÿåò ðåæèì íà êàíàëå
+ KICK Êèêíóòü ïîëüçîâàòåëÿ ñ êàíàëà
+ CLEARMODES Î÷èñòêà ðåæèìîâ íà êàíàëå
+ KILLCLONES Ïðèáèòü âñåõ ïîëüçîâàòåëåé ñ îïðåäåëåííîãî õîñòà
+ AKILL Óïðàâëåíèå ñïèñêîì AKILL'îâ
+ SGLINE Óïðàâëåíèå ñïèñêîì SGLINE'îâ
+ SQLINE Óïðàâëåíèå ñïèñêîì SQLINE'îâ
+ SZLINE Óïðàâëåíèå ñïèñêîì SZLINE'îâ
+
+OPER_HELP_ADMIN_CMD
+ Êîìàíäû, äîñòóïíûå òîëüêî Àäìèíèñòðàòîðàì ñåðâèñîâ:
+ OPER Óïðàâëåíèå ñïèñêîì Îïåðàòîðîâ ñåðâèñîâ
+ SVSNICK Ñìåíèòü íèê ïîëüçîâàòåëþ
+ CHANLIST Ïîêàçàòü âñå òåêóùèå êàíàëû
+ USERLIST Ïîêàçàòü âñåõ òåêóùèõ ïîëüçîâàòåëåé
+ LOGONNEWS Óñòàíîâèòü ñîîáùåíèÿ ïðè âõîäå â ñåòü
+ RANDOMNEWS Óñòàíîâèòü ñëó÷àéíûå ñîîáùåíèÿ
+ ïðè âõîäå â ñåòü
+ OPERNEWS Óñòàíîâèòü ñîîáùåíèÿ, ïîêàçûâàåìûå ïðè /oper
+ SESSION Ïîñìîòðåòü ñïèñîê òåêóùèõ ñîåäèíåíèé
+ EXCEPTION Óïðàâëåíèå ñïèñêîì èñêëþ÷åíèé èç ëèìèòà ñåññèé
+ CACHE Ñïèñîê êýøèðîâàííûõ õîñòîâ, èñïîëüçóåìûõ äåòåêòîðîì ïðîêñè
+ NOOP Âðåìåííî óäàëèòü âñå O:ëàéíû íà óêàçàííîì
+ ñåðâåðå
+ JUPE "Äæóïíóòü" ñåðâåð
+ IGNORE Óïðàâëåíèå ñïèñêîì èãíîðîâ ñåðâèñîâ
+ UMODE Èçìåíåíèå ðåæèìîâ ïîëüçîâàòåëÿ
+ OLINE Óñòàíîâèòü ôëàãè IRC Îïåðàòîðîâ îïðåäåëåííîìó ïîëüçîâàòåëþ (òîëüêî
+ UnrealIRCd)
+ SET Óñòàíîâèòü ðàçëè÷íûå îïöèè ñåðâèñîâ
+ RELOAD Ïåðåçàãðóçèòü êîíôèãóðàöèîííûé ôàéë ñåðâèñîâ
+ UPDATE Çàñòàâèòü ñåðâèñû íåìåäëåííî ñîõðàíèòü
+ âñå áàçû äàííûõ íà äèñê
+ RESTART Ñîõðàíèòü áàçû äàííûõ è ïåðåçàïóñòèòü ñåðâèñû
+ QUIT Çàâåðøèòü ðàáîòó ñåðâèñîâ áåç ñîõðàíåíèÿ äàííûõ
+ SHUTDOWN Çàâåðøèòü ðàáîòó ñåðâèñîâ ñ ñîõðàíåíèåì äàííûõ
+ DEFCON Óïðàâëåíèå ñèñòåìîé DefCon
+ CHANKILL Ïðèáèòü âñåõ ïîëüçîâàòåëåé íà îïðåäåëåííîì êàíàëå
+
+ Êîìàíäû, äîñòóïíûå òîëüêî ñóïåðïîëüçîâàòåëþ ñåðâèñîâ:
+ ADMIN Óïðàâëåíèå ñïèñêîì àäìèíèñòðàòîðîâ ñåðâèñîâ
+
+OPER_HELP_ROOT_CMD
+ Êîìàíäû, äîñòóïíû òîëüêî ñóïåðïîëüçîâàòåëÿì ñåðâèñîâ:
+ MODLOAD Çàãðóçèòü ìîäóëü
+ MODUNLOAD Âûãðóçèòü ìîäóëü
+ MODLIST Ñïèñîê çàãðóæåííûõ ìîäóëåé
+ MODINFO Èíôîðìàöèÿ î çàãðóæåííîì ìîäóëå
+
+OPER_HELP_LOGGED
+ Âíèìàíèå: Âñå êîìàíäû %S'ó çàïèñûâàþòñÿ â ëîã!
+
+OPER_HELP_GLOBAL
+ Ñèíòàêñèñ: GLOBAL ñîîáùåíèå
+
+ Ïîçâîëÿåò IRC Îïåðàòîðàì îòïðàâèòü ñîîáùåíèå âñåì ïîëüçîâàòåëÿì IRC ñåòè.
+ Ýòî ñîîáùåíèå áóäåò îòïðàâëåíî îò íèêà %s.
+
+OPER_HELP_STATS
+ Ñèíòàêñèñ: STATS [AKILL | ALL | RESET]
+
+ Áåç ïàðàìåòðîâ, ïîêàæåò òåêóùåå êîëè÷åñòâî ïîëüçîâàòåëåé è
+ IRC Îïåðàòîðîâ â îíëàéíå (êðîìå Ñåðâèñíûõ), ìàêñèìàëüíîå ÷èñëî ïîëüçîâàòåëåé
+ îíëàéí çàðåãèñòðèðîâàííîå ñåðâèñàìè ñ ìîìåíòà ñòàðòà, è äëèòåëüíîñòü
+ áåñïåðåáîéíîé ðàáîòû ñåðâèñîâ.
+
+ Ñ îïöèåé AKILL, ïîêàæåò òåêóùèé ðàçìåð ñïèñêà AKILL'îâ
+ è âðåìÿ èñòåêàíèÿ AKILL'îâ ïî óìîë÷àíèþ.
+
+ Îïöèÿ ALL äîñòóïíà òîëüêî äëÿ Àäìèíèñòðàòîðîâ ñåðâèñîâ, è
+ ïîêàæåò èíôîðìàöèþ îá èñïîëüçîâàíèè ïàìÿòè ñåðâèñàìè. Èïîëüçîâàíèå
+ ýòîé îïöèè ìîæåò çàòîðìîçèòü ñåðâèñû íà íåáîëüøîé ïðîìåæóòîê âðåìåíè â
+ áîëüøèõ ñåòÿõ, íå èñïîëüçóéòå ýòó îïöèþ ÷åðåñ÷óð ÷àñòî!
+
+ Îïöèÿ RESET ñáðàñûâàåò ñ÷åò÷èê ìàñêèìàëüíî çàðåãèñòðèðîâàííîãî ñåðâèñàìè
+ êîëè÷åñòâà ïîëüçîâàòåëåé â îíëàéíå.
+
+ UPTIME ýòî ñèíîíèì êîìàíäû STATS.
+
+OPER_HELP_OPER
+ Ñèíòàêñèñ: OPER ADD íèê
+ OPER DEL {íèê | íîìåð çàïèñè | list}
+ OPER LIST [ìàñêà | list]
+ OPER CLEAR
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì
+ Îïåðàòîðîâ ñåðâèñîâ. Ïîëüçîâàòåëü, ÷åé íèê
+ ïðèñóòñòâóåò â ñïèñêå Îïåðàòîðîâ ñåðâèñîâ, èäåíòèôèöèðîâàâøèñü íà
+ %s ïîëó÷àåò äîñòóï ê êîìàíäàì Îïåðàòîðîâ ñåðâèñîâ.
+
+ Êîìàíäà OPER ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê
+ Îïåðàòîðîâ ñåðâèñîâ.
+
+ Êîìàíäà OPER DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà
+ Îïåðàòîðîâ ñåðâèñîâ. Åñëè óêàçàíû íîìåðà çàïèñåé,
+ ýòè çàïèñè áóäóò óäàëåíû. (Ñì. ïðèìåð èïîëüçîâàíèÿ êîìàíäû LIST íèæå.)
+
+ Êîìàíäà OPER LIST ïîêàçûâàåò ñïèñîê Îïåðàòîðîâ ñåðâèñîâ.
+ Åñëè óêàçàíà ñèìâîëüíàÿ ìàñêà, òîëüêî ñîîòâåòñòâóþùèå åé
+ çàïèñè áóäóò ïîêàçàíû. Åñëè óêàçàíû íîìåðà çàïèñåé,
+ òîëüêî ýòè çàïèñè áóäóò ïîêàçàíû; íàïðèìåð:
+
+ OPER LIST 2-5,7-9
+ Ïîêàæåò Îïåðàòîðîâ ñåðâèñîâ ñ íîìåðàìè çàïèñåé îò 2 äî
+ 5 è îò 7 äî 9.
+
+ Êîìàíäà OPER CLEAR óäàëÿåò âñå çàïèñè èç ñïèñêà
+ Îïåðàòîðîâ ñåðâèñîâ.
+
+ Ëþáîé IRC Îïåðàòîð ìîæåò èñïîëüçîâàòü êîìàíäó OPER LIST.
+ Âñå îñòàëüíûå êîìàíäû ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_ADMIN
+ Ñèíòàêñèñ: ADMIN ADD íèê
+ ADMIN DEL {íèê | íîìåð çàïèñè | list}
+ ADMIN LIST [ìàñêà | list]
+ ADMIN CLEAR
+
+ Ïîçâîëÿåò ñóïåðïîëüçîâàòåëþ ñåðâèñîâ äîáàâëÿòü èëè óäàëÿòü íèêè
+ èç ñïèñêà Àäìèíèñòðàòîðîâ ñåðâèñîâ. Ïîëüçîâàòåëü, ÷åé íèê
+ íàõîäèòñÿ ñ ñïèñêå Àäìèíèñòðàòîðîâ ñåðâèñîâ è êîòîðûé èäåíòèôèöèðîâàëñÿ
+ %s ïîëó÷àå äîñòóï ê êîìàíäàì Àäìèíèñòðàòîðîâ ñåðâèñîâ.
+
+ Êîìàíäà ADMIN ADD äîáàâëÿåò óêàçàííûé íèê â ñïèñîê
+ àäìèíèñòðàòîðîâ ñåðâèñîâ.
+
+ Êîìàíäà ADMIN DEL óäàëÿåò óêàçàííûé íèê èç ñïèñêà
+ àäìèíèñòðàòîðîâ ñåðâèñîâ. Åñëè óêàçàòü íîìåð(à) çàïèñè(çàïèñåé),
+ âñå îíè áóäóò óäàëåíû. (Ñì. ïðèìåð èñïîëüçîâàíèÿ êîìàíäû LIST íèæå.)
+
+ Êîìàíäà ADMIN LIST ïîêàçûâàåò ñïèñîê àäìèíèñòðàòîðîâ ñåðâèñîâ.
+ Åñëè óêàçàòü ñèìâîëüíóþ ìàñêó, òîëüêî ïîäïàäàþùèå ïîä íåå çíà÷åíèÿ
+ áóäóò ïîêàçàíû. Åñëè óêàçàòü íîìåðà çàïèñåé, òî
+ áóäóò ïîêàçàíû òîëüêî îíè; íàïðèìåð:
+
+ ADMIN LIST 2-5,7-9
+ Ïîêàæåò àäìèíèñòðàòîðîâ ñåðâèñîâ ñ íîìåðàìè çàïèñåé îò 2 äî
+ 5 è îò 7 äî 9.
+
+ Êîìàíäà ADMIN CLEAR óäàëèò âñå çàïèñè èç ñïèñêà
+ àäìèíèñòðàòîðîâ ñåðâèñîâ.
+
+ Ëþáîé IRC îïåðàòîð ìîæåò èñïîëüçîâàòü êîìàíäó ADMIN LIST.
+ Îñòàëüíîå ìîæåò èñïîëüçîâàåòü òîëüêî Ñóïåðïîëüçîâàòåëü ñåðâèñîâ.
+
+OPER_HELP_IGNORE
+ Ñèíòàêñèñ: IGNORE {ADD|DEL|LIST|CLEAR} [âðåìÿ] [íèê]
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì èãíîðèðóåìûõ ñåðâèñàìè íèêîâ
+ íà óêàçàííîå âðåìÿ èëè äî ïåðåçàïóñêà ñåðâèñîâ. Ïî óìîë÷àíèþ ôîðìàò óêàçàíèÿ âðåìåíè
+ èãíîðèðîâàíèÿ - ñåêóíäû. Âû ìîæåòå òàêæå óêàçàòü èíûå åäèíèöû èçìåðåíèÿ, èñïîëüçóÿ:
+ s ñåêóíä, m ìèíóò, h ÷àñîâ è
+ d äíåé. Êîìáèíàöèè ýòèõ åäèíèö èçìåðåíèÿ íå äîïóñòèìû. ×òîáû ñäåëàòü
+ ïîñòîÿííûé èãíîð ïîëüçîâàòåëÿ, óñòàíîâèòå âðåìÿ èãíîðà ðàâíûì 0.
+
+OPER_HELP_MODE
+ Ñèíòàêñèñ: MODE #êàíàë ðåæèìû
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ èçìåíÿòü ðåæèìû êàíàëà íà ëþáîì
+ êàíàëå. Ïàðàìåòðû äàííîé êîìàíäû òàêèå æå, ÷òî è ïðè èñïîëüçîâàíèè
+ êîìàíäû /MODE.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû ñåðâèñîâ.
+
+OPER_HELP_UMODE
+ Ñèíòàêñèñ: UMODE ïîëüçîâàòåëü ðåæèìû
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ èçìåíÿòü ïîëüçîâàòåëüñêèå ðåæèìû äëÿ ëþáîãî ïîëüçîâàòåëÿ.
+ Ïàðàìåòðû äàííîé êîìàíäû òàêèå æå, ÷òî è ïðè èñïîëüçîâàíèè
+ êîìàíäû /MODE.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_OLINE
+ Ñèíòàêñèñ: OLINE ïîëüçîâàòåëü ôëàãè
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ óñòàíîâèòü ôëàãè IRC Îïåðàòîðîâ ëþáîìó ïîëüçîâàòåëþ.
+ Ïåðåä ôëàãàìè äîëæåí ïðèñóòñòâîâàòü ïðåôèêñ "+" èëè "-". ×òîáû
+ óäàëèòü âñå ôëàãè, èñïîëüçóéòå "-" âìåñòî ëþáîãî ôëàãà.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_CLEARMODES
+ Ñèíòàêñèñ: CLEARMODES #êàíàë [ALL]
+
+ Î÷èùàåò âñå äâîè÷íûå ðåæèìû (i,k,l,m,n,p,s,t) è áàíû íà óêàçàííîì
+ êàíàëå. Åñëè óêàçàí ïàðàìåòð ALL, òàêæå ñíèìåò ñî âñåõ ñòàòóñ îïåðàòîðà êàíàëà,
+ âîéñû (ðåæèìû +o è +v) íà êàíàëå.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû ñåðâèñîâ.
+
+OPER_HELP_KICK
+ Ñèíòàêñèñ: KICK #êàíàë ïîëüçîâàòåëü ïðè÷èíà
+
+ Ïîçâîëÿåò IRC Îïåðàòîðàì âûêèíóòü ïîëüçîâàòåëÿ ñ ëþáîãî êàíàëà.
+ Ïàðàìåòðû äàííîé êîìàíäû òàêèå æå, ÷òî è ïðè èñïîüçîâàíèè êîìàíäû /KICK.
+ Ñîîáùåíèå êèêà áóäåò âêëþ÷àòü èìÿ IRC Îïåðàòîðà, èñïîëüçîâàâøåãî êîìàíäó
+ è óêàçàííóþ èì ïðè÷èíó, íàïðèìåð:
+
+ *** SpamMan has been kicked off channel #my_channel by %S (Alcan (Flood))
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû ñåðâèñîâ.
+
+OPER_HELP_SVSNICK
+ Ñèíòàêñèñ: SVSNICK íèê íîâûé íèê
+
+ Èçìåíèòü íèê íà íîâûé íèê.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_AKILL
+ Ñèíòàêñèñ: AKILL ADD [+âðåìÿ èñòå÷åíèÿ] ìàñêà ïðè÷èíà
+ AKILL DEL {ìàñêà | íîìåð çàïèñè | list}
+ AKILL LIST [ìàñêà | list]
+ AKILL VIEW [ìàñêà | list]
+ AKILL CLEAR
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì AKILL'îâ. Åñëè
+ ïîëüçîâàòåëü, ïîäïàäàþùèé ïîä ìàñêó AKILL'à ïîïûòàåòñÿ ïðèêîííåêòèòüñÿ, ñåðâèñû
+ èñïîëüçóþò íà íåãî KILL, è, Åñëè Âàø IRC ñåðâåð ýòî ïîääåðæèâàåò,
+ óñòàíîâèò íà âñåõ ñåðâåðàõ IRC ñåòè K-line íà
+ ìàñêó äàííîãî ïîëüçîâàòåëÿ.
+
+ AKILL ADD äîáàâëÿåò ìàñêó âèäà user@host/ip â ñïèñîê AKILL'îâ
+ ñ óêàçàííîé ïðè÷èíîé (êîòîðàÿ îáÿçàòåëüíî äîëæíà áûòü óêàçàíà).
+ âðåìÿ èñòå÷åíèÿ - ýòî öåëîå ÷èñëî, êîòîðîå ìîæåò áûòü îäíèì èç: d
+ (äíåé), h (÷àñîâ), èëè m (ìèíóò). Ñî÷åòàíèÿ (òî åñòü, ê ïðèìåðó
+ 1h30m) íå äîïóñêàþòñÿ. Åñëè åäèíèöà èçìåðåíèÿ íå óêàçàíà,
+ ïî óìîë÷àíèþ îíà áóäåò óñòàíîâëåíà â "äíè" (òàêèì îáðàçîì +30 áóäåò îçíà÷àòü 30
+ äíåé). ×òîáû äîáàâèòü âå÷íûé AKILL, èñïîëüçóéòå âðåìÿ èñòå÷åíèÿ ðàâíûì +0. Åñëè
+ ìàñêà ïîëüçîâàòåëÿ to áûëà äîáàâëåíà, íà÷èíàÿ ñ +, âðåìÿ èñòå÷åíèÿ
+ áóäåò çàäàíî ïî óìîë÷àíèþ. Òåêóùåå âðåìÿ AKILL'à
+ ïî óìîë÷àíèþ ìîæíî óçíàòü êîìàíäîé
+ STATS AKILL.
+
+ Êîìàíäà AKILL DEL óäàëÿåò óêàçàííóþ ìàñêó èç ñïèñêà
+ AKILL'îâ. Åñëè óêàçàíû íîìåðà çàïèñåé,
+ ýòè çàïèñè áóäóò óäàëåíû. (Ñì. ïðèìåð èñïîüçîâàíèÿ êîìàíäû LIST
+ íèæå.)
+
+ Êîìàíäà AKILL LIST ïîêàçûâàåò òåêóùèé ñïèñîê AKILL'îâ.
+ Åñëè óêàçàòü ñèìâîëüíóþ ìàñêó, áóäóò ïîêàçàíû òîëüêî ñîâïàäàþùèå ñ íåé
+ çíà÷åíèÿ. Åñëè óêàçàòü íîìåðà çàïèñåé, òîëüêî,
+ ýòè çàïèñè áóäóò ïîêàçàíû; íàïðèìåð:
+
+ AKILL LIST 2-5,7-9
+ Ñïèñîê AKILL'îâ ñ íîìåðàìè çàïèñåé ñî 2 äî 5 è ñ 7
+ ïî 9.
+
+ AKILL VIEW ïîêàæåò áîëåå ïîäðîáíóþ èíôîðìàöèþ, ÷åì AKILL LIST, è
+ ïîêàæåò òàêæå êòî äîáàâèë AKILL, âðåìÿ óñòàíîâëåíèÿ AKILL'à, êîãäà
+ îí èñòåêàåò, íó è êîíå÷íî æå ìàñêó âèäà user@host/ip è ïðè÷èíó AKILL'à.
+
+ AKILL CLEAR óäàëÿåò âñå çàïèñè èç ñïèñêà AKILL'îâ.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû ñåðâèñîâ.
+
+OPER_HELP_SGLINE
+ Ñèíòàêñèñ: SGLINE ADD [+âðåìÿ èñòå÷åíèÿ] ìàñêà:ïðè÷èíà
+ SGLINE DEL {ìàñêà | íîìåð çàïèñè | list}
+ SGLINE LIST [ìàñêà | list]
+ SGLINE VIEW [ìàñêà | list]
+ SGLINE CLEAR
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì SGLINE'îâ. Åñëè
+ ïîëüçîâàòåëü ñ ðåàëüíûì èìåíåì, ïîäïàäàþùèì ïîä ìàñêó SGLINE'àïîïûòàåòñÿ
+ ïðèêîííåêòèòüñÿ, ñåðâèñû íå ðàçðåøàò åìó óñòàíîâèòü
+ ñîåäèíåíèå.
+
+ SGLINE ADD äîáàâëÿåò ìàñêó ðåàëüíîãî èìåíè â ñïèñîê SGLINE'îâ
+ ñ óêàçàííîé ïðè÷èíîé (êîòîðàÿ îáÿçàòåëüíî äîëæíà áûòü óêàçàíà).
+ âðåìÿ èñòå÷åíèÿ - ýòî öåëîå ÷èñëî, êîòîðîå ìîæåò áûòü îäíèì èç: d
+ (äíåé), h (÷àñîâ), èëè m (ìèíóò). Ñî÷åòàíèÿ (òî åñòü, ê ïðèìåðó
+ 1h30m) íå äîïóñêàþòñÿ. Åñëè åäèíèöà èçìåðåíèÿ íå óêàçàíà,
+ ïî óìîë÷àíèþ îíà áóäåò óñòàíîâëåíà â "äíè" (òàêèì îáðàçîì +30 áóäåò îçíà÷àòü 30
+ äíåé). ×òîáû äîáàâèòü âå÷íûé SGLINE, èñïîëüçóéòå âðåìÿ èñòå÷åíèÿ ðàâíûì +0. Åñëè
+ ìàñêà ïîëüçîâàòåëÿ to áûëà äîáàâëåíà, íà÷èíàÿ ñ +, âðåìÿ èñòå÷åíèÿ
+ áóäåò çàäàíî ïî óìîë÷àíèþ. Òåêóùåå âðåìÿ SGLINE'à
+ ïî óìîë÷àíèþ ìîæíî óçíàòü êîìàíäîé
+ STATS AKILL.
+ Ïðèìå÷àíèå: òàê êàê ìàñêè ðåàëüíûõ èìåí ìîãóò ñîäåðæàòü ïðîáåëû,
+ ðàçäåëèòåëåì ìåæäó ðåàëüíûì èìåíåì è ïðè÷èíîé áóäåò äâîåòî÷èå.
+
+ Êîìàíäà SGLINE DEL óäàëÿåò óêàçàííóþ ìàñêó èç ñïèñêà
+ SGLINE'îâ. Åñëè óêàçàíû íîìåðà çàïèñåé,
+ ýòè çàïèñè áóäóò óäàëåíû. (Ñì. ïðèìåð èñïîüçîâàíèÿ êîìàíäû LIST
+ íèæå.)
+
+ Êîìàíäà SGLINE LIST ïîêàçûâàåò òåêóùèé ñïèñîê SGLINE'îâ.
+ Åñëè óêàçàòü ñèìâîëüíóþ ìàñêó, áóäóò ïîêàçàíû òîëüêî ñîâïàäàþùèå ñ íåé
+ çíà÷åíèÿ. Åñëè óêàçàòü íîìåðà çàïèñåé, òîëüêî,
+ ýòè çàïèñè áóäóò ïîêàçàíû; íàïðèìåð:
+
+ SGLINE LIST 2-5,7-9
+ Ñïèñîê SGLINE'îâ ñ íîìåðàìè çàïèñåé ñî 2 äî 5 è ñ 7
+ ïî 9.
+
+ SGLINE VIEW ïîêàæåò áîëåå ïîäðîáíóþ èíôîðìàöèþ, ÷åì SGLINE LIST, è
+ ïîêàæåò òàêæå êòî äîáàâèë SGLINE, âðåìÿ óñòàíîâëåíèÿ SGLINE'à, êîãäà
+ îí èñòåêàåò, íó è êîíå÷íî æå ìàñêó ðåàëüíîãî èìåíè è ïðè÷èíó SGLINE'à.
+
+ SGLINE CLEAR óäàëÿåò âñå çàïèñè èç ñïèñêà SGLINE'îâ.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû ñåðâèñîâ.
+
+OPER_HELP_SQLINE
+ Ñèíòàêñèñ: SQLINE ADD [+âðåìÿ èñòå÷åíèÿ] ìàñêà:ïðè÷èíà
+ SQLINE DEL {ìàñêà | íîìåð çàïèñè | list}
+ SQLINE LIST [ìàñêà | list]
+ SQLINE VIEW [ìàñêà | list]
+ SQLINE CLEAR
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì SQLINE'îâ. Åñëè
+ ïîëüçîâàòåëü ñ íèêîì, ïîäïàäàþùèé ïîä ìàñêó SQLINE'à ïîïûòàåòñÿ
+ ïðèêîííåêòèòüñÿ, ñåðâèñû íå ðàçðåøàò åìó óñòàíîâèòü
+ ñîåäèíåíèå.
+
+ Åñëè ïåðâûé ñèìâîë ìàñêè #, ñåðâèñû íå ðàçðåøàò
+ èñïîëüçîâàòü ïîäïàäàþùèå ïîä ìàñêó êàíàëû (íà IRC ñåðâåðàõ, êîòîðûå
+ ýòî ïîääåðæèâàþò).
+
+ SQLINE ADD äîáàâëÿåò óêàçàííóþ ìàñêó â ñïèñîê SQLINE'îâ
+ ñ óêàçàííîé ïðè÷èíîé (êîòîðàÿ îáÿçàòåëüíî äîëæíà áûòü óêàçàíà).
+ âðåìÿ èñòå÷åíèÿ - ýòî öåëîå ÷èñëî, êîòîðîå ìîæåò áûòü îäíèì èç: d
+ (äíåé), h (÷àñîâ), èëè m (ìèíóò). Ñî÷åòàíèÿ (òî åñòü, ê ïðèìåðó
+ 1h30m) íå äîïóñêàþòñÿ. Åñëè åäèíèöà èçìåðåíèÿ íå óêàçàíà,
+ ïî óìîë÷àíèþ îíà áóäåò óñòàíîâëåíà â "äíè" (òàêèì îáðàçîì +30 áóäåò îçíà÷àòü 30
+ äíåé). ×òîáû äîáàâèòü âå÷íûé SQLINE, èñïîëüçóéòå âðåìÿ èñòå÷åíèÿ ðàâíûì +0. Åñëè
+ ìàñêà ïîëüçîâàòåëÿ to áûëà äîáàâëåíà, íà÷èíàÿ ñ +, âðåìÿ èñòå÷åíèÿ
+ áóäåò çàäàíî ïî óìîë÷àíèþ. Òåêóùåå âðåìÿ SQLINE'à
+ ïî óìîë÷àíèþ ìîæíî óçíàòü êîìàíäîé
+ STATS AKILL.
+
+ Êîìàíäà SQLINE DEL óäàëÿåò óêàçàííóþ ìàñêó èç ñïèñêà
+ SGLINE'îâ. Åñëè óêàçàíû íîìåðà çàïèñåé,
+ ýòè çàïèñè áóäóò óäàëåíû. (Ñì. ïðèìåð èñïîüçîâàíèÿ êîìàíäû LIST
+ íèæå.)
+
+ Êîìàíäà SQLINE LIST ïîêàçûâàåò òåêóùèé ñïèñîê SQLINE'îâ.
+ Åñëè óêàçàòü ñèìâîëüíóþ ìàñêó, áóäóò ïîêàçàíû òîëüêî ñîâïàäàþùèå ñ íåé
+ çíà÷åíèÿ. Åñëè óêàçàòü íîìåðà çàïèñåé, òîëüêî,
+ ýòè çàïèñè áóäóò ïîêàçàíû; íàïðèìåð:
+
+ SQLINE LIST 2-5,7-9
+ Ñïèñîê SQLINE'îâ ñ íîìåðàìè çàïèñåé ñî 2 äî 5 è ñ 7
+ ïî 9.
+
+ SQLINE VIEW ïîêàæåò áîëåå ïîäðîáíóþ èíôîðìàöèþ, ÷åì SQLINE LIST, è
+ ïîêàæåò òàêæå êòî äîáàâèë SQLINE, âðåìÿ óñòàíîâëåíèÿ SQLINE'à, êîãäà
+ îí èñòåêàåò, íó è êîíå÷íî æå ìàñêó ðåàëüíîãî èìåíè è ïðè÷èíó SQLINE'à.
+
+ SQLINE CLEAR óäàëÿåò âñå çàïèñè èç ñïèñêà SQLINE'îâ.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû ñåðâèñîâ.
+
+OPER_HELP_SZLINE
+ Ñèíòàêñèñ: SZLINE ADD [+âðåìÿ èñòå÷åíèÿ] ìàñêà ïðè÷èíà
+ SZLINE DEL {ìàñêà | íîìåð çàïèñè | list}
+ SZLINE LIST [ìàñêà | list]
+ SZLINE VIEW [ìàñêà | list]
+ SZLINE CLEAR
+
+ Ïîçâîëÿåò Îïåðàòîðàì ñåðâèñîâ óïðàâëÿòü ñïèñêîì SZLINE'îâ. Åñëè
+ ïîëüçîâàòåëü ñ IP àäðåñîì, ïîäïàäàþùèì ïîä ìàñêó SZLINE'à ïîïûòàåòñÿ
+ ïðèêîííåêòèòüñÿ, ñåðâèñû íå ðàçðåøàò åìó óñòàíîâèòü
+ ñîåäèíåíèå (íåâàæíî, åñòü ëè äëÿ ýòîãî IP çàïèñü PTR RR èëè íåò).
+
+ SZLINE ADD äîáàâëÿåò IP ìàñêó â ñïèñîê SZLINE'îâ
+ ñ óêàçàííîé ïðè÷èíîé (êîòîðàÿ îáÿçàòåëüíî äîëæíà áûòü óêàçàíà).
+ âðåìÿ èñòå÷åíèÿ - ýòî öåëîå ÷èñëî, êîòîðîå ìîæåò áûòü îäíèì èç: d
+ (äíåé), h (÷àñîâ), èëè m (ìèíóò). Ñî÷åòàíèÿ (òî åñòü, ê ïðèìåðó
+ 1h30m) íå äîïóñêàþòñÿ. Åñëè åäèíèöà èçìåðåíèÿ íå óêàçàíà,
+ ïî óìîë÷àíèþ îíà áóäåò óñòàíîâëåíà â "äíè" (òàêèì îáðàçîì +30 áóäåò îçíà÷àòü 30
+ äíåé). ×òîáû äîáàâèòü âå÷íûé SGLINE, èñïîëüçóéòå âðåìÿ èñòå÷åíèÿ ðàâíûì +0. Åñëè
+ ìàñêà ïîëüçîâàòåëÿ to áûëà äîáàâëåíà, íà÷èíàÿ ñ +, âðåìÿ èñòå÷åíèÿ
+ áóäåò çàäàíî ïî óìîë÷àíèþ. Òåêóùåå âðåìÿ SZLINE'à
+ ïî óìîë÷àíèþ ìîæíî óçíàòü êîìàíäîé
+ STATS AKILL.
+
+ Êîìàíäà SZLINE DEL óäàëÿåò óêàçàííóþ ìàñêó èç ñïèñêà
+ SZLINE'îâ. Åñëè óêàçàíû íîìåðà çàïèñåé,
+ ýòè çàïèñè áóäóò óäàëåíû. (Ñì. ïðèìåð èñïîüçîâàíèÿ êîìàíäû LIST
+ íèæå.)
+
+ Êîìàíäà SZLINE LIST ïîêàçûâàåò òåêóùèé ñïèñîê SZLINE'îâ.
+ Åñëè óêàçàòü ñèìâîëüíóþ ìàñêó, áóäóò ïîêàçàíû òîëüêî ñîâïàäàþùèå ñ íåé
+ çíà÷åíèÿ. Åñëè óêàçàòü íîìåðà çàïèñåé, òîëüêî,
+ ýòè çàïèñè áóäóò ïîêàçàíû; íàïðèìåð:
+
+ SZLINE LIST 2-5,7-9
+ Ñïèñîê SZLINE'îâ ñ íîìåðàìè çàïèñåé ñî 2 äî 5 è ñ 7
+ ïî 9.
+
+ SZLINE VIEW ïîêàæåò áîëåå ïîäðîáíóþ èíôîðìàöèþ, ÷åì SZLINE LIST, è
+ ïîêàæåò òàêæå êòî äîáàâèë SZLINE, âðåìÿ óñòàíîâëåíèÿ SZLINE'à, êîãäà
+ îí èñòåêàåò, íó è êîíå÷íî æå ìàñêó ðåàëüíîãî èìåíè è ïðè÷èíó SZLINE'à.
+
+ SZLINE CLEAR óäàëÿåò âñå çàïèñè èç ñïèñêà SZLINE'îâ.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû ñåðâèñîâ.
+
+OPER_HELP_SET
+ Ñèíòàêñèñ: SET îïöèÿ ïàðàìåòð
+
+ Óñòàíàâëèâàåò ðàçëè÷íûå ãëîáàëüíûå îïöèè ñåðâèñîâ. Îïöèè
+ òàêèå:
+ READONLY Óñòàíîâèòü ðåæèì òîëüêî-÷òåíèå èëè ÷òåíèå-çàïèñü
+ LOGCHAN Âåñòè ëîã ñåðâèñîâ â êàíàë
+ DEBUG Àêòèâèðîâàòü/äåàêòèâèðîâàòü ðåæèì îòëàäêè
+ NOEXPIRE Àêòèâèðîâàòü/äåàêòèâèðîâàòü ðåæèì íå-èñòå÷åíèÿ
+ SUPERADMIN Àêòèâèðîâàòü/äåàêòèâèðîâàòü ðåæèì Ñóïåðàäìèíà
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_SET_READONLY
+ Ñèíòàêñèñ: SET READONLY {ON | OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò ðåæèì òîëüêî-÷òåíèÿ.  ðåæèìå òîëüêî-÷òåíèÿ
+ îáû÷íûå ïîëüçîâàòåëè íå ìîãó èçìåíÿòü ëþáûå äàííûå,
+ âêëþ÷àÿ ñïèñêè äîñòóïà äëÿ íèêîâ è êàíàëîâ, è ìíîãîå äðóãîå. IRC Îïåðàòîðû
+ ñ äîñòàòî÷íûìè ïðèâèëåãèÿìè íà ñåðâèñàõ ìîãóò ìîäèôèöèðîâàòü ñïèñîê
+ AKILL'îâ è óäàëÿòü èëè çàïðåùàòü íèêè è
+ êàíàëû, íî âñå ýòè èçìåíåíèÿ íå áóäóò ñîõðàíåíû ïîêà ðåæèì
+ òîëüêî-÷òåíèÿ íå áóäåò äåàêòèâèðîâàí ëèáî ñåðâèñû íå çàâåðøàò ðàáîòó
+ èëè íå ïåðåçàïóñòÿòñÿ.
+
+ Ýòà îïöèÿ ÿâëÿåòñÿ ýêâèâàëåíòîì ïàðàìåòðà êîìàíäíîé ñòðîêè
+ -readonly.
+
+OPER_HELP_SET_LOGCHAN
+ Ñèíòàêñèñ: SET LOGCHAN {ON | OFF}
+
+ Ñ âêëþ÷åííûì LOHCHAN, ñåðâèñû áóäóò íå òîëüêî çàïèñûâàòü âñå ñîîáùåíèÿ â ëîã, íî è îòïðàâëÿòü èõ
+ íà ñïåöèàëüíûé êàíàë. Ýòîò êàíàë äîëæåí áûòü îïðåäåëåí â
+ êîíôèãóðàöèîííîì ôàéëå ñåðâèñîâ ÷òîáû ýòà îïöèÿ ìîãëà áûòü
+ èñïîëüçîâàíà.
+
+ Ïðèìå÷àíèå: Èç ñîîáðàæåíèé áåçîïàñíîñòè, ðåêîìåíäóåòñÿ îáðàòèòü îñîáîå
+ âíèìàíèå íà áåçîïàñíîñòü äîñòóïà íà ýòîò êàíàë.
+
+OPER_HELP_SET_DEBUG
+ Ñèíòàêñèñ: SET DEBUG {ON | OFF | íîìåð}
+
+ Âêëþ÷àåò/âûêëþ÷àåò ðåæèì îòëàäêè.  ðåæèìå îòëàäêè, äàííûå, êîòîðûìè ñåðâèñû
+ îáìåíèâàþòñÿ ñ IRC ñåðâåðîì, êîëè÷åñòâî äàííûõ çàâèñèò îò óðîâíÿ (íîìåðà) îòëàäêè
+ áóäóò çàïèñàíû â ëîã. Åñëè óêàçàòü íîìåð,
+ ðåæèì îòëàäêè àêòèâèðóåòñÿ ñ óðîâíåì îòëàäêè, óñòàíîâëåííûì â
+ íîìåð.
+
+ Ýòà îïöèÿ ÿâëÿåòñÿ ýêâèâàëåíòîì ïàðàìåòðà êîìàíäíîé ñòðîêè
+ -debug.
+
+OPER_HELP_SET_NOEXPIRE
+ Ñèíòàêñèñ: SET NOEXPIRE {ON | OFF}
+
+ Âêëþ÷àåò/âûêëþ÷àåò ðåæèì íå-èñòåêàíèÿ.  ýòîì ðåæèìå íèêè,
+ êàíàëû, AKILL'û è èñêëþ÷åíèÿ íèêîãäà íå èñòåêóò, ïîêà îïöèÿ
+ íå áóäåò îòêëþ÷åíà.
+
+ Ýòà îïöèÿ ÿâëÿåòñÿ ýêâèâàëåíòîì ïàðàìåòðà êîìàíäíîé ñòðîêè
+ -noexpire.
+
+OPER_HELP_SET_SUPERADMIN
+ Ñèíòàêñèñ: SET SUPERADMIN {ON | OFF}
+
+ Ýòà îïöèÿ ïîçâîëÿåò Âàì ïîëó÷èòü ñóïåð ïðèâèëåãèè - íàïðèìåð òàêèå êàê
+ "âëàäåëåö" íà âñåõ êàíàëàõ è äðóãîå...
+
+ Ýòà îïöèÿ íå ïîñòîÿííàÿ, è äîëæíà èñïîëüçîâàòüñÿ òîëüêî ïðè êðàéíåé
+ íåîáõîäèìîñòè, óñòàíîâèòå åå â OFF êàê òîëüêî ïåðåñòàíåòå íóæäàòüñÿ â íåé.
+
+
+OPER_HELP_NOOP
+ Ñèíòàêñèñ: NOOP SET ñåðâåð
+ NOOP REVOKE ñåðâåð
+
+ NOOP SET óäàëÿåò âñå O:lines íà óêàçàííîì
+ ñåðâåðå è ïðèáèâàåò âñåõ IRC Îïåðàòîðîâ, íàõîäÿùèõñÿ íà íåì,
+ ÷òîáû íå äàòü èì âîçìîæíîñòü ðåõàøíóòü ñåðâåð (òàê êàê ýòî
+ îòìåíèò ýôôåêò äàííîé êîìàíäû).
+
+ NOOP REVOKE äåëàåò âñå ðàíåå óäàëåííûå O:lines äîñòóïíûìè
+ äëÿ èñïîëüçîâàíèÿ íà ñåðâåðå.
+
+ Ïðèìå÷àíèå: ñåðâåð íå áóäåò ïîëíîñòüþ îãðàíè÷åí
+ ñåðâèñàìè.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_JUPE
+ Ñèíòàêñèñ: JUPE ñåðâåð [ïðè÷èíà]
+
+ Äæóïíóòü ñåðâèñû -- ýòî ñîçäàñò
+ ôàëüøèâûé "ñåðâåð" ïðèêîííåê÷åííûé ê ñåðâèñàì, êîòîðûé
+ íå äàñò ðåàëüíîìó ñåðâåðó ñ ýòèì èìåíåì ïðèêîííåêòèòüñÿ ê ñåòè. Äæóï
+ ìîæåò áûòü óäàëåí, èñïîëüçóÿ ñòàíäàðòíûé SQUIT. Åñëè óêàçàíà ïðè÷èíà,
+ îíà áóäåò ïîêàçàíà â èíôîðìàöèè, âûäàâàåìîé êîííåêòÿùåìóñÿ ñåðâåðó;
+ â èíîì ñëó÷àå, ýòà èíôîðìàöèîííàÿ ñòðîêà áóäåò ñîäåðæàòü òåêñò
+ "Juped by <íèê>", òî åñòü ïîêàæåò ÷åëîâåêà, êîòîðûé
+ äæóïíóë äàííûé ñåðâåð.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_RAW
+ Ñèíòàêñèñ: RAW òåêñò
+
+ Îòïðàâëÿåò òåêñòîâóþ ñòðîêó íàïðÿìóþ íà IRC ñåðâåð, ê êîòîðîìó
+ ïðèëèíêîâàíû ñåðâèñû. Ýòà êîìàíäà èìååò î÷åíü îãðàíè÷åííîå
+ èñïîëüçîâàíèå, îíà ìîæåò âûçâàòü ôàòàëüíóþ îøèáêó â ñåòè ïðè
+ íåâåðíîì èñïîüçîâàíèè. ÍÅ ÈÑÏÎËÜÇÓÉÒÅ ÝÒÓ ÊÎÌÀÍÄÓ áåç
+ àáñîëþòíîé óâåðåííîñòè â òîì, ÷òî Âû äåëàåòå!
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_UPDATE
+ Ñèíòàêñèñ: UPDATE
+
+ Çàñòàâëÿåò ñåðâèñû íåìåäëåííî îáíîâèòü ôàéäû áàç äàííûõ
+ íà äèñêå.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_RELOAD
+ Ñèíòàêñèñ: RELOAD
+
+ Çàñòàâëÿåò ñåðâèñû ïåðå÷èòàòü êîíôèãóðàöèîííûé ôàéë. Ïðèìå÷àíèå:
+ íåêîòîðûå âåùè òðåáóþò ïåðåçàïóñêà ñåðâèñîâ.
+ (íàïðèìåð èçìåíåíèå íèêîâ ïñåâäîêëèåíòîâ ñåðâèñîâ, àêòèâàöèÿ
+ ëèìèòèðîâàíèÿ ñåññèé, è ò.ä.)
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_QUIT
+ Ñèíòàêñèñ: QUIT
+
+ Çàñòàâëÿåò ñåðâèñû íåìåäëåííî çàâåðøèòü ñâîþ ðàáîòó; áàçû äàííûõ
+ íå áóäóò ñîõðàíåíû. Ýòà êîìàíäà íå äîëæíà èñïîëüçîâàòüñÿ êðîìå ñëó÷àåâ
+ ïîâðåæäåíèÿ áàçû äàííûõ â ïàìÿòè, ÷òîáû ïîâðåæäåííàÿ áàçà
+ äàííûõ íå áûëà ñîõðàíåíà. Äëÿ íîðìàëüíîãî çàâåðøåíèÿ ðàáîòû èñïîëüçóéòå
+ êîìàíäó SHUTDOWN.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_SHUTDOWN
+ Ñèíòàêñèñ: SHUTDOWN
+
+ Çàñòàâëÿåò ñåðâèñû ñîõðàíèòü âñå áàçû äàííûõ è çàâåðøèòü ðàáîòó.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_RESTART
+ Ñèíòàêñèñ: RESTART
+
+ Çàñòàâëÿåò ñåðâèñû ñîõðàíèòü âñå áàçû äàííûõ è ïåðåçàïóñòèòüñÿ
+ (ò.å. çàâåðøèòü ðàáîòó è íåìåäëåííî ñíîâà çàïóñòèòü ñåðâèñû íà èñïîëíåíèå).
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_KILLCLONES
+ Ñèíòàêñèñ: KILLCLONES íèê
+
+ Ïðèáèâàåò âñåõ ïîëüçîâàòåëåé, õîñò êîòîðûõ òàêîé æå, êàê ó óêàçàííîãî íèêà.
+ Äîáàâëÿåòñÿ âðåìåííûé AKILL, â âèäå *@host, ÷òîáû ïðåäîòâðàòèòü
+ íåìåäëåííûé ðåêîííåêò ïðèáèòûõ êëèåíòîâ.
+ Òàêæå ïðè èñïîëüçîâàíèè ýòîé êîìàíäû áóäåò îòïðàâëåí wallop,
+ êîòîðûé ñîîáùèò î ïðèáèòîì õîñòå è êîëè÷åñòâå ïðèáèòûõ êëèåíòîâ.
+ Ýòó êîìàíäó î÷åíü óäîáíî ïðèìåíÿòü, ÷òîáû óáðàòü
+ êëîíîâ èç IRC ñåòè.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû ñåðâèñîâ.
+
+OPER_HELP_CHANLIST
+ Ñèíòàêñèñ: CHANLIST [{ñèìâîëíàÿ ìàñêà | íèê} [SECRET]]
+
+ Ïîêàçûâàåò âñå ñîçäàííûå íà äàííûé ìîìåíò êàíàëû â IRC ñåòè, íåâàæíî
+ çàðåãèñòðèðîâàíû îíè èëè íåò.
+
+ Åñëè óêàçàíà ñèìâîëüíàÿ ìàñêà, ïîêàæåò òîëüêî òå êàíàëû, êîòîðûå ñîâïàäàþò ñ íåé. Åñëè óêàçàí íèê,
+ ïîêàæåò òîëüêî òå êàíàëû, íà êîòîðûõ íàõîäèòñÿ ýòîò íèê. Åñëè óêàçàí ïàðàìåòð SECRET,
+ ïîêàæåò òîëüêî êàíàëû ñ óêàçàííîé ñèìâîëüíîé ìàñêîé íà êîòîðûõ
+ ñòîèò ðåæèì +s èëè +p.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_USERLIST
+ Ñèíòàêñèñ: USERLIST [{ñèìâîëüíàÿ ìàñêà | #êàíàë} [INVISIBLE]]
+
+ Ïîêàçàòü âñåõ ïîëüçîâàòåëåé, íàõîäÿùèõñÿ â äàííûé ìîìåíò â IRC ñåòè, áåç ðàçíèöû
+ çàðåãèñòðèðîâàí ó íèõ íèê èëè íåò.
+
+ Åñëè óêàçàíà ñèìâîëüíàÿ ìàñêà, ïîêàæåò òîëüêî ïîëüçîâàòåëåé ñîâïàäàþùèõ ñ íåé (ìàñêà äîëæíà áûòü
+ â ôîðìàòå nick!user@host). Åñëè óêàçàí #êàíàë, ïîêàæåò òîëüêî ïîëüçîâàòåëåé,
+ íàõîäÿùèõñÿ íà ýòîì êàíàëå. Åñëè óêàçàí ïàðåìåòð INVISIBLE áóäóò ïîêàçàíû
+ òîëüêî òå ïîëüçîâàòåëè, íà êîòîðûõ ñòîèò ôëàã +i.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_CACHE
+ Ñèíòàêñèñ: CACHE DEL õîñò
+ CACHE LIST ñèìâîëüíàÿ ìàñêà [QUEUED | ALL]
+
+ Êîìàíäà CACHE DEL óäàëÿåò óêàçàííûé õîñò èç
+ êýøà. Ýòà êîìàíäà ïðåäíàçíà÷åíà òîëüêî äëÿ îòëàäêè.
+
+ Êîìàíäà CACHE LIST ïîêàçûâàåò ñïèñêî âñåõ íàéäåííûõ ïðîêñè, ïîäïàäàþùèõ ïîä
+ óêàçàííóþ ñèìâîëüíóþ ìàñêó. Åñëè óêàçàòü ïàðàìåòð QUEUED, òî áóäåò ïîêàçàíà
+ î÷åðåäü ñêàíîâ, è åñëè óêàçàòü ïàðàìåòð ALL,
+ òî áóäóò ïîêàçàíû âñå êýøèðîâàííûå õîñòû.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+OPER_HELP_MODLOAD
+ Ñèíòàêñèñ: MODLOAD ÈìÿÔàéëà
+
+ Ýòà êîìàíäà çàãðóçèò óêàçàííûé ìîäóëü èç äèðåêòîðèè
+ ñ ìîäóëÿìè.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Ñóïåðïîëüçîâàòåëè ñåðâèñîâ.
+
+OPER_HELP_MODUNLOAD
+ Ñèíòàêñèñ: MODUNLOAD ÈìÿÔàéëà
+
+ Ýòà êîìàíäà çàãðóçèò óêàçàííûé ìîäóëü èç äèðåêòîðèè
+ ñ ìîäóëÿìè.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Ñóïåðïîëüçîâàòåëè ñåðâèñîâ.
+
+OPER_HELP_MODINFO
+ Ñèíòàêñèñ: MODINFO ÈìÿÔàéëà
+
+ Ýòà êîìàíäà ïîêàæåò èíôîðìàöèþ îá óêàçàííîì ìîäóëå
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Ñóïåðïîëüçîâàòåëè ñåðâèñîâ.
+
+OPER_HELP_MODLIST
+ Ñèíòàêñèñ: MODLIST
+
+ Ñïèñîê âñåõ çàãðóæåííûõ ìîäóëåé
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Ñóïåðïîëüçîâàòåëè ñåðâèñîâ.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S ïîçâîëÿåò Âàì ïîâåñèòü áîòà íà ñâîé êàíàë.
+ Ýòî ñäåëàíî äëÿ òåõ, êòî íå ìîæåò èíà÷å óñòàíîâèòü èëè
+ íàñòðîèòü áîòà, èëè åñëè èñïîëüçîâàíèå áîòîâ çàïðåùåíî
+ â Âàøåé IRC ñåòè. Äîñòóïíûå êîìàíäû ïåðå÷èñëåíû íèæå;
+ ÷òîáû èñïîëüçîâàòü èõ, íàïèøèòå /msg %S êîìàíäà. Äëÿ ïîëó÷åíèÿ
+ áîëåå ïîäðîáíîé èíôîðìàöèè ïî êîíêðåòíîé êîìàíäå, íàïèøèòå /msg
+ %S HELP êîìàíäà.
+
+ BOTLIST Ñïèñîê äîñòóïíûõ äëÿ óñòàíîâêè áîòîâ
+ ASSIGN Óñòàíîâèòü áîòà íà êàíàë
+ SET Êîíôèãóðèðîâàòü íàñòðîéêè áîòà
+ KICK Êîíôèãóðèðîâàòü çà ÷òî áîò áóäåò êèêàòü è áàíèòü
+ BADWORDS Óïðàâëåíèå ñïèñêîì ïëîõèõ ñëîâ
+
+ Äðóãèå êîìàíäû: ACT INFO SAY UNASSIGN
+
+ Áîò ïðèñîåäèíèòñÿ ê êàíàëó ïîñëå òîãî, êàê íà íåì îêàæåòñÿ
+ íå ìåíåå %d ïîëüçîâàòåëåé.
+
+BOT_HELP_BOTLIST
+ Ñèíòàêñèñ: BOTLIST
+
+ Ïîêàæåò âñåõ äîñòóïíûõ äëÿ óñòàíîâêè áîòîâ.
+
+BOT_HELP_ASSIGN
+ Ñèíòàêñèñ: ASSIGN #êàíàë íèê
+
+ Óñòàíîâèò áîòà ïîä óêàçàííûì íèêîì íà óêàçàííûé êàíàë. Òåïåðü
+ Âû ìîæåòå íàñòðàèâàòü îïöèè áîòà òàê, êàê Âàì
+ íåîáõîäèìî.
+
+BOT_HELP_UNASSIGN
+ Ñèíòàêñèñ: UNASSIGN #êàíàë
+
+ Óáèðàåò áîòà ñ óêàçàííîãî êàíàëà. Ïðè èñïîëüçîâàíèè ýòîé êîìàíäû
+ áîò áîëüøå íå áóäåò çàõîäèòü íà êàíàë. Òåì íå ìåíåå, êîíôèãóðàöèÿ
+ áîòà äëÿ äàííîãî êàíàëà áóäåò ñîõðàíåíà, ïîýòîìó åñëè Âû ïîçäíåå
+ ñíîâà óñòàíîâèòå ýòîãî áîòà íà êàíàë, âñå åãî íàñòðîéêè áóäóò
+ âîññòàíîâëåíû.
+
+BOT_HELP_INFO
+ Ñèíòàêñèñ: INFO {#êàíàë | íèê}
+
+ ÏÎçâîëÿåò Âàì óâèäåòü èíôîðìàöèþ %S î êàíàëå èëè î áîòå.
+ Åñëè óêàçàòü #êàíàë, òî Âû ïîëó÷èòå èíôîðìàöèþ î êàíàëå
+ è íàñòðîéêàõ êèêîâ. Åñëè óêàçàòü íèê,
+ Âû ïîëó÷èòå èíôîðìàöèþ î áîòå, êîãäà áîò áûë ñîçäàí
+ è ÷èñëî êàíàëîâ íà êîòîðîì îí íàõîäèòñÿ.
+
+BOT_HELP_SET
+ Ñèíòàêñèñ: SET #êàíàë îïöèÿ ïàðàìåòðû
+
+ Êîíôèãóðàöèÿ îïöèé áîòà. Íàñòðàèâàåìûå îïöèè:
+
+ DONTKICKOPS Íå êèêàòü îïåðàòîðîâ
+ DONTKICKVOICES Íå êèêàòü âîéñîâ
+ GREET Âêëþ÷èòü ñîîáùåíèå ïðèâåòñòâèé
+ FANTASY Âêëþ÷èòü ðåæèì Ôàíòàçèè
+ SYMBIOSIS Ïîçâîëèòü áîòó êèêàòü/áàíèòü/ìåíÿòü ðåæèìû, èñïîëüçóÿ ChanServ
+
+ Íàïèøèòå /msg %S HELP SET îïöèÿ äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè
+ î êîíêðåòíîé îïöèè.
+
+ Ïðèìå÷àíèå: äîñòóï ê ýòîé êîìàíäå ìîæåò áûòü èçìåíåí ÷åðåç
+ level SET.
+
+BOT_HELP_SET_DONTKICKOPS
+ Ñèíòàêñèñ: SET #êàíàë DONTKICKOPS {ON|OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò çàùèòó îïåðàòîðîâ êàíàëà íà óêàçàííîì êàíàëå.
+ Åñëè âêëþ÷åíî, îïåðàòîðû íå áóäóò êèêíóòû áîòîì
+ äàæå åñëè èõ óðîâåíü äîñòóïà íå ñîîòâåòñòâóåò óðîâíþ NOKICK.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Ñèíòàêñèñ: SET #êàíàë DONTKICKVOICES {ON|OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò çàùèòó âîéñîâ íà óêàçàííîì êàíàëå.
+ Åñëè âêëþ÷åíî, âîéñû íå áóäóò êèêíóòû áîòîì
+ äàæå åñëè èõ óðîâåíü äîñòóïà íå ñîîòâåòñòâóåò óðîâíþ NOKICK.
+
+BOT_HELP_SET_FANTASY
+ Ñèíòàêñèñ: SET #êàíàë FANTASY {ON|OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò ðåæèì Ôàíòàçèè íà êàíàëå.
+ Åñëè âêëþ÷åíî, ïîëüçîâàòåëè ìîãóò èñïîëüçîâàòü
+ êîìàíäû !op, !deop, !voice, !devoice,
+ !kick, !kb, !unban, !seen íà êàíàëå (ìîæíî èñïîëüçîâàòü,
+ óêàçûâàÿ íèê (íåîáÿçàòåëüíî),
+ èëè ïðè÷èíó (äëÿ êîìàíä !kick, !kb)).
+
+ Ïðèìå÷àíèå: ÷òîáû èñïîëüçîâàòü êîìàíäû Ôàíòàçèè,
+ ïîëüçîâàòåëè ÄÎËÆÍÛ èìåòü ñîîòâåòñòâóþùèé óðîâåíü äîñòóïà
+ ê êîìàíäàì Ôàíòàçèè è äðóãèå ïðèâèëåãèè,
+ òðåáóåìûå äëÿ ýòèõ êîìàíä (íàïðèìåð, ÷òîáû èñïîëüçîâàòü êîìàíäó
+ !op, ïîëüçîâàòåëü äîëæåí èìåòü ïðàâà íà èñïîëüçîâàíèå êîìàíä
+ OP/DEOP).
+
+BOT_HELP_SET_GREET
+ Ñèíòàêñèñ: SET #êàíàë GREET {ON|OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò ðåæèì ïðèâåòñòâèé íà êàíàëå.
+ Åñëè âêëþ÷åíî, áîò áóäåò ïîêàçûâàòü ïðèâåòñòâåííûå ñîîáùåíèÿ
+ äëÿ ïîëüçîâàòåëåé, çàõîäÿùèõ íà êàíàë è èìåþùèõ
+ äîñòàòî÷íûé óðîâåíü äîñòóïà.
+
+BOT_HELP_SET_SYMBIOSIS
+ Ñèíòàêñèñ: SET #êàíàë SYMBIOSIS {ON|OFF}
+
+ Âêëþ÷àåò èëè âûêëþ÷àåò ðåæèì ñèìáèîçà íà êàíàëå.
+ Åñëè âêëþ÷åíî, áîò áóäåò âûïîëíÿòü ìíîãèå äåéñòâèÿ
+ íà êàíàëå ÷åðåç %s, íàïðèìåð èçìåíåíèå ðåæèìîâ êàíàëà,
+ êèêè, è äð.
+
+BOT_HELP_KICK
+ Ñèíòàêñèñ: KICK #êàíàë îïöèÿ ïàðàìåòðû
+
+ Êîíôèãóðèðîâàòü çà ÷òî áîò áóäåò êèêàòü è áàíèòü. Äîñòóïíûå îïöèè:
+
+ BOLDS Áóäåò ëè áîò êèêàòü çà âûäåëåíèå æèðíûì øðèôòîì
+ BADWORDS Áóäåò ëè áîò êèêàòü çà ïëîõèå ñëîâà
+ CAPS Áóäåò ëè áîò êèêàòü çà èñïîëüçîâàíèå CapsLOCK
+ COLORS Áóäåò ëè áîò êèêàòü çà âûäåëåíèå öâåòàìè
+ FLOOD Áóäåò ëè áîò êèêàòü çà ôëóä
+ REPEAT Áóäåò ëè áîò êèêàòü çà
+ ïîâòîðû
+ REVERSES Áóäåò ëè áîò êèêàòü çà ðåâåðñû
+ UNDERLINES Áóäåò ëè áîò êèêàòü çà âûäåëåíèå ïîä÷åðêèâàíèåì
+
+ Íàïèøèòå /msg %S HELP KICK îïöèÿ äëÿ ïîëó÷åíèÿ áîëåå ïîëíîé
+ èíôîðìàöèè î êîíêðåòíîé îïöèè.
+
+ Ïðèìå÷àíèå: äîñòóï ê ýòîé êîìàíäå ìîæåò áûòü èçìåíåí ÷åðåç
+ level SET.
+
+BOT_HELP_KICK_BOLDS
+ Ñèíòàêñèñ: KICK #êàíàë BOLDS {ON|OFF} [ttb]
+
+ Áóäåò ëè áîò êèêàòü çà âûäåëåíèå æèðíûì øðèôòîì.
+ Åñëè âêëþ÷åíî - áóäåò.
+
+ ttb ýòî êîëè÷åñòâî êèêîâ, ïîñëå êîòîðûõ
+ áîò ïîñòàâèò áàí. Åñëè Âû íå óêàæåòå ttb,
+ ïîëüçîâàòåëü íèêîãäà íå áóäåò áàíèòüñÿ.
+
+BOT_HELP_KICK_COLORS
+ Ñèíòàêñèñ: KICK #êàíàë COLORS {ON|OFF} [ttb]
+
+ Áóäåò ëè áîò êèêàòü çà âûäåëåíèå öâåòàìè.
+ Åñëè âêëþ÷åíî - áóäåò.
+
+ ttb ýòî êîëè÷åñòâî êèêîâ, ïîñëå êîòîðûõ
+ áîò ïîñòàâèò áàí. Åñëè Âû íå óêàæåòå ttb,
+ ïîëüçîâàòåëü íèêîãäà íå áóäåò áàíèòüñÿ.
+
+BOT_HELP_KICK_REVERSES
+ Ñèíòàêñèñ: KICK #êàíàë REVERSES {ON|OFF} [ttb]
+
+ Áóäåò ëè áîò êèêàòü çà ðåâåðñû.
+ Åñëè âêëþ÷åíî - áóäåò.
+
+ ttb ýòî êîëè÷åñòâî êèêîâ, ïîñëå êîòîðûõ
+ áîò ïîñòàâèò áàí. Åñëè Âû íå óêàæåòå ttb,
+ ïîëüçîâàòåëü íèêîãäà íå áóäåò áàíèòüñÿ.
+
+BOT_HELP_KICK_UNDERLINES
+ Ñèíòàêñèñ: KICK #êàíàë UNDERLINES {ON|OFF} [ttb]
+
+ Áóäåò ëè áîò êèêàòü çà âûäåëåíèå ïîä÷åðêèâàíèåì.
+ Åñëè âêëþ÷åíî - áóäåò.
+
+ ttb ýòî êîëè÷åñòâî êèêîâ, ïîñëå êîòîðûõ
+ áîò ïîñòàâèò áàí. Åñëè Âû íå óêàæåòå ttb,
+ ïîëüçîâàòåëü íèêîãäà íå áóäåò áàíèòüñÿ.
+
+BOT_HELP_KICK_CAPS
+ Ñèíòàêñèñ: KICK #êàíàë CAPS {ON|OFF} [ttb [ìèíèìóì [ïðîöåíòû]]]
+
+ Áóäåò ëè áîò êèêàòü çà èñïîëüçîâàíèå CapsLOCK.
+ Åñëè âêëþ÷åíî - áîò áóäåò êèêàòü òåõ, êòî ëþáèò ðàçãîâàðèâàòü
+ áîëüøèìè áóêâàìè.
+
+ Áîò êèêíåò ïîëüçîâàòåëÿ, åñëè îí èñïîëüçóåò ìèíèìóì áîëüøèõ áóêâ,
+ êîëè÷åñòâî êîòîðûõ ñîñòàâèò ïðîöåíòû%% îò îáùåãî êîëè÷åñòâà
+ áóêâ (Åñëè íå óêàçàíû, òî çíà÷åíèÿ ïî óìîë÷àíèþ 10 ñèìâîëîâ
+ è 25%%).
+
+ ttb ýòî êîëè÷åñòâî êèêîâ, ïîñëå êîòîðûõ
+ áîò ïîñòàâèò áàí. Åñëè Âû íå óêàæåòå ttb,
+ ïîëüçîâàòåëü íèêîãäà íå áóäåò áàíèòüñÿ.
+
+BOT_HELP_KICK_FLOOD
+ Ñèíòàêñèñ: KICK #êàíàë FLOOD {ON|OFF} [ttb [ëèíèé [ñåêóíäû]]]
+
+ Áóäåò ëè áîò êèêàòü çà ôëóä. Åñëè âêëþ÷åíî,
+ áîò áóäåò êèêàòü ôëóäåðîâ ñ êàíàëà,
+ åñëè îíè ñêàçàëè áîëåå ëèíèé ñòðîê òåêñòà çà ñåêóíäû ñåêóíä
+ (Åñëè íå óêàçàíî, çíà÷åíèÿ ïî óìîë÷àíèþ 6 ñòðîê çà 10 ñåêóíä).
+
+ ttb ýòî êîëè÷åñòâî êèêîâ, ïîñëå êîòîðûõ
+ áîò ïîñòàâèò áàí. Åñëè Âû íå óêàæåòå ttb,
+ ïîëüçîâàòåëü íèêîãäà íå áóäåò áàíèòüñÿ.
+
+BOT_HELP_KICK_REPEAT
+ Ñèíòàêñèñ: KICK #êàíàë REPEAT {ON|OFF} [ttb [÷èñëî ïîâòîðîâ]]
+
+ Áóäåò ëè áîò êèêàòü çà ïîâòîðû. Åñëè âêëþ÷åíî,
+ áîò áóäåò êèêàòü ïîëüçîâàòåëåé, êîòîðûå ïîâòîðÿþò îäèí è òîò æå
+ òåêñò ÷èñëî ïîâòîðîâ ðàç (Åñëè íå óêàçàíî, çíà÷åíèå ïî óìîë÷àíèþ
+ ðàâíî 3).
+
+ ttb ýòî êîëè÷åñòâî êèêîâ, ïîñëå êîòîðûõ
+ áîò ïîñòàâèò áàí. Åñëè Âû íå óêàæåòå ttb,
+ ïîëüçîâàòåëü íèêîãäà íå áóäåò áàíèòüñÿ.
+
+BOT_HELP_KICK_BADWORDS
+ Ñèíòàêñèñ: KICK #êàíàë BADWORDS {ON|OFF} [ttb]
+
+ Áóäåò ëè áîò êèêàòü çà ïëîõèå ñëîâà. Åñëè âêëþ÷åíî,
+ áîò áóäåò êèêàòü ïîëüçîâàòåëåé, èñïîëüçóþùèõ ïëîõèå ñëîâà
+ íà êàíàëå.
+
+ Âû ìîæåòå óñòàíîâèòü ïëîõèå ñëîâà íà êàíàëå, èñïîëüçóÿ
+ êîìàíäó BADWORDS. Íàïèøèòå /msg %S HELP BADWORDS äëÿ
+ ïîëó÷åíèÿ áîëåå ïîäðîáíîé èíôîðìàöèè.
+
+ ttb ýòî êîëè÷åñòâî êèêîâ, ïîñëå êîòîðûõ
+ áîò ïîñòàâèò áàí. Åñëè Âû íå óêàæåòå ttb,
+ ïîëüçîâàòåëü íèêîãäà íå áóäåò áàíèòüñÿ.
+
+BOT_HELP_BADWORDS
+ Ñèíòàêñèñ: BADWORDS #êàíàë ADD ñëîâî [SINGLE | START | END]
+ BADWORDS #êàíàë DEL {ñëîâî | íîìåð çàïèñè | list}
+ BADWORDS #êàíàë LIST [ìàñêà | list]
+ BADWORDS #êàíàë CLEAR
+
+ Óïðàâëÿåò ñïèñêîì ïëîõèõ ñëîâ äëÿ êàíàëà. Ñïèñîê ïëîõèõ ñëîâ
+ îïðåäåëÿåò çà èñïîëüçîâàíèå êàêèõ ñëîâ ïîëüçîâàòåëü áóäåò êèêíóò,
+ ïðè óñëîâèè ÷òî äàííàÿ âîçìîæíîñòü âêëþ÷åíà. Äëÿ ïîëó÷åíèÿ áîëåå ïîëíîé èíôîðìàöèè,
+ íàïèøèòå /msg %S HELP KICK BADWORDS.
+
+ Êîìàíäà BADWORDS ADD äîáàâèò óêàçàííîå ñëîâî â ñïèñîê
+ ïëîõèõ ñëîâ. Åñëè óêàçàí ïàðàìåòð SINGLE, ïîëüçîâàòåëü áóäåò
+ êèêíóò, òîëüêî åñëè ïîëüíîñòüþ ïðîèçíåñåò ýòî ñëîâî. Åñëè óêàçàòü ïàðàìåòð START,
+ ïîëüçîâàòåëü áóäåò êèêíóò, êîãäà ïðîèçíåñåò ñëîâî, íà÷èíàþùååñÿ
+ íà ñëîâî. Åñëè óêàçàòü ïàðàìåòð END, òî êèê áóäåò ïðîèçâåäåí,
+ åñëè ïîëüçîâàòåëü ïðîèçíåñåò ñëîâî, çàêàí÷èâàþùååñÿ íà
+ ñëîâî. Åñëè Âû íå óêàæåòå íè îäèí èç ýòèõ ïàðàìåòðîâ, ëþáîé ïîëüçîâàòåëü
+ áóäåò êèêíóò âñÿêèé ðàç ïî ïðîèçíåñåíèè ñëîâà.
+
+ Êîìàíäà BADWORDS DEL óäàëÿåò óêàçàííîå ñëîâî èç ñïèñêà ïëîõèõ ñëîâ.
+ Åñëè óêàçàòü íîìåðà çàïèñåé, óêàçàííûå çàïèñè
+ áóäóò óäàëåíû. (Ñì. ïðèìåð èñïîëüçîâàíèÿ êîìàíäû LIST íèæå.)
+
+ Êîìàíäà BADWORDS LIST ïîêàæåò òåêóùèé ñïèñîê ïëîõèõ ñëîâ. Åñëè óêàçàòü
+ ñèìâîëüíóþ ìàñêó, òîëüêî ñîâïàäàþùèå ñ íåé ñëîâà áóäóò
+ ïîêàçàíû. Åñëè óêàçàòü íîìåðà çàïèñåé, áóäóò ïîêàçàíû òîëüêî
+ óêàçàííûå çàïèñè; íàïðèìåð:
+
+ BADWORDS #channel LIST 2-5,7-9
+ Ïîêàæåò ïëîõèå ñëîâà ñ íîìåðàìè çàïèñåé ñî 2 ïî 5 è ñ
+ 7 ïî 9.
+
+ Êîìàíäà BADWORDS CLEAR óäàëèò âñå ïëîõèå ñëîâà
+ èç ñïèñêà.
+
+BOT_HELP_SAY
+ Ñèíòàêñèñ: SAY #êàíàë òåêñò
+
+ Çàñòàâëÿåò áîòà ïðîèçíåñòè óêàçàííûé òåêñò íà óêàçàííûé êàíàë.
+
+BOT_HELP_ACT
+ Ñèíòàêñèñ: ACT #êàíàë òåêñò
+
+ Çàñòàâëÿåò áîòà âûïîëíèòü êîìàíäó, ýêâèâàëåíòíóþ êîìàíäó "/me"
+ íà óêàçàííîì êàíàëå, èñïîëüçîâàâ óêàçàííûé òåêñò.
+
+BOT_SERVADMIN_HELP
+
+ Íèæåñëåäóþùèå êîìàíäû äîñòóïíû äëÿ Àäìèíèñòðàòîðîâ ñåðâèñîâ:
+
+ BOT Óïðàâëåíèå áîòàìè
+
+BOT_SERVADMIN_HELP_BOT
+ Ñèíòàêñèñ: BOT ADD íèê èäåíò õîñò ðåàëüíîå èìÿ
+ BOT CHANGE ñòàðûé íèê íîâûé íèê [èäåíò [õîñò [ðåàëüíîå èìÿ]]]
+ BOT DEL íèê
+ BOT LIST
+
+ Ïîçâîëÿåò Àäìèíèñòðàòîðàì ñåðâèñîâ ñîçäàâàòü, èçìåíÿòü è óäàëÿòü
+ áîòîâ, êîòîðûå ìîãóò áûòü â äàëüíåéøåì èñïîëüçîâàíû ïîëüçîâàòåëÿìè
+ íà ñâîèõ êàíàëàõ.
+
+ BOT ADD äîáàâëÿåò áîòà ñ óêàçàííûì íèêîì, èäåíòîì,
+ õîñòîì è ðåàëüíûì èìåíåì. Òàê êàê êîððåêòíîñòü ýòèõ çíà÷åíèé
+ íå ïðîâåðÿåòñÿ, áóäüòå êðàéíå îñòîðîæíû!
+ BOT CHANGE ïîçâîëÿåò èçìåíÿòü íèê, èäåíò, õîñò
+ èëè ðåàëüíîå èìÿ áîòà áåç óäàëåíèÿ åãî (è âñåõ
+ åãî íàñòðîåê).
+ BOT DEL óäàëÿåò óêàçàííîãî áîòà èç ñïèñêà áîòîâ.
+ BOT LIST èëè BOTLIST ïîêàæåò ñïèñîê
+ âñåõ äîñòóïíûõ â ñåòè áîòîâ.
+
+ Ïðèìå÷àíèå: Åñëè Âû ñîçäàëè áîòà ñ íèêîì, ðàíåå êåì-òî çàðåãèñòðèðîâàííûì,
+ ýòîò íèê áóäåò óäàëåí. À òàêæå, åñëè êòî-òî èñïîëüçóåò äàííûé íèê
+ â ìîìåíò ñîçäàíèÿ áîòà, îí áóäåò ïðèáèò.
+
+BOT_SERVADMIN_HELP_SET
+
+ Îïöèè, çàðåçåðâèðîâàííûå äëÿ èñïîëüçîâàíèÿ Àäìèíèñòðàòîðàìè ñåðâèñîâ:
+
+ NOBOT Çàïðåòèòü èñïîëüçîâàíèå áîòîâ
+ íà êàêîì-ëèáî êàíàëå
+ PRIVATE Çàïðåòèòü èñïîëüçîâàíèå áîòà êåì-ëèáî, êðîìå
+ IRC Îïåðàòîðîâ
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Ñèíòàêñèñ: SET #êàíàë NOBOT {ON|OFF}
+
+ Ýòà îïöèÿ çàïðåùàåò èñïîëüçîâàòü áîòîâ íà êàíàëå. Åñëè áîò
+ óæå óñòàíîâëåí íà êàíàë, îí áóäåò àâòîìàòè÷åñêè óäàëåí ñ íåãî
+ ñðàçó ïîñëå âêëþ÷åíèÿ äàííîé îïöèè.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Ñèíòàêñèñ: SET íèê áîòà PRIVATE {ON|OFF}
+
+ Ýòà îïöèÿ çàïðåùàåò óñòàíàâëèâàòü áîòà íà êàíàë îáû÷íûì ïîëüçîâàòåëÿì.
+ Òàêîãî áîòà ìîãóò óñòàíîâèòü òîëüêî IRC Îïåðàòîðû.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Àäìèíèñòðàòîðû ñåðâèñîâ.
+
+###########################################################################
+#
+# HostServ messages
+#
+###########################################################################
+HOST_EMPTY
+ Ëèñò âèðòóàëüíûõ õîñòîâ ïóñò.
+HOST_ENTRY
+ #%d Íèê:%s, âèðòóàëüíûé õîñò:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Íèê:%s, âèðòóàëüíûé õîñò:%s@%s (%s - %s)
+HOST_SET
+ Âèðòóàëüíûé õîñò äëÿ %s óñòàíîâëåí â %s.
+HOST_IDENT_SET
+ Âèðòóàëüíûé õîñò %s óñòàíîâëåí â %s@%s.
+HOST_SETALL
+ Âèðòóàëüíûõ õîñò äëÿ ãðóïïû %s óñòàíîâëåí â %s.
+HOST_DELALL
+ Âèðòóàëüíûå õîñòû äëÿ ãðóïïû %s áûëè óäàëåíû.
+HOST_DELALL_SYNTAX
+ Ñèíòàêñèñ: DELALL <íèê>.
+HOST_IDENT_SETALL
+ Âèðòóàëüíûé õîñò äëÿ ãðóïïû %s óñòàíîâëåí â %s@%s.
+HOST_SET_ERROR
+ Âèðòóàëüíûé õîñò äîëæåí áûòü â ïðàâèëüíîì ôîðìàòå èëè äåéñòâèòåëüíîé õîñòìàñêîé.
+HOST_SET_IDENT_ERROR
+ Èäåíò âèðòóàëüíîãî õîñòà äîëæåí áûòü â ïðàâèëüíîì ôîðìàòå.
+HOST_SET_TOOLONG
+ Îøèáêà! Âèðòóàëüíûé õîñò ñëèøêîì äëèííûé, ïîæàëóéñòà èñïîëüçóéòå õîñò äëèíîé ìåíüøå %d ñèìâîëîâ.
+HOST_SET_IDENTTOOLONG
+ Îøèáêà! Èäåíò ñëèøêîì äëèííûé, ïîæàëóéñòà èñïîëüçóéòå èäåíò äëèíîé ìåíüøå %d ñèìâîëîâ.
+HOST_NOREG
+ Ïîëüçîâàòåëü %s íå íàéäåí â áàçå äàííûõ NickServ.
+HOST_SET_SYNTAX
+ Ñèòàêñèñ: /msg %s set <íèê> <õîñòìàñêà>.
+HOST_SETALL_SYNTAX
+ Ñèíòàêñèñ /msg %s setall <íèê> <õîñòìàñêà>.
+HOST_DENIED
+ ÄÎñòóï çàïðåùåí.
+HOST_NOT_ASSIGNED
+ Ïîæàëóéñòà îáðàòèòåñü ê IRC Îïåðàòîðó, ÷òîáû ïîëó÷èòü âèðòóàëüíûé õîñò.
+HOST_ACTIVATED
+ Âàø âèðòóàëüíûé õîñò %s àêòèâèðîâàí.
+HOST_IDENT_ACTIVATED
+ Âàø âèðòóàëüíûé õîñò %s@%s àêòèâèðîâàí.
+HOST_ID
+ Ñíà÷àëà, ïîæàëóéñòà, èäåíòèôèöèðóéòå ñâîé íèê.
+HOST_NOT_REGED
+ Âàø íèê äîëæåí áûòü çàðåãèñòðèðîâàí, ÷òîáû Âû ñìîãëè èñïîëüçîâàòü âèðòóàëüíûé õîñò.
+HOST_DEL
+ Âèðòóàëüíûé õîñò äëÿ %s óäàëåí.
+HOST_DEL_SYNTAX
+ Ñèíòàêñèñ: /msg %s del <íèê>.
+HOST_OFF_UNREAL
+ Âàø âèðòóàëüíûé õîñò óäàëåí. ÷òîáû ñíîâà óñòàíîâèòü åãî íà Âàñ, íàïèøèòå /mode %s +x
+HOST_NO_VIDENT
+ Âàø IRC ñåðâåð íå ïîääåðæèâàåò âèðòóàëüíûå èäåíòû, åñëè ýòî íå òàê, ïîæàëóéñòà îáðàòèòåñü ê íàñ, ýòî ìîæåò áûòü îøèáêà â ïðîãðàììå.
+HOST_GROUP
+ Âñå âèðòóàëüíûå õîñòû â ãðóïïå %s áûëè óñòàíîâëåíû â %s
+HOST_IDENT_GROUP
+ Âñå âèðòóàëüíûå õîñòû â ãðóïïå %s áûëè óñòàíîâëåíû â %s@%s
+HOST_LIST_FOOTER
+ Ïîêàçûâàåò âñå çàïèñè (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Ïîêàçûâàåò çàïèñè ñ %d ïî %d
+HOST_LIST_KEY_FOOTER
+ Ïîêàçûâàåò çàïèñè, ñîäåðæàùèå êëþ÷ %s (Ñ÷åò÷èê: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ %S commands:
+ ON Àêòèâèðóåò íàçíà÷åííûé Âàì âèðòóàëüíûé õîñò
+ OFF Äåàêòèâèðóåò âèðòóàëüíûé õîñò
+ GROUP Óñòàíàâëèâàåò è ñèíõðîíèçèðóåò âèðòóàëüíûé õîñò äëÿ âñåõ íèêîâ â Âàøåé ãðóïïå
+
+HOST_OPER_HELP
+ Êîìàíäû, äîñòóïíûå òîëüêî Îïåðàòîðàì õîñòîâ (setter/removers):
+ SET Óñòàíîâèòü âèðóòàëüíûé õîñò ïîëüçîâàòåëþ
+ SETALL Óñòàíîâèòü âèðòóàëüíûé õîñò äëÿ âñåõ íêîâ â ãðóïïå
+ DEL Óäàëèòü âèðòóàëüíûé õîñò ïîëüçîâàòåëÿ
+ DELALL Óäàëèòü âèðòóàëüíûå õîñòû äëÿ âñåõ íèêîâ â ãðóïïå
+
+HOST_ADMIN_HELP
+ Êîìàíäû, äîñòóïíûå òîëüêî Àäìèíèñòðàòîðàì ñåðâèñîâ:
+ LIST Ïîêàæåò ñïèñîê âèðòóàëüíûõ õîñòîâ.
+
+HOST_HELP_ON
+ Ñèíòàêñèñ: ON
+
+ Àêòèâèðóåò âèðòóàëüíûé õîñò, íàçíà÷åííûé Âàøåìó íèêó.
+ Êîãäà Âû èñïîüçóåòå ýòó êîìàíäó ëþáîé ïîëüçîâàòåëü, ñäåëàâøèé /whois
+ íà Âàñ óâèäèò âèðòóàëüíûé õîñò âìåñòî Âàøåãî ðåàëüíîãî IP àäðåñà.
+
+HOST_HELP_SET
+ Ñèíòàêñèñ: SET <íèê> <õîñòìàñêà>.
+
+ Óñòàíàâëèâàåò âèðòóàëüíûé õîñò íà óêàçàííûé íèê â óêàçàííóþ
+ õîñòìàñêó. Åñëè Âàø IRC ñåðâåð ïîäåðæèâàåò âèðòóàëüíûå èäåíòû, ìîæíî èñïîëüçîâàòü
+ SET <íèê> <èäåíò>@<õîñòìàñêà> äëÿ óñòàíîâêè èäåíòà è
+ âèðòóàëüíîãî õîñòà îäíîâðåìåííî.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû õîñòîâ(setters).
+
+HOST_HELP_DELALL
+ Ñèíòàêñèñ: DELALL <íèê>.
+
+ Óäàëÿåò âèðòóàëüíûå õîñòû äëÿ âñåõ íèêîâ â ãðóïïå
+ óêàçàííîãî íèêà.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû õîñòîâ(removers).
+
+HOST_HELP_SETALL
+ Ñèíòàêñèñ: SETALL <íèê> <õîñòìàñêà>.
+
+ Óñòàíàâëèâàåò âèðòóàëüíûé õîñò äëÿ âñåõ íèêîâ â ãðóïïå
+ óêàçàííîãî íèêà. Åñëè Âàø IRC ñåðâåð ïîääåðæèâàåò âèðòóàëüíûå èäåíòû, Âû ìîæåòå
+ èñïîëüçîâàòü SETALL <íèê> <èäåíò>@<õîñòìàñêà> ÷òîáû óñòàíîâèòü èäåíò è
+ âèðòóàëüíûé õîñò îäíîâðåìåííî.
+
+ * Ïðèìå÷àíèå, âèðòóàëüíûé õîñò ÍÅ áóäåò îáíîâëÿòüñÿ àâòîìàòè÷åñêè äëÿ ëþáîãî
+ íèêà, äîáàâëåííîãî â ãðóïïó ïîñëå èñïîëüçîâàíèÿ ýòîé êîìàíäû.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû õîñòîâ(setters).
+
+HOST_HELP_OFF
+ Ñèíòàêñèñ: OFF
+
+ Äåàêòèâèðóåò âèðòóàëüíûé õîñò, íàçíà÷åííûé Âàøåìó íèêó.
+ Êîãäà Âû èñïîüçóåòå ýòó êîìàíäó ëþáîé ïîëüçîâàòåëü, ñäåëàâøèé /whois
+ íà Âàñ óâèäèò Âàø ðåàëüíûé IP àäðåñ.
+
+HOST_HELP_DEL
+ Ñèíòàêñèñ: DEL <íèê>
+
+ Óäàëÿåò âèðòóàëüíûé õîñò, íàçíà÷åííûé óêàçàííîìó íèêó èç
+ áàçû äàííûõ.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû õîñòîâ.
+
+HOST_HELP_LIST
+ Ñèíòàêñèñ: LIST [<êëþ÷>|<#X-Y>]
+
+ Ýòà êîìàíäà ïîêàçûâàåò çàðåãèñòðèðîâàííûå âèðòóàëüíûå õîñòû îïåðàòîðó.
+ Åñëè óêàçàí Êëþ÷, òî áóäóò ïîêàçàíû òîëüêî òå çàïèñè, êîòîðûå
+ ñîäåðæàò óêàçàííûé øàáëîí, ò.å. Rob* äëÿ âñåõ çàïèñåé,
+ íà÷èíàþùèõñÿ ñ "Rob"
+
+ Åñëè èñïîëüçîâàí ñòèëü #X-Y, áóäóò ïîêàçàíû çàïèñè îò X
+ äî Y, ò.å. #1-3 ïîêàæåò ïåðâûå 3
+ çàïèñè íèê/âèðòóàëüíûé õîñò.
+
+ Ëèìèò îäíîâðåìåííî ïîêàçûâàåìûõ çíà÷åíèé îãðàíè÷åí ÷èñëîì NSListMax
+ â êîíôèãóðàöèîííîì ôàéëå ñåðâèñîâ.
+
+ Ýòó êîìàíäó ìîãóò èñïîëüçîâàòü òîëüêî Îïåðàòîðû ñåðâèñîâ.
+
+HOST_HELP_GROUP
+ Ñèíòàêñèñ: GROUP
+
+ Ýòà êîìàíäà ïîçâîëÿåò ïîëüçîâàòåëÿì óñòàíîâèòü âèðòóàëüíûé õîñò ñ èõ
+ ÒÅÊÓÙÅÃÎ íèêà íà âñå íèêè
+ ãðóïïû.
diff --git a/lang/tr.l b/lang/tr.l
new file mode 100644
index 000000000..91b45b5e4
--- /dev/null
+++ b/lang/tr.l
@@ -0,0 +1,5982 @@
+# Turkish language file.
+#
+# (C) 2003 Anope Team
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# Based on the original code of Epona by Lara.
+# Based on the original code of Services by Andy Church.
+#
+# When translating this file to another language, keep in mind that the
+# order of parameters for sprintf() is fixed in the source code, so your
+# messages need to take the same parameters in the same order as the
+# English messages do. (Obviously, this doesn't hold for the strftime()
+# format lines immediately below.) If you can't get a natural translation
+# of a message without changing the order of the parameters, let me know
+# (achurch@dragonfire.net) which message is causing a problem and I'll see
+# what I can do.
+#
+# In help messages, "%S" (capital S, not lowercase) refers to the name of
+# the service sending the message; for example, in NickServ help messages,
+# "%S" is replaced by "NickServ" (or whatever it is renamed to in
+# config.h). The %S's do not count as sprintf() parameters, so they can be
+# rearranged, removed, or added as necessary.
+#
+# Also in help messages, please try to limit line lengths to 60 characters
+# of text (not including the leading tab). This length was chosen because
+# it does not cause line wrap under default settings on most current IRC
+# clients. Remember that format characters (control-B, control-_) are not
+# included in that 60-character limit (since they don't show on the user's
+# screen). Also remember that format specifiers (%S, etc.) will expand
+# when displayed, so remember to take this into account; you can assume
+# that the length of a pseudoclient name (%S replacement) will be eight
+# characters, so reduce the maximum line length by 6 for every %S on a
+# line.
+#
+# Finally, remember to put a tab at the beginning of every line of text
+# (including empty lines). This has to be a tab, not spaces.
+
+###########################################################################
+#
+# Name of this language
+#
+###########################################################################
+
+# For languages other than English, this string should have the following
+# format:
+# language-name-in-language (language-name-in-English)
+# For example, "Español (Spanish)" or "Français (French)".
+
+LANG_NAME
+ Türkçe (Turkish)
+#################################################################
+# Translated by CafeiN (oytuny@yahoo.com) irc.ixir.net #
+# Modified by MeShGuL - guzelbey@cs.utk.edu - irc.arkadas.com #
+#################################################################
+
+###########################################################################
+#
+# General messages
+#
+###########################################################################
+
+# strftime() format strings. man 3 strftime for information on the
+# meanings of the format specifiers. Short version:
+# %a = weekday name (short) %H = hour
+# %b = month name (short) %M = minute
+# %d = day of month %S = second
+# %Y = year %Z = time zone
+
+# This is used as the format string for strftime() for a date and time
+# together.
+STRFTIME_DATE_TIME_FORMAT
+ %b %d %H:%M:%S %Y %Z
+# This is used as the format string for strftime() for a date alone in long
+# format (English: including weekday).
+STRFTIME_LONG_DATE_FORMAT
+ %a %b %d %Y
+# This is used as the format string for strftime() for a date alone in
+# short format (English: without weekday).
+STRFTIME_SHORT_DATE_FORMAT
+ %b %d %Y
+
+# These tell our strftime() what the names of months and days are. If you
+# don't use %a, %A, %b, or %B in your strftime() strings above, you can
+# leave these empty. However, if you enter names, they MUST stay in order,
+# one per line, and the list MUST be complete!
+
+# %a
+STRFTIME_DAYS_SHORT
+ Paz
+ Pzt
+ Sal
+ Çar
+ Per
+ Cum
+ Cmt
+# %A
+STRFTIME_DAYS_LONG
+ Pazar
+ Pazartesi
+ Salý
+ Çarþamba
+ Perþembe
+ Cuma
+ Cumartesi
+# %b
+STRFTIME_MONTHS_SHORT
+ Oca
+ Þub
+ Mar
+ Nis
+ May
+ Haz
+ Tem
+ Aðu
+ Eyl
+ Eki
+ Kas
+ Ara
+# %B
+STRFTIME_MONTHS_LONG
+ Ocak
+ Þubat
+ Mart
+ Nisan
+ Mayýs
+ Haziran
+ Temmuz
+ Aðustos
+ Eylül
+ Ekim
+ Kasým
+ Aralýk
+
+
+# This is used in ChanServ/NickServ INFO displays.
+COMMA_SPACE
+ ,
+
+
+# Various error messages.
+USER_RECORD_NOT_FOUND
+ Dahili hata - Kullanýcý kaydý bulunamadý.
+UNKNOWN_COMMAND
+ Varolmayan komut %s.
+UNKNOWN_COMMAND_HELP
+ Varolmayan komut %s. yardým için "/msg %s HELP" yazýnýz.
+SYNTAX_ERROR
+ Kullanýmý: %s
+MORE_INFO
+ Daha fazla bilgi için /msg %s HELP %s yazýnýz.
+NO_HELP_AVAILABLE
+ %s hakkýnda yardým bulunamadý.
+OBSOLETE_COMMAND
+ Bu komut artýk kullanýlmýyor; onun yerine %s komutunu deneyin.
+
+BAD_USERHOST_MASK
+ Mask user@host þeklinde tanýmlanmalýdýr.
+BAD_EXPIRY_TIME
+ Geçersiz zaman aþýmý süresi.
+USERHOST_MASK_TOO_WIDE
+ %s kapsamý aþýrý geniþ; Lütfen daha belirli bir mask kullanýn.
+
+SERVICE_OFFLINE
+ %s þu an devre dýþý.
+READ_ONLY_MODE
+ Not: Servisler read-only modunda; deðiþiklikler kaydedilmeyecektir!
+PASSWORD_INCORRECT
+ Þifre geçersiz.
+
+# What's the difference between "Access denied" and "Permission denied"?
+# Very little; you can safely make them the same message with no real loss
+# of meaning. If you want to make a distinction, "Access denied" is
+# usually used more generally; for example, a non-oper trying to access
+# OperServ gets "Access denied", while a non-Services admin trying to use
+# NickServ SET NOEXPIRE gets "Permission denied".
+ACCESS_DENIED
+ Bu komuta eriþiminiz yok.
+PERMISSION_DENIED
+ Bu komutu kullanma izniniz yok.
+RAW_DISABLED
+ The RAW option has been disabled. If you must use it, enable the DisableRaw directive in Services configuration.
+
+MORE_OBSCURE_PASSWORD
+ Lütfen daha zor bir þifre deneyin. Þifreler en az 5 karakter uzunlukta, kolayca tahmin edilemeyecek birþey olmalýdýr(ör: gerçek isminiz, nickiniz v.b. olmamalýdýr), ve boþlukla tab kullanýlmamalýdýr.
+PASSWORD_TRUNCATED
+ Uyarý: Þifreniz %d karaktere kadar kýsaltýldý.
+
+NICK_NOT_REGISTERED
+ Nickiniz kayýtlý deðil.
+NICK_NOT_REGISTERED_HELP
+ Nickiniz kayýtlý deðil. Nick kayýt hakkýnda bilgi almak için /msg %s HELP yazýn.
+NICK_X_NOT_REGISTERED
+ %s kayýtlý bir nick deðil.
+NICK_X_IN_USE
+ Nick %s is currently in use.
+NICK_X_NOT_IN_USE
+ %s nicki þu an kullanýmda deðil.
+NICK_X_NOT_ON_CHAN
+ %s su anda %s kanalinda degil.
+NICK_X_FORBIDDEN
+ %s nicki kayýt edilemez ve kullanýlamaz.
+NICK_X_FORBIDDEN_OPER
+ %s nicki yasaklanmýþtýr. %s:
+ %s
+NICK_X_ILLEGAL
+ Nick %s is an illegal nickname and cannot be used.
+NICK_X_TRUNCATED
+ Nick %s was truncated to %d characters.
+CHAN_X_NOT_REGISTERED
+ %s kanalý kayýtlý deðil.
+CHAN_X_NOT_IN_USE
+ %s kanalý þu an kullanýmda deðil.
+CHAN_X_FORBIDDEN
+ %s kanalý kayýt edilemez ve kullanýlamaz.
+CHAN_X_FORBIDDEN_OPER
+ %s kanalý yasaklanmýþtýr. %s:
+ %s
+CHAN_X_SUSPENDED
+ Suspended: [%s] %s
+NICK_IDENTIFY_REQUIRED
+ Bu komutu kullanabilmek için þifrenizi girmelisiniz.
+ /msg %s IDENTIFY þifreniz yazarak yeniden deneyiniz.
+CHAN_IDENTIFY_REQUIRED
+ Bu komutu kullanabilmek için þifrenizi girmelisiniz.
+ /msg %s IDENTIFY %s þifreniz yazarak yeniden deneyiniz.
+
+MAIL_DISABLED
+ Servislerin mail gönderme özelliði devre dýþýdýr.
+MAIL_INVALID
+ %s için mail adresi geçerli deðil.
+MAIL_X_INVALID
+ %s geçerli bir mail adresi deðil.
+MAIL_LATER
+ Þu an mail gönderilemiyor; lütfen az sonra tekrar deneyin.
+MAIL_DELAYED
+ Lütfen %d saniye bekleyin ve tekrar deneyin.
+
+NO_REASON
+ Sebep yok
+UNKNOWN
+ <varolmayan>
+
+# Duration system
+DURATION_DAY
+ 1 gün
+DURATION_DAYS
+ %d gün
+DURATION_HOUR
+ 1 saat
+DURATION_HOURS
+ %d saat
+DURATION_MINUTE
+ 1 dakika
+DURATION_MINUTES
+ %d dakika
+DURATION_SECOND
+ 1 saniye
+DURATION_SECONDS
+ %d saniye
+
+# Human readable expiration
+NO_EXPIRE
+ zaman aþýmý yok
+EXPIRES_SOON
+ bir sonraki veritabaný güncellemesinde zaman aþýmý süresi dolacak
+EXPIRES_M
+ %d dakika sonra zaman aþýmý süresi dolacak
+EXPIRES_1M
+ %d dakika sonra zaman aþýmý süresi dolacak
+EXPIRES_HM
+ %d saat, %d dakika sonra zaman aþýmý süresi dolacak
+EXPIRES_H1M
+ %d saat, %d dakika sonra zaman aþýmý süresi dolacak
+EXPIRES_1HM
+ %d saat, %d dakika sonra zaman aþýmý süresi dolacak
+EXPIRES_1H1M
+ %d saat, %d dakika sonra zaman aþýmý süresi dolacak
+EXPIRES_D
+ %d gün sonra zaman aþýmý süresi dolacak
+EXPIRES_1D
+ %d gün sonra zaman aþýmý süresi dolacak
+
+# Generic Footer message
+END_OF_ANY_LIST
+ End of %s list.
+
+
+###########################################################################
+#
+# NickServ messages
+#
+###########################################################################
+
+# Automatic messages
+NICK_IS_REGISTERED
+ Bu nick baþkasýna ait. Lütfen baþka bir tane seçin.
+ (Eðer bu sizin nickiniz ise, /msg %s IDENTIFY þifreniz yazýnýz.)
+NICK_IS_SECURE
+ Bu nick kayýtlý ve korumalýdýr. Eðer bu sizin nickiniz ise,
+ /msg %s IDENTIFY þifreniz yazýnýz. Yada, baþka bir nick seçin.
+NICK_MAY_NOT_BE_USED
+ Bu nick kullanýlamaz. Lütfen baþka bir tane seçin.
+FORCENICKCHANGE_IN_1_MINUTE
+ Eðer bir dakika içinde nickinizi deðiþtirmezseniz, Ben deðiþtireceðim.
+FORCENICKCHANGE_IN_20_SECONDS
+ Eðer 20 saniye içinde nickinizi deðiþtirmezseniz, Ben deðiþtireceðim.
+FORCENICKCHANGE_NOW
+ Bu nick kayýtlýdýr; bunu kullanamazsýnýz.
+FORCENICKCHANGE_CHANGING
+ Nickiniz %s olarak deðiþtirildi.
+
+# REGISTER responses
+NICK_REGISTER_SYNTAX
+ REGISTER þifreniz [emailiniz]
+NICK_REGISTER_SYNTAX_EMAIL
+ REGISTER þifreniz emailiniz
+NICK_REGISTRATION_DISABLED
+ Nick kaydý geçici olarak devre dýþýdýr.
+NICK_REGISTRATION_FAILED
+ Nick kaydý baþarýsýz.
+NICK_REG_PLEASE_WAIT
+ Lütfen %d saniye REGISTER komutunu tekrar kullanmak için bekleyin.
+NICK_CANNOT_BE_REGISTERED
+ %s nicki kayýt edilemez.
+NICK_ALREADY_REGISTERED
+ %s nicki zaten kayýtlý!
+NICK_REGISTERED
+ %s nicki sizin adýnýza kayýt edildi: %s
+NICK_PASSWORD_IS
+ Nick Þifreniz %s - Ýlerde kullanacaðýnýz için unutmayýnýz ve kimseye söylemeyiniz.
+
+# GROUP responses
+NICK_GROUP_SYNTAX
+ GROUP hedef þifre
+NICK_GROUP_DISABLED
+ Nick gruplama geçici olarak devre dýþý.
+NICK_GROUP_FAILED
+ Nick gruplama baþarýsýz.
+NICK_GROUP_PLEASE_WAIT
+ GROUP komutunu tekrar kullanmadan önce lütfen %d saniye bekleyin.
+NICK_GROUP_CHANGE_DISABLED
+ Nickiniz zaten kayýtlý; önce /msg %s DROP yazýn.
+NICK_GROUP_SAME
+ %s grubunun zaten bir üyesisiniz.
+NICK_GROUP_TOO_MANY
+ %s nickinin grubunda çok fazla nick var; listeleyip birkaçini silin.
+ Daha fazla bilgi için /msg %s HELP GLIST ve /msg %s HELP DROP
+ yazin.
+NICK_GROUP_JOINED
+ %s grubuna dahil edildiniz.
+
+# IDENTIFY responses
+NICK_IDENTIFY_SYNTAX
+ IDENTIFY þifreniz
+NICK_IDENTIFY_FAILED
+ Tanýmlama baþarýsýz.
+NICK_IDENTIFY_SUCCEEDED
+ Þifre kabul edildi.
+NICK_IDENTIFY_EMAIL_REQUIRED
+ Þimdi nickiniz için bir e-mail adresi belirtmelisiniz.
+ Bu e-mail adresi þifrenizi unutmanýz halinde þifrenizi
+ isterken kullanýlacaktýr.
+NICK_IDENTIFY_EMAIL_HOWTO
+ Mail adresinizi ayarlamak için /msg %S SET EMAIL e-mailadresiniz
+ yazýn. Gizliliðiniz korunacaktýr; bu mail adresi herhangi üçüncü
+ þahýslara verilmeyecektir.
+
+# LOGOUT responses
+NICK_ALREADY_IDENTIFIED
+ You are already identified.
+
+# UPDATE responses
+NICK_UPDATE_SUCCESS
+ Status updated (memos, vhost, chmodes, flags).
+
+# LOGOUT responses
+NICK_LOGOUT_SYNTAX
+ LOGOUT
+NICK_LOGOUT_SUCCEEDED
+ Nickinizin çýkýþý yapýldý.
+NICK_LOGOUT_X_SUCCEEDED
+ %s nickinin çýkýþý yapýldý.
+
+# DROP responses
+NICK_LOGOUT_SERVICESADMIN
+ Can't logout %s because he's a services administrator.
+
+# DROP responses
+NICK_DROP_DISABLED
+ Nick kaydý silinmesi geçici olarak devre dýþýdýr.
+NICK_DROPPED
+ Nickinizin kaydý silindi (dropped).
+NICK_X_DROPPED
+ %s nickinin kaydý silindi (dropped).
+
+# SET responses
+NICK_SET_SYNTAX
+ SET özellik parametre
+NICK_SET_SERVADMIN_SYNTAX
+ SET [nick] özellik parametre
+NICK_SET_DISABLED
+ NickServ'ün SET komutu geçici olarak devre dýþýdýr.
+NICK_SET_UNKNOWN_OPTION
+ Varolmayan SET özelliði: %s.
+NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK
+ Varolmayan SET özelliði: %s, yada nick kayýtlý deðil.
+
+# SET DISPLAY responses
+NICK_SET_OPTION_DISABLED
+ Option %s cannot be set on this network.
+
+# SET DISPLAY responses
+NICK_SET_DISPLAY_INVALID
+ Yeni gösterim nick grubunuzdan bir nick olmalýdýr!
+NICK_SET_DISPLAY_CHANGED
+ Yeni gösterim %s.
+
+# SET PASSWORD responses
+NICK_SET_PASSWORD_FAILED
+ Þifre deðiþtirilemedi.
+NICK_SET_PASSWORD_CHANGED
+ Þifreniz deðiþtirildi.
+NICK_SET_PASSWORD_CHANGED_TO
+ Nick þifreniz %s olarak deðiþtirildi.
+
+# SET LANGUAGE responses
+NICK_SET_LANGUAGE_SYNTAX
+ SET LANGUAGE numara
+NICK_SET_LANGUAGE_UNKNOWN
+ Varolmayan dil numarasý %d. Dil listesi için /msg %s HELP SET LANGUAGE yazýn.
+NICK_SET_LANGUAGE_CHANGED
+ Dil Türkçe olarak deðiþtirildi.
+
+# SET URL responses
+NICK_SET_URL_CHANGED
+ URL adresi %s olarak deðiþtirildi.
+NICK_SET_URL_UNSET
+ URL adresi silindi.
+
+# SET EMAIL responses
+NICK_SET_EMAIL_CHANGED
+ E-mail adresi %s olarak deðiþtirildi.
+NICK_SET_EMAIL_UNSET
+ E-mail adresi silindi.
+NICK_SET_EMAIL_UNSET_IMPOSSIBLE
+ E-mail adresini bu networkte silemezsiniz.
+
+# SET ICQ responses
+NICK_SET_ICQ_CHANGED
+ ICQ numarasý %s olarak deðiþtirildi.
+NICK_SET_ICQ_UNSET
+ ICQ numarasý silindi.
+NICK_SET_ICQ_INVALID
+ %s geçerli bir numara deðil.
+
+# SET GREET responses
+NICK_SET_GREET_CHANGED
+ Karþýlama mesajý %s olarak deðiþtirildi.
+NICK_SET_GREET_UNSET
+ Karþýlama mesajý silindi.
+
+# SET PROTECT responses
+NICK_SET_KILL_SYNTAX
+ SET KILL {ON | QUICK | OFF}
+NICK_SET_KILL_IMMED_SYNTAX
+ SET KILL {ON | QUICK | IMMED | OFF}
+NICK_SET_KILL_ON
+ Kill korumasý: AKTÝF.
+NICK_SET_KILL_QUICK
+ Kill korumasý: zaman limitli olarak AKTÝF.
+NICK_SET_KILL_IMMED
+ Anýnda kill korumasý: AKTÝF.
+NICK_SET_KILL_IMMED_DISABLED
+ HEMEN seçeneði bu networkte aktif deðil.
+NICK_SET_KILL_OFF
+ Kill korumasý: KAPALI.
+
+# SET SECURE responses
+NICK_SET_SECURE_SYNTAX
+ SET SECURE {ON | OFF}
+NICK_SET_SECURE_ON
+ Güvenlik seçeneði: AKTÝF.
+NICK_SET_SECURE_OFF
+ Güvenlik seçeneði: KAPALI.
+
+# SET PRIVATE responses
+NICK_SET_PRIVATE_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_PRIVATE_ON
+ Özel seçeneði: AKTÝF.
+NICK_SET_PRIVATE_OFF
+ Özel seçeneði: KAPALI.
+
+# SET HIDE responses
+NICK_SET_HIDE_SYNTAX
+ SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+NICK_SET_HIDE_EMAIL_ON
+ Artýk %s INFO da e-mail adresiniz gözükmeyecek.
+NICK_SET_HIDE_EMAIL_OFF
+ Artýk %s INFO da e-mail adresiniz gözükecek.
+NICK_SET_HIDE_MASK_ON
+ Artýk son göründüðünüz user@host maskýnýz %s INFO da gözükmeyecek.
+NICK_SET_HIDE_MASK_OFF
+ Artýk son göründüðünüz user@host maskýnýz %s INFO da gözükecek.
+NICK_SET_HIDE_QUIT_ON
+ Artýk son çýkýþ mesajýnýz(/quit) %s INFO da gözükmeyecek.
+NICK_SET_HIDE_QUIT_OFF
+ Artýk son çýkýþ mesajýnýz(/quit) %s INFO da gözükecek.
+
+# SET NOEXPIRE responses
+NICK_SET_MSG_SYNTAX
+ SET PRIVATE {ON | OFF}
+NICK_SET_MSG_ON
+ Services will now reply to you with messages.
+NICK_SET_MSG_OFF
+ Services will now reply to you with notices.
+
+# SET NOEXPIRE responses
+NICK_SET_NOEXPIRE_SYNTAX
+ SET [nick] NOEXPIRE {ON | OFF}
+NICK_SET_NOEXPIRE_ON
+ %s nicki zaman aþýmýndan çýkarýldý.
+NICK_SET_NOEXPIRE_OFF
+ %s nicki zaman aþýmýna eklendi.
+
+# ACCESS responses
+NICK_ACCESS_SYNTAX
+ ACCESS {ADD | DEL | LIST} [mask]
+NICK_ACCESS_ALREADY_PRESENT
+ %s access listenizde zaten var.
+NICK_ACCESS_REACHED_LIMIT
+ Bir nick için sadece %d tane access girilebilir.
+NICK_ACCESS_ADDED
+ %s access listenize eklendi.
+NICK_ACCESS_NOT_FOUND
+ %s access listenizde bulunamadý.
+NICK_ACCESS_DELETED
+ %s access listenizden silindi.
+NICK_ACCESS_LIST
+ Access listesi:
+NICK_ACCESS_LIST_X
+ %s nickinin access listesi:
+
+# INFO responses
+NICK_INFO_SYNTAX
+ INFO nick [ALL]
+NICK_INFO_REALNAME
+ %s isim: %s
+NICK_INFO_SERVICES_OPER
+ %s servis operatörüdür.
+NICK_INFO_SERVICES_ADMIN
+ %s servis adminidir.
+NICK_INFO_ADDRESS
+ Son görüldüðü adres: %s
+NICK_INFO_ADDRESS_ONLINE
+ Baðlandýðý adres: %s
+NICK_INFO_ADDRESS_ONLINE_NOHOST
+ %s þu an baðlý.
+NICK_INFO_TIME_REGGED
+ Kayýt zamaný: %s
+NICK_INFO_LAST_SEEN
+ Son görüldüðü tarih: %s
+NICK_INFO_LAST_QUIT
+ Son çýkýþ mesajý: %s
+NICK_INFO_URL
+ URL: %s
+NICK_INFO_EMAIL
+ E-mail adresi: %s
+NICK_INFO_VHOST
+ vhost: %s
+NICK_INFO_ICQ
+ ICQ #: %d
+NICK_INFO_GREET
+ Karþýlama mesajý: %s
+NICK_INFO_OPTIONS
+ Özellikler: %s
+# These strings MUST NOT be empty
+NICK_INFO_OPT_KILL
+ Kill korumasý
+NICK_INFO_OPT_SECURE
+ Güvenlik
+NICK_INFO_OPT_PRIVATE
+ Özel
+NICK_INFO_OPT_MSG
+ Message mode
+NICK_INFO_OPT_NONE
+ YOK
+NICK_INFO_NO_EXPIRE
+ Bu nick zaman aþýmýna uðramayacak.
+NICK_INFO_FOR_MORE
+ Geniþ bilgi için, /msg %s INFO %s ALL yazýn.
+
+# LIST responses
+NICK_LIST_SYNTAX
+ LIST model
+NICK_LIST_SERVADMIN_SYNTAX
+ LIST model [FORBIDDEN] [NOEXPIRE]
+NICK_LIST_HEADER
+ %s içeren kayýtlarýn listesi:
+NICK_LIST_RESULTS
+ Liste sonu - %d/%d .
+
+# GLIST responses
+NICK_ALIST_SYNTAX
+ ALIST nickname
+NICK_ALIST_HEADER
+ Channels that you have access on:
+ Num Channel Level Description
+NICK_ALIST_HEADER_X
+ Channels that %s has access on:
+ Num Channel Level Description
+NICK_ALIST_XOP_FORMAT
+ %3d %c%-20s %-8s %s
+NICK_ALIST_ACCESS_FORMAT
+ %3d %c%-20s %-8d %s
+NICK_ALIST_FOOTER
+ Liste sonu - %d/%d .
+
+# GLIST responses
+NICK_GLIST_HEADER
+ Grubunuzdaki nicklerin listesi:
+NICK_GLIST_HEADER_X
+ %s grubundaki nicklerin listesi:
+NICK_GLIST_FOOTER
+ Grupta %d nick var.
+
+# RECOVER responses
+NICK_RECOVER_SYNTAX
+ RECOVER nick [þifre]
+NICK_NO_RECOVER_SELF
+ Kendizi recover edemezsiniz!
+NICK_RECOVERED
+ Nickinizi kullanan user kill lendi.
+ /msg %s RELEASE %s yazarak bir dakikadan önce nickinizi serbest býrakabilirsiniz.
+
+# RELEASE responses
+NICK_RELEASE_SYNTAX
+ RELEASE nick [þifre]
+NICK_RELEASE_NOT_HELD
+ %s nicki zaten serbest.
+NICK_RELEASED
+ Nickiniz serbest býrakýldý.
+
+# GHOST responses
+NICK_GHOST_SYNTAX
+ GHOST nick [þifre]
+NICK_NO_GHOST_SELF
+ Kendinizi ghost edemezsiniz!
+NICK_GHOST_KILLED
+ Asýlý kalan nickiniz kill lendi.
+
+# GETPASS responses
+NICK_GETPASS_SYNTAX
+ GETPASS nick
+NICK_GETPASS_UNAVAILABLE
+ GETPASS komutu devre dýþý çünkü þifreleme(encryption) devrede.
+NICK_GETPASS_PASSWORD_IS
+ %s nickinin þifresi %s.
+
+# SENDPASS responses
+NICK_GETEMAIL_SYNTAX
+ GETEMAIL user@email-host No WildCards!!
+NICK_GETEMAIL_EMAILS_ARE
+ Emails Match %s to %s.
+NICK_GETEMAIL_NOT_USED
+ No Emails listed for %s.
+
+# SENDPASS responses
+NICK_SENDPASS_SYNTAX
+ SENDPASS nick
+NICK_SENDPASS_UNAVAILABLE
+ SENDPASS komutu devre dýþý çünkü þifreleme(encryption) devrede.
+NICK_SENDPASS_SUBJECT
+ Nick þifresi (%s)
+NICK_SENDPASS_HEAD
+ Selam,
+NICK_SENDPASS_LINE_1
+ %s nickinizin þifresinin e-mail adresinize yollanmasýný istemiþsiniz.
+NICK_SENDPASS_LINE_2
+ Nickinizin Þifresi %s. Güvenlik nedenlerinden dolayý, bu maili aldýktan sonra deðiþtirseniz iyi olur.
+NICK_SENDPASS_LINE_3
+ Eðer bu mailin neden size gönderildiðini bilmiyorsanýz, maili ciddiye almayýn.
+NICK_SENDPASS_LINE_4
+ LÜTFEN BU MAÝLE CEVAP VERMEYÝN!
+NICK_SENDPASS_LINE_5
+ %s yönetimi.
+NICK_SENDPASS_OK
+ %s nickinin þifresi gönderildi.
+
+# FORBID responses
+NICK_FORBID_SYNTAX
+ FORBID nick [sebep]
+NICK_FORBID_SYNTAX_REASON
+ FORBID nick sebep
+NICK_FORBID_SUCCEEDED
+ %s nickinin Kullanýmý yasaklandý.
+NICK_FORBID_FAILED
+ %s nickinin Kullanýmý yasaklanamadý!
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+NICK_REQUESTED
+ This nick has already been requested, please check your e-mail address for the pass code
+NICK_REG_RESENT
+ Your passcode has been re-sent to %s.
+NICK_REG_UNABLE
+ Nick NOT registered, please try again later.
+NICK_IS_PREREG
+ This nick is awaiting an e-mail verification code before completing registration.
+NICK_ENTER_REG_CODE
+ A passcode has been sent to %s, please type /msg %s confirm <passcode> to complete registration
+NICK_CONFIRM_NOT_FOUND
+ Registration step 1 may have expired, please use "/msg %s register <password> <email>" first.
+NICK_CONFIRM_INVALID
+ Invalid passcode has been entered, please check the e-mail again, and retry
+NICK_REG_MAIL_SUBJECT
+ Nickname Registration (%s)
+NICK_REG_MAIL_HEAD
+ Hi,
+NICK_REG_MAIL_LINE_1
+ You have requested to register the following nickname %s.
+NICK_REG_MAIL_LINE_2
+ Please type " /msg %s confirm %s " to complete registration.
+NICK_REG_MAIL_LINE_3
+ If you don't know why this mail is sent to you, please ignore it silently.
+NICK_REG_MAIL_LINE_4
+ PLEASE DON'T ANSWER TO THIS MAIL!
+NICK_REG_MAIL_LINE_5
+ %s administrators.
+NICK_GETPASS_PASSCODE_IS
+ Passcode for %s is %s.
+NICK_FORCE_REG
+ Nickname %s confirmed
+
+###########################################################################
+#
+# ChanServ messages
+#
+###########################################################################
+
+# Access level descriptions
+CHAN_LEVEL_AUTOOP
+ Kanala giriþte ChanServ tarafýndan otomatik op (+o)
+CHAN_LEVEL_AUTOVOICE
+ Kanala giriþte ChanServ tarafýndan otomatik voice (+v)
+CHAN_LEVEL_AUTOHALFOP
+ Kanala giriþte ChanServ tarafýndan otomatik yarým op (+h)
+CHAN_LEVEL_AUTOPROTECT
+ Kanala giriþte ChanServ tarafýndan otomatik koruma (+a)
+CHAN_LEVEL_AUTODEOP
+ Kanal içinde op olmasýný yasaklar.
+CHAN_LEVEL_NOJOIN
+ RESTRICTED özelliðinin aktif olmasý halinde kanala giremez.
+CHAN_LEVEL_INVITE
+ INVITE komutunu kullanmaya izinlidir.
+CHAN_LEVEL_AKICK
+ AKICK komutunu kullanmaya izinlidir.
+CHAN_LEVEL_SET
+ SET komutunu (FOUNDER/PASSWORD hariç) kullanmaya izinlidir.
+CHAN_LEVEL_CLEAR
+ CLEAR komutunu kullanmaya izinlidir.
+CHAN_LEVEL_UNBAN
+ UNBAN komutunu kullanmaya izinlidir.
+CHAN_LEVEL_OPDEOP
+ OP/DEOP komutlarýný kullanmaya izinlidir.
+CHAN_LEVEL_ACCESS_LIST
+ Kanalýn Access listesini görüntülemeye izinlidir.
+CHAN_LEVEL_ACCESS_CHANGE
+ Kanalýn Access listesinde deðiþiklik yapmaya izinlidir.
+CHAN_LEVEL_MEMO
+ Kanala gelen mesajlari listelemeye/okumaya izinlidir.
+CHAN_LEVEL_ASSIGN
+ Botun assign/unassign komutlarýný kullanmaya izinlidir.
+CHAN_LEVEL_BADWORDS
+ BADWORDS komutunu kullanmaya izinlidir.
+CHAN_LEVEL_NOKICK
+ Bot tarafýndan kicklenmemeyi saðlar.
+CHAN_LEVEL_FANTASIA
+ Kanalda fantazi komutlarýný kullanmaya izinlidir.
+CHAN_LEVEL_SAY
+ SAY ve ACT komutlarýný kullanmaya izinlidir.
+CHAN_LEVEL_GREET
+ Karþýlama mesajý alabilir.
+CHAN_LEVEL_VOICEME
+ Kendini (de)voice etmeye izinlidir.
+CHAN_LEVEL_VOICE
+ VOICE/DEVOICE komutlarýný kullanmaya izinlidir.
+CHAN_LEVEL_GETKEY
+ GETKEY komutunu kullanmaya izinlidir.
+CHAN_LEVEL_OPDEOPME
+ Kendini (de)op etmeye izinlidir.
+CHAN_LEVEL_HALFOPME
+ Kendini (de)halfop etmeye izinlidir.
+CHAN_LEVEL_HALFOP
+ HALFOP/DEHALFOP komutlarýný kullanmaya izinlidir.
+CHAN_LEVEL_PROTECTME
+ Kendini (de)protect etmeye izinlidir.
+CHAN_LEVEL_PROTECT
+ PROTECT/DEPROTECT komutlarýný kullanmaya izinlidir.
+CHAN_LEVEL_KICKME
+ Kendini atmaya izinlidir.
+CHAN_LEVEL_KICK
+ KICK komutunu kullanmaya izinlidir.
+CHAN_LEVEL_SIGNKICK
+ SIGNKICK LEVEL kullanýldýðýnda iþaretli atma yapýlmaz.
+CHAN_LEVEL_BANME
+ Kendini banlamaya yetkili
+CHAN_LEVEL_BAN
+ BAN komutunu kullanmaya yetkili
+CHAN_LEVEL_TOPIC
+ TOPIC komutunu kullanmaya yetkili
+CHAN_LEVEL_INFO
+ INFO komutunu ALL seçenegiyle kullanmaya yetkili
+
+# Automatic responses
+CHAN_IS_REGISTERED
+ Bu kanal %s ile kayýtlýdýr.
+CHAN_NOT_ALLOWED_OP
+ %s kanalýnda op olmaya yetkiniz yok.
+CHAN_MAY_NOT_BE_USED
+ Bu kanal kullanýlamaz.
+CHAN_NOT_ALLOWED_TO_JOIN
+ Bu kanalda bulunmanýza müsaade yok.
+
+# REGISTER responses
+CHAN_REGISTER_SYNTAX
+ REGISTER kanaladý þifre açýklama
+CHAN_REGISTER_DISABLED
+ Kanal kaydý geçici olarak devre dýþýdýr.
+CHAN_REGISTER_NOT_LOCAL
+ Local kanallar kayýt edilemezler.
+CHAN_MUST_REGISTER_NICK
+ Önce nickinizi kayýt etmeniz gerekiyor. Nick kayýt hakkýnda bilgi için /msg %s HELP yazýnýz.
+CHAN_MUST_IDENTIFY_NICK
+ Lütfen önce %s ile bu komutu kullanarak nickinizi tanýtýn:
+ /msg %s IDENTIFY þifreniz
+CHAN_MAY_NOT_BE_REGISTERED
+ %s kanalý kayýt edilemez.
+CHAN_ALREADY_REGISTERED
+ %s kanalý zaten kayýtlý!
+CHAN_MUST_BE_CHANOP
+ Kanal kayýt edebilmeniz için kayýt edilmemiþ bir kanala ilk girip op olmanýz gerekmektedir.
+CHAN_REACHED_CHANNEL_LIMIT
+ %d kanallýk limitinizi doldurdunuz.
+CHAN_EXCEEDED_CHANNEL_LIMIT
+ %d kanallýk limitinizi aþtýnýz.
+CHAN_REGISTRATION_FAILED
+ Kanal kaydý baþarýsýz.
+CHAN_REGISTERED
+ %s kanalý bu nicke kayýt edildi: %s
+CHAN_PASSWORD_IS
+ Kanal þifreniz %s - ilerde kullanacaðýnýz için unutmayýnýz ve kimseye söylemeyiniz.
+
+# IDENTIFY responses
+CHAN_IDENTIFY_SYNTAX
+ IDENTIFY kanaladý þifreniz
+CHAN_IDENTIFY_FAILED
+ Geçersiz þifre.
+CHAN_IDENTIFY_SUCCEEDED
+ Þifre kabul edildi - %s kanalýnda founder seviyesinde eriþim kazandýnýz.
+
+# LOGOUT responses
+CHAN_LOGOUT_SYNTAX
+ LOGOUT kanaladý nick
+CHAN_LOGOUT_SERVADMIN_SYNTAX
+ LOGOUT kanaladý [nick]
+CHAN_LOGOUT_SUCCEEDED
+ Kullanýcý %s artýk %s kanalý tarafýndan tanýnmýyor.
+CHAN_LOGOUT_ALL_SUCCEEDED
+ Tüm tanýmlý kullanýcýlar artýk %s kanalý tarafýndan tanýnmýyor.
+
+# DROP responses
+CHAN_DROP_SYNTAX
+ DROP kanaladý
+CHAN_DROP_DISABLED
+ Kanal kaydýnýn silinmesi(DROP) geçici olarak devre dýþýdýr.
+CHAN_DROPPED
+ %s kanalýnýn kaydý silinmiþtir (dropped).
+
+# SET responses
+CHAN_SET_SYNTAX
+ SET kanaladý özellik parametre
+CHAN_SET_DISABLED
+ Chanserv'ün SET komutu geçici olarak devre dýþýdýr.
+CHAN_SET_UNKNOWN_OPTION
+ Varolmayan SET özelliði: %s.
+
+# SET FOUNDER responses
+CHAN_SET_FOUNDER_TOO_MANY_CHANS
+ %s çok fazla kanala sahip.
+CHAN_FOUNDER_CHANGED
+ %s kanalýnýn founderý %s olarak deðiþtirildi.
+
+# SET SUCCESSOR responses
+CHAN_SUCCESSOR_CHANGED
+ %s için successor %s olarak deðiþtirildi.
+CHAN_SUCCESSOR_UNSET
+ %s için successor kaldýrýldý.
+CHAN_SUCCESSOR_IS_FOUNDER
+ %s %s kanalýnda successor olamaz çünkü zaten o kanalýn founderý.
+
+# SET PASSWORD responses
+CHAN_SET_PASSWORD_FAILED
+ Þifre deðiþimi baþarýsýz.
+CHAN_PASSWORD_CHANGED
+ %s kanalýnýn þifresi deðiþtirildi.
+CHAN_PASSWORD_CHANGED_TO
+ %s kanalýnýn þifresi %s olarak deðiþtirildi.
+
+# SET DESC responses
+CHAN_DESC_CHANGED
+ %s kanalýnýn açýklamasý %s olarak deðiþtirildi.
+
+# SET URL responses
+CHAN_URL_CHANGED
+ %s kanalýnýn URL adresi %s olarak deðiþtirildi.
+CHAN_URL_UNSET
+ %s kanalýnýn URL adresi kaldýrýldý.
+
+# SET EMAIL responses
+CHAN_EMAIL_CHANGED
+ %s kanalýnýn e-mail adresi %s olarak deðiþtirildi.
+CHAN_EMAIL_UNSET
+ %s kanalýnýn e-mail adresi kaldýrýldý.
+
+# SET ENTRYMSG responses
+CHAN_ENTRY_MSG_CHANGED
+ %s kanalýnýn giriþ mesajý deðiþtirildi.
+CHAN_ENTRY_MSG_UNSET
+ %s kanalýnýn giriþ mesajý kaldýrýldý.
+
+# SET BANTYPE responses
+CHAN_SET_BANTYPE_INVALID
+ %s geçerli bir ban tipi deðil.
+CHAN_SET_BANTYPE_CHANGED
+ %s kanalýnýn ban tipi #%d olarak deðiþtirildi.
+
+# SET MLOCK responses
+CHAN_SET_MLOCK_UNKNOWN_CHAR
+ Varolmayan mod karakteri %c yoksayýldý.
+CHAN_SET_MLOCK_IMPOSSIBLE_CHAR
+ %c modunu kitleyemezsiniz, yoksayildi.
+CHAN_SET_MLOCK_L_REQUIRED
+ +L modunu kullanabilmek için +l modunuda kullanmalisiniz.
+CHAN_SET_MLOCK_K_REQUIRED
+ +K modunu kullanabilmek için +i modunuda kullanmalisiniz.
+CHAN_MLOCK_CHANGED
+ %s kanalýnýn mod kilidi %s olarak deðiþtirildi.
+
+# SET KEEPTOPIC responses
+CHAN_SET_KEEPTOPIC_SYNTAX
+ SET kanaladý KEEPTOPIC {ON | OFF}
+CHAN_SET_KEEPTOPIC_ON
+ Topic hatýrlama özelliði AKTÝF.
+CHAN_SET_KEEPTOPIC_OFF
+ Topic hatýrlama özelliði KAPALI.
+
+# SET TOPICLOCK responses
+CHAN_SET_TOPICLOCK_SYNTAX
+ SET kanaladý TOPICLOCK {ON | OFF}
+CHAN_SET_TOPICLOCK_ON
+ Topic kilidi AKTÝF.
+CHAN_SET_TOPICLOCK_OFF
+ Topic kilidi KAPALI.
+
+# SET PEACE responses
+CHAN_SET_PEACE_SYNTAX
+ SET kanaladi PEACE {ON | OFF}
+CHAN_SET_PEACE_ON
+ Baris özelligi AKTIF.
+CHAN_SET_PEACE_OFF
+ Baris özelligi KAPALI.
+
+# SET PRIVATE responses
+CHAN_SET_PRIVATE_SYNTAX
+ SET kanaladý PRIVATE {ON | OFF}
+CHAN_SET_PRIVATE_ON
+ Özel özelliði AKTÝF.
+CHAN_SET_PRIVATE_OFF
+ Özel özelliði KAPALI.
+
+# SET SECUREOPS responses
+CHAN_SET_SECUREOPS_SYNTAX
+ SET kanaladý SECUREOPS {ON | OFF}
+CHAN_SET_SECUREOPS_ON
+ Secure ops özelliði AKTÝF.
+CHAN_SET_SECUREOPS_OFF
+ Secure ops özelliði KAPALI.
+
+# SET SECUREFOUNDER responses
+CHAN_SET_SECUREFOUNDER_SYNTAX
+ SET kanaladý SECUREFOUNDER {ON | OFF}
+CHAN_SET_SECUREFOUNDER_ON
+ Secure founder özelliði AKTÝF.
+CHAN_SET_SECUREFOUNDER_OFF
+ Secure founder özelliði KAPALI.
+
+# SET RESTRICTED responses
+CHAN_SET_RESTRICTED_SYNTAX
+ SET kanaladý RESTRICTED {ON | OFF}
+CHAN_SET_RESTRICTED_ON
+ Restricted access özelliði AKTÝF.
+CHAN_SET_RESTRICTED_OFF
+ Restricted access özelliði KAPALI.
+
+# SET SECURE responses
+CHAN_SET_SECURE_SYNTAX
+ SET kanal SECURE {ON | OFF}
+CHAN_SET_SECURE_ON
+ Güvenlik özelliði AKTÝF.
+CHAN_SET_SECURE_OFF
+ Güvenlik özelliði KAPALI.
+
+# SET SIGNKICK responses
+CHAN_SET_SIGNKICK_SYNTAX
+ SET kanaladý SIGNKICK {ON | LEVEL | OFF}
+CHAN_SET_SIGNKICK_ON
+ Ýþaretli atma özelliði AKTÝF.
+CHAN_SET_SIGNKICK_LEVEL
+ Ýþaretli atma özelliði AKTÝF, fakat komutu kullanan
+ kullanýcýnýn seviyesine baðlý.
+CHAN_SET_SIGNKICK_OFF
+ Ýþaretli atma özelliði KAPALI.
+
+# SET OPNOTICE responses
+CHAN_SET_OPNOTICE_SYNTAX
+ SET kanaladý OPNOTICE {ON | OFF}
+CHAN_SET_OPNOTICE_ON
+ Oplara-not özelliði AKTÝF.
+CHAN_SET_OPNOTICE_OFF
+ Oplara-not özelliði KAPALI.
+
+# SET XOP responses
+CHAN_SET_XOP_SYNTAX
+ SET kanaladi XOP {ON | OFF}
+CHAN_SET_XOP_ON
+ xOP sistemi AKTIF.
+CHAN_SET_XOP_OFF
+ xOP sistemi KAPALI.
+
+# SET NOEXPIRE responses
+CHAN_SET_NOEXPIRE_SYNTAX
+ SET kanaladý NOEXPIRE {ON | OFF}
+CHAN_SET_NOEXPIRE_ON
+ %s kanalý zaman aþýmýndan çýkarýldý.
+CHAN_SET_NOEXPIRE_OFF
+ %s kanalý zaman aþýmýna eklendi.
+
+# xOP messages
+CHAN_XOP_REACHED_LIMIT
+ Bir kanala toplam %d AOP/SOP/VOP kayit edilebilir.
+CHAN_XOP_LIST_FORMAT
+ %3d %s
+CHAN_XOP_ACCESS
+ Bu komutu kullanamazsiniz. Yerine ACCESS komutunu kullanin.
+ Daha fazla bilgi için /msg %s HELP ACCESS yazin.
+
+# AOP messages
+CHAN_AOP_SYNTAX
+ AOP kanal {ADD|DEL|LIST|CLEAR} [nick | liste-no]
+CHAN_AOP_DISABLED
+ Kanal AOP listesi degisiklikleri geçici olarak devre disidir.
+CHAN_AOP_NICKS_ONLY
+ Kanal AOP listeleri sadece kayitli nicklerden olusabilir.
+CHAN_AOP_ADDED
+ %s %s kanalinin AOP listesine eklenmistir.
+CHAN_AOP_MOVED
+ %s moved to %s AOP list.
+CHAN_AOP_NO_SUCH_ENTRY
+ (#%d) %s kanalinin AOP listesinde böyle bir kayit bulunamadi.
+CHAN_AOP_NOT_FOUND
+ %s %s kanali AOP listesinde bulunamadi.
+CHAN_AOP_NO_MATCH
+ %s kanali AOP listesinde uyusan kayit bulunamadi.
+CHAN_AOP_DELETED
+ %s %s kanali AOP listesinden silindi.
+CHAN_AOP_DELETED_ONE
+ %s kanalinin AOP listesinden 1 kayit silindi.
+CHAN_AOP_DELETED_SEVERAL
+ Deleted %d entries from %s AOP list.
+CHAN_AOP_LIST_EMPTY
+ %s kanalinin AOP listesi bos.
+CHAN_AOP_LIST_HEADER
+ %s kanali AOP listesi:
+ Num Nick
+CHAN_AOP_CLEAR
+ Kanalin AOP listesi temizlendi.
+
+# HOP messages
+CHAN_HOP_SYNTAX
+ HOP kanaladi {ADD|DEL|LIST|CLEAR} [nick | liste-no]
+CHAN_HOP_DISABLED
+ Kanal HOP listesi degisiklikleri geçici olarak devre disidir.
+CHAN_HOP_NICKS_ONLY
+ Kanal HOP listeleri sadece kayitli nicklerden olusabilir.
+CHAN_HOP_ADDED
+ %s %s kanali HOP listesine eklendi.
+CHAN_HOP_MOVED
+ %s moved to %s HOP list.
+CHAN_HOP_NO_SUCH_ENTRY
+ (#%d) %s kanali HOP listesinde uyusan kayit bulunamadi.
+CHAN_HOP_NOT_FOUND
+ %s %s kanali HOP listesinde bulunamadi.
+CHAN_HOP_NO_MATCH
+ %s kanali HOP listesinde uyusan kayit bulunamadi.
+CHAN_HOP_DELETED
+ %s %s kanali HOP listesinden silindi.
+CHAN_HOP_DELETED_ONE
+ %s kanali HOP listesinden 1 kayit silindi.
+CHAN_HOP_DELETED_SEVERAL
+ Deleted %d entries from %s HOP list.
+CHAN_HOP_LIST_EMPTY
+ %s kanali HOP listesi bos.
+CHAN_HOP_LIST_HEADER
+ %s kanali HOP listesi:
+ Num Nick
+CHAN_HOP_CLEAR
+ Kanal HOP listesi temizlendi.
+
+# SOP messages
+CHAN_SOP_SYNTAX
+ SOP kanaladi {ADD|DEL|LIST|CLEAR} [nick | liste-no]
+CHAN_SOP_DISABLED
+ Kanal SOP listesi degisikligi geçici olarak devre disidir.
+CHAN_SOP_NICKS_ONLY
+ Kanal SOP listesi sadece kayitli nicklerden olusabilir.
+CHAN_SOP_ADDED
+ %s %s kanali SOP listesine eklendi.
+CHAN_SOP_MOVED
+ %s moved to %s SOP list.
+CHAN_SOP_NO_SUCH_ENTRY
+ (#%d) %s kanali SOP listesinde uyusan kayit bulunamadi.
+CHAN_SOP_NOT_FOUND
+ %s %s kanali SOP listesinde bulunamadi.
+CHAN_SOP_NO_MATCH
+ %s kanali SOP listesinde uyusan kayit bulunamadi.
+CHAN_SOP_DELETED
+ %s %s kanali SOP listesinden silindi.
+CHAN_SOP_DELETED_ONE
+ %s kanali SOP listesinden 1 kayit silindi.
+CHAN_SOP_DELETED_SEVERAL
+ Deleted %d entries from %s SOP list.
+CHAN_SOP_LIST_EMPTY
+ %s kanali SOP listesi bos.
+CHAN_SOP_LIST_HEADER
+ %s kanali SOP listesi:
+ Num Nick
+CHAN_SOP_CLEAR
+ Kanal SOP listesi temizlendi.
+
+# VOP messages
+CHAN_VOP_SYNTAX
+ VOP kanaladi {ADD|DEL|LIST|CLEAR} [nick | liste-no]
+CHAN_VOP_DISABLED
+ Kanal VOP listesi degisikligi geçici olarak devre disidir.
+CHAN_VOP_NICKS_ONLY
+ Kanal VOP listeleri sadece kayitli nicklerden olusabilir.
+CHAN_VOP_ADDED
+ %s %s kanali VOP listesine eklendi.
+CHAN_VOP_MOVED
+ %s moved to %s VOP list.
+CHAN_VOP_NO_SUCH_ENTRY
+ (#%d) %s kanali VOP listesinde uyusan kayit bulunamadi.
+CHAN_VOP_NOT_FOUND
+ %s %s kanali VOP listesinde bulunamadi.
+CHAN_VOP_NO_MATCH
+ %s kanali VOP listesinde uyusan kayit bulunamadi.
+CHAN_VOP_DELETED
+ %s %s kanali VOP listesinden silindi.
+CHAN_VOP_DELETED_ONE
+ %s kanali VOP listesinden 1 kayit silindi.
+CHAN_VOP_DELETED_SEVERAL
+ Silindi %d VOP listesinden kayit %s kanali.
+CHAN_VOP_LIST_EMPTY
+ %s kanali VOP listesi bos.
+CHAN_VOP_LIST_HEADER
+ %s kanali VOP listesi:
+ Num Nick
+CHAN_VOP_CLEAR
+ Kanal VOP listesi temizlendi.
+
+# ACCESS messages
+CHAN_ACCESS_SYNTAX
+ ACCESS kanaladý {ADD|DEL|LIST|CLEAR} [nick [seviye] | kayýt-listesi]
+CHAN_ACCESS_XOP
+ Bu komutu kullanamazsiniz.
+ Yerine AOP, SOP veya VOP komutlarini kullanin.
+ Daha fazla bilgi için /msg %s HELP komut yazin.
+CHAN_ACCESS_DISABLED
+ Kanal access listesinin deðiþtirilmesi geçici olarak devre dýþýdýr.
+CHAN_ACCESS_LEVEL_NONZERO
+ Access seviyesi sýfýrdan farklý bir sayý olmalýdýr.
+CHAN_ACCESS_LEVEL_RANGE
+ Access seviyesi %d ve %d arasýnda olmalýdýr.
+CHAN_ACCESS_NICKS_ONLY
+ Kanal access listesi sadece kayýtlý kullanýcýlarý içermelidir.
+CHAN_ACCESS_REACHED_LIMIT
+ Kanalda sadece %d tane access kaydý olabilir.
+CHAN_ACCESS_LEVEL_UNCHANGED
+ %s nickinin access seviyesi %s kanalýnda zaten %d.
+CHAN_ACCESS_LEVEL_CHANGED
+ %s nickinin access seviyesi %s kanalýnda %d olarak deðiþtirildi.
+CHAN_ACCESS_ADDED
+ %s nicki %s kanalinin access listesine %d seviyeden eklendi.
+CHAN_ACCESS_NO_SUCH_ENTRY
+ (#%d) þeklinde bir kayýt %s kanalýnýn access listesinde bulunamadý.
+CHAN_ACCESS_NOT_FOUND
+ %s %s kanalýnýn access listesinde bulunamadý.
+CHAN_ACCESS_NO_MATCH
+ Uyuþan kayýt %s kanalýnýn access listesinde yok.
+CHAN_ACCESS_DELETED
+ %s %s kanalýnýn access listesinden silindi.
+CHAN_ACCESS_DELETED_ONE
+ %s kanalýnýn access listesinden 1 kayýt silindi.
+CHAN_ACCESS_DELETED_SEVERAL
+ Deleted %d entries from %s access list.
+CHAN_ACCESS_LIST_EMPTY
+ %s kanalýnýn access listesi boþ.
+CHAN_ACCESS_LIST_HEADER
+ %s kanalý için access listesi:
+ Sýra Seviye Nick
+CHAN_ACCESS_LIST_FOOTER
+ access listenin sonu.
+CHAN_ACCESS_LIST_XOP_FORMAT
+ %3d %s %s
+CHAN_ACCESS_LIST_AXS_FORMAT
+ %3d %4d %s
+CHAN_ACCESS_CLEAR
+ Kanal access listesi temizlendi.
+
+# AKICK responses
+CHAN_AKICK_SYNTAX
+ AKICK kanaladý {ADD | STICK | UNSTICK | DEL | LIST | VIEW | ENFORCE | CLEAR} [nick-veya-usermask] [sebep]
+CHAN_AKICK_DISABLED
+ Kanal Akick listesinin deðiþtirilmesi geçici olarak devre dýþýdýr.
+CHAN_AKICK_ALREADY_EXISTS
+ %s nicki %s kanalýnýn akick listesinde zaten var.
+CHAN_AKICK_REACHED_LIMIT
+ Bir kanalýn akick listesinde en fazla %d kiþi olabilir.
+CHAN_AKICK_ADDED
+ %s nicki %s kanalýnýn akick listesine eklendi.
+CHAN_AKICK_NO_SUCH_ENTRY
+ (#%d) þeklinde bir kayýt %s kanalýnýn akick listesinde bulunamadý.
+CHAN_AKICK_NOT_FOUND
+ %s %s kanalýnýn akick listesinde bulunamadý.
+CHAN_AKICK_NO_MATCH
+ Uyuþan kayýt %s kanalýnýn akick listesinde bulunamadý.
+CHAN_AKICK_STUCK
+ %s artik %s kanalinda sürekli aktif.
+CHAN_AKICK_UNSTUCK
+ %s artik %s kanalinda sürekli aktif degil.
+CHAN_AKICK_DELETED
+ %s %s kanalýnýn akick listesinden silindi.
+CHAN_AKICK_DELETED_ONE
+ %s kanalýnýn akick listesinden 1 kayýt silindi.
+CHAN_AKICK_DELETED_SEVERAL
+ Deleted %d entries from %s autokick list.
+CHAN_AKICK_LIST_EMPTY
+ %s kanalýnýn akick listesi boþ.
+CHAN_AKICK_LIST_HEADER
+ %s kanalýnýn akick listesi:
+CHAN_AKICK_LIST_FORMAT
+ %3d %s (%s)
+CHAN_AKICK_VIEW_FORMAT
+ %3d %s (by %s on %s)
+ %s
+CHAN_AKICK_VIEW_FORMAT_STUCK
+ %3d %s (kalici) (by %s on %s)
+ %s
+CHAN_AKICK_ENFORCE_DONE
+ %s için AKICK uygulamasý tamam; %d kullanýcý için geçerli.
+CHAN_AKICK_CLEAR
+ Kanal akick listesi temizlendi.
+
+# LEVELS responses
+CHAN_LEVELS_SYNTAX
+ LEVELS kanaladý {SET | DIS[ABLE] | LIST | RESET} [madde [seviye]]
+CHAN_LEVELS_XOP
+ Bu modda bu komut kullanilmaz.
+CHAN_LEVELS_RANGE
+ Level %d ile %d arasýnda olmalýdýr.
+CHAN_LEVELS_CHANGED
+ %s için level %s kanalýnda %d olarak deðiþtirildi.
+CHAN_LEVELS_UNKNOWN
+ Varolmayan ayar: %s. Geçerli ayar listesi için /msg %s HELP LEVELS DESC yazýnýz.
+CHAN_LEVELS_DISABLED
+ %s %s kanalýnda iptal edildi.
+CHAN_LEVELS_LIST_HEADER
+ %s kanalý için access level ayarlarý:
+CHAN_LEVELS_LIST_DISABLED
+ %-*s (kapatýldý)
+CHAN_LEVELS_LIST_FOUNDER
+ %-*s (sadece founder)
+CHAN_LEVELS_LIST_NORMAL
+ %-*s %d
+CHAN_LEVELS_RESET
+ %s için access levelleri varsayýlanlarla deðiþtirildi.
+
+# INFO responses
+CHAN_INFO_SYNTAX
+ INFO kanaladý [ALL]
+CHAN_INFO_HEADER
+ %s kanalý için bilgi:
+CHAN_INFO_FOUNDER
+ Founder: %s (%s)
+CHAN_INFO_NO_FOUNDER
+ Founder: %s
+CHAN_INFO_SUCCESSOR
+ Successor: %s (%s)
+CHAN_INFO_NO_SUCCESSOR
+ Successor: %s
+CHAN_INFO_DESCRIPTION
+ Açýklama: %s
+CHAN_INFO_ENTRYMSG
+ Giriþ mesajý: %s
+CHAN_INFO_TIME_REGGED
+ Kayýt tarihi: %s
+CHAN_INFO_LAST_USED
+ Son kullanýlýþ: %s
+CHAN_INFO_LAST_TOPIC
+ Son topic: %s
+CHAN_INFO_TOPIC_SET_BY
+ Topici yazan: %s
+CHAN_INFO_URL
+ URL: %s
+CHAN_INFO_EMAIL
+ E-mail adresi: %s
+CHAN_INFO_BANTYPE
+ Ban tipi: %d
+CHAN_INFO_OPTIONS
+ Özellikler: %s
+CHAN_INFO_OPT_KEEPTOPIC
+ Topic hatýrlama
+CHAN_INFO_OPT_OPNOTICE
+ OP Notu
+CHAN_INFO_OPT_PEACE
+ Baris
+CHAN_INFO_OPT_PRIVATE
+ Özel
+CHAN_INFO_OPT_RESTRICTED
+ Kisitli Erisim.
+CHAN_INFO_OPT_SECURE
+ Güvenlik
+CHAN_INFO_OPT_SECUREOPS
+ Secure Ops
+CHAN_INFO_OPT_SECUREFOUNDER
+ Secure Founder
+CHAN_INFO_OPT_SIGNKICK
+ Ýþaretli atma
+CHAN_INFO_OPT_TOPICLOCK
+ Topic kilidi
+CHAN_INFO_OPT_XOP
+ xOP sistemi
+CHAN_INFO_OPT_NONE
+ YOK
+CHAN_INFO_MODE_LOCK
+ Mod kilidi: %s
+CHAN_INFO_NO_EXPIRE
+ Bu kanal için zaman aþýmý söz konusu deðil.
+
+# LIST responses
+CHAN_LIST_SYNTAX
+ LIST model
+CHAN_LIST_SERVADMIN_SYNTAX
+ LIST model [FORBIDDEN] [NOEXPIRE]
+CHAN_LIST_HEADER
+ %s ile uyuþan kayýt listesi:
+CHAN_LIST_FORMAT
+ %-20s %s
+CHAN_LIST_END
+ Liste sonu - %d/%d uyan kayýt bulundu.
+
+# CLIST responses
+CHAN_INVITE_SYNTAX
+ INVITE kanaladý
+
+# UNBAN responses
+CHAN_UNBAN_SYNTAX
+ UNBAN kanaladý
+CHAN_UNBANNED
+ %s kanalýndaki banýnýz kaldýrýldý.
+
+# TOPIC responses
+CHAN_TOPIC_SYNTAX
+ TOPIC kanaladi [konu]
+
+# CLEAR responses
+CHAN_CLEAR_SYNTAX
+ CLEAR kanaladý neyi
+CHAN_CLEARED_BANS
+ %s kanalýndaki tüm banlar kaldýrýldý.
+CHAN_CLEARED_EXCEPTS
+ All excepts on channel %s have been removed.
+CHAN_CLEARED_MODES
+ %s kanalýndaki tüm modlar resetlendi.
+CHAN_CLEARED_OPS
+ Mod +o %s kanalýnda temizlendi.
+CHAN_CLEARED_VOICES
+ Mod +v %s kanalýnda temizlendi.
+CHAN_CLEARED_USERS
+ %s kanalýndaki tüm kullanýcýlar atýldý.
+
+# GETPASS responses
+CHAN_GETPASS_SYNTAX
+ GETPASS kanaladý
+CHAN_GETPASS_UNAVAILABLE
+ GETPASS komutu devre dýþý çünkü þifreleme(encryption) devrede.
+CHAN_GETPASS_PASSWORD_IS
+ %s kanalýnýn þifresi %s.
+
+# SENDPASS responses
+CHAN_SENDPASS_SYNTAX
+ SENDPASS kanaladý
+CHAN_SENDPASS_UNAVAILABLE
+ SENDPASS komutu devre dýþý çünkü þifreleme(encryption) devrede.
+CHAN_SENDPASS_SUBJECT
+ Kanal þifresi (%s)
+CHAN_SENDPASS_HEAD
+ Selam,
+CHAN_SENDPASS_LINE_1
+ %s kanalýnýzýn þifresinin e-mail adresinize gönderilmesini istemiþsiniz.
+CHAN_SENDPASS_LINE_2
+ Kanal Þifresi %s. Güvenlik nedenlerinden dolayý, þifrenizi bu maili aldýktan sonra deðiþtirirseniz iyi olur.
+CHAN_SENDPASS_LINE_3
+ Eðer bu mailin niye size gönderildiðini bilmiyorsanýz, lütfen ciddiye almayýn.
+CHAN_SENDPASS_LINE_4
+ LÜTFEN BU MAÝLE CEVAP VERMEYÝN!
+CHAN_SENDPASS_LINE_5
+ %s yönetimi.
+CHAN_SENDPASS_OK
+ %s kanalýnýn þifresi gönderildi.
+
+# FORBID responses
+CHAN_FORBID_SYNTAX
+ FORBID kanaladý [sebep]
+CHAN_FORBID_SYNTAX_REASON
+ FORBID kanaladý sebep
+CHAN_FORBID_SUCCEEDED
+ %s kanalýnýn Kullanýmý yasaklandý.
+CHAN_FORBID_FAILED
+ %s kanalýnýn Kullanýmý yasaklanamadý!
+
+# Misc responses
+CHAN_FORBID_REASON
+ This channel has been forbidden.
+
+# SUSPEND responses
+CHAN_SUSPEND_SYNTAX
+ SUSPEND channel [reason]
+CHAN_SUSPEND_SYNTAX_REASON
+ SUSPEND channel reason
+CHAN_SUSPEND_SUCCEEDED
+ Channel %s is now suspended.
+CHAN_SUSPEND_FAILED
+ Couldn't suspended channel %s!
+CHAN_SUSPEND_REASON
+ This channel has been suspended.
+
+# UNSUSPEND responses
+CHAN_UNSUSPEND_SYNTAX
+ UNSUSPEND channel
+CHAN_UNSUSPEND_ERROR
+ No # found in front of channel name.
+CHAN_UNSUSPEND_SUCCEEDED
+ Channel %s is now released.
+CHAN_UNSUSPEND_FAILED
+ Couldn't release channel %s!
+
+# Misc responses
+CHAN_EXCEPTED
+ %s matches an except on %s and cannot be banned until the except have been removed.
+
+###########################################################################
+#
+# MemoServ messages
+#
+###########################################################################
+
+# Automatic messages
+MEMO_HAVE_NEW_MEMO
+ 1 yeni mesajýnýz var.
+MEMO_HAVE_NEW_MEMOS
+ %d yeni mesajýnýz var.
+MEMO_TYPE_READ_LAST
+ Okumak için /msg %s READ LAST yazýn.
+MEMO_TYPE_READ_NUM
+ Okumak için /msg %s READ %d yazýn.
+MEMO_TYPE_LIST_NEW
+ Listelemek için /msg %s LIST NEW yazýn.
+MEMO_AT_LIMIT
+ Dikkat: Maksimum mesaj sayýnýza ulaþtýnýz (%d). Þimdiki mesajlarýnýzdan bir kaçýný silmezseniz yeni mesaj alamayacaksýnýz.
+MEMO_OVER_LIMIT
+ Dikkat: Maksimum mesaj sayýnýzý aþtýnýz (%d). Þimdiki mesajlarýnýzdan bir kaçýný silmezseniz yeni mesaj alamayacaksýnýz.
+MEMO_X_MANY_NOTICE
+ There are %d memos on channel %s.
+MEMO_X_ONE_NOTICE
+ There is %d memo on channel %s.
+MEMO_NEW_X_MEMO_ARRIVED
+ There is a new memo on channel %s.
+ Type /msg %s READ %s %d to read it.
+MEMO_NEW_MEMO_ARRIVED
+ %s nickinden yeni mesajýnýz var.
+ Okumak için /msg %s READ %d yazýn.
+
+# Multi-use responses
+MEMO_HAVE_NO_MEMOS
+ Hiç mesajýnýz yok.
+MEMO_X_HAS_NO_MEMOS
+ %s nickinin hiç mesajý yok.
+MEMO_DOES_NOT_EXIST
+ %d numaralý mesaj bulunamadý!
+MEMO_LIST_NOT_FOUND
+ Uyuþan mesaj bulunamadý.
+
+# SEND responses
+MEMO_SEND_SYNTAX
+ SEND {nick | kanaladý} mesaj
+MEMO_SEND_DISABLED
+ Mesaj yollama geçici olarak devre dýþýdýr.
+MEMO_SEND_PLEASE_WAIT
+ Lütfen %d saniye SEND komutunu tekrar kullanmak için bekleyin.
+MEMO_X_GETS_NO_MEMOS
+ %s nicki mesaj alamaz.
+MEMO_X_HAS_TOO_MANY_MEMOS
+ %s nickinin limiti dolduðundan daha fazla mesaj alamaz.
+MEMO_SENT
+ %s nickine mesajýnýz gönderildi.
+
+# CANCEL responses
+MEMO_MASS_SENT
+ A massmemo has been sent to all registered users.
+
+# CANCEL responses
+MEMO_CANCEL_SYNTAX
+ CANCEL {nick | kanaladý}
+MEMO_CANCEL_DISABLED
+ Mesaj iptal etme geçici olarak devre dýþýdýr.
+MEMO_CANCEL_NONE
+ Ýptal edilecek mesaj yoktu.
+MEMO_CANCELLED
+ %s nickine gönderilen son mesaj iptal edildi.
+
+# LIST responses
+MEMO_LIST_SYNTAX
+ LIST [kanaladý] [liste | NEW]
+MEMO_HAVE_NO_NEW_MEMOS
+ Hiç yeni mesajýnýz yok.
+MEMO_X_HAS_NO_NEW_MEMOS
+ %s nickinin hiç yeni mesajý yok.
+MEMO_LIST_MEMOS
+ %s nicki için mesajlar. Okumak için: /msg %s READ num yazýn.
+MEMO_LIST_NEW_MEMOS
+ %s nicki için yeni mesajlar. Okumak için: /msg %s READ num yazýn.
+MEMO_LIST_CHAN_MEMOS
+ %s kanali için mesajlar. Okumak için: /msg %s READ %s num yazýn.
+MEMO_LIST_CHAN_NEW_MEMOS
+ %s kanali için yeni mesajlar. Okumak için: /msg %s READ %s num yazýn.
+MEMO_LIST_HEADER
+ Num Gönderen Tarih/Zaman
+MEMO_LIST_FORMAT
+ %c%3d %-16s %s
+
+# READ responses
+MEMO_READ_SYNTAX
+ READ [kanaladý] {liste | LAST | NEW}
+MEMO_HEADER
+ %d nolu mesaj %s nickinden (%s). Silmek için: /msg %s DEL %d yazýn.
+MEMO_CHAN_HEADER
+ %d nolu mesaj %s nickinden (%s). Silmek için: /msg %s DEL %s %d yazýn.
+MEMO_TEXT
+ %s
+
+# DEL responses
+MEMO_DEL_SYNTAX
+ DEL [kanaladý] {num | liste | ALL}
+MEMO_DELETED_NONE
+ Hiç mesaj silinmedi.
+MEMO_DELETED_ONE
+ %d nolu mesaj silindi.
+MEMO_DELETED_SEVERAL
+ %s mesajlarý silindi.
+MEMO_DELETED_ALL
+ Tüm mesajlarýnýz silindi.
+
+# SET responses
+MEMO_CHAN_DELETED_ALL
+ All memos for channel %s have been deleted.
+
+# SET responses
+MEMO_SET_SYNTAX
+ SET özellik parametre
+MEMO_SET_DISABLED
+ MemoServ'ün SET komutu geçici olarak devre dýþýdýr.
+MEMO_SET_UNKNOWN_OPTION
+ Varolmayan SET özelliði: %s.
+
+# SET NOTIFY responses
+MEMO_SET_NOTIFY_SYNTAX
+ SET NOTIFY {ON | LOGON | NEW | OFF}
+MEMO_SET_NOTIFY_ON
+ %s sizi yeni mesajlar için baðlandýðýnýzda veya mesajlar size gönderildiði anda uyaracak.
+MEMO_SET_NOTIFY_LOGON
+ %s sizi yeni mesajlar için baðlandýðýnýzda veya AWAY modundan dönüþte uyaracak.
+MEMO_SET_NOTIFY_NEW
+ %s sizi yeni mesajlar için size gönderildiði anda uyaracak.
+MEMO_SET_NOTIFY_OFF
+ %s sizi yeni mesajlar için uyarmayacak.
+
+# SET LIMIT responses
+MEMO_SET_LIMIT_SYNTAX
+ SET LIMIT [kanaladý] limit
+MEMO_SET_LIMIT_SERVADMIN_SYNTAX
+ SET LIMIT [kullanýcý | kanaladý] {limit | NONE} [HARD]
+MEMO_SET_YOUR_LIMIT_FORBIDDEN
+ Mesaj limitinizi belirlemeye izinli deðilsiniz.
+MEMO_SET_LIMIT_FORBIDDEN
+ %s nickinin mesaj limiti deðiþtirelemez.
+MEMO_SET_YOUR_LIMIT_TOO_HIGH
+ Mesaj limitinizi %d sayýsýndan daha fazla yapamazsýnýz.
+MEMO_SET_LIMIT_TOO_HIGH
+ %s nickinin mesaj limitini %d sayýsýndan daha fazla yapamazsýnýz.
+MEMO_SET_LIMIT_OVERFLOW
+ Mesaj limiti çok fazla; limit %d olarak deðiþtiriliyor.
+MEMO_SET_YOUR_LIMIT
+ Mesaj limitiniz %d olarak ayarlandý.
+MEMO_SET_YOUR_LIMIT_ZERO
+ Limitiniz sýfýr olduðundan artýk mesaj alamayacaksýnýz.
+MEMO_UNSET_YOUR_LIMIT
+ Mesaj limitiniz kapatýldý.
+MEMO_SET_LIMIT
+ %s nickinin mesaj limiti %d olarak ayarlandý.
+MEMO_SET_LIMIT_ZERO
+ %s nickinin mesaj limiti 0 olarak ayarlandý.
+MEMO_UNSET_LIMIT
+ %s nickinin mesaj limiti kapatýldý.
+
+# INFO responses
+MEMO_INFO_SYNTAX
+ INFO [kanaladý]
+MEMO_INFO_SERVADMIN_SYNTAX
+ INFO [nick | kanaladý]
+MEMO_INFO_NO_MEMOS
+ Þu an hiç mesajýnýz yok.
+MEMO_INFO_MEMO
+ Þu an 1 mesajýnýz var.
+MEMO_INFO_MEMO_UNREAD
+ Þu an 1 mesajýnýz var, ve henüz okunmadý.
+MEMO_INFO_MEMOS
+ Þu an %d mesajýnýz var.
+MEMO_INFO_MEMOS_ONE_UNREAD
+ Þu an %d mesajýnýz var, 1 tanesi okunmamýþ.
+MEMO_INFO_MEMOS_SOME_UNREAD
+ Þu an %d mesajýnýz var, %d tanesi okunmamýþ.
+MEMO_INFO_MEMOS_ALL_UNREAD
+ Þu an %d mesajýnýz var; hiçbiri okunmamýþ.
+MEMO_INFO_LIMIT
+ Mesaj limitiniz %d.
+MEMO_INFO_HARD_LIMIT
+ Mesaj limitiniz %d, ve deðiþtirilemez.
+MEMO_INFO_LIMIT_ZERO
+ Mesaj limitiniz 0; hiç mesaj alamayacaksýnýz.
+MEMO_INFO_HARD_LIMIT_ZERO
+ Mesaj limitiniz 0; hiç yeni mesaj alamayacaksýnýz. Bu limiti deðiþtiremezsiniz.
+MEMO_INFO_NO_LIMIT
+ Saklayabileceðiniz mesaj sayýsýnda limit yok.
+MEMO_INFO_NOTIFY_OFF
+ Yeni mesajlar için uyarýlmayacaksýnýz.
+MEMO_INFO_NOTIFY_ON
+ Yeni mesajlar için baðlandýðýnýzda ve size ulaþtýðýnda uyarýlacaksýnýz.
+MEMO_INFO_NOTIFY_RECEIVE
+ Yeni mesajlar için ulaþtýklarý anda uyarýlacaksýnýz.
+MEMO_INFO_NOTIFY_SIGNON
+ Yeni mesajlar için baðlandýðýnýzda uyarýlacaksýnýz.
+MEMO_INFO_X_NO_MEMOS
+ %s nickinin þu an hiç mesajý yok.
+MEMO_INFO_X_MEMO
+ %s nickinin þu an 1 mesajý var.
+MEMO_INFO_X_MEMO_UNREAD
+ %s nickinin þu an 1 mesajý var, ve daha okunmamýþ.
+MEMO_INFO_X_MEMOS
+ %s nickinin þu an %d mesajý var.
+MEMO_INFO_X_MEMOS_ONE_UNREAD
+ %s nickinin þu an %d mesajý var, 1 tanesi okunmamýþ.
+MEMO_INFO_X_MEMOS_SOME_UNREAD
+ %s nickinin þu an %d mesajý var, %d tanesi okunmamýþ.
+MEMO_INFO_X_MEMOS_ALL_UNREAD
+ %s nickinin þu an %d mesajý var; hiçbiri okunmamýþ.
+MEMO_INFO_X_LIMIT
+ %s nickinin mesaj limiti %d.
+MEMO_INFO_X_HARD_LIMIT
+ %s nickinin mesaj limiti %d, ve deðiþtirilemez.
+MEMO_INFO_X_NO_LIMIT
+ %s nickinin mesaj limiti yok.
+MEMO_INFO_X_NOTIFY_OFF
+ %s yeni mesajlar için uyarýlmayacak.
+MEMO_INFO_X_NOTIFY_ON
+ %s yeni mesajlar için baðlandýðýnda ve mesajlar ulaþtýðý anda uyarýlacak.
+MEMO_INFO_X_NOTIFY_RECEIVE
+ %s yeni mesajlar ulaþtýðý anda uyarýlacak.
+MEMO_INFO_X_NOTIFY_SIGNON
+ %s yeni mesajlar için baðlandýðýnda uyarýlacak.
+
+###########################################################################
+#
+# BotServ messages
+#
+###########################################################################
+
+# Standard responses
+BOT_DOES_NOT_EXIST
+ Bot %s mevcut deðil.
+BOT_NOT_ASSIGNED
+ Bu komutu kullanmadan önce kanala bir bot sokmalýsýnýz.
+ Daha fazla bilgi için /msg %S HELP ASSIGN yazýn.
+BOT_NOT_ON_CHANNEL
+ Bot %s kanalýnda deðil.
+
+# Kick reasons (must be a single line)
+BOT_REASON_BADWORD
+ %s kelimesinin bu kanalda kullanýlmasý yasaktýr!
+BOT_REASON_BADWORD_GENTLE
+ Konuþmalarýna dikkat et!
+BOT_REASON_BOLD
+ Bu kanalda kalýn yazý kullanýlmasý yasaktýr!
+BOT_REASON_CAPS
+ Lütfen büyük harf kullanmayýn!
+BOT_REASON_COLOR
+ Lütfen bu kanalda renkli yazý kullanmayýn!
+BOT_REASON_FLOOD
+ Flood yapma!
+BOT_REASON_REPEAT
+ Kendini tekrar etme!
+BOT_REASON_REVERSE
+ Lütfen bu kanalda Ctrl+R ile yazýlmýþ yazý kullanmayýn!
+BOT_REASON_UNDERLINE
+ Lütfen bu kanalda altý çizili yazý kullanmayýn!
+
+# !seen replies
+BOT_SEEN_BOT
+ Beni buldun, %s!
+BOT_SEEN_YOU
+ Kendinimi arýyorsun, %s?
+BOT_SEEN_ON_CHANNEL
+ %s þu anda kanalda!
+BOT_SEEN_ON_CHANNEL_AS
+ %s þu anda kanalda (%s olarak) !
+BOT_SEEN_ON
+ %s %s önce buradaydý.
+BOT_SEEN_NEVER
+ %s diye birini bu kanalda hiç görmedim.
+BOT_SEEN_UNKNOWN
+ %s þahsýnýn kim olduðunu bilmiyorum.
+
+# BOT responses
+BOT_BOT_SYNTAX
+ BOT ADD nick user host gerçekismi
+ BOT CHANGE eskinick yeninick [user [host [gerçekismi]]]
+ BOT DEL nick
+ BOT LIST
+BOT_BOT_ALREADY_EXISTS
+ %s nickli bot zaten var.
+BOT_BOT_CREATION_FAILED
+ Bot yaratma baþarýsýz.
+BOT_BOT_READONLY
+ Botta deðiþiklik yapma geçici olarak devre dýþý.
+BOT_BOT_ADDED
+ %s!%s@%s (%s) bot listesine eklendi.
+BOT_BOT_ANY_CHANGES
+ Eski bilgiler þimdikilerle ayný.
+BOT_BOT_CHANGED
+ %s botu %s!%s@%s (%s) olarak deðiþtirildi.
+BOT_BOT_DELETED
+ %s botu silindi.
+
+# BOTLIST responses
+BOT_BOTLIST_HEADER
+ Bot listesi:
+BOT_BOTLIST_PRIVATE_HEADER
+ IRCoplara ayrilmis botlar:
+BOT_BOTLIST_FOOTER
+ %d bot mevcut.
+BOT_BOTLIST_EMPTY
+ Þu an mevcut bot yok.
+ Server adminine bir tane yaratmasýný söyleyin!
+
+# ASSIGN responses
+BOT_ASSIGN_SYNTAX
+ ASSIGN kanaladý nick
+BOT_ASSIGN_READONLY
+ Kanala bot sokma geçici olarak devre dýþý.
+BOT_ASSIGN_ALREADY
+ Bot %s is already assigned to channel %s.
+BOT_ASSIGN_ASSIGNED
+ %s botu %s kanalýna sokuldu.
+
+# UNASSIGN responses
+BOT_UNASSIGN_SYNTAX
+ UNASSIGN kanaladý
+BOT_UNASSIGN_UNASSIGNED
+ %s kanalýndan bot çýkarýldý.
+
+# INFO responses
+BOT_INFO_SYNTAX
+ INFO {kanaladý | nick}
+BOT_INFO_NOT_FOUND
+ %s geçerli bir bot yada kanal deðil.
+BOT_INFO_BOT_HEADER
+ %s botunun bilgileri:
+BOT_INFO_BOT_MASK
+ Mask : %s@%s
+BOT_INFO_BOT_REALNAME
+ Gerçek ismi : %s
+BOT_INFO_BOT_CREATED
+ Yaratýlýþ : %s
+BOT_INFO_BOT_USAGE
+ Kullanýlan kanallar : %d kanalda
+BOT_INFO_BOT_OPTIONS
+ Ayarlar : %s
+BOT_INFO_OPT_PRIVATE
+ Özel
+BOT_INFO_CHAN_HEADER
+ %s kanalýnýn bilgileri:
+BOT_INFO_CHAN_BOT
+ Botun nicki : %s
+BOT_INFO_CHAN_BOT_NONE
+ Botun nicki : þu an yok.
+BOT_INFO_CHAN_KICK_BADWORDS
+ Küfürde atma : %s
+BOT_INFO_CHAN_KICK_BADWORDS_BAN
+ Küfürde atma : %s (%d tanede ban)
+BOT_INFO_CHAN_KICK_BOLDS
+ Kalýn yazýda atma : %s
+BOT_INFO_CHAN_KICK_BOLDS_BAN
+ Kalýn yazýda atma : %s (%d tanede ban)
+BOT_INFO_CHAN_KICK_CAPS_ON
+ Büyük yazýda atma : %s (minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_BAN
+ Büyük yazýda atma : %s (%d tanede ban; minimum %d/%d%%)
+BOT_INFO_CHAN_KICK_CAPS_OFF
+ Büyük yazýda atma : %s
+BOT_INFO_CHAN_KICK_COLORS
+ Renkli yazýda atma : %s
+BOT_INFO_CHAN_KICK_COLORS_BAN
+ Renkli yazýda atma : %s (%d tanede ban)
+BOT_INFO_CHAN_KICK_FLOOD_ON
+ Floodda atma : %s (%d sýra %ds)
+BOT_INFO_CHAN_KICK_FLOOD_BAN
+ Floodda atma : %s (%d tanede ban; %d sýra %ds)
+BOT_INFO_CHAN_KICK_FLOOD_OFF
+ Floodda atma : %s
+BOT_INFO_CHAN_KICK_REPEAT_ON
+ Tekrarda atma : %s (%d kez)
+BOT_INFO_CHAN_KICK_REPEAT_BAN
+ Tekrarda atma : %s (%d tanede ban; %d kez)
+BOT_INFO_CHAN_KICK_REPEAT_OFF
+ Tekrarda atma : %s
+BOT_INFO_CHAN_KICK_REVERSES
+ Ctrl+R de atma : %s
+BOT_INFO_CHAN_KICK_REVERSES_BAN
+ Ctrl+R de atma : %s (%d tanede ban)
+BOT_INFO_CHAN_KICK_UNDERLINES
+ Altýçizili yazýda atma : %s
+BOT_INFO_CHAN_KICK_UNDERLINES_BAN
+ Altýçizili yazýda atma : %s (%d tanede ban)
+BOT_INFO_ACTIVE
+ Aktif
+BOT_INFO_INACTIVE
+ Kapalý
+BOT_INFO_CHAN_OPTIONS
+ Özellikler : %s
+BOT_INFO_OPT_DONTKICKOPS
+ Oplarý koruma
+BOT_INFO_OPT_DONTKICKVOICES
+ Voicelarý koruma
+BOT_INFO_OPT_FANTASY
+ Fantazi
+BOT_INFO_OPT_GREET
+ Karþýlama
+BOT_INFO_OPT_NOBOT
+ Bot yok
+BOT_INFO_OPT_SYMBIOSIS
+ Gerçek bot
+BOT_INFO_OPT_NONE
+ YOK
+
+# SET responses
+BOT_SET_SYNTAX
+ SET kanaladý özellik ayarlar
+BOT_SET_DISABLED
+ Bot özellik ayarý geçici olarak devre dýþý.
+BOT_SET_UNKNOWN
+ Varolmayan özellik %s.
+ Daha fazla bilgi için /msg %S HELP SET yazýn.
+
+# SET DONTKICKOPS messages
+BOT_SET_DONTKICKOPS_SYNTAX
+ SET kanaladý DONTKICKOPS {ON|OFF}
+BOT_SET_DONTKICKOPS_ON
+ Bot %s kanalýnda oplarý atmayacak .
+BOT_SET_DONTKICKOPS_OFF
+ Bot %s kanalýnda oplarýda atacak.
+
+# SET DONTKICKVOICES messages
+BOT_SET_DONTKICKVOICES_SYNTAX
+ SET kanaladý DONTKICKVOICES {ON|OFF}
+BOT_SET_DONTKICKVOICES_ON
+ Bot %s kanalýnda voicelarý atmayacak.
+BOT_SET_DONTKICKVOICES_OFF
+ Bot %s kanalýnda voicelarýda atacak.
+
+# SET FANTASY messages
+BOT_SET_FANTASY_SYNTAX
+ SET kanaladý FANTASY {ON|OFF}
+BOT_SET_FANTASY_ON
+ Fantazi modu %s kanalýnda AKTÝF.
+BOT_SET_FANTASY_OFF
+ Fantazi modu %s kanalýnda KAPALI.
+
+# SET GREET messages
+BOT_SET_GREET_SYNTAX
+ SET kanaladý GREET {ON|OFF}
+BOT_SET_GREET_ON
+ Karþýlama modu %s kanalýnda AKTÝF.
+BOT_SET_GREET_OFF
+ Karþýlama modu %s kanalýnda KAPALI.
+
+# SET NOBOT
+BOT_SET_NOBOT_SYNTAX
+ SET kanaladý NOBOT {ON|OFF}
+BOT_SET_NOBOT_ON
+ Bot yok modu %s kanalý için AKTÝF.
+BOT_SET_NOBOT_OFF
+ Bot yok modu %s kanalý için KAPALI.
+
+# SET PRIVATE
+BOT_SET_PRIVATE_SYNTAX
+ SET kanaladi PRIVATE {ON|OFF}
+BOT_SET_PRIVATE_ON
+ %s botunun özel seçenegi artik AKTIF.
+BOT_SET_PRIVATE_OFF
+ %s botunun özel seçenegi artik KAPALI.
+
+# SET SYMBIOSIS
+BOT_SET_SYMBIOSIS_SYNTAX
+ SET kanaladý SYMBIOSIS {ON|OFF}
+BOT_SET_SYMBIOSIS_ON
+ Gerçek bot modu %s kanalýnda AKTÝF.
+BOT_SET_SYMBIOSIS_OFF
+ Gerçek bot modu %s kanalýnda KAPALI.
+
+# KICK responses
+BOT_KICK_SYNTAX
+ KICK kanaladý özellik {ON|OFF} [ayarlar]
+BOT_KICK_DISABLED
+ Atma ayarlarý geçici olarak devre dýþý.
+BOT_KICK_UNKNOWN
+ Varolmayan özellik %s.
+ Daha fazla bilgi için /msg %S HELP KICK yazýn.
+BOT_KICK_BAD_TTB
+ %s deðeri kullanýlamaz.
+BOT_KICK_BADWORDS_ON
+ Bot þimdi küfürlerde atacak. BADWORDS komutunu kullanarak
+ listeye küfür ekleyip silebilirsiniz.
+BOT_KICK_BADWORDS_ON_BAN
+ Bot þimdi küfürlerde atacak, ve %d atma sonrasýnda
+ ayný kullanýcýyý banlayacak. BADWORDS komutunu
+ kullanarak küfür ekleyip çýkarabilirsiniz.
+BOT_KICK_BADWORDS_OFF
+ Bot artýk küfürlerde atmayacak.
+BOT_KICK_BOLDS_ON
+ Bot þimdi kalýn yazýda atacak.
+BOT_KICK_BOLDS_ON_BAN
+ Bot þimdi kalýn yazýda atacak, ve
+ %d atma sonrasýnda ayný kullanýcýyý banlayacak.
+BOT_KICK_BOLDS_OFF
+ Bot artýk kalýn yazýda atmayacak.
+BOT_KICK_CAPS_ON
+ Bot þimdi büyük yazýda atacak(Tüm mesajýn en az
+ %d karakterini ve %d%% kadarýný içermelidir).
+BOT_KICK_CAPS_ON_BAN
+ Bot þimdi büyük yazýda atacak(Tüm mesajýn en az
+ %d karakterini ve %d%% kadarýný içermelidir), ve
+ %d atma sonrasýnda ayný kullanýcýyý banlayacak.
+BOT_KICK_CAPS_OFF
+ Bot artýk büyük yazýda atmayacak.
+BOT_KICK_COLORS_ON
+ Bot þimdi renkli yazýda atacak.
+BOT_KICK_COLORS_ON_BAN
+ Bot þimdi renkli yazýda atacak, ve
+ %d atma sonrasýnda ayný kullanýcýyý banlayacak.
+BOT_KICK_COLORS_OFF
+ Bot artýk renkli yazýda atmayacak.
+BOT_KICK_FLOOD_ON
+ Bot þimdi text floodda atacak(%d sýra %d saniyede).
+BOT_KICK_FLOOD_ON_BAN
+ Bot þimdi text floodda atacak(%d sira %d saniyede), ve
+ %d atma sonrasýnda ayný kullanýcýyý banlayacak.
+BOT_KICK_FLOOD_OFF
+ Bot artýk text floodda atmayacak.
+BOT_KICK_REPEAT_ON
+ Bot þimdi tekrarda atacak(kullanýcý %d kez
+ ayný þeyi söylerse).
+BOT_KICK_REPEAT_ON_BAN
+ Bot þimdi tekrarda atacak(kullanýcý %d kez
+ ayný þeyi söylerse), ve %d atma sonrasýnda
+ ayný kullanýcýyý banlayacak.
+BOT_KICK_REPEAT_OFF
+ Bot artýk tekrarda atmayacak.
+BOT_KICK_REVERSES_ON
+ Bot þimdi Ctrl+R de atacak.
+BOT_KICK_REVERSES_ON_BAN
+ Bot þimdi Ctrl+R de atacak, ve %d atma sonrasýnda
+ ayný kullanýcýyý banlayacak.
+BOT_KICK_REVERSES_OFF
+ Bot artýk Ctrl+R de atmayacak.
+BOT_KICK_UNDERLINES_ON
+ Bot þimdi altýçizili yazýda atacak.
+BOT_KICK_UNDERLINES_ON_BAN
+ Bot þimdi altýçizili yazýda atacak, ve %d atma
+ sonrasýnda ayný kullanýcýyý banlayacak.
+BOT_KICK_UNDERLINES_OFF
+ Bot artýk altýçizili yazýda atmayacak.
+
+# BADWORDS messages
+BOT_BADWORDS_SYNTAX
+ BADWORDS kanaladý {ADD|DEL|LIST|CLEAR} [nick | kayýt-listesi]
+BOT_BADWORDS_DISABLED
+ Kanalýn küfür listesinde deðiþiklik yapma geçici olarak devre dýþýdýr.
+BOT_BADWORDS_REACHED_LIMIT
+ Bir kanalda sadece %d tane küfür kaydý olabilir.
+BOT_BADWORDS_ALREADY_EXISTS
+ %s zaten %s kanalýnýn küfür listesinde var.
+BOT_BADWORDS_ADDED
+ %s %s kanalýnýn küfür listesine eklendi.
+BOT_BADWORDS_NO_SUCH_ENTRY
+ (#%d) þeklinde bir kayýt %s kanalýnýn küfür listesinde bulunamadý.
+BOT_BADWORDS_NOT_FOUND
+ %s %s kanalýnýn küfür listesinde bulunamadý.
+BOT_BADWORDS_NO_MATCH
+ Uyuþan kayýt %s kanalýnýn küfür listesinde bulunamadý.
+BOT_BADWORDS_DELETED
+ %s %s kanalýnýn küfür listesinden çýkarýldý.
+BOT_BADWORDS_DELETED_ONE
+ %s kanalýnýn küfür listesinden 1 kayýt silindi.
+BOT_BADWORDS_DELETED_SEVERAL
+ Deleted %d entries from %s bad words list.
+BOT_BADWORDS_LIST_EMPTY
+ %s kanalýnýn küfür listesi boþ.
+BOT_BADWORDS_LIST_HEADER
+ %s kanalýnýn küfür listesi:
+ Sayý Kelime Tipi
+BOT_BADWORDS_LIST_FORMAT
+ %3d %-30s %s
+BOT_BADWORDS_CLEAR
+ Küfür listesi þimdi boþ.
+
+# SAY responses
+BOT_SAY_SYNTAX
+ SAY kanaladý yazý
+
+# ACT responses
+BOT_ACT_SYNTAX
+ ACT kanaladý yazý
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_EXCEPT
+ User matches channel except.
+
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+BOT_BAD_NICK
+ Bot Nicks may only contain valid nick characters.
+BOT_BAD_HOST
+ Bot Hosts may only contain valid host characters.
+BOT_BAD_IDENT
+ Bot Idents may only contain valid characters.
+###########################################################################
+#
+# OperServ messages
+#
+###########################################################################
+
+# General messages
+OPER_BOUNCY_MODES
+ Servisler mod deðiþtiremiyor. Serverin doðru ayarlandýðýna emin olun.
+OPER_BOUNCY_MODES_U_LINE
+ Servisler mod deðiþtiremiyor. Serverin U:line larýnýn doðru ayarlandýðýna emin olun.
+
+# GLOBAL responses
+OPER_GLOBAL_SYNTAX
+ GLOBAL mesaj
+
+# STATS responses
+OPER_STATS_UNKNOWN_OPTION
+ Varolmayan STATS özelliði: %s.
+OPER_STATS_CURRENT_USERS
+ Þu anki kullanýcý sayýsý: %d (%d op)
+OPER_STATS_MAX_USERS
+ Maximum kullanýcý sayýsý: %d (%s)
+# This is ugly, but at least it's language-portable...
+# Note that you can include seconds in any of these--my personal preference
+# is to only give resolution to the nearest minute when uptime is one hour
+# or more, but just add a %d to get seconds as well.
+OPER_STATS_UPTIME_DHMS
+ Servisler %d gündür çalýþýyor, %02d:%02d
+OPER_STATS_UPTIME_1DHMS
+ Servisler %d gündür çalýþýyor, %02d:%02d
+OPER_STATS_UPTIME_HMS
+ Servisler %d saat, %d dakikadýr çalýþýyor.
+OPER_STATS_UPTIME_HM1S
+ Servisler %d saat, %d dakikadýr çalýþýyor.
+OPER_STATS_UPTIME_H1MS
+ Servisler %d saat, %d dakikadýr çalýþýyor.
+OPER_STATS_UPTIME_H1M1S
+ Servisler %d saat, %d dakikadýr çalýþýyor.
+OPER_STATS_UPTIME_1HMS
+ Servisler %d saat, %d dakikadýr çalýþýyor.
+OPER_STATS_UPTIME_1HM1S
+ Servisler %d saat, %d dakikadýr çalýþýyor.
+OPER_STATS_UPTIME_1H1MS
+ Servisler %d saat, %d dakikadýr çalýþýyor.
+OPER_STATS_UPTIME_1H1M1S
+ Servisler %d saat, %d dakikadýr çalýþýyor.
+OPER_STATS_UPTIME_MS
+ Servisler %d dakika, %d saniyedir çalýþýyor.
+OPER_STATS_UPTIME_M1S
+ Servisler %d dakika, %d saniyedir çalýþýyor.
+OPER_STATS_UPTIME_1MS
+ Servisler %d dakika, %d saniyedir çalýþýyor.
+OPER_STATS_UPTIME_1M1S
+ Servisler %d dakika, %d saniyedir çalýþýyor.
+OPER_STATS_BYTES_READ
+ Okunan veri : %5d kB
+OPER_STATS_BYTES_WRITTEN
+ Yazýlan veri : %5d kB
+OPER_STATS_USER_MEM
+ Kullanýcý : %6d kayýt, %5d kB
+OPER_STATS_CHANNEL_MEM
+ Kanal : %6d kayýt, %5d kB
+OPER_STATS_GROUPS_MEM
+ NS Groups : %6d records, %5d kB
+OPER_STATS_ALIASES_MEM
+ NS Aliases : %6d records, %5d kB
+OPER_STATS_CHANSERV_MEM
+ ChanServ : %6d kayýt, %5d kB
+OPER_STATS_BOTSERV_MEM
+ BotServ : %6d kayýt, %5d kB
+OPER_STATS_OPERSERV_MEM
+ OperServ : %6d kayýt, %5d kB
+OPER_STATS_SESSIONS_MEM
+ Oturumlar : %6d kayýt, %5d kB
+OPER_STATS_PROXY_MEM
+ Proxyler : %6d kayit, %5d kB
+OPER_STATS_AKILL_COUNT
+ Þu anki AKILL sayýsý: %d
+OPER_STATS_AKILL_EXPIRE_DAYS
+ Varsayýlan AKILL zaman aþýmý: %d gün
+OPER_STATS_AKILL_EXPIRE_DAY
+ Varsayýlan AKILL zaman aþýmý: 1 gün
+OPER_STATS_AKILL_EXPIRE_HOURS
+ Varsayýlan AKILL zaman aþýmý: %d saat
+OPER_STATS_AKILL_EXPIRE_HOUR
+ Varsayýlan AKILL zaman aþýmý: 1 saat
+OPER_STATS_AKILL_EXPIRE_MINS
+ Varsayýlan AKILL zaman aþýmý: %d dakika
+OPER_STATS_AKILL_EXPIRE_MIN
+ Varsayýlan AKILL zaman aþýmý: 1 dakika
+OPER_STATS_AKILL_EXPIRE_NONE
+ Varsayýlan AKILL zaman aþýmý: zaman aþýmý yok
+OPER_STATS_SGLINE_COUNT
+ Þu anki SGLINE sayýsý: %d
+OPER_STATS_SGLINE_EXPIRE_DAYS
+ Varsayýlan SGLINE zaman aþýmý süresi: %d gün
+OPER_STATS_SGLINE_EXPIRE_DAY
+ Varsayýlan SGLINE zaman aþýmý süresi: 1 gün
+OPER_STATS_SGLINE_EXPIRE_HOURS
+ Varsayýlan SGLINE zaman aþýmý süresi: %d saat
+OPER_STATS_SGLINE_EXPIRE_HOUR
+ Varsayýlan SGLINE zaman aþýmý süresi: 1 saat
+OPER_STATS_SGLINE_EXPIRE_MINS
+ Varsayýlan SGLINE zaman aþýmý süresi: %d dakika
+OPER_STATS_SGLINE_EXPIRE_MIN
+ Varsayýlan SGLINE zaman aþýmý süresi: 1 dakika
+OPER_STATS_SGLINE_EXPIRE_NONE
+ Varsayýlan SGLINE zaman aþýmý süresi: Zaman aþýmý yok
+OPER_STATS_SQLINE_COUNT
+ Su anki SQLINE sayisi: %d
+OPER_STATS_SQLINE_EXPIRE_DAYS
+ Varsayilan SQLINE zaman asimi süresi: %d gün
+OPER_STATS_SQLINE_EXPIRE_DAY
+ Varsayilan SQLINE zaman asimi süresi: 1 gün
+OPER_STATS_SQLINE_EXPIRE_HOURS
+ Varsayilan SQLINE zaman asimi süresi: %d saat
+OPER_STATS_SQLINE_EXPIRE_HOUR
+ Varsayilan SQLINE zaman asimi süresi: 1 saat
+OPER_STATS_SQLINE_EXPIRE_MINS
+ Varsayilan SQLINE zaman asimi süresi: %d dakika
+OPER_STATS_SQLINE_EXPIRE_MIN
+ Varsayilan SQLINE zaman asimi süresi: 1 dakika
+OPER_STATS_SQLINE_EXPIRE_NONE
+ Varsayilan SQLINE zaman asimi süresi: Zaman asimi yok
+OPER_STATS_SZLINE_COUNT
+ Þu anki SZLINE sayýsý: %d
+OPER_STATS_SZLINE_EXPIRE_DAYS
+ Varsayýlan SZLINE zaman aþýmý süresi: %d gün
+OPER_STATS_SZLINE_EXPIRE_DAY
+ Varsayýlan SZLINE zaman aþýmý süresi: 1 gün
+OPER_STATS_SZLINE_EXPIRE_HOURS
+ Varsayýlan SZLINE zaman aþýmý süresi: %d saat
+OPER_STATS_SZLINE_EXPIRE_HOUR
+ Varsayýlan SZLINE zaman aþýmý süresi: 1 saat
+OPER_STATS_SZLINE_EXPIRE_MINS
+ Varsayýlan SZLINE zaman aþýmý süresi: %d dakika
+OPER_STATS_SZLINE_EXPIRE_MIN
+ Varsayýlan SZLINE zaman aþýmý süresi: 1 dakika
+OPER_STATS_SZLINE_EXPIRE_NONE
+ Varsayýlan SZLINE zaman aþýmý süresi: Zaman aþýmý yok
+OPER_STATS_RESET
+ Ýstatistikler resetlendi.
+
+# MODE responses
+OPER_MODE_SYNTAX
+ MODE kanaladý modlar
+
+# CLEARMODES responses
+OPER_UMODE_SYNTAX
+ UMODE nick modes
+
+# OLINE responses
+OPER_UMODE_SUCCESS
+ Changed usermodes of %s.
+OPER_UMODE_CHANGED
+ %s changed your usermodes.
+
+# OLINE responses
+OPER_OLINE_SYNTAX
+ OLINE nick flags
+OPER_OLINE_SUCCESS
+ An O:Line with the flags %s has been added for %s.
+
+# CLEARMODES responses
+OPER_OLINE_IRCOP
+ You are now an IRC Operator.
+
+# CLEARMODES responses
+OPER_CLEARMODES_SYNTAX
+ CLEARMODES kanaladý [ALL]
+OPER_CLEARMODES_DONE
+ %s kanalýnda modlar ve banlar temizlendi.
+OPER_CLEARMODES_ALL_DONE
+ %s kanalýndaki tüm modlar temizlendi.
+
+
+# KICK responses
+OPER_KICK_SYNTAX
+ KICK kanaladý kullanýcý sebep
+
+# ADMIN responses
+OPER_SVSNICK_SYNTAX
+ SVSNICK nick newnick
+OPER_SVSNICK_NEWNICK
+ The nick %s is now being changed to %s.
+
+# ADMIN responses
+OPER_ADMIN_SYNTAX
+ ADMIN {ADD|DEL|LIST|CLEAR} [nick | kayýt-listesi]
+OPER_ADMIN_SKELETON
+ Servisler iskelet modunda(skeleton); ADMIN komutu devre dýþý.
+OPER_ADMIN_EXISTS
+ %s zaten Servis adminleri listesinde.
+OPER_ADMIN_REACHED_LIMIT
+ Sadece %d tane servis admini olabilir.
+OPER_ADMIN_ADDED
+ %s Servis adminleri listesine eklendi.
+OPER_ADMIN_NOT_FOUND
+ %s Servisler admin listesinde bulunamadý.
+OPER_ADMIN_NO_MATCH
+ Servis adminleri listesinde uyuþan kayýt yok.
+OPER_ADMIN_DELETED
+ %s servis adminleri listesinden silindi.
+OPER_ADMIN_DELETED_ONE
+ Servis adminleri listesinden 1 kayýt silindi.
+OPER_ADMIN_DELETED_SEVERAL
+ Servis adminleri listesinden %d kayýt silindi.
+OPER_ADMIN_LIST_EMPTY
+ Servis adminleri listesi boþ.
+OPER_ADMIN_LIST_HEADER
+ Servis adminleri listesi:
+ Num Nick
+OPER_ADMIN_LIST_FORMAT
+ %3d %s
+OPER_ADMIN_CLEAR
+ Servis adminleri listesi temizlendi.
+
+# OPER responses
+OPER_OPER_SYNTAX
+ OPER {ADD|DEL|LIST|CLEAR} [nick | kayýt-listesi]
+OPER_OPER_SKELETON
+ Servisler iskelet modunda(skeleton); OPER komutu devre dýþý.
+OPER_OPER_EXISTS
+ %s zaten servis operatörleri listesinde.
+OPER_OPER_REACHED_LIMIT
+ Sadece %d tane servis operatörü olabilir.
+OPER_OPER_ADDED
+ %s servis operatörleri listesine eklendi.
+OPER_OPER_NOT_FOUND
+ %s servis operatörleri listesinde bulunamadý.
+OPER_OPER_NO_MATCH
+ Servis operatörleri listesinde uyuþan kayýt bulunamadý.
+OPER_OPER_DELETED
+ %s servis operatörleri listesinden silindi.
+OPER_OPER_DELETED_ONE
+ Servis operatörleri listesinden 1 kayýt silindi.
+OPER_OPER_DELETED_SEVERAL
+ Servis operatörleri listesinden %d kayýt silindi.
+OPER_OPER_LIST_EMPTY
+ Servis operatörleri listesi boþ.
+OPER_OPER_LIST_HEADER
+ Servis operatörleri listesi:
+ Num Nick
+OPER_OPER_LIST_FORMAT
+ %3d %s
+OPER_OPER_CLEAR
+ Servis operatörleri listesi temizlendi.
+
+# AKILL responses
+OPER_AKILL_SYNTAX
+ AKILL {ADD | DEL | LIST | VIEW | CLEAR} [[+zamanaþýmý] {mask | kayýt-no} [sebep]]
+OPER_AKILL_EXISTS
+ %s zaten AKILL listesinde.
+OPER_AKILL_ALREADY_COVERED
+ %s zaten %s tarafýndan deðiþtirildi.
+OPER_AKILL_REACHED_LIMIT
+ Sadece %d kiþi AKILL listesinde olabilir.
+OPER_AKILL_NO_NICK
+ Hatýrlatma: AKILL maskýna nick eklenemez; AKILL maskýna nick eklemediðinizden emin olun.
+OPER_AKILL_ADDED
+ %s AKILL listesine eklendi.
+OPER_AKILL_CHANGED
+ %s nickinin zaman aþýmý süresi deðiþtirildi.
+OPER_AKILL_NOT_FOUND
+ %s AKILL listesinde bulunamadý.
+OPER_AKILL_NO_MATCH
+ Uyuþan kayýt AKILL listesinde bulunamadý.
+OPER_AKILL_DELETED
+ %s AKILL listesinden silindi.
+OPER_AKILL_DELETED_ONE
+ AKILL listesinden 1 kayýt silindi.
+OPER_AKILL_DELETED_SEVERAL
+ AKILL listesinden %d kayýt silindi.
+OPER_AKILL_LIST_EMPTY
+ AKILL listesi boþ.
+OPER_AKILL_LIST_HEADER
+ Þu anki AKILL listesi:
+ No Mask Sebep
+OPER_AKILL_LIST_FORMAT
+ %3d %-32s %s
+OPER_AKILL_VIEW_HEADER
+ Þu anki AKILL listesi:
+# number, mask, set-by, set-time, expires, reason
+OPER_AKILL_VIEW_FORMAT
+ %3d %s (%s tarafýndan %s tarihinde; %s)
+ %s
+OPER_AKILL_CLEAR
+ AKILL listesi temizlendi.
+
+# SGLINE responses
+OPER_CHANKILL_SYNTAX
+ CHANAKILL [+expiry] {#channel} [reason]
+# SGLINE responses
+OPER_SGLINE_SYNTAX
+ SGLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+zamanaþýmý] {mask | kayýt-sýrasý} [sebep]]
+OPER_SGLINE_UNSUPPORTED
+ SGLINE bu networkte mevcut deðil.
+OPER_SGLINE_EXISTS
+ %s zaten SGLINE listesinde.
+OPER_SGLINE_ALREADY_COVERED
+ %s zaten %s tarafýndan deðiþtirildi.
+OPER_SGLINE_REACHED_LIMIT
+ Sadece %d kiþi SGLINE listesinde olabilir.
+OPER_SGLINE_ADDED
+ %s SGLINE listesinde eklendi.
+OPER_SGLINE_CHANGED
+ %s nickinin zaman aþýmý süresi deðiþtirildi.
+OPER_SGLINE_NOT_FOUND
+ %s SGLINE listesinde bulunamadý.
+OPER_SGLINE_NO_MATCH
+ SGLINE listesinde uyuþan kayýt bulunamadý.
+OPER_SGLINE_DELETED
+ %s SGLINE listesinden silindi.
+OPER_SGLINE_DELETED_ONE
+ SGLINE listesinden 1 kayýt silindi.
+OPER_SGLINE_DELETED_SEVERAL
+ SGLINE listesinden %d kayýt silindi.
+OPER_SGLINE_LIST_EMPTY
+ SGLINE listesi boþ.
+OPER_SGLINE_LIST_HEADER
+ Þu anki SGLINE listesi:
+ No Mask Sebep
+OPER_SGLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SGLINE_VIEW_HEADER
+ Þu anki SGLINE listesi:
+# number, mask, set-by, set-time, expires, reason
+OPER_SGLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SGLINE_CLEAR
+ SGLINE listesi temizlendi.
+
+# SQLINE responses
+OPER_SQLINE_SYNTAX
+ SQLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+zaman asimi] {mask | kayit-sirasi} [sebep]]
+OPER_SQLINE_CHANNELS_UNSUPPORTED
+ SQLINE kullandiginiz IRCd tarafindan desteklenmiyor, bu yüzden kullanmazsiniz.
+OPER_SQLINE_EXISTS
+ %s zaten SQLINE listesinde mevcut.
+OPER_SQLINE_ALREADY_COVERED
+ %s zaten %s tarafindan degistirildi.
+OPER_SQLINE_REACHED_LIMIT
+ Toplam %d SQLINE olabilir.
+OPER_SQLINE_ADDED
+ %s SQLINE listesine eklendi.
+OPER_SQLINE_CHANGED
+ %s için zaman asimi süresi degistirildi.
+OPER_SQLINE_NOT_FOUND
+ %s SQLINE listesinde bulunamadi.
+OPER_SQLINE_NO_MATCH
+ SQLINE listesinde uyusan kayit bulunamadi.
+OPER_SQLINE_DELETED
+ %s SQLINE listesinden silindi.
+OPER_SQLINE_DELETED_ONE
+ SQLINE listesinden 1 kayit silindi.
+OPER_SQLINE_DELETED_SEVERAL
+ SQLINE listesinden %d kayit silindi.
+OPER_SQLINE_LIST_EMPTY
+ SQLINE listesi bos.
+OPER_SQLINE_LIST_HEADER
+ Mevcut SQLINE listesi:
+ Num Mask Sebep
+OPER_SQLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SQLINE_VIEW_HEADER
+ Mevcut SQLINE listesi:
+# number, mask, set-by, set-time, expires, reason
+OPER_SQLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SQLINE_CLEAR
+ SQLINE listesi temizlendi.
+
+# SZLINE responses
+OPER_SZLINE_SYNTAX
+ SZLINE {ADD | DEL | LIST | VIEW | CLEAR} [[+zamanaþýmý] {mask | kayýt-sýrasý} [sebep]]
+OPER_SZLINE_UNSUPPORTED
+ SZLINE bu networkte mevcut deðil.
+OPER_SZLINE_EXISTS
+ %s zaten SZLINE listesinde.
+OPER_SZLINE_ALREADY_COVERED
+ %s zaten %s tarafýndan deðiþtirildi.
+OPER_SZLINE_REACHED_LIMIT
+ Sadece %d kiþi SZLINE listesinde olabilir.
+OPER_SZLINE_ONLY_IPS
+ Hatýrlatma: SZLINE listesine sadece IP masklarýný ekleyebilirsiniz.
+OPER_SZLINE_ADDED
+ %s SZLINE listesine eklendi.
+OPER_SZLINE_CHANGED
+ %s nickinin zaman aþýmý süresi deðiþtirildi.
+OPER_SZLINE_NOT_FOUND
+ %s SZLINE listesinde bulunamadý.
+OPER_SZLINE_NO_MATCH
+ SZLINE listesinde uyuþan kayýt bulunamadý.
+OPER_SZLINE_DELETED
+ %s SZLINE listesinden silindi.
+OPER_SZLINE_DELETED_ONE
+ SZLINE listesinden 1 kayýt silindi.
+OPER_SZLINE_DELETED_SEVERAL
+ SZLINE listesinden %d kayýt silindi.
+OPER_SZLINE_LIST_EMPTY
+ SZLINE listesi boþ.
+OPER_SZLINE_LIST_HEADER
+ Þu anki SZLINE listesi:
+ No Mask Sebep
+OPER_SZLINE_LIST_FORMAT
+ %3d %-32s %s
+OPER_SZLINE_VIEW_HEADER
+ Þu anki SZLINE listesi:
+# number, mask, set-by, set-time, expires, reason
+OPER_SZLINE_VIEW_FORMAT
+ %3d %s (by %s on %s; %s)
+ %s
+OPER_SZLINE_CLEAR
+ SZLINE listesi temizlendi.
+
+# SET responses
+OPER_SET_SYNTAX
+ SET özellik ayar
+OPER_SET_IGNORE_ON
+ Ignore kodu AKTIF.
+OPER_SET_IGNORE_OFF
+ Ignore kodu KAPALI.
+OPER_SET_IGNORE_ERROR
+ IGNORE ayarý ON veya OFF þeklinde olmalýdýr.
+OPER_SET_READONLY_ON
+ Servisler þimdi read-only modunda.
+OPER_SET_READONLY_OFF
+ Servisler þimdi read-write modunda.
+OPER_SET_READONLY_ERROR
+ READONLY ayarý ON veya OFF þeklinde olmalýdýr.
+OPER_SET_LOGCHAN_ON
+ Services is now reporting log messages to %s.
+OPER_SET_LOGCHAN_OFF
+ Services is no longer reporting log messages to a channel.
+OPER_SET_LOGCHAN_ERROR
+ Setting for LOGCHAN must be ON or OFF and LogChannel must be defined.
+OPER_SET_DEBUG_ON
+ Servisler þimdi debug modunda.
+OPER_SET_DEBUG_OFF
+ Servisler þimdi non-debug modunda.
+OPER_SET_DEBUG_LEVEL
+ Servisler þimdi debug modunda (seviye %d).
+OPER_SET_DEBUG_ERROR
+ DEBUG ayarý ON, OFF, veya pozitif bir sayý olmalýdýr.
+OPER_SET_NOEXPIRE_ON
+ Servisler þimdi no expire modunda.
+OPER_SET_NOEXPIRE_OFF
+ Servisler þimdi expire modunda.
+OPER_SET_NOEXPIRE_ERROR
+ NOEXPIRE ayarý ON yada OFF olmalýdýr.
+OPER_SET_UNKNOWN_OPTION
+ Varolmayan özellik %s.
+
+# NOOP responses
+OPER_NOOP_SYNTAX
+ NOOP {SET|REVOKE} server
+OPER_NOOP_SET
+ %s serverýndaki tüm O:line lar silindi.
+OPER_NOOP_REVOKE
+ %s serverýndaki tüm O:line lar resetlendi.
+
+# JUPE responses
+OPER_JUPE_SYNTAX
+ JUPE serverismi [sebep]
+
+# RAW responses
+OPER_JUPE_HOST_ERROR
+ Please use a valid server name when juping
+
+# RAW responses
+OPER_RAW_SYNTAX
+ RAW yazý
+
+# UPDATE responses
+OPER_UPDATING
+ Veritabaný güncelleniyor.
+
+# RELOAD responses
+OPER_RELOAD
+ Servislerin conf dosyasý yeniden yüklendi.
+
+# RESTART responses
+OPER_CANNOT_RESTART
+ SERVICES_BIN tanýmlanmamýþ; restart edilemiyor. Yeniden \2configure\2 edin ve RESTART komutunu aktifleþtirmek için Servisleri yeniden derleyin.
+
+# LISTIGNORE responses
+OPER_IGNORE_SYNTAX
+ Syntax: IGNORE {ADD|DEL|LIST|CLEAR} [time] [nick]
+OPER_IGNORE_VALID_TIME
+ You have to enter a valid number as time.
+OPER_IGNORE_TIME_DONE
+ %s will now be ignored for %s.
+OPER_IGNORE_PERM_DONE
+ %s will now permanently be ignored.
+OPER_IGNORE_DEL_DONE
+ %s will no longer be ignored.
+OPER_IGNORE_LIST
+ Servisler ignore listesi:
+OPER_IGNORE_LIST_NOMATCH
+ %s not found on ignore list.
+OPER_IGNORE_LIST_EMPTY
+ Ignore listesi boþ.
+
+# KILLCLONES responses
+OPER_IGNORE_LIST_CLEARED
+ Ignore list has been cleared.
+
+# KILLCLONES responses
+OPER_KILLCLONES_SYNTAX
+ KILLCLONES nick
+OPER_KILLCLONES_UNKNOWN_NICK
+ Kullanýcý %s bulunamadý.
+
+# CHANLIST responses
+OPER_CHANLIST_HEADER
+ Kanal listesi:
+ Ýsim Kullanici Modlari Konu
+OPER_CHANLIST_HEADER_USER
+ %s kanal listesi:
+ Ýsim Kullanici Modlari Konu
+OPER_CHANLIST_RECORD
+ %-20s %4d +%-6s %s
+OPER_CHANLIST_END
+ Kanal listesi sonu.
+
+# USERLIST responses
+OPER_USERLIST_HEADER
+ Kullanýcý listesi:
+ Nick Mask
+OPER_USERLIST_HEADER_CHAN
+ %s kullanýcý listesi:
+ Nick Mask
+OPER_USERLIST_RECORD
+ %-20s %s@%s
+OPER_USERLIST_END
+ Kullanýcý listesi sonu.
+
+# CACHE responses
+OPER_CACHE_SYNTAX
+ CACHE {DEL | LIST} {host | model} [QUEUED | ALL]
+OPER_CACHE_DISABLED
+ Proxy taramasi devre disi.
+OPER_CACHE_NOT_FOUND
+ %s cache te bulunamadi.
+OPER_CACHE_REMOVED
+ %s cache ten çikarildi.
+OPER_CACHE_HEADER
+ Host Durum
+OPER_CACHE_LIST
+ %-48s %s
+OPER_CACHE_FOOTER
+ Liste sonu - %d/%d kayit gösterildi.
+OPER_CACHE_QUEUED
+ Siraya alindi
+OPER_CACHE_PROGRESS
+ Islemde
+OPER_CACHE_NORMAL
+ Normal
+OPER_CACHE_WINGATE
+ Wingate
+OPER_CACHE_SOCKS4
+ SOCKS 4
+OPER_CACHE_SOCKS5
+ SOCKS 5
+OPER_CACHE_HTTP
+ HTTP proxy
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ON
+ You are now a SuperAdmin
+OPER_SUPER_ADMIN_OFF
+ You are no longer a SuperAdmin
+OPER_SUPER_ADMIN_SYNTAX
+ Setting for SuperAdmin must be ON or OFF.
+OPER_SUPER_ADMIN_WALL_ON
+ %s is now a Super-Admin
+OPER_SUPER_ADMIN_WALL_OFF
+ %s is no longer a Super-Admin
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_SUPER_ADMIN_ONLY
+ Only Super-Admins can use this command.
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_STAFF_LIST_HEADER
+ On Level Nick
+
+# DefCon Messages
+
+OPER_STAFF_FORMAT
+ %c %s %s
+OPER_STAFF_AFORMAT
+ %c %s %s [%s]
+
+# DefCon Messages
+
+OPER_DEFCON_SYNTAX
+ Syntax: DEFCON [1|2|3|4|5]
+OPER_DEFCON_DENIED
+ This service is temporarly disabled, please try again later
+OPER_DEFCON_NO_CONF
+ The Defcon system must be enabled in the services.conf file
+OPER_DEFCON_CHANGED
+ Services are now at DEFCON %d
+OPER_DEFCON_WALL
+ %s Changed the DEFCON level to %d
+DEFCON_GLOBAL
+ The Defcon Level is now at Level: %d
+
+# Modules strings
+
+OPER_MODULE_LOADED
+ Module %s loaded
+OPER_MODULE_UNLOADED
+ Module %s unloaded
+OPER_MODULE_LOAD_FAIL
+ Unable to load module %s
+OPER_MODULE_REMOVE_FAIL
+ Unable to remove module %s
+OPER_MODULE_LOAD_SYNTAX
+ MODLOAD FileName
+OPER_MODULE_UNLOAD_SYNTAX
+ MODUNLOAD FileName
+OPER_MODULE_LIST
+ Module: %s
+OPER_MODULE_INFO_LIST
+ Module: %s Version: %s Author: %s loaded: %s
+OPER_MODULE_CMD_LIST
+ Providing command: /msg %s %s
+OPER_MODULE_MSG_LIST
+ Providing IRCD handler for: %s
+OPER_MODULE_NO_LIST
+ No modules currently loaded
+OPER_MODULE_NO_INFO
+ No information about module %s is available
+OPER_MODULE_INFO_SYNTAX
+ MODINFO FileName
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+MODULE_HELP_HEADER
+ The following commands have been loaded by a module:
+
+###########################################################################
+#
+# Session Limiting and Exception messages
+#
+###########################################################################
+
+# EXCEPTION responses
+OPER_EXCEPTION_SYNTAX
+ EXCEPTION {ADD | DEL | MOVE | LIST | VIEW} [parametreler]
+OPER_EXCEPTION_ADD_SYNTAX
+ EXCEPTION ADD [+zamanaþýmý] mask limit sebep
+OPER_EXCEPTION_DEL_SYNTAX
+ EXCEPTION DEL {mask | liste}
+OPER_EXCEPTION_MOVE_SYNTAX
+ EXCEPTION MOVE num pozisyon
+OPER_EXCEPTION_DISABLED
+ Session limit koyma devre dýþý.
+OPER_EXCEPTION_ALREADY_PRESENT
+ Mask %s zaten exception listesinde bulunuyor.
+OPER_EXCEPTION_TOO_MANY
+ Session-limit exception listesi dolu!
+OPER_EXCEPTION_ADDED
+ %s için session limit %d olarak deðiþtirildi.
+OPER_EXCEPTION_MOVED
+ %s (#%d) için exception %d pozisyonuyla deðiþtirildi.
+OPER_EXCEPTION_NO_SUCH_ENTRY
+ (#%d) böyle bir kayýt yok. session-limit exception listesi.
+OPER_EXCEPTION_NOT_FOUND
+ %s session-limit exception listesinde bulunamadý.
+OPER_EXCEPTION_NO_MATCH
+ session-limit exception listesinde uyuþan kayýt bulunamadý.
+OPER_EXCEPTION_DELETED
+ %s session-limit exception listesinden silindi.
+OPER_EXCEPTION_DELETED_ONE
+ Session-limit exception listesinden 1 kayýt silindi.
+OPER_EXCEPTION_DELETED_SEVERAL
+ Session-limit exception listesinden %d kayýt silindi.
+OPER_EXCEPTION_LIST_HEADER
+ Þu anki Session Limit Exception listesi:
+# mask, limit
+OPER_EXCEPTION_LIST_FORMAT
+ %3d %4d %s
+OPER_EXCEPTION_LIST_COLHEAD
+ Sayý Limit Host
+# mask, set-by, set-time, expires, limit, reason
+OPER_EXCEPTION_VIEW_FORMAT
+ %3d. %s (by %s on %s; %s)
+ Limit: %-4d - %s
+OPER_EXCEPTION_INVALID_LIMIT
+ Geçersiz session limiti. Sýfýrdan büyük yada eþit ve %d den az bir geçerli tamsayý olmalýdýr.
+OPER_EXCEPTION_INVALID_HOSTMASK
+ Geçersiz hostmask. Sadece gerçek hostmasklar exception olarak geçerlidir.
+
+# SESSION responses
+OPER_SESSION_SYNTAX
+ SESSION {LIST limit | VIEW host}
+OPER_SESSION_LIST_SYNTAX
+ SESSION LIST limit
+OPER_SESSION_VIEW_SYNTAX
+ SESSION VIEW host
+OPER_SESSION_DISABLED
+ Session limit koyma devre dýþý.
+OPER_SESSION_INVALID_THRESHOLD
+ Geçersiz threshold deðeri. 1 den büyük geçerli tamsayý olmalýdýr.
+OPER_SESSION_NOT_FOUND
+ %s session listesinde bulunamadý.
+OPER_SESSION_LIST_HEADER
+ En az %d sessionlý hostlar:
+OPER_SESSION_LIST_COLHEAD
+ Sessionlar Host
+# limit, host
+OPER_SESSION_LIST_FORMAT
+ %6d %s
+# host, sessions, limit
+OPER_SESSION_VIEW_FORMAT
+ Host %s þu anda %d session a sahip ve %d ile limitli.
+
+# EXCEPTION help
+
+OPER_HELP_EXCEPTION
+ Kullanýmý: EXCEPTION ADD [+zamanaþýmý] mask limit sebep
+ EXCEPTION DEL {mask | liste}
+ EXCEPTION MOVE num pozisyon
+ EXCEPTION LIST [mask | liste]
+ EXCEPTION VIEW [mask | liste]
+
+ Servis adminlerinin, belirli oturum limiti olan hostlarýn
+ listesini deðiþtirmesini saðlar. Shell server gibi bazý
+ makinalarýn varsayýlandan daha fazla kullanýcýyý ayný anda
+ taþýmasýný saðlar. Eðer bir host session(oturum) limitine
+ ulaþmýþsa o hosttan baðlanmaya çalýþan tüm kullanýcýlar
+ kill lenir. Kill lenmeden önce, %S'ün /NOTICE i ile
+ uyarýlarak session limiti hakkýnda yardým verilir. Bu uyarýnýn
+ içeriði ayar yapmayla ilgilidir.
+
+ EXCEPTION ADD exception(istisna) listesine belirtilen hostmaský
+ ekler. nick!user@host ve user@host masklarýnýn geçersiz
+ olduðunu unutmayýn! Sadece box.host.dom ve *.host.dom gibi
+ gerçek hostmasklar kullanýlabilinir, çünkü session limitleme
+ nickleri ve username leri hesaba almaz. limit sýfýrdan büyük
+ yada eþit bir rakam olmalýdýr. Bu o host un ayný anda kaç oturum
+ (session) kaldýrabileceðini belirler. Sýfýr deðeri o host un
+ sýnýrsýz oturum limiti olduðunu belirtir. Opsiyonel zamanaþýmý
+ parametresinin formatý ile ilgili yardým için AKILL in
+ yardýmýna bakýnýz.
+ EXCEPTION DEL listesinden belirtilen mask ý çýkarýr.
+ EXCEPTION MOVE exception numarasýný(num) pozisyona (position)
+ çevirir. Aralarýndaki exceptionlarýn yeri aralýðý doldurmak için
+ yukarý yada aþþaðý deðiþtirilecektir.
+ EXCEPTION LIST ve EXCEPTION VIEW tüm mevcut exceptionlarý
+ gösterir; eðer opsiyonel olarak mask belirtilmiþse, liste
+ bu masklarla uyuþan exceptionlarla sýnýrlandýrýlýr. Aradaki fark
+ EXCEPTION VIEW daha gelismis bir komuttur ve exception ý ekleyenin
+ nickini, o exceptionýn session limitini, sebebi, host maský ve zaman
+ aþýmý tarih ve zamanýný gösterir.
+
+ Baðlanan kullanýcý, hostuyla uyuþan ilk exceptioný kullanýr. Büyük
+ exception listeleri ve geniþ olarak uyuþan exception masklarý
+ servislerin performansýný düþürür.
+
+ Servis adminleri tarafýndan kullanýlabilir.
+
+OPER_HELP_SESSION
+ Kullanýmý: SESSION LIST threshold
+ SESSION VIEW host
+
+ Servis adminlerinin session listesini görüntülemesini saðlar.
+
+ SESSION LIST en az threshold sessionlardaki hostlarý listeler.
+ Threshold(eþik) 1 den büyük bir sayý olmalýdýr. Bu büyük
+ ölçüdeki tek session hostlarýn yanlýþlýkla listelenmelerini
+ önlemek içindir.
+ SESSION VIEW belirli bir host hakkýnda ayrýntýlý bilgileri
+ görüntüler. Bu o anki session sayýsýný ve session limitinide
+ gösterir. host deðeri wildcard(açýk olarak yazýlmalýdýr)
+ içermemelidir.
+
+ Session limitleme ve belirli hostlara ve gruplara nasýl session
+ limit koyulacaðý hakkýnda yardým için EXCEPTION yardýmýna bakýn.
+
+ Servis adminleri tarafýndan kullanýlabilir.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_STAFF
+ Syntax: STAFF
+
+ Displays all Services Staff nicks along with level
+ and on-line status.
+
+OPER_HELP_DEFCON
+ Syntax: DEFCON [1|2|3|4|5]
+
+ The defcon system can be used to implement a pre-defined
+ set of restrictions to services useful during an attemtped
+ attack on the network.
+
+OPER_HELP_DEFCON_NO_NEW_CHANNELS
+ * No new channel registrations
+OPER_HELP_DEFCON_NO_NEW_NICKS
+ * No new nick registrations
+OPER_HELP_DEFCON_NO_MLOCK_CHANGE
+ * No MLOCK changes
+OPER_HELP_DEFCON_FORCE_CHAN_MODES
+ * Force Chan Modes (%s) to be set on all channels
+OPER_HELP_DEFCON_REDUCE_SESSION
+ * Use the reduced session limit of %d
+OPER_HELP_DEFCON_NO_NEW_CLIENTS
+ * Kill any NEW clients connecting
+OPER_HELP_DEFCON_OPER_ONLY
+ * Ignore any non-opers with message
+OPER_HELP_DEFCON_SILENT_OPER_ONLY
+ * Silently ignore non-opers
+OPER_HELP_DEFCON_AKILL_NEW_CLIENTS
+ * AKILL any new clients connecting
+
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+OPER_HELP_DEFCON_NO_NEW_MEMOS
+ * No new memos sent
+OPER_HELP_CHANKILL
+ Syntax: CHANKILL [+expiry] channel reason
+
+ Puts an AKILL for every nick on the specified channel. It
+ uses the entire and complete real ident@host for every nick,
+ then enforces the AKILL.
+
+###########################################################################
+#
+# News system messages
+#
+###########################################################################
+
+NEWS_LOGON_TEXT
+ [Baðlantý Haberleri - %s] %s
+NEWS_OPER_TEXT
+ [Operatör Haberleri - %s] %s
+NEWS_RANDOM_TEXT
+ [Karisik Haberler - %s] %s
+
+NEWS_LOGON_SYNTAX
+ Kullanýmý: LOGONNEWS {ADD|DEL|LIST} [yazý|num]
+NEWS_LOGON_LIST_HEADER
+ Baðlantý haberleri:
+NEWS_LOGON_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_LOGON_LIST_NONE
+ Hiç baðlantý haberi yok.
+NEWS_LOGON_ADD_SYNTAX
+ Kullanýmý: LOGONNEWS ADD yazý
+NEWS_LOGON_ADD_FULL
+ Haber listesi dolu!
+NEWS_LOGON_ADDED
+ Yeni baðlantý haberleri maddesi eklendi (#%d).
+NEWS_LOGON_DEL_SYNTAX
+ Kullanýmý: LOGONNEWS DEL {num | ALL}
+NEWS_LOGON_DEL_NOT_FOUND
+ Baðlantý haberleri maddesi #%d bulunamadý!
+NEWS_LOGON_DELETED
+ Baðlantý haberleri maddesi #%d silindi.
+NEWS_LOGON_DEL_NONE
+ Silebileceðiniz baðlantý haberleri maddesi yok!
+NEWS_LOGON_DELETED_ALL
+ Tüm baðlantý haberleri silindi.
+
+NEWS_OPER_SYNTAX
+ Kullanýmý: OPERNEWS {ADD|DEL|LIST} [yazý|num]
+NEWS_OPER_LIST_HEADER
+ Operatör haberleri:
+NEWS_OPER_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_OPER_LIST_NONE
+ Hiç operatör haberi yok.
+NEWS_OPER_ADD_SYNTAX
+ Kullanýmý: OPERNEWS ADD yazý
+NEWS_OPER_ADD_FULL
+ Haber listesi dolu!
+NEWS_OPER_ADDED
+ Yeni operatör haberleri maddesi eklendi (#%d).
+NEWS_OPER_DEL_SYNTAX
+ Kullanýmý: OPERNEWS DEL {num | ALL}
+NEWS_OPER_DEL_NOT_FOUND
+ Operatör haberleri maddesi #%d bulunamadý!
+NEWS_OPER_DELETED
+ Operatör haberleri maddesi #%d silindi.
+NEWS_OPER_DEL_NONE
+ Silebileceðiniz operatör haberleri maddesi yok!
+NEWS_OPER_DELETED_ALL
+ Tüm operatör haberleri maddeleri silindi.
+
+NEWS_RANDOM_SYNTAX
+ Kullanýmý: RANDOMNEWS {ADD|DEL|LIST} [yazi|no]
+NEWS_RANDOM_LIST_HEADER
+ Karisik haberler:
+NEWS_RANDOM_LIST_ENTRY
+ %5d (%s by %s)
+ %s
+NEWS_RANDOM_LIST_NONE
+ Hiç karisik haber yok.
+NEWS_RANDOM_ADD_SYNTAX
+ Kullanýmý: RANDOMNEWS ADD yazi
+NEWS_RANDOM_ADD_FULL
+ Haber listesi dolu!
+NEWS_RANDOM_ADDED
+ Yeni karisik haber eklendi (#%d).
+NEWS_RANDOM_DEL_SYNTAX
+ Kullanýmý: RANDOMNEWS DEL {no | ALL}
+NEWS_RANDOM_DEL_NOT_FOUND
+ #%d numarali karisik haber bulunamadi!
+NEWS_RANDOM_DELETED
+ #%d numarali karisik haber silindi.
+NEWS_RANDOM_DEL_NONE
+ Silinecek karisik haber yok!
+NEWS_RANDOM_DELETED_ALL
+ Tüm karisik haberler silindi.
+
+NEWS_HELP_LOGON
+ Kullanýmý: LOGONNEWS ADD text
+ LOGONNEWS DEL {num | ALL}
+ LOGONNEWS LIST
+
+ Baðlantý haberleri listesini deðiþtirmeye ve görüntülemeye
+ yarar. Bir kullanýcý network e baðlandýðý zaman bu haberler
+ onlara gönderilir.(Fakat üçten fazla mesaj kullanýcýyý
+ floodlamamak için gönderilmez. Eðer üçten fazla haber varsa
+ bunlardan en güncel olan üç tanesi gönderilir.)
+
+ BAÐLANTI HABERLERÝ LÝSTESÝ(LOGONNEWS LIST) herhangi bir IRCop
+ tarafýndan görüntülenebilir. ADD ve DEL komutlarý sadece servis
+ adminleri tarafýndan kullanýlýr.
+
+NEWS_HELP_OPER
+ Kullanýmý: OPERNEWS ADD yazý
+ OPERNEWS DEL {num | ALL}
+ OPERNEWS LIST
+
+ Operatör haberlerinin listesini deðiþtirmeye ve görüntülemeye
+ yarar. Bir kullanýcý oper olduðu zaman (/OPER komutuyla), bu
+ haberler ona gönderilir. (Fakat üçten fazla mesaj kullanýcýyý
+ floodlamamak için gönderilmez. Eðer üçten fazla mesaj varsa
+ en güncel olan üç tanesi göderilir.)
+
+ OPERATÖR HABERLERÝ LÝSTESÝ(OPERNEWS LIST) herhangi bir IRCop
+ tarafýndan görüntülenebilir. ADD ve DEL komutlarý sadece
+ Servis adminleri tarafýndan kullanýlýr.
+
+NEWS_HELP_RANDOM
+ Kullanimi: RANDOMNEWS ADD yazi
+ RANDOMNEWS DEL {no | ALL}
+ RANDOMNEWS LIST
+
+ Karisik haberleri düzenlemenizi saglar. Bir kullanici
+ network e baglandigi zaman, karisik haberlerden bir tanesi
+ seçilerek kullaniciya gönderilir.
+
+ RANDOMNEWS LIST herhangi bir IRC operatörü tarafindan
+ haberleri listelemek için kullanilabilir. ADD ve DEL
+ komutlarini sadece Servis adminlerinin kullanabilir.
+
+###########################################################################
+#
+# HelpServ help message
+#
+###########################################################################
+
+HELP_HELP
+ %S servisler hakkýnda bilgi vermek için tasarlanmýþtýr.
+ Yardým konularýna diðer servislerin HELP komutuyla ulaþýlýr.
+
+ /msg %s HELP
+ nick kayýt hakkýnda bilgiler içerir.
+
+ /msg %s HELP
+ kanal kayýdý ve kontrolü hakkýnda bilgi içerir.
+
+ /msg %s HELP
+ kullanýcýlara internette olmasalar bile mesaj göndermek
+ için gerekli bilgileri içerir.
+
+HELP_HELP_BOT
+
+ /msg %s HELP
+ kanallara bot sokulmasý ve ayarlarý hakkýnda bilgi içerir.
+
+HELP_HELP_HOST
+
+ /msg %s HELP
+ for information on setting up nick vHosts
+
+###########################################################################
+#
+# NickServ help messages
+#
+###########################################################################
+
+NICK_HELP
+ %S nickinizi "kayýt" etmenizi ve diðerlerinin nickinizi
+ kullanmalarýný engellemeyi saðlar. Aþaðýdaki komutlar nicki
+ kayýt etmeye ve korumaya izin verir, kullanmak için,
+ /msg %S komut yazýn. Belirli bir komut hakkýnda daha
+ fazla bilgi için, /msg %S HELP komut yazýn.
+
+ REGISTER Nickinizi kaydeder
+ GROUP Bir gruba dahil eder
+ IDENTIFY Þifrenizle nickinizi tanýtýr
+ ACCESS Ýzinli adreslerin listesini düzenler
+ SET Ayarlar, kill korumasýný içerir
+ DROP Nickin kaydýný siler
+ RECOVER Nickinizi kullanan birini kill ler
+ RELEASE RECOVER komutundan sonra nickinizi serbest
+ býrakýr
+ SENDPASS Þifrenizimi unuttunuz? Bunu deneyin
+
+ Diðer komutlar: GHOST, GLIST, INFO, LIST, LOGOUT, STATUS
+
+ NOT: Bu servis kullanýcýlarýn kimliklerini tehlikeye
+ atmayacak þekilde tasarlanmýþtýr. Bu nickleri "çalmayý"
+ veya diðer kötü niyetli hareketleri kolaylaþtýrmayý saðlama
+ amaçlý deðildir. %S 'ün kötüye Kullanýmý kötüye
+ kullanýlan kiþinin nickini kaybetmesiyle sonuçlanacaktýr.
+
+NICK_HELP_EXPIRES
+
+ Daha fazla kullanýlmayan nicklerin otomatik olarak
+ kaydýnýn silinmesi söz konusudur, mesela kullanýlmayan
+ nickler %d gün sonra silinirler.
+
+NICK_HELP_REGISTER
+ Kullanýmý: REGISTER þifre [email]
+
+ %S 'ün veritabanýna nickinizi kaydeder. Nickinizi
+ bir kere kayýt ettikten sonra nickinizin özelliklerini
+ istediðiniz gibi belirlemek için SET ve ACCESS
+ komutlarýný kullanabilirsiniz. Kayýtta kullandýðýnýz þifrenin
+ hatýrlanabilecek birþey olmasýna dikkat edin - ilerde
+ nickinizin özelliklerinde deðiþiklik yaparken ve sunucuda
+ kullanabilmek için ihtiyacýnýz olacak. (Þifrelerin büyük
+ küçük harf hassasiyeti olduðunu unutmayýn! ÝXÝR, Ýxir,
+ ve ixir þifreleri birbirinden farklýdýr.)
+
+ Þifreleri seçme konusunda rehber:
+
+ Þifreler kolayca tahmin edilebilir olmamalýdýr. Örneðin,
+ gerçek isminizi þifre olarak kullanmak kötü bir fikirdir.
+ Nickinizi þifre olarak kullanmak daha kötü bir fikirdir :)
+ ve zaten %S buna izin vermez. Ayrýca kýsa þifreler
+ deneme yanýlma yöntemiyle bulunabilirler, bu yüzden þifrenizin
+ en az 5 karakter olmasýna dikkat edin. Son olarak þifrede
+ boþluk kullanmamanýz gerekir.
+
+ email parametresi opsiyoneldir ve nickiniz için bir
+ email adresi belirler. Fakat bazý networklerde bu
+ parametrenin kullanýlmasý zorunlu olabilir.(Unutmayýn
+ email adresinizi doðru olarak vermeniz ilerde þifrenizi
+ unutmanýz halinde çok iþe yarayacaktýr)
+ Gizliliðinize saygý duyulacak ve mail adresiniz herhangi
+ üçüncü þahýslara söylenmeyecektir.
+
+ Bu komut ayrýca nickiniz için yeni bir grup oluþturur ki bu
+ ilerde gruba kaydedeceðiniz nickler için ayný özellikleri,
+ memo ayarlarýný ve ayný kanal ayrýcalýklarýný paylaþmanýzý
+ saðlar. Bu özellik hakkýnda daha fazla bilgi için,
+ /msg %S HELP GROUP yazýn.
+
+
+NICK_HELP_GROUP
+ Kullanýmý: GROUP hedef þifre
+
+ Bu komut nickinizin hedef gösterilen nickin grubuna katýlmasýný
+ saðlar. þifre hedef gösterilen nickin þifresidir.
+
+ Bir gruba dahil olmak size o gruba dahil olan tüm nicklerinizin
+ ayarlarýný, memolarýný, ve kanal ayrýcalýklarýný paylaþmanýzý ve
+ daha fazlasýný saðlar!
+
+ Bir grup kullanýþlý olduðu sürece kalýcýdýr. Bu demektirki eðer
+ gruba dahil nickleriniz kaydýný silerseniz, grupta en az bir nick
+ kalmasý kaydiyle yukarda açýklanan paylaþýmlarý kaybetmezseniz.
+
+ Bu komutu nickinizi kaydetmemiþ olsanýz bile kullanabilirsiniz.
+ Eðer nickiniz zaten kayýtlý ise, bu komutu kullanmadan önce
+ nickinizi tanýtmanýz gerekir, daha fazla bilgi için
+ /msg %S HELP IDENTIFY yazýn. Sizin IRC networkunuzda
+ bu mümkün olmayabilir.
+
+ Bu komutu kayýtlý olmayan bir nickle kullanmanýz önerilir çünkü
+ bu komutu kullanýcý o nick otomatik olarak kaydedilir. Bunu
+ kayýtlý bir nicklede eðer network adminleri buna izin veriyorsa
+ kullanabilirsiniz.
+
+ Bir seferde sadece bir grupta olabilirsiniz. Grup karýþtýrma
+ mümkün deðildir.
+
+ Not: bir gruptaki tüm nickler bir þifreye sahip olurlar.
+
+NICK_HELP_IDENTIFY
+ Kullanýmý: IDENTIFY þifreniz
+
+ %S 'e kullandýðýnýz nickin gerçek sahibinin siz olduðunu
+ belirtir. Çoðu komut kullanýlmadan önce bu komutla
+ tanýtýlmanýzý gerektirir. Þifreniz nickinizi kayýt ederken
+ REGISTER komutuyla beraber kullandýðýnýzla aynýdýr.
+
+NICK_HELP_UPDATE
+ Syntax: UPDATE
+
+ Updates your current status, i.e. it checks for new memos,
+ sets needed chanmodes (ModeonID) and updates your vhost and
+ your userflags (lastseentime, etc).
+
+NICK_HELP_LOGOUT
+ Kullanýmý: LOGOUT
+
+ IDENTIFY komutunun yaptýðý etkiyi tersine çevirir,
+ yani artýk o nickin gerçek sahibi olarak tanýnmamanýzý
+ saðlar. Fakat sizden nickinizi tekrar identify etmeniz
+ istenmez.
+
+NICK_HELP_DROP
+ Kullanýmý: DROP [nick]
+
+ %S 'ün veritabanýndan nickinizi siler. Silinmiþ bir nick
+ baþkasý tarafýndan kayýt edilebilir.
+
+ nick parametresini kullanarak belirttiðiniz nicki
+ grubunuzdan silebilirsiniz.
+
+ Bu komutu kullanmadan önce, þifrenizle kendinizi tanýtmanýz
+ gereklidir (Daha fazla bilgi için /msg %S HELP IDENTIFY
+ yazýn).
+
+NICK_HELP_ACCESS
+ Kullanýmý: ACCESS ADD mask
+ ACCESS DEL mask
+ ACCESS LIST
+
+ Nickinizin access litesini görüntüler ve deðiþiklikler
+ yapmanýzý saðlar. Bu listede belirtilen adresler %S
+ tarafýndan nickinizi kullanabilmek için otomatik olarak
+ tanýnacak adreslerdir. (böylece identify komutunu
+ kullanmanýza gerek kalmaz.) Eðer belirtilenden farklý bir
+ adresle baðlanmýþsanýz %S 'ün sizi tanýmasý için
+ IDENTIFY komutunu kullanmanýz gerekir.
+
+ Örnekler:
+
+ ACCESS ADD birisi@*.ixir.com
+ Kullanýcý birisi'ne ixir.com
+ domaininden herhangi bir makineden
+ eriþim saðlar.
+
+ ACCESS DEL birisi@*.ixir.com
+ Önceki komutun tersini yapar(siler).
+
+ ACCESS LIST
+ Mevcut access listesini görüntüler.
+
+NICK_HELP_SET
+ Kullanýmý: SET özellik parametre
+
+ Çeþitli nick özelliklerini ayarlar. özellik þunlardan biri
+ olabilir:
+
+ DISPLAY Grubunuzun servislerde nasýl görüneceðini ayarlar
+ PASSWORD Nickinize þifre belirtir
+ LANGUAGE Servislerin size hitap edeceði
+ dili belirler
+ URL Nickinizle bir URL yi iliþkilendirir
+ EMAIL Nickinizle bir email adresini iliþkilendirir
+ ICQ Nickinizle bir ICQ numarasýný iliþikilendirir
+ GREET Nickiniz için bir karþýlama mesajý belirler
+ KILL Korumayý açar kapatýr
+ SECURE Nick güvenliðini açar kapatýr
+ PRIVATE Nickinizin /msg %S LIST yazýldýðýnda görünmesini
+ engeller
+ HIDE Nickinizle ilgili bazý bilgileri saklar
+
+ Bu komutu kullanabilmek için önce, þifrenizle
+ kendinizi tanýtmanýz gerekir (Daha fazla bilgi için
+ /msg %S HELP IDENTIFY yazýn).
+
+ Belirli bir özellik(option) hakkýnda bilgi almak için
+ /msg %S HELP SET option yazýn.
+
+NICK_HELP_SET_DISPLAY
+ Kullanýmý: SET DISPLAY yeni-görünüm
+
+ Servislerde grubunuzdaki nicklerden hangisinin gözükeceðini
+ ayarlar. Yeni görünüm grubunuzda bulunan nicklerden biri
+ olmalýdýr.
+
+NICK_HELP_SET_PASSWORD
+ Kullanýmý: SET PASSWORD yeni þifre
+
+ Nickinizi tanýtmak için kullandýðýnýz þifreyi
+ deðiþtirir.
+
+NICK_HELP_SET_LANGUAGE
+ Kullanýmý: SET LANGUAGE numara
+
+ Servislerin size hitap edeceði dili belirlemenizi saðlar.
+ (örneðin, bir komut yazdýðýnýzda gelecek cevabýn dili gibi).
+ numara aþaðýdaki listede desteklenen dillerden biri olarak
+ belirlenir:
+
+NICK_HELP_SET_URL
+ Kullanýmý: SET URL url
+
+ Nickiniz için bir URL adresi belirtir. Bu URL adresi birisi
+ sizin hakkýnýzda bilgi almak için INFO komutunu
+ kullandýðýnda görünür.
+
+NICK_HELP_SET_EMAIL
+ Kullanýmý: SET EMAIL email adresiniz
+
+ Nickiniz için bir email adresi belirtir. Bu email adresi
+ birisi sizin hakkýnýzda bilgi almak için INFO komutunu
+ kullandýðýnda görünür.
+
+NICK_HELP_SET_ICQ
+ Kullanýmý: SET ICQ icqnumaranýz
+
+ Nickiniz için bir ICQ numarasý belirtir. Bu ICQ numarasý
+ birisi sizin hakkýnýzda bilgi almak için INFO komutunu
+ kullandýðýnda görünür.
+
+NICK_HELP_SET_GREET
+ Kullanýmý: SET GREET mesaj
+
+ Yazdýðýnýz mesajý nickinizin karþýlama mesajý olarak
+ belirler, bu mesaj GREET özelliði aktif bir kanala
+ girdiðinizde gönderilir, kanaldaki access seviyenize
+ baðlýdýr.
+
+NICK_HELP_SET_KILL
+ Kullanýmý: SET KILL {ON | QUICK | IMMED | OFF}
+
+ Nickiniz için otomatik koruma özelliðini açar ve kapatýr.
+ Koruma açýkken eðer bir baþkasý sizin nickinizi kullanmaya
+ kalkarsa, o kiþiye nicki deðiþtirmesi için bir dakika süre
+ verilir, eðer deðiþtirmezse %S tarafýndan otomatik olarak
+ deðiþtirilir.
+
+ Eðer QUICK parametresini seçerseniz, kullanýcýya nickini
+ deðiþtirmesi için 60 saniye yerine sadece 20 saniye verilir.
+ Eðer IMMED parametresini seçerseniz kullanýcýnýn nicki
+ uyarýlmadan hemen deðiþtirilir; lütfen çok gerekmedikçe
+ bu özelliði kullanmayýn. Hatta network yöneticileri bu
+ özelliði devre dýþý býrakmýþ olabilirler.
+
+NICK_HELP_SET_SECURE
+ Kullanýmý: SET SECURE {ON | OFF}
+
+ %S'ün güvenlik özelliklerini açar ve kapatýr. SECURE
+ ayarý ile, nickin sahibi olarak tanýnmanýz için önce þifreyle
+ kendinizi tanýtmanýz gerekir(adresinizin nickin access
+ listesinde olup olmamasýna baðlý olarak). Fakat, eðer
+ adresiniz nickin access listesindeyse KILL özelliði
+ kullanýlmýþ olsa bile %S sizi otomatik olarak kill
+ lemeyecektir.
+
+NICK_HELP_SET_PRIVATE
+ Kullanýmý: SET PRIVATE {ON | OFF}
+
+ %S'ün özel nick özelliðini açar kapatýr. PRIVATE ayarý
+ ile, %S'ün LIST komutu kullanýldýðýnda nickiniz listede
+ gözükmeyecektir.(Buna raðmen, nickinizi bilen biri INFO
+ komutunu kullanarak hakkýnýzda bilgi alabilir.)
+
+NICK_HELP_SET_HIDE
+ Kullanýmý: SET HIDE {EMAIL | USERMASK | QUIT} {ON | OFF}
+
+ Birisi hakkýnýzda bilgi almak için %S INFO komutunu
+ kullandýðýnda bazý bilgilerin burada gözükmemesini saðlar.
+ E-mail adresinizi (EMAIL), son göründüðünüz user@host
+ maskýný (USERMASK), ve son çýkýþ mesajýnýzý (QUIT)
+ saklayabilirsiniz. Ýkinici parametre bilginin görünüp (OFF)
+ görünmeyeceðini (ON) belirtmenizi saðlar.
+
+NICK_HELP_SET_MSG
+ Syntax: SET MSG {ON | OFF}
+
+ Allows you to choose the way Services are communicating with
+ you. With MSG set, Services will use messages, else they'll
+ use notices.
+
+NICK_HELP_RECOVER
+ Kullanýmý: RECOVER nick [þifre]
+
+ Eðer birisi nickinizi kullanýyorsa ondan nicki geri almanýzý
+ saðlar; bu komut kill korumasý olan bir nicke %S'ün
+ yaptýðýnýn aynýsýný yapar.
+
+ Bu komutu kullandýðýnýzda, %S o nicke sahip sahte bir
+ kullanýcýyý servera sokar. Bu diðer kullanýcýnýn serverdan
+ kopmasýna neden olur. Bu sahte kullanýcý bir dakika kadar
+ hatta kalýr ve diðer kullanýcýnýn tekrar o nickle baðlanmasýna
+ engel olur. Bir dakikadan sonra nickinizi geri alabilirsiniz.
+ Bir dakikadan önce nickinizi geri almak için RELEASE komutunu
+ (/msg %S HELP RELEASE) kullanabilirsiniz.
+
+ RECOVER komutunu bir nick üzerinde kullanabilmek için o an
+ /WHOIS inizdeki adresin o nickin access listesinde olmasý, o
+ nickin grubundaki baþka bir nickin tanýtýlmýþ olmasý yada o
+ nick için doðru þifenin belirtilmiþ olmasý gerekir.
+
+NICK_HELP_RELEASE
+ Kullanýmý: RELEASE nick [þifre]
+
+ Otomatik kill korumasý veya RECOVER komutunun kullanýlmasýndan
+ kaynaklanan nickin %S tarafýndan tutulmasý durumunda nicki
+ serbest býrakmak için kullanýlýr. Varsayýlan olarak, nick tutma
+ olayý bir dakika sonunda sona erer. Bu komut bunun bir dakikadan
+ önce olmasýný saðlar.
+
+ RELEASE komutunu bir nick üzerinde kullanabilmek için o an
+ /WHOIS inizdeki adresin o nickin access listesinde olmasý, o
+ nickin grubundaki baþka bir nickin tanýtýlmýþ olmasý yada o
+ nick için doðru þifenin belirtilmiþ olmasý gerekir.
+
+NICK_HELP_GHOST
+ Kullanýmý: GHOST nick [þifre]
+
+ Asýlý kalan nickinizin baðlantýsýný koparýr. Asýlý kalan nick
+ aslýnda hayalet nicktir fakat IRC serverý bunun hala hatta
+ olduðunu sanar. Genellikle bu durum bilgisayarýnýzýn çökmesi
+ yada modem baðlantýnýzýn serverdayken kopmasý durumunda
+ gerçekleþir.
+
+ GHOST komutunu bir nick üzerinde kullanabilmek için o an
+ /WHOIS inizdeki adresin o nickin access listesinde olmasý,
+ o nick için doðru þifrenin belirtilmiþ olmasý yada o nickin
+ grubundaki baþka bir nickin tanýtýlmýþ olmasý gerekir.
+
+NICK_HELP_INFO
+ Kullanýmý: INFO nick [ALL]
+
+ Belirtilen nick hakkýnda o nickin sahibi, son görüldüðü adres ve
+ zaman, ve nickin özellikleri gibi bilgiler verir. Eðer nick
+ hakkýnda bilgi alýrken o nickin sahibi sizseniz ve tanýtmýþsanýz
+ ALL parametresini kullandýðýnýzda bilgiler gizli olsa bile o
+ nick hakkýndaki tüm bilgiler görünür.
+
+NICK_HELP_LIST
+ Kullanýmý: LIST model
+
+ nick!user@host formatýnda, belirtilen modeli içeren
+ tüm kayýtlý nickleri listeler. PRIVATE özelliði aktif olan
+ nickler listelenmez.
+
+ Örnekler:
+
+ LIST *!aliuser@ixir.com
+ identi aliuser@ixir.com olan tüm kayýtlý nickleri
+ listeler.
+
+ LIST *Bot*!*@*
+ Bot kelimesini içeren tüm kayýtlý nickleri listeler.
+ (büyük küçük harf hassasiyeti vardýr.)
+
+ LIST *!*@*.ixir.com
+ ixir.com domainine sahip tüm kayýtlý nickleri listeler.
+
+NICK_HELP_ALIST
+ Syntax: ALIST [level]
+
+ Lists all channels you have access on. Optionally, you can specify
+ a level in XOP or ACCESS format. The resulting list will only
+ include channels where you have the given level of access.
+
+ Examples:
+ ALIST Founder
+ Lists all channels where you have Founder
+ access.
+
+ ALIST AOP
+ Lists all channels where you have AOP access
+ or greater.
+
+ ALIST 10
+ Lists all channels where you have level 10
+ access or greater.
+
+ Channels that have the NOEXPIRE option set will be prefixed by
+ an exclamation mark.
+
+NICK_HELP_GLIST
+ Syntax: GLIST
+
+ Lists all nicks in your group.
+
+NICK_HELP_STATUS
+ Kullanýmý: STATUS nick...
+
+ Nickin kullanýcý tarafýndan nickin sahibi olarak tanýtýlýp
+ tanýtýlmadýðýný gösterir. Cevap þu formattadýr:
+
+ nick durum-kodu
+
+ nick komutta yazýlan nick, ve durum-kodu da
+ aþaðýdakilerden biridir:
+
+ 0 - Böyle bir kullanýcý baðlý deðil veya nick
+ kayýtlý deðil
+ 1 - Kullanýcý nickin sahibi olarak tanýtýlmamýþ
+ 2 - Kullanýcý nickin sahibi olarak access listesinden
+ tanýtýlmýþ
+ 3 - Kullanýcý nickin sahibi olarak þifreyle tanýtýlmýþ
+
+ Her komutta en fazla 16 nick için cevap verilir; gerisi
+ yoksayýlýr. Eðer bir nick belirtilmemiþse cevap olarak bir
+ hata mesajý gelmez.
+
+NICK_HELP_SENDPASS
+ Kullanýmý: SENDPASS nick
+
+ Belirtilen nickin þifresini nickin kayýtlarýnda belirtilmiþ
+ email adresine gönderir.
+
+ Bazý networklerde sadece IRC operatörleri kullanabilir.
+
+ Eðer þifreleme(encryption) aktifse bu komut devre dýþý kalýr.
+
+NICK_SERVADMIN_HELP
+
+ Aþaðýdaki komutlarý Servis adminleri kullanabilir:
+
+ GETPASS Bir nickin þifresini öðrenmek içindir
+ (Sadece þifreleme(encryption) devre dýþýysa)
+ FORBID Bir nickin kullanýlmasýný yasaklar
+
+ Servis adminleri herhangi bir nickin tanýtmasýna gerek olmadan
+ kaydýný silebilir(drop) ve herhangi bir nickin access listesini
+ görüntüleyebilir. (/msg %S ACCESS LIST nick).
+
+NICK_SERVADMIN_HELP_LOGOUT
+ Kullanýmý: LOGOUT [nick [REVALIDATE]]
+
+ Parametre kullanýlmazsa, IDENTIFY komutunun yaptýðý
+ etkiyi tersine çevirir, yani artýk o nickin gerçek sahibi
+ olarak tanýnmamanýzý saðlar. Fakat sizden nickinizi tekrar
+ identify etmeniz istenmez.
+
+ Parametre kullanýlýrsada aynýsýný yapar ama buna ek olarak
+ REVALIDATE belirtilirse servisler o kiþiye nickini yeniden
+ identify etmesini söyler. Servis adminlerinin Kullanýmýyla
+ sýnýrlýdýr.
+
+NICK_SERVADMIN_HELP_DROP
+ Kullanýmý: DROP [nick]
+
+ Parametreye gerek olmadan, %S veritabanýndan nickinizi siler.
+
+ Parametreyle, belirtilen bir nicki veritabanýndan siler.
+ Grubunuzda bulunan herhangi bir nicki özel ayrýcalýklara
+ gerek olmadan silebilirsiniz. Bu iþlemler Servis adminleri
+ tarafýndan yapýlabilir.
+
+NICK_SERVADMIN_HELP_SET
+
+ Servis adminleri ayrýca NOEXPIRE özelliðini ayarlayabilirler,
+ böylece hangi nicklerin zaman asimini uðrayýp kayýtlarýnýn
+ silinmeyeceðini belirlerler.
+ Ek olarak, Servis adminleri bu formatý kullanarak
+ SET nick özellik parametre herhangi bir nick için
+ þifre girmeden ayar yapabilirler.
+
+NICK_SERVADMIN_HELP_SET_NOEXPIRE
+ Kullanýmý: SET [nick] NOEXPIRE {ON | OFF}
+
+ Belirtilen nickin zaman asimina uðrayýp uðramayacaðýný belirler.
+ Bunu ON yapmak o nickin zaman asimina uðramasýný ve kaydýnýn
+ silinmesini engeller. Eðer bir nick belirtilmezse no-expire
+ parametresini komutu kullananýn nickine ayarlar.
+
+ Sadece Servis adminleri kullanabilir.
+
+NICK_SERVADMIN_HELP_INFO
+
+ Servis adminleri ALL parametresini herhangi bir nick için
+ kullanabilirler.
+
+NICK_SERVADMIN_HELP_LIST
+ Kullanýmý: LIST model [FORBIDDEN] [NOEXPIRE]
+
+ Belirtilen modele uyuþan tüm kayýtlý nickleri nick!user@host
+ formatýnda listeler. PRIVATE özellið aktif olan kullanýcýlar
+ sadece servis adminleri tarafýndan görüntülenir. NOEXPIRE
+ ayarý olan nicklerde servis adminleri için asýlý bir ! bulunur.
+
+ Eðer FORBIDDEN ve NOEXPIRE parametreleri verilmiþse, Sadece
+ yasaklanmýþ(forbidden) ve zaman asimi olmayan(noexpire)
+ nickler listelenir. Eðer iki parametrede verilmiþse iki tip
+ nicklerde listelenir. Bu özellikleri sadece Servis adminleri
+ kullanabilir.
+
+ Örnekler:
+
+ LIST *!aliuser@ixir.com
+ identi aliuser@ixir.com olan tüm kayýtlý nickler
+ listelenir.
+
+ LIST *Bot*!*@*
+ Ýsimlerinde Bot yazan tüm kayýtlý nickler listelenir
+ (küçük büyük harf hassasiyeti vardýr).
+
+ LIST * NOEXPIRE
+ Zaman asimi olmayan tüm kayýtlý nickler listelenir.
+
+NICK_SERVADMIN_HELP_ALIST
+ Syntax: ALIST [nickname] [level]
+
+ With no parameters, lists channels you have access on. With
+ one parameter, lists channels that nickname has access
+ on. With two parameters lists channels that nickname has
+ level access or greater on.
+
+ This use limited to Services admins.
+
+NICK_SERVADMIN_HELP_GLIST
+ Syntax: GLIST [nickname]
+
+ Without a parameter, lists all nicknames that are in
+ your group.
+
+ With a parameter, lists all nicknames that are in the
+ group of the given nick.
+ This use limited to Services admins.
+
+NICK_SERVADMIN_HELP_GETPASS
+ Kullanýmý: GETPASS nick
+
+ Belirtilen nickin þifresini söyler. Unutmayýnki bu komutun
+ her kullanýlýþýnda , kullanýlan nick ve komutu kullanan
+ kiþi kaydedilerek WALLOPS/GLOBOPS olarak gönderilir.
+
+ Sadece Servis adminleri tarafýndan kullanýlýr.
+
+ (Bu komut þifreleme(encryption) aktif olduðu zaman devre dýþýdýr.)
+
+NICK_SERVADMIN_HELP_GETEMAIL
+ Syntax: GETEMAIL user@emailhost
+
+ Returns the matching nicks that used given email. Note that
+ you can not use wildcards for either user or emailhost. Whenever
+ this command is used, a message including the person who issued
+ the command and the email it was used on will be logged.
+
+ Limited to Services admins.
+
+NICK_SERVADMIN_HELP_FORBID
+ Kullanýmý: FORBID nick [sebep]
+
+ Belirtilen nickin kullanýlmasýný ve kayýt edilmesini engeller.
+ Nick drop edilerek iptal edilebilir.
+
+ Bazý networklerde, sebep yazýlmasý gereklidir.
+
+ Sadece Servis adminleri tarafýndan kullanýlýr.
+
+###########################################################################
+#
+# ChanServ help messages
+#
+###########################################################################
+
+CHAN_HELP
+ %S kanallarýnýzý kayýt etmenizi ve kontrol etmenizi
+ saðlar. %S kötü niyetli kullanýcýlarýn kanallarý ele
+ geçirmelerini(takeover), kanalda kimlerin op olacaðýný sizin
+ tarafýnýzdan beliryerek engeller. Mevcut komutlar aþaðýda
+ listelenmiþtir; onlarý kullanmak için /msg %S komut
+ yazýn. Belirli bir komut hakkýnda daha fazla bilgi için,
+ /msg %S HELP komut yazýn.
+
+ REGISTER Kanalý kaydeder
+ IDENTIFY Þifreyle sizi kanalýn sahibi olarak tanýmlar
+ SET Kanal özelliklerini ve bilgisini ayarlar
+ AOP AOP listesini düzenler
+ SOP SOP listesini düzenler
+ ACCESS Ayrýcalýklý kullanýcýlarý belirler deðiþtirir
+ LEVELS Access seviyelerini isteðinize göre düzenler
+ AKICK Autokick listesini düzenler
+ DROP Kanal kaydýný siler
+ SENDPASS Kayýp þifrelerinizi söyler
+
+ Diðer komutlar: BAN, CLEAR, DEOP, DEVOICE, GETKEY, INFO,
+ INVITE, KICK, LIST, LOGOUT, OP, TOPIC,
+ UNBAN, VOICE, VOP
+
+CHAN_HELP_UNREAL
+
+ Bu networkte bu komutlarda mevcuttur:
+ DEHALFOP, DEOWNER, DEPROTECT, HALFOP, HOP, OWNER,
+ PROTECT
+
+CHAN_HELP_ULTIMATE
+
+ Bu networkte bu komutlarda mevcuttur:
+ DEHALFOP, HALFOP, HOP
+
+CHAN_HELP_ULTIMATE3
+
+ Bu networkte bu komutlarda mevcuttur:
+ DEHALFOP, HALFOP, HOP, ADMIN, DEADMIN
+
+CHAN_HELP_EXPIRES
+
+ Unutmayýn %d gün kullanýlmayan kanallarýn
+ (kanalýn access listesinde olan bir kimse o süre içinde
+ kanala girmezse ) kaydý silinir.
+
+CHAN_HELP_REGISTER
+ Kullanýmý: REGISTER kanaladý þifre açýklama
+
+ %S veritabanýna belirtilen kanalý ekler yani kaydeder.
+ Bu komutu kullanabilmek için kayýt etmek istediðiniz kanal
+ önceden kayýtlý olmamalý ve kanalda op olmalýsýnýz. Þifre
+ kanal özelliklerinde deðiþiklikler yapmanýz için ilerde
+ lazým olacaktýr. Son parametre kanalýn genel bir tanýmýdýr
+ ve mutlaka belirtilmelidir.
+
+ Kanalý kayýt ettiðiniz zaman, kanalýn "founder" 'ý olursunuz.
+ Kanal founderý kanalýn tüm özelliklerini deðiþtirme yetkisine
+ sahip olan kiþidir; %S kanala girdiðiniz zaman size
+ otomatik kanal opu hakkýný verecektir. Kanal opu hakkýný
+ baþkalarýnada vermek için gerekli bilgiyi ACCESS komutunun
+ yardýmýna bakarak alabilirsiniz (/msg %S HELP ACCESS).
+
+ NOT: Bir kanalý kaydedebilmek için, önce nickinizi kaydetmelisiniz.
+ Eðer kaydetmediyseniz /msg %s HELP yazarak nasýl yapacaðýnýz
+ hakkýnda bilgi alabilirsiniz.
+
+CHAN_HELP_IDENTIFY
+ Kullanýmý: IDENTIFY kanaladý þifre
+
+ %S tarafýndan kanalýn founderý olarak tanýnmanýzý saðlar.
+ Birçok komutu kullanabilmek için kendinizi kanalýn sahibi
+ (founder) olarak bu komutu kullanarak tanýtmanýz gerekir.
+ Þifre kanalý kaydederken kullandýðýnýz þifreyle aynýdýr.
+
+CHAN_HELP_LOGOUT
+ Kullanýmý: LOGOUT kanaladý nick
+
+ Bu komut belirtilen nickin artýk belirtilen kanal için
+ tanýmlanmamasýný saðlar.
+
+ Eðer kanalýn founderý iseniz istediðiniz kiþi üzerinde,
+ deðilseniz kendi üzerinizde bu komutu kullanabilirsiniz.
+
+CHAN_HELP_DROP
+ Kullanýmý: DROP kanaladý
+
+ Kanalýn kaydýný siler. Sadece kanal founderý tarafýndan
+ kullanýlabilir ve o kiþinin önce IDENTIFY komutunu kullanarak
+ kanalýn sahibi olduðunu belirtmesi gerekir.
+
+CHAN_HELP_SET
+ Kullanýmý: SET kanaladý özellik parametre
+
+ Kanal founderýnýn çeþitli kanal özelliklerini ve diðer bilgileri
+ ayarlamasýný saðlar.
+
+ Mevcut özellikler:
+
+ FOUNDER Kanal founderýný belirler
+ SUCCESSOR Kanal successorýný belirler
+ PASSWORD Founder þifresini belirler
+ DESC Kanal açýklamasýný belirler
+ URL Kanala bir URL adresini iliþkilendirir
+ EMAIL Kanala bir E-mail adresini iliþkilendirir
+ ENTRYMSG Kanala giren kullanýcýlara gönderilecek mesajý
+ belirler
+ BANTYPE Servislerin kanalda ne tip ban koyacaðýný belirler
+ KEEPTOPIC Kanalda kimse olmasa bile topiði hatýrlar
+ TOPICLOCK Topic sadece SET TOPIC komutuyla deðiþtirilir
+ MLOCK Kanal modlarýný kitler yada açar
+ PRIVATE LIST komutuyla kanal listelenmez
+ RESTRICTED Kanala izinli giriþ gerektirir
+ SECURE %S güvenlik özelliklerini aktifleþtirir
+ SECUREOPS Kanal opu durumunun sýký kontrolünü saðlar
+ SECUREFOUNDER Kanal founderý durumunun sýký kontrolünü saðlar
+ SIGNKICK KICK komutuyla yapýlan atmalarý iþaretler
+ OPNOTICE OP/DEOP komutlarý kullanýldýðýnda mesaj yollar
+ PEACE kritik komutlarin kullanilmasini engeller
+ XOP Ayricalik sistemleri arasinda geçisi saglar
+
+
+ Belirli bir özellik hakkýnda daha fazla bilgi için
+ /msg %S HELP özellik yazýn.
+
+CHAN_HELP_SET_FOUNDER
+ Kullanýmý: SET kanaladý FOUNDER nick
+
+ Kanal founderýný deðiþtirir. Yeni nickin kayýtlý
+ olmasý gereklidir.
+
+CHAN_HELP_SET_SUCCESSOR
+ Kullanýmý: SET kanaladý SUCCESSOR nick
+
+ Kanal successorýný belirler, deðiþtirir. Eðer bir kanalýn
+ founderýnýn nicki zaman aþýmýna uðrayýp kaydý silinirse
+ yada kanal kayýtlýyken nickin kaydý bilerek silinirse(drop)
+ successor kanalýn yeni founderý durumuna gelir. Fakat eðer
+ successorýnda çok fazla kayýtlý kanalý varsa(%d) veya kanal
+ için bir successor belirtilmemiþse kanalýn kaydý silinir(drop).
+ Komutta belirtilen nickin kayýtlý olmasý gereklidir.
+
+CHAN_HELP_SET_PASSWORD
+ Kullanýmý: SET kanaladý PASSWORD þifre
+
+ Kanal founderýnýn þifresini deðiþtirir.
+
+CHAN_HELP_SET_DESC
+ Kullanýmý: SET kanaladý DESC açýklama
+
+ LIST ve INFO komutlarý kullanýldýðýnda gözükecek kanal
+ açýklamasýný belirler.
+
+CHAN_HELP_SET_URL
+ Kullanýmý: SET kanaladý URL [urladresi]
+
+ Belirtilen URL adresini kanal ile iliþkilendirir. Bu URL
+ adresi birisi kanal hakkýnda bilgi almak için INFO
+ komutunu kullandýðýnda gözükür. Eðer urladresi parametresi
+ belirtilmezse kanal için önceden belirtilen URL adresi
+ silinir.
+
+CHAN_HELP_SET_EMAIL
+ Kullanýmý: SET kanaladý EMAIL [emailadresi]
+
+ Belirtilen E-mail adresini kanal ile iliþkilendirir.Bu E-mail
+ adresi birisi kanal hakkýnda bilgi almak için INFO komutunu
+ kullandýðýnda gözükür. Eðer emailadresi parametresi
+ belirtilmezse kanal için önceden belirtilen E-mail adresi
+ silinir.
+
+CHAN_HELP_SET_ENTRYMSG
+ Kullanýmý: SET kanaladý ENTRYMSG [mesaj]
+
+ Kanala giren kullanýcýlara notice þeklinde gönderilecek
+ mesajý belirler. Eðer mesaj parametresi belirtilmezse
+ giren kullanýcýya bir mesaj gönderilmez.
+
+CHAN_HELP_SET_BANTYPE
+ Kullanýmý: SET kanaladý BANTYPE bantipi
+
+ Servislerin birini kanaldan banlarken kullanacaðý ban
+ tipini belirler.
+
+ bantipi 0 ile 3 arasýnda bir sayýdýr ve anlamlarý þudur:
+
+ 0: *!user@host formatýnda ban için
+ 1: *!*user@host formatýnda ban için
+ 2: *!*@host formatýnda ban için
+ 3: *!*user@*.domain formatýnda ban için
+
+CHAN_HELP_SET_KEEPTOPIC
+ Kullanýmý: SET kanaladý KEEPTOPIC {ON | OFF}
+
+ Bir kanal için topic hatýrlamayý aktifleþtirir yada kapatýr.
+ topic hatýrlama aktifse kanal kapansa bile kanal topic i
+ %S tarafýndan hatýrlanýr ve birisi kanala girdiðinde bu
+ topic geçerli olur.
+
+CHAN_HELP_SET_TOPICLOCK
+ Kullanýmý: SET kanaladý TOPICLOCK {ON | OFF}
+
+ Bir kanal için topic kilidini aktifleþtirir yada kapatýr.
+ topic kilidi aktifse, %S SET TOPIC komutunun
+ dýþýnda kanal topic inin deðiþtirilmesine izin vermez.
+
+CHAN_HELP_SET_MLOCK
+ Kullanýmý: SET kanaladý MLOCK modlar
+
+ Bir kanal için mod-kilidini aktifleþtirir. %S belirlediðiniz
+ modlarýn her zaman açýk yada kapalý olacaðýný ayarlar.
+
+ + ile belirtilen modlar açik olarak, - ile belirtilen modlar
+ kapali olarak kitlenir.
+
+ Dikkat: Eðer ikinci örnekteki gibi bir mod kilidi koyarsanýz,
+ kanalýn RESTRICTED özelliðinide aktifleþtirmeniz gerekir
+ (HELP SET RESTRICTED e bakýn), yoksa kanal boþken ilk
+ giren kiþi kanal key ini(anahtar) görebilir!
+
+ Örnekler:
+
+ SET #kanaladý MLOCK +nt-iklps
+ n ve t modlarýný hep açýk, i, k, l, p, ve s modlarýný hep
+ açýk olarak ayarlar. m modu ise istenildiði gibi ayarlanabilir
+ açýk yada kapalý.
+
+ SET #kanaladý MLOCK +knst-ilmp anahtar
+ k, n, s, ve t modlarý hep açýk, ve i, l, m, ve p modlarý
+ hep kapalý. Ayrýca kanal anahtarýný belirler ve hep o
+ anahtar olmasýný saðlar.
+
+ SET #kanaladý MLOCK +
+ Mod kilidini kaldýrýr; ve tüm kanal modlarýný açýlýp
+ kapanacak þekilde serbest býrakýr.
+
+CHAN_HELP_SET_PEACE
+ Kullanimi: SET kanaladi PEACE {ON | OFF}
+
+ Bir kanalin peace özelligini açar veya kapatir.
+ peace özelligi ayarlandiginda, hic kimse seviyesi kendinden
+ yüksek veya esit olanlari atamaz, banlayamaz veya %S
+ seviyesini degistiremez.
+
+CHAN_HELP_SET_PRIVATE
+ Kullanýmý: SET kanaladý PRIVATE {ON | OFF}
+
+ Bir kanal için private özelliðini açar kapatýr. private özelliði
+ aktifse, /msg %S LIST komutuyla kanal listelenemez.
+
+CHAN_HELP_SET_RESTRICTED
+ Kullanýmý: SET kanaladý RESTRICTED {ON | OFF}
+
+ Bir kanal için izinli giriþ özelliðini açar yada kapatýr.
+ izinli giriþ özelliði aktifse, kanal opu özelliði olmayan
+ kullanýcýlar(negatif access seviyesi olanlar, secure ops
+ özelliði aktif olanlar, ve access listesinde olmayan
+ kullanýcýlar) kanaldan atýlýp banlanýrlar.
+
+CHAN_HELP_SET_SECURE
+ Kullanýmý: SET kanaladý SECURE {ON | OFF}
+
+ Bir kanal için %S'ün güvenlik özelliklerini açar veya
+ kapatýr. SECURE özelliði aktifse, sadece nicki kayýtlý
+ ve %s ile nickini tanýtmýþ kullanýcýlar kanalda access
+ alabilirler ve access listesindeki statülerini
+ alabilirler.(mesela op olabilirler)
+
+CHAN_HELP_SET_SECUREOPS
+ Kullanýmý: SET kanaladý SECUREOPS {ON | OFF}
+
+ Bir kanal için güvenli op özelliðini açar veya kapatýr.
+ güvenli op özelliði aktifse, access listesinde olmayan
+ kullanýcýlar kanalda op olamazlar.
+
+CHAN_HELP_SET_SECUREFOUNDER
+ Kullanýmý: SET kanaladý SECUREFOUNDER {ON | OFF}
+
+ Bir kanal için güvenli founder özelliðini açar yada kapatýr.
+ güvenli founder özelliði aktifse, sadece gerçek founder
+ kanalýn kaydýný silebilir, kanal þifresini deðiþtirebilir yada
+ kanal founderýný ve successor ýný deðiþtirebilir. Kanal
+ þifresiyle kendilerini %S'e kanal founderý olarak tanýtan
+ ama nicki founderýn nicki olmayanlar bu komutlarý kullanamazlar.
+
+CHAN_HELP_SET_SIGNKICK
+ Kullanýmý: SET kanaladý SIGNKICK {ON | LEVEL | OFF}
+
+ Bir kanal için iþaretli atmayý açar yada kapatýr.
+ SIGNKICK ayarlandýðý zaman, %S KICK
+ komutuyla yapýlan atmalarda komutu kullanan kiþinin
+ nicki atma sebebinde yer alýr.
+
+ Eðer LEVEL parametresini kullanýrsanýz, seviyesi
+ SIGNKICK seviyesine eþit yada fazla olanlarýn yaptýðý
+ atmalarda atanýn nicki sebepte gözükmez. Daha fazla
+ bilgi için /msg %S HELP LEVELS yazýn.
+
+CHAN_HELP_SET_XOP
+ Kullanimi: SET kanaladi XOP {ON | OFF}
+
+ Bir kanalin xOP sistemini açar veya kapatir. XOP
+ ayarlandigi zaman, AOP/SOP/VOP komutlariyla
+ yetkileri düzenlemelisiniz, aksi takdirde ACCESS
+ komutunu kullanmalisiniz.
+
+ Teknik Not: Access sisteminden xOP sisteminde
+ geçtiginizde seviye ayarlariniz degistirilir, bu
+ yüzden tekrar access sistemine geçtiginizde ayni
+ ayarlari bulamazsiniz!
+
+ Access sisteminden xOP sistemine geçtiginizde listedeki
+ ayricaliklari kontrol edip listenizdeki nicklerin dogru
+ xOP ayarlarinda bulundugunu kontrol edin, çünkü sistemin
+ tahmin etmesi her zaman dogru olmayabilir... Eger LEVELS
+ komutuyla komut seviye ayarlarini degistirdiyseniz xOP
+ sistemini kullanmaniz önerilmez.
+
+ Bunlarin disinda xOP sisteminden access sistemine geçmek
+ bir problem çikarmaz.
+
+CHAN_HELP_SET_OPNOTICE
+ Kullanýmý: SET kanaladý OPNOTICE {ON | OFF}
+
+ Bir kanal için op-notu özelliðini açar yada kapatýr.
+ op-notu özelliði aktifse, %S kanala bir kullanýcý
+ üzerinde OP veya DEOP komutlarýnýn kullanýldýðýný
+ belirten bir mesaj gönderir.
+
+CHAN_HELP_AOP
+ Kullanýmý: AOP kanaladi ADD nick
+ AOP kanaladi DEL {nick | kayit-no | liste}
+ AOP kanaladi LIST [mask | liste]
+ AOP kanaladi CLEAR
+
+ Bir kanalin AOP (otoop) listesini düzenler. AOP listesi
+ o kanalda kullaniciya otomatik olarak op olma, gerekirse
+ kendi banlarini kaldirma veya davet edilme, giriste karsilama
+ mesajlarini görüntüleme, vs yetkilerini verir.
+
+ AOP ADD komutu belirtilen nicki AOP listesine ekler.
+
+ AOP DEL komutu belirtilen nicki AOP listesinden siler.
+ Eger kayit numaralari belirtilirse, o numaralara ait nickler
+ silinir. (Asagidaki örnegi inceleyin.)
+
+ AOP LIST komutu AOP listesini gösterir. Eger bir hostmask
+ belirtilmisse, sadece onla uyusan kayitlari gösterir. Eger
+ kayit numaralari belirtilmisse o numaralarla uyusan kayitlari
+ gösterir; örnegin:
+
+ AOP #kanal LIST 2-5,7-9
+ 2 den 5 e ve 7 den 9 a kadar olan kayitlari gösterir.
+
+ AOP CLEAR komutu AOP listesindeki tüm kayitlari siler.
+
+ AOP ADD ve AOP DEL komutlarini kanal SOP lari veya üstü
+ kullanabilir. AOP CLEAR komutunu ise sadece kanal founderi
+ kullanabilir. Ayrica, AOP listesindeki herhangi biri AOP LIST
+ komutunu kullanabilir.
+
+ Bu komutu kanaliniz için devre disi birakabilirsiniz. O zaman
+ access komutlarini kullanmalisiniz. Access komutlari hakkinda
+ bilgi almak için /msg %S HELP ACCESS yazin.
+ Access ile xOP arasinda geçis yapabilmek için gerekli bilgilere
+ /msg %S HELP SET XOP yazarak ulasabilirsiniz.
+
+CHAN_HELP_HOP
+ Kullanýmý: HOP kanaladi ADD nick
+ HOP kanaladi DEL {nick | kayit-no | liste}
+ HOP kanaladi LIST [mask | liste]
+ HOP kanaladi CLEAR
+
+ Bir kanalin HOP (HalfOP) listesini düzenler. HOP
+ listesinde bulunan bir kisi kanalda otomatik olarak
+ halfop olur.
+
+ HOP ADD komutu belirtilen nicki HOP listesine ekler.
+
+ HOP DEL komutu belirtilen nicki HOP listesinden siler.
+ Eger kayit numaralari listesi belirtilirse, bu kayitlar
+ silinir. (Asagidaki örnegi inceleyin.)
+
+ HOP LIST komutu HOP listesini gösterir. Eger bir hostmask
+ belirtilmisse, o hostmask la uyusan kayitlar gösterilir.
+ Eger kayit numaralari listesi belirtilmisse, o numaralardaki
+ nickler gösterilir; örnegin:
+
+ HOP #kanaladi LIST 2-5,7-9
+ 2 den 5 e ve 7 den 9 a kadar olan kayitlari gösterir.
+
+ HOP CLEAR komutu HOP listesindeki tüm kayitlari temziler.
+
+ HOP ADD, HOP DEL ve HOP LIST komutlarini AOP lar ve üstü
+ HOP CLEAR komutunu ise sadece founder kullanabilir.
+
+ Bu komutu kanaliniz için devre disi birakabilirsiniz. O zaman
+ access komutlarini kullanmalisiniz. Access komutlari hakkinda
+ bilgi almak için /msg %S HELP ACCESS yazin.
+ Access ile xOP arasinda geçis yapabilmek için gerekli bilgilere
+ /msg %S HELP SET XOP yazarak ulasabilirsiniz.
+
+CHAN_HELP_SOP
+ Kullanýmý: SOP kanaladi ADD nick
+ SOP kanaladi DEL {nick | kayit-no | liste}
+ SOP kanaladi LIST [mask | liste]
+ SOP kanaladi CLEAR
+
+ Bir kanalin SOP (SuperOP) listesini düzenler. SOP
+ listesindekiler AOP larin sahip oldugu tüm yetkilere
+ sahiptir. Ayrica AutoKick ve BadWords listesini
+ düzenleyebilirler, kanal memolarini okuyabilirler, vs.
+
+ SOP ADD komutu belirtilen nicki SOP listesine ekler.
+
+ SOP DEL komutu belirtilen nicki SOP listesinden siler.
+ Eger kayit numaralari listesi belirtilmisse, bu kayitlar
+ silinir. (Asagidaki örnegi inceleyin.)
+
+ SOP LIST komutu SOP listesini görüntüler. Eger bir
+ hostmask belirtilmisse o hostmaskla uyusan kayitlar
+ gösterilir. Eger kayit numaralari listesi belirtilmisse
+ o numaralardaki nickler gösterilir; örnegin:
+
+ SOP #kanaladi LIST 2-5,7-9
+ 2 den 5 e ve 7 den 9 a kadar olan kayitlar gösterilir.
+
+ SOP CLEAR komutu SOP listesindeki tüm kayitlari temizler.
+
+ SOP ADD, SOP DEL ve SOP CLEAR komutlarini sadece kanal
+ founderi kullanabilir. Ama AOP listesindeki herhangi biri
+ SOP LIST komutunu kullanabilir.
+
+ Bu komutu kanaliniz için devre disi birakabilirsiniz. O zaman
+ access komutlarini kullanmalisiniz. Access komutlari hakkinda
+ bilgi almak için /msg %S HELP ACCESS yazin.
+ Access ile xOP arasinda geçis yapabilmek için gerekli bilgilere
+ /msg %S HELP SET XOP yazarak ulasabilirsiniz.
+
+CHAN_HELP_VOP
+ Kullanýmý: VOP kanaladi ADD nick
+ VOP kanaladi DEL {nick | kayit-no | liste}
+ VOP kanaladi LIST [mask | liste]
+ VOP kanaladi CLEAR
+
+ Bir kanalin VOP (otovoice) listesini düzenler. VOP
+ listesindekiler kanalda otomatik olarak voice alirlar.
+
+ VOP ADD komutu belirtilen nicki VOP listesine ekler.
+
+ VOP DEL komutu belirtilen nicki VOP listesindene siler.
+ Eger kayit numaralari listesi belirtilmisse, o kayitlar
+ silinir. (Asagidaki örnegi inceleyin.)
+
+ VOP LIST komutu VOP listesini görüntüler. Eger bir
+ hostmask belirtilmisse o hostmaskla uyusan kayitlar
+ listelenir. Eger kayit numaralari listesi belirtilmisse
+ o numaralardaki nickler gösterilir; örnegin:
+
+ VOP #kanaladi LIST 2-5,7-9
+ 2 den 5 e ve 7 den 9 a kadar olan kayitlar gösterilir.
+
+ VOP CLEAR komutu VOP listesindeki tüm kayitlari temizler.
+
+ VOP ADD, VOP DEL ve VOP LIST komutlarini AOP lar ve üstü,
+ VOP CLEAR komutunu ise sadece founder kullanabilir.
+
+ Bu komutu kanaliniz için devre disi birakabilirsiniz. O zaman
+ access komutlarini kullanmalisiniz. Access komutlari hakkinda
+ bilgi almak için /msg %S HELP ACCESS yazin.
+ Access ile xOP arasinda geçis yapabilmek için gerekli bilgilere
+ /msg %S HELP SET XOP yazarak ulasabilirsiniz.
+
+CHAN_HELP_ACCESS
+ Kullanýmý: ACCESS kanaladý ADD nick seviye
+ ACCESS kanaladý DEL {nick | kayýt-no | liste}
+ ACCESS kanaladý LIST [mask | liste]
+ ACCESS kanaladý CLEAR
+
+ Bir kanal için access listesi oluþturur. Access listesi
+ kanalda kimlerin op olacaðýný ve %S komutlarýna
+ kimlerin eriþimi olacaðýný belirtir. Deðiþik access
+ seviyeleri deðiþik komutlara eriþim saðlar. Ayrýntýlý bilgi
+ için /msg %S HELP ACCESS LEVELS yazýn. Access
+ listesinde olmayan kullanýcýlarýn seviyesi 0 dýr.
+
+ ACCESS ADD komutu belirtilen nicki belirtilen seviyeden
+ access listesine ekler; eðer o kiþi zaten access listesindeyse
+ seviyesini belirtilen seviyeyle deðiþtirir. Belirtilen seviye
+ komutu kullanan kiþinin seviyesinden az olmalýdýr, eðer
+ belirtilen nick zaten access listesindeyse komutu kullanan
+ kiþinin access seviyesi onunkinden büyük olmalýdýr.
+
+ ACCESS DEL komutu belirtilen nicki access listesinden siler.
+ eðer kayýt numarasý belirtilmiþse o kayýt numarasý olan kiþinin
+ accessi silinir.(Aþaðýdaki LIST için verilen örneðe bakýn.)
+
+ ACCESS LIST komutu access listesini görüntüler. Eðer * lý
+ bir mask belirtilirse o maskla uyuþan kiþiler listelenir.
+ Eðer kayýt numarasý listesi belirtilirse o kiþiler listelenir.
+ Örneðin:
+
+ ACCESS #kanaladý LIST 2-5,7-9
+ 2'den 5'e ve 7'den 9'a kadar olan access kayýtlarý
+ listelenir.
+
+ ACCESS CLEAR komutu tüm access listesini temizler.
+
+CHAN_HELP_ACCESS_LEVELS
+ Kullanýcý access seviyeleri
+
+ Varsayýlan olarak, aþaðýdaki access seviyeleri tanýmlanmýþtýr:
+
+ Founder %S fonksiyonlarýna tam eriþim hakký vardýr.
+ kanal girer girmez op olur. Unutmayýnki
+ sadece bir kiþi founder olma hakkýna
+ sahiptir. (ACCESS komutuyla verilemez.)
+  10 AKICK komutuna eriþimi vardýr; otomatik oplanýr.
+  5 Otomatik oplanýr.
+  3 Otomatik voice lanýr.
+  0 Bir özelliði yoktur; diðer oplar tarafýndan
+ oplanabilir (güvenli-op kapalýysa).
+  <0 Kanalda oplanamaz.
+
+ Bu seviyeler LEVELS komutu kullanýlarak deðiþtirilebilir, veya
+ yenileri eklenebilir, bilgi için /msg %S HELP LEVELS
+ yazýn.
+
+CHAN_HELP_AKICK
+ Kullanýmý: AKICK kanaladý ADD mask [sebep]
+ AKICK kanaladi STICK mask
+ AKICK kanaladi UNSTICK mask
+ AKICK kanaladý DEL mask
+ AKICK kanaladý LIST [mask]
+ AKICK kanaladý VIEW [mask]
+ AKICK kanaladý ENFORCE
+ AKICK kanaladý CLEAR
+
+ Bir kanal için AutoKick listesi oluþturur. Eðer Akick
+ listesindeki bir kullanýcý kanala girmeye çalýþýrsa, Bu
+ kiþi %S tarafýndan banlanýr ve kanaldan atýlýr.
+
+ AKICK ADD komutu belirtilen nicki yada maský Akick
+ listesine ekler. Eðer komutla beraber birde sebep
+ belirtilmiþse bu sebep kullanýcý kanaldan atýlýrken
+ kullanýlýr; eðer kullanýlmazsa geçerli sebep olan
+ "You have been banned from the channel" kullanýlýr.
+
+ AKICK STICK komutu belirtilen maski kalici olarak
+ banlar. Eger biri bani kaldirmaya çalisirsa, %S
+ otomatik olarak yeniden banlar. Bunu kayitli nickler
+ için kullanamazsiniz.
+
+ AKICK UNSTICK komutu AKICK STICK komutunun etkilerini
+ iptal eder, böylece bani kaldirabilirsiniz.
+
+ AKICK DEL komutu belirtilen nicki yada maský Akick
+ listesinden siler. Fakat bu komutla önceden Akick
+ listesindeyken banlanmýþ birinin baný manuel olarak
+ açýlana kadar kalkmaz.
+
+ AKICK LIST komutu Akick listesinde kimlerin olduðunu
+ listeler, yada opsiyonel olarak belirtilen maskla uyuþan
+ Akick listesindeki kullanýcýlarý listeler.
+
+ AKICK VIEW komutu AKICK LIST komutunun daha açýklayýcý
+ versiyonudur.
+
+ AKICK ENFORCE komutu %S'ün mevcut akick listesinde bulunan
+ masklara sahip kullanýcýlarý kanaldan atmasýný saðlar.
+
+ AKICK CLEAR komutu akick listesinde bulunan tüm kayýtlarý
+ siler.
+
+CHAN_HELP_LEVELS
+ Kullanýmý: LEVELS kanaladý SET tip seviye
+ LEVELS kanaladý {DIS | DISABLE} tip
+ LEVELS kanaladý LIST
+ LEVELS kanaladý RESET
+
+ LEVELS komutu bir kanaldaki access seviyelerinin iyi
+ kontrolünü saðlar. Bu komutla, %S'ün birçok
+ fonksiyonu için gereken access seviyelerini
+ belirleyebilirsiniz. (SET FOUNDER ve SET PASSWORD
+ komutlarý ve bu komut sadece kanal founderý tarafýndan
+ kullanýlabilir.)
+
+ LEVELS SET komutu bir fonksiyon yada fonksiyon gruplarý için
+ access seviyelerini deðiþtirmeye yarar. LEVELS DISABLE (veya
+ kýsaca DIS) otomatik bir özelliði kapatýr yada founderdan
+ baþkasýnýn kullanmasýný engeller. LEVELS LIST komutu
+ fonksiyonlar yada fonksiyon gruplarý için mevcut seviyeleri
+ gösterir. LEVELS RESET komutu seviyeleri varsayýlan deðerlerine
+ geri çevirir. (HELP ACCESS LEVELS e bakýn).
+
+ Seviyeleri ayarlanabilecek fonksiyonlar için, HELP LEVELS DESC e
+ bakýn.
+
+CHAN_HELP_LEVELS_DESC
+ Aþaðýda seviyeleri deðiþtirilebilecek fonksiyonlar listelidir.
+ Dikkat edilirse AUTODEOP ve NOJOIN deðerleri maximum, diðerleri
+ minimum seviyelerdir.
+
+CHAN_HELP_LEVELS_DESC_FORMAT
+ %-*s %s
+
+CHAN_HELP_INFO
+ Kullanýmý: INFO kanaladý [ALL]
+
+ Belirtilen kayýtlý kanalla ilgili bilgiler sunar. Bu
+ bilgilerin içeriðinde kanalýn founderý, kayýt zamaný,
+ son kullanýldýðý zaman, açýklamasý, ve varsa mod kilidi
+ bulunur. Eðer kanalýn founderý olarak kendinizi
+ tanýtmýþsanýz ve ALL parametresini belirtmiþseniz
+ giriþ mesajý ve successor hakkýndada bilgi alabilirsiniz.
+
+ Varsayilan olarak, ALL seçenegini founderlar kullanabilir.
+
+CHAN_HELP_LIST
+ Kullanýmý: LIST model
+
+ Belirtilen modelle uyuþan tüm kayýtlý kanallarý listeler.
+ (PRIVATE özelliði aktif olan kanallar listelenmez.)
+
+CHAN_HELP_OP
+ Kullanýmý: OP [#kanaladý [nick]]
+
+ Belirtilen nicki kanalda oplar. Eðer nick belirtilmemiþse,
+ kendinizi oplarsýnýz. Eðer kanal ve nick belirtilmemiþse,
+ bulunduðunuz tüm kanalda sizi oplar, tabi eðer op accessiniz
+ ve bu komutu kullanmaya yetkiniz varsa.
+
+ Varsayýlan olarak, AOP lar ile access seviyesi 5 ve üzeri
+ olanlar kullanabilir.
+
+CHAN_HELP_DEOP
+ Kullanýmý: DEOP [#kanaladý [nick]]
+
+ Belirtilen nicki kanalda deoplar. Eðer nick belirtilmemiþse,
+ kendinizi deoplarsýnýz. Eðer nick ve kanal belirtilmemiþse,
+ bulunduðunuz tüm kanallarda sizi deoplar, tabi eðer bu komutu
+ kullanmaya yetkiniz varsa.
+
+ Varsayýlan olarak, AOP lar veya access seviyesi 5 ve üzeri
+ olanlar kullanabilir.
+
+CHAN_HELP_VOICE
+ Kullanýmý: VOICE [#kanaladý [nick]]
+
+ Belirtilen nicke kanalda voice verir. Eðer nick belirtilmemiþse,
+ size voice verir. Eðer kanal ve nick belirtilmemiþse, size
+ bulunduðunuz tüm kanallarda voice verir, tabi eðer accessiniz ve
+ bu komutu kullanmaya izniniz varsa.
+
+ Varsayýlan olarak, AOP lar ile access seviyesi 5 ve üzeri olanlar
+ kullanabilir, veya VOP lar ile access seviyesi 3 ve yukarý olanlar
+ kendilerine voice vermek için kullanabilirler.
+
+CHAN_HELP_DEVOICE
+ Kullanýmý: DEVOICE [#kanaladý [nick]]
+
+ Belirtilen nicki kanalda devoice eder. Eðer nick belirtilmemiþse,
+ sizi devoice eder. Eðer kanal ve nick belirtilmemiþse sizi,
+ bulunduðunuz tüm kanallarda devoice eder, tabi eðer accessiniz
+ ve bu komutu kullanmaya izniniz varsa.
+
+ Varsayýlan olarak, AOP lar, access seviyesi 5 ve üzeri olanlar
+ kullanabilir, veya VOP lar ile access seviyesi 3 ve üzeri olanlar
+ kendilerini devoice etmek için kullanabilirler.
+
+CHAN_HELP_HALFOP
+ Kullanýmý: HALFOP [#kanaladý [nick]]
+
+ Belirtilen nicki kanalda halfop(yarýmop) yapar. Eðer nick
+ belirtilmemiþse, sizi halfop yapar. Eðer nick ve kanal
+ belirtilmemiþse, sizi bulunduðunuz tüm kanallarda halfop yapar,
+ tabi eðer bu komutu kullanmaya izniniz varsa.
+
+ Varsayýlan olarak, AOP lar ile access seviyesi 5 ve üzeri
+ olanlar kullanabilir, veya HOP lar ile access seviyesi 4 ve
+ üzeri olanlar kendilerini halfop yapmak için kullanabilir.
+
+CHAN_HELP_DEHALFOP
+ Kullanýmý: DEHALFOP [#kanaladý [nick]]
+
+ Belirtilen nickin halfopunu(yarýmop) alýr. Eðer nick
+ belirtilmemiþse, sizin halfopunuz alýr. Eðer kanal ve nick
+ belirtilmemiþse, bulunduðunuz tüm kanallardan halfopunuzu
+ alýr, tabi eðer bu komutu kullanmaya izniniz varsa.
+
+ Varsayýlan olarak, AOP lar veya 5 ve üzeri access seviyesi
+ olanlar kullanabilir, ayrica HOP lar veya access seviyesi
+ 4 ve üzeri olanlar kendi halfoplarýný alabilirler.
+
+CHAN_HELP_PROTECT
+ Kullanýmý: PROTECT [#kanaladý [nick]]
+
+ Belirtilen nicki kanalda korur. Eðer nick belirtilmezse,
+ sizi korur. Eðer nick ve kanal belirtilmezse sizi bulunduðunuz
+ tüm kanallarda koruyacaktýr, tabi eðer bu komutu kullanmaya
+ izniniz varsa.
+
+ Varsayýlan olarak, founder kullanabilir, veya SOP lar ile access
+ seviyesi 10 ve üzeri olanlar kendilerinde kullanabilirler.
+
+CHAN_HELP_DEPROTECT
+ Kullanýmý: DEPROTECT [#kanaladý [nick]]
+
+ Belirtilen nickin korumasýný kaldýrýr. Eðer nick belirtilmemiþse,
+ sizin korumanýzý kaldýrýr. Eðer kanal ve nick belirtilmezse,
+ sizin bulunduðunuz tüm kanallardaki korumalarýnýz kaldýrýr,
+ tabi eðer bu komutu kullanmaya izniniz varsa.
+
+ Varsayýlan olarak, founder kullanabilir, veya SOP lar ile
+ access seviyesi 10 ve üzeri olanlar kendilerinde kullanabilir.
+
+CHAN_HELP_OWNER
+ Kullanýmý: OWNER [#kanaladi]
+
+ Belirtilen kanalda owner statüsü verilir. Eger kanal
+ belirtilmemisse bulundugunuz tüm kanallarda size owner
+ statüsü verilir. Tabi bu yetkinizin olup olmamasina
+ baglidir.
+
+ Belirtilen kanal founderlarinin kullanma yetkisi vardir.
+
+CHAN_HELP_DEOWNER
+ Kullanýmý: DEOWNER [#kanaladi]
+
+ Belirtilen kanaldaki owner statünüzü kaldirir. Eger
+ kanal belirtilmezse bulundugunuz tüm kanallardaki owner
+ statünüzü kaldirir. Tabi bu yetkinizin olup olmamasina
+ baglidir.
+
+ Belirtilen kanal founderlarinin kullanma yetkisi vardir.
+
+CHAN_HELP_INVITE
+ Kullanýmý: INVITE kanaladý
+
+ %S'e sizi belirtilen kanala davet etmesini söyler.
+
+ Varsayýlan olarak AOP lar ile access seviyesi 5 veya
+ üzeri olanlar kullanabilir.
+
+CHAN_HELP_UNBAN
+ Kullanýmý: UNBAN kanaladý
+
+ %S'e sizin kanala girmenizi engelleyen tüm banlarý kaldýrmasýný
+ söyler.
+
+ Varsayýlan olarak, AOP lar ile 5 ve üzeri access seviyesi olanlar
+ kullanabilir.
+
+CHAN_HELP_KICK
+ Kullanýmý: KICK [#kanaladý [nick [sebep]]]
+
+ Belirtilen nicki kanaldan atar. Eðer nick belirtilmemiþse
+ sizi atar. Eðer kanal ve nick belirtilmemiþse, sizi
+ bulunduðunuz tüm kanallardan atar.
+
+ Varsayýlan olarak, AOP lar ile access seviyesi 5 ve üzeri
+ olanlar bu komutu kullanabilir.
+
+CHAN_HELP_BAN
+ Kullanýmý: BAN [#kanaladi [nick [sebep]]]
+
+ Belirtilen nicki kanaldan banlar. Eger nick belirtilmezse
+ sizi banlar. Eger nick ve kanal belirtilmezse sizi bulundugunuz
+ tüm kanallardan banlar.
+
+ Varsayilan olarak, AOP larin veya 5. seviyeden access i olanlarin
+ ve üstünün kullanma yetkisi vardir.
+
+CHAN_HELP_TOPIC
+ Kullanýmý: TOPIC kanaladi [konu]
+
+ %S belirtilen kanala belirtilen konuyu yazar.Eger
+ topic belirtilmemisse, bos bir konu yazilir. Bu
+ komut SET TOPICLOCK aktif oldugu zaman kullanislidir.
+ Daha fazla bilgi için /msg %S HELP SET TOPICLOCK
+ yazin.
+
+ Varsayilan olarak, founderin kullanma yetkisi vardir.
+
+CHAN_HELP_CLEAR
+ Kullanýmý: CLEAR kanaladý neyi
+
+ %S'e belirtilen ayarý kaldýrmasýný söyler. neyi
+ þunlardan biri olmalýdýr:
+
+ MODES Kanal modlarýný temizler. (ör. i,k,l,m,n,p,s,t
+ modlarýný temizler).
+ BANS Kanaldaki tüm banlarý kaldýrýr.
+ EXCEPTS Clears all excepts on the channel.
+ OPS Kanal opu statüsünde olanlarýn (mode +o)
+ oplarýný alýr.
+ VOICES Voice statüsünde olanlarýn (mode +v) voice larýný
+ alýr.
+ USERS Tüm kullanýcýlarý kanaldan atar.
+
+ Varsayýlan olarak, founder tarafindan kullanilabilir.
+
+CHAN_HELP_GETKEY
+ Kullanýmý: GETKEY kanaladý
+
+ Belirtilen kanalýn anahtarýný söyler. Bu komut botlar
+ veya scriptler tarafýndan kullanýlmak üzere tasarlanmýþtýr,
+ ve çýktýsý þu þekildedir:
+
+ KEY <kanaladý> <anahtar>
+
+ Eðer bir anahtar yoksa anahtar kýsmýnda "NO KEY" olacaktýr.
+
+CHAN_HELP_SENDPASS
+ Kullanýmý: SENDPASS kanaladý
+
+ Kanalýn þifresini founderýn nick kayýtlarýnda belirtilen
+ e-mail adresine gönderir. Bu komut kanal þifresini
+ unutanlarýn çok iþine yarayacaktýr.
+
+ Bazý networklerde IRC operatörlerinin Kullanýmýyla
+ sýnýrlandýrýlmýþ olabilir.
+
+ Bu komut þifreleme(encryption) aktifken devre dýþýdýr.
+
+CHAN_SERVADMIN_HELP
+
+ Aþaðýdaki komutlar servis adminleri tarafýndan kullanýlabilir:
+
+ GETPASS Bir kanalýn founder þifresini ister
+ (sadece þifreleme(encryption) devre dýþýysa)
+ FORBID Kanalý kullanýma kapatýr
+ STATUS Kullanýcýnýn kanaldaki access seviyesini söyler
+ CLIST Bir kullanýcýnýn founder olduðu kanallarý listeler
+
+ Servis adminleri kanalýn kaydýný þifreyle tanýtmadan silebilir,
+ ve access, Akick ve seviye ayarlarýný görüntüleyebilirler.
+
+CHAN_SERVADMIN_HELP_LOGOUT
+ Kullanýmý: LOGOUT kanaladý [nick]
+
+ Bu komut belirtilen nickin artýk belirtilen kanalda
+ tanýmlanmamasýný saðlar.
+
+ Eðer kanal founderý iseniz, istediðiniz kiþide, deðilseniz
+ sadece kendinizde bu komutu kullanabilirsiniz.
+
+ Eðer Servis admini iseniz, kanal founderý olmanýza gerek
+ olmadan istediðiniz kiþide bu komutu kullanabilirsiniz.
+ Hatta nick parametresini boþ býrakarak o kanalda kendini
+ kanala tanýtmýþ herkesi tanýmlanmamýþ yapabilirsiniz.
+
+CHAN_SERVADMIN_HELP_DROP
+ Kullanýmý: DROP kanaladý
+
+ Belirtilen kanalýn kaydýný siler. Sadece Servis adminleri
+ kanalý tanýtmadan kaydýný silebilirler.
+
+CHAN_SERVADMIN_HELP_SET
+
+ Servis adminleri NOEXPIRE özelliðini ayarlayarak istedikleri
+ kanalýn zaman aþýmýna uðramasýný engelleyebilirler.
+ Ek olarak, Servis adminleri þifreyle kanalý tanýtmaya gerek
+ olmadan bir kanalýn tüm özelliklerini ayarlayabilirler.
+
+CHAN_SERVADMIN_HELP_SET_NOEXPIRE
+ Kullanýmý: SET kanaladý NOEXPIRE {ON | OFF}
+
+ Belirtilen kanalýn zaman asimina uðrayýp uðramayacaðýný
+ belirler. Bunu ON olarak ayarlamak kanalýn zaman aþýmýna
+ uðramasýný engelleyecektir.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+CHAN_SERVADMIN_HELP_INFO
+
+ Servis adminleri herhangi bir kanal için ALL parametresini
+ kullanabilirler.
+
+CHAN_SERVADMIN_HELP_LIST
+ Kullanýmý: LIST model [FORBIDDEN] [NOEXPIRE]
+
+ Belirtilen modelle uyuþan tüm kayýtlý kanallarý listeler.
+ PRIVATE özelliði ayarlý kanallar sadece Servis adminleri
+ tarafýndan görüntülenir. NOEXPIRE özelliði olan kanallarýn
+ yanýnda Servis adminleri için ! iþareti bulunur.
+
+ Eðer FORBIDDEN veya NOEXPIRE özellikleri belirtilmiþse,
+ sadece yasaklý(FORBIDDEN) yada zaman aþýmýna(NOEXPIRE)
+ uðramayacak kanallar listelenir. Eðer her iki özellikte
+ belirtilmiþse, her iki tip kanalda listelenir. Bu komutlar
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+CHAN_SERVADMIN_HELP_GETPASS
+ Kullanýmý: GETPASS kanaladý
+
+ Belirtilen kanalýn þifresini söyler. Unutmayýnki bu
+ komut ne zaman kullanýlsa, Komutu kullananýn ve komutta
+ kullanýlan kanalýn adý kaydedilir ve WALLOPS/GLOBOPS olarak
+ gönderilir.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+CHAN_SERVADMIN_HELP_FORBID
+ Kullanýmý: FORBID kanaladý [sebep]
+
+ Belirtilen kanalýn birisi tarafýndan kayýt edilmesini veya
+ kullanýlmasýný önler. Kanal droplanarak iptal edilir.
+
+ Bazý networklerde sebep gereklidir.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+CHAN_SERVADMIN_HELP_SUSPEND
+ Syntax: SUSPEND channel [reason]
+
+ Disallows anyone from registering or using the given
+ channel. May be cancelled by using the UNSUSPEND
+ command to preserve all previous channel data/settings.
+
+ Reason may be required on certain networks.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_UNSUSPEND
+ Syntax: UNSUSPEND channel
+
+ Releases a suspended channel. All data and settings
+ are preserved from before the suspension.
+
+ Limited to Services admins.
+
+CHAN_SERVADMIN_HELP_STATUS
+ Kullanýmý: STATUS kanaladý nick
+
+ Belirtilen nickin belirtilen kanaldaki access seviyesini
+ söyler. Cevabýn formatý þu þekildedir:
+
+ STATUS kanaladý nick access-seviyesi
+
+ Eðer bir hata olursa, cevabun formatý þöyle olur:
+
+ STATUS ERROR hata-mesajý
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+###########################################################################
+#
+# MemoServ help messages
+#
+###########################################################################
+
+MEMO_HELP
+ %S kullanýcýlarýn birbirlerine veya kanallara(*) online
+ olmasalar bile mesaj göndermelerini saðlar. Mesaj gönderebilmek
+ için gönderenin nicki, gönderilenin nicki veya kanalýn kayýtlý
+ olmasý gereklidir.
+
+ %S'ün mevcut komutlarý:
+
+ SEND Nicke veya kanala mesaj gönderir
+ CANCEL Son gönderilen mesajý iptal eder
+ LIST Mesajlarýnýzý listeler
+ READ Mesajlarý okumanýzý saðlar
+ DEL Mesajlarý silmenizi saðlar
+ SET Mesajlarla ilgili ayarlarý yapar
+
+MEMO_HELP_ADMIN
+ SENDALL Send a memo to all registered users
+
+MEMO_HELP_OPER
+ STAFF Send a memo to all opers/admins
+
+MEMO_HELP_FOOTER
+
+ Yukardaki herhangi bir komut hakkýnda yardým için
+ /msg %S HELP komut yazýn.
+
+ (*) Varsayýlan olarak, kanal mesajlarýný o kanalda access
+ seviyesi en az 10 olanlar okuyabilir. Bu %s LEVELS
+ komutuyla deðiþtirebilir.
+
+MEMO_HELP_SEND
+ Kullanýmý: SEND {nick | kanaladý} mesaj
+
+ Belirtilen nicke veya kanala yazýlan mesajý gönderir.
+ Nicke gönderirken, gönderilen kiþi yeni mesajý olduðuna dair
+ bir not alýr. Mesaj gönderilen nick/kanal kayýtlý olmalýdýr.
+
+MEMO_HELP_CANCEL
+ Kullanýmý: CANCEL {nick | kanaladý}
+
+ Belirtilen kanala yada nicke gönderilen son mesajý iptal eder,
+ tabi eðer o mesaj siz komutu kullandýðýnýz sýrada okunmamýþsa.
+
+MEMO_HELP_LIST
+ Kullanýmý: LIST [kanaladý] [liste | NEW]
+
+ Mevcut mesajlarýnýzý listeler. NEW parametresi sadece yeni
+ okunmamýþ mesajlarý listeler. Okunmamýþ mesajlar mesaj
+ numarasýnýn solunda "*" ile iþaretlidir. Aþaðýdaki örnekte
+ olduðu gibi belirli numaralarýda listeleyebilirsiniz:
+
+ LIST 2-5,7-9
+ 2'den 5'e ve 7'den 9'a kadar olan mesajlarý listeler.
+
+MEMO_HELP_READ
+ Kullanýmý: READ [kanaladý] {num | liste | LAST | NEW}
+
+ Belirtilen mesajlarý okumanýzý saðlar. Eðer LAST belirtilmiþse
+ en son gelen mesajýnýzý okursunuz. Eðer NEW belirtilmiþse tüm
+ yeni mesajlarýný okursunuz. Eðer bir numara belirtirseniz (num)
+ o numaraya ait mesajý okursunuz. Aþaðýdaki örnekteki gibi belirli
+ numaralarýda okuyabilirsiniz:
+
+ READ 2-5,7-9
+ 2'den 5'e ve 7'den 9'a kadar olan mesajlarý gösterir.
+
+MEMO_HELP_DEL
+ Kullanýmý: DEL [kanaladý] {num | liste | LAST | ALL}
+
+ Belirtilen mesajlarý siler. Aþaðýdaki örnekteki gibi birden
+ fazla mesajýda silebilirsiniz.
+
+ If LAST is given, the last memo will be deleted.
+ Eðer ALL parametresi belirtilmiþse, tüm mesajlarýnýz silinir.
+
+ Örnekler:
+
+ DEL 1
+ Ýlk gelen mesajýnýzý siler.
+
+ DEL 2-5,7-9
+ 2'den 5'e ve 7'den 9'a kadar olan mesajlarý siler.
+
+MEMO_HELP_SET
+ Kullanýmý: SET özellik parametre
+
+ Çeþitli mesaj ayarlarýný yapar. özellik aþaðýdakilerden
+ biri olabilir:
+
+ NOTIFY Yeni mesajlarda ne zaman uyarýlacaðýnýzý
+ belirler (sadece nickler içindir)
+ LIMIT Alabileceðiniz maksimum mesaj sayýsýný
+ belirler
+
+ Belirli bir özellik hakkýnda daha fazla bilgi için,
+ /msg %S HELP SET özellik yazýn.
+
+MEMO_HELP_SET_NOTIFY
+ Kullanýmý: SET NOTIFY {ON | LOGON | NEW | OFF}
+
+ Yeni mesajlarda ne zaman uyarýlacaðýnýzý belirler:
+
+ ON Yeni mesajlar için baðlandýðýnýzda, away den
+ dönüþte ve size gönderildikleri anda
+ uyarýlýrsýnýz.
+ LOGON Yeni mesajlar için baðlandýðýnýzda ve away den
+ dönüþte uyarýlýrsýnýz.
+ NEW Yeni mesajlar için sadece size gönderildikleri
+ anda uyarýlýrsýnýz.
+ OFF Yeni mesajlar için herhangi bir uyarý almazsýnýz.
+
+ ON parametresi LOGON ve NEW 'in kombinasyonudur
+
+MEMO_HELP_SET_LIMIT
+ Kullanýmý: SET LIMIT [kanaladý] limit
+
+ Sizin alabileceðiniz (yada belirtilen kanalýn) maksimum mesaj
+ sayýsýný belirler. Eðer bunu 0 yaparsanýz kimse size mesaj
+ gönderemeyecektir. Ayrýca bu limiti %d den fazla yapamazsýnýz.
+
+MEMO_HELP_INFO
+ Kullanýmý: INFO [kanaladý]
+
+ Sahip olduðunuz mesaj sayýsý, kaç tanesinin okunmadýðý, ve
+ alabileceðiniz maksimum mesaj sayýsý gibi bilgiler verir.
+ Eðer kanaladý parametresi belirtilirse ayný bilgiyi o kanal
+ için gösterir.
+
+MEMO_SERVADMIN_HELP_SET_LIMIT
+ Kullanýmý: SET LIMIT [kullanýcý | kanaladý] {limit | NONE} [HARD]
+
+ Bir kullanýcýcn yada kanalýn alabileceði maksimum mesaj
+ sayýsýný belirler. Bunu 0 yapmak kullanýcýnýn mesaj almasýný
+ engeller; NONE yapmaksa kullanýcýnýn istediði kadar mesaj
+ alýp saklamasýný saðlar. Eðer kanal veya nick belirtilmezse,
+ kendi limitinizi ayarlarsýnýz.
+
+ HARD parametresini eklemek kullanýcýnýn bu limiti deðiþtirmesini
+ engeller. Bunu eklememekde, kullanýcýnýn limiti deðiþtirmesine izin
+ verir. (Bir önceki limit ayarýnda HARD kullanýlmýþ olsa bile).
+
+ SET LIMIT komutunun Kullanýmý Servis adminleriyle sýnýrlýdýr.
+ Diðer kullanýcýlar limitlerini kaldýramaz, %d üzeri bir limit
+ belirleyemez, ve hard limitini ayarlayamaz. Sadece gerekli
+ ayrýcalýklarý varsa bir kanalýn mesaj limitini ve kendi mesaj
+ limitlerini ayarlayabilirler.
+
+MEMO_SERVADMIN_HELP_INFO
+ Kullanýmý: INFO [nick | kanaladý]
+
+ Parametre kullanýlmazsa, sahip olduðunuz mesajlarý, kaç
+ tanesinin okunmamýþ olduðunu, ve toplam kaç tane mesaj
+ alabileceðiniz hakkýnda bilgiler verir.
+
+ Kanaladý parametresiyle, ayný bilgiyi belirtilen kanal
+ için verir.
+
+ Nick parametresiyle, ayný bilgiyi belirtilen nick için
+ verir. Kullanýmý Servis adminleriyle sýnýrlýdýr.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_STAFF
+ Syntax: STAFF memo-text
+
+ Sends all services staff a memo containing memo-text.
+ Note: If you have opers on both the oper list and the
+ admin list they will recive the memo twice. The same
+ applies for oper's on the Root list as well as other
+ lists.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+MEMO_HELP_SENDALL
+ Syntax: SENDALL memo-text
+
+ Sends all registered users a memo containing memo-text.
+
+###########################################################################
+#
+# OperServ help messages
+#
+###########################################################################
+
+OPER_HELP
+ %S commands:
+ GLOBAL Tüm kullanýcýlara mesaj gönderir
+ STATS Servislerin ve networkun durumunu gösterir
+ OPER LIST Tüm Servis operatörlerini listeler
+ ADMIN LIST Tüm Servis adminlerini listeler
+ STAFF Display Services staff and online status
+
+OPER_HELP_OPER_CMD
+ Sadece Servis operatörleri ve adminleri için geçerli komutlar:
+ MODE Bir kanalýn modlarýný deðiþtirir
+ KICK Bir kullanýcýyý kanaldan atar
+ CLEARMODES Bir kanalýn modlarýný temizler
+ KILLCLONES Ayni ip'deki tum kullanicilari kill'ler.
+ AKILL AKILL listesini düzenler
+ SGLINE SGLINE listesini düzenler
+ SQLINE SQLINE listesini düzenler
+ SZLINE SZLINE listesini düzenler
+
+OPER_HELP_ADMIN_CMD
+ Sadece Servis adminleri için geçerli komutlar:
+ CACHE Proxy detectörü tarafindan kullanilan hostname
+ cache listesini gösterir
+ SESSION Host session(oturum) larýn listesini gösterir
+ EXCEPTION Session-limit exception listesini düzenler
+ CHANLIST Tüm kanal kayýtlarýný listeler
+ USERLIST Tüm kullanýcý kayýtlarýný listeler
+ OPER Servis operatör listesini düzenler
+ LOGONNEWS Baðlantý sýrasýnda kullanýcýnýn göreceði mesajý
+ belirler
+ RANDOMNEWS Baglanti sirasina kullaniciya gönderilen karisik
+ mesajlari belirler
+ OPERNEWS Oper olan kullanýcýlarýn görüntüleyeceði mesajý
+ belirler
+ NOOP Geçici olarak tüm O:line larý kaldýrýr
+ JUPE Bir server'ý "Kullanýlmaz" yapar
+ SET Çeþitli global servis özelliklerini ayarlar
+ UPDATE Diskteki Servis veritabanýnýn hemen
+ güncellenmesini saðlar
+ RELOAD Servislerin conf dosyasýný yeniden yükler
+ QUIT Servis programýný kapatýr
+ RESTART Veritabanýný kaydeder ve servisleri yeniden
+ baþlatýr
+ SHUTDOWN Servisler programýný kayýt ederek kapatýr
+
+ Sadece Servis super-user(root) larý için geçerli komutlar:
+ ADMIN Servis adminleri listesini düzenler
+
+OPER_HELP_ROOT_CMD
+ Commands available to Serivces Roots only:
+ MODLOAD Load a module
+ MODUNLOAD Un-Load a module
+ MODLIST List loaded modules
+ MODINFO Info about a loaded module
+
+OPER_HELP_LOGGED
+ Not: %S'e gönderilen tüm komutlarýn kaydý tutulur!
+
+OPER_HELP_GLOBAL
+ Kullanýmý: GLOBAL mesaj
+
+ IRCoplarýn networkteki tüm kullanýcýlara mesaj yollamasýný
+ saðlar. Mesajlar %s nickinden gönderilir.
+
+OPER_HELP_STATS
+ Kullanýmý: STATS [AKILL | ALL | RESET]
+
+ Hiçbir parametre yokken, mevcut kullanýcý sayýsýný ve online
+ olan IRCoplarý(Servisler hariç), Servisler baþlatýldýðýndan
+ beri baðlý olan en fazla kullanýcý sayýsýný, ve servislerin
+ çalýþma süresini gösterir.
+
+ AKILL parametresiyle, mevcut AKILL listesini ve o anki
+ varsayýlan zaman aþýmý süresini gösterir.
+
+ ALL parametresi sadece Servis adminleri tarafýndan
+ kullanýlabilir, ve servislerin kullandýðý hafýza(memory)
+ hakkýnda bilgi verir. Büyük networklerde bu komutun kullanýlmasý
+ servisleri kýsa bir süre dondurabilir, bu yüzden tekrar kullanmaya
+ kalkmayýn!
+
+ RESET parametresi önceki maksimum kullanýcý sayýsýný o anda
+ networkte bulunan kullanýcý sayýsýyla deðiþtirir.
+
+ UPTIME komutu STATS komutunun alternatifi olarak kullanýlabilir.
+
+OPER_HELP_OPER
+ Kullanýmý: OPER ADD nick
+ OPER DEL {nick | kayýt-num | liste}
+ OPER LIST [mask | liste]
+ OPER CLEAR
+
+ Servis adminlerinin Servis operatörleri listesine belirtilen
+ nicki ekleyip çýkarmasýný saðlar. Nicki Servis operatörleri
+ listesinde olan ve kendini %s ile tanýtmýþ olan kullanýcýlar
+ Servis operatörleri komutlarýný kullanabilir.
+
+ OPER ADD komutu belirtilen nicki servis operatörleri listesine
+ ekler.
+
+ OPER DEL komutu belirtilen nicki servis operatörleri listesinden
+ siler. Eðer bir kayýt numarasý listesi verilmiþse, bu kayýtlar
+ silinir. (Aþaðýdaki LIST ile ilgili örneði inceleyin.)
+
+ OPER LIST komutu servis operatörleri listesini görüntüler.
+ Eðer yýldýzlý(wildcard) bir mask belirtilirse, sadece o maskla
+ uyuþan kayýtlar listelenir. Eðerbir kayýt numarasý listesi
+ belirtilirse, sadece o kayýtlar gösterilir; Örneðin:
+
+ OPER LIST 2-5,7-9
+ Servis operatörlerinden kaydý 2 den 5 e ve 7 den 9 a
+ kadar olanlar listelenir.
+
+ OPER CLEAR komutu servis operatörleri listesindeki tüm kayýtlarý
+ siler.
+
+ Herhangi bir IRC operatörü OPER LIST komutunu kullanabilir.
+ Diðer tüm OPER komutlarýný Servis adminleri kullanabilir.
+
+OPER_HELP_ADMIN
+ Kullanýmý: ADMIN ADD nick
+ ADMIN DEL {nick | kayýt-num | liste}
+ ADMIN LIST [mask | liste]
+ ADMIN CLEAR
+
+ Servis root unun Servis adminleri listesine
+ belirtilen nicki ekleyip çýkarmasýný saðlar. Nicki Servis
+ adminleri listesinde olan ve kendini %s ile tanýtmýþ olan
+ kullanýcý Servis adminlerini komutlarýný kullanabilir.
+
+ ADMIN ADD komutu servis adminleri listesine belirtilen nicki
+ ekler.
+
+ ADMIN DEL komutu belirtilen nicki servis adminleri listesinden
+ siler. Eðer kayýt numaralarý listesi verilmiþse, bu kayýtlar
+ silinir. (Aþaðýdaki LIST örneðini inceleyin.)
+
+ ADMIN LIST komutu servis adminleri listesini görüntüler.
+ Eðer yýldýzlý(wildcard) bir mask belirtilmiþse, sadece bu
+ maskla uyuþan kayýtlar görüntülenir. Eðer bir kayýt numarasý
+ listesi belirtilmiþse, sadece o kayýtlar gösterilir; Örneðin:
+
+ ADMIN LIST 2-5,7-9
+ Servis adminleri kayýtlarýndan 2 den 5 e ve 7 den 9 a
+ kadar olanlar listelenir.
+
+ ADMIN CLEAR komutu tüm servis adminlerinin kayýtlarýný siler.
+
+ Herhangi bir IRC operatörü ADMIN LIST komutunu kullanabilir.
+ Diðer tüm ADMIN komutlarýný Servis rootlarý kullanabilir.
+
+OPER_HELP_IGNORE
+ Syntax: IGNORE {ADD|DEL|LIST} [time] [nick]
+
+ Allows Services Admins to make Services ignore an user for
+ a certain time or until the next restart. The default time
+ format is seconds. You can specify it by using units. Valid
+ units are: s for seconds, m for minutes, h for hours and
+ d for days. Combinations of these units are not permitted. To
+ make Services permanently ignore the user type 0 as time.
+
+OPER_HELP_MODE
+ Kullanýmý: MODE kanaladý modlar
+
+ Servis operatörlerinin herhangi bir kanalýn modlarýný
+ ayarlamasýný saðlar. Parametreler standart /MODE komutununkiyle
+ aynýdýr.
+
+ Servis operatörlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_UMODE
+ Syntax: UMODE user modes
+
+ Allows Services admins to set user modes for any user.
+ Parameters are the same as for the standard /MODE
+ command.
+
+ Limited to Services admins.
+
+OPER_HELP_OLINE
+ Syntax: OLINE user flags
+
+ Allows Services admins to give Operflags to any user.
+ Flags have to be prefixed with a "+" or a "-". To
+ remove all flags simply type a "-" instead of any flags.
+
+ Limited to Services admins.
+
+OPER_HELP_CLEARMODES
+ Kullanýmý: CLEARMODES kanaladý [ALL]
+
+ Bir kanaldaki tüm modlarý (i,k,l,m,n,p,s,t) ve banlarý
+ temizler. Eðer ALL parametresi belirtilmiþse, tüm
+ oplarý (+o) ve voicelarý (+v) temizler.
+
+ Servis operatörlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_KICK
+ Kullanýmý: KICK kanaladý kullanýcý sebep
+
+ IRCoplarýn herhangi bir kullanýcýyý kanaldan atmalarýný
+ saðlar. Parametreler standart /KICK komutununkiyle aynýdýr.
+ Kick mesajýnda komutu kullanan IRCop un nickide belirtilir.
+ Örneðin:
+
+ *** SpamMan has been kicked off channel #my_channel by %S (MJJ (Flood))
+
+ Servis operatörlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_SVSNICK
+ Syntax: SVSNICK nick newnick
+
+ Forcefully changes a user's nickname from nick to newnick.
+
+ Limited to Services admins
+
+OPER_HELP_AKILL
+ Kullanýmý: AKILL ADD [+zamanaþýmý] mask sebep
+ AKILL DEL {mask | kayýt-no | liste}
+ AKILL LIST [mask | liste]
+ AKILL VIEW [mask | liste]
+ AKILL CLEAR
+
+ Servis operatörlerinin AKILL listesini iþletmesini saðlar.
+ Eðer AKILL listesineki mask la uyuþan bir kullanýcý
+ baðlanmaya çalýþýrsa, Servisler o kullanýcýyý KILL ler ve,
+ destekleyen server tiplerinde, tüm serverlarýn o maska K-line
+ koymasýný saðlar.
+
+ AKILL ADD belirtilen user@host maskýný AKILL listesine
+ belirtilen sebeple(mutlaka belirtilmelidir) birlikte
+ ekler. AKILL DEL belirtilen maský eðer listedeyse AKILL
+ listesinden çýkarýr. AKILL LIST mevcut tüm AKILL leri
+ gösterir; eðer opsiyonel olarak mask belirtilmiþse, AKILL
+ listesi belirtilen maskla uyuþanlarla sýnýrlandýrýlýr.
+
+ AKILL VIEW, AKILL LIST in daha açýklayýcý versiyonudur,
+ ve AKILL i ekleyeni, eklenme tarihini, ne zaman sona ereceðini,
+ user@host maskýyla ve sebeple birlikte gösterir.
+
+ Opsiyonel olarak, zaman aþýmý süresi AKILL ADD komutuyla
+ birlikte belirtilebilir. Zaman aþýmý süresi user@host maskýndan
+ önce gelir, ve bir tamsayý olarak þunlardan birinden önce gelir,
+ d (gün), h (saat), veya m (dakika). 1h30m gibi kombinasyonlar
+ kullanýlamaz. Eðer birim belirleyici belirtilmemiþse varsayýlan
+ olarak gün kullanýlýr (yani +30 un anlamý 30 gündür). Zaman
+ aþýmýna uðramayacak bir AKILL eklemek için +0 kullanýn. Eðer
+ eklenecek mask + ile baþlarsa zaman aþýmý süresi belirtilmelidir.
+ Mevcut varsayýlan AKILL zaman aþýmý süresi STATS AKILL komutuyla
+ bulunabilir.
+
+ AKILL CLEAR AKILL listesindeki tüm kayýtlarý siler.
+
+ sebep sadece IRC operatörleri tarafýndan kullanýlmak içindir,
+ ve kullanýcýlarýn KILL mesajlarýnda gözükmez.
+
+ Servis operatörlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_SGLINE
+ Kullanýmý: SGLINE ADD [+zamanaþýmý] mask:sebep
+ SGLINE DEL {mask | kayýt-no | liste}
+ SGLINE LIST [mask | liste]
+ SGLINE VIEW [mask | liste]
+ SGLINE CLEAR
+
+ Servis operatörlerinin SGLINE listesi oluþturmalarýný saðlar.
+ Eðer SGLINE listesindeki bir kullanýcý gerçek ismi(realname)
+ servera baðlanmaya çalýþan bir kullanýcýnýnkiyle uyuþuyorsa
+ o kullanýcýnýn servera baðlanmasý engellenir.
+
+ SGLINE ADD komutu belirtilen realname(gerçek isim) mask ýný
+ SGLINE listesine bir sebeple(belirtilmesi zorunludur)
+ birlikte ekler.
+ zamanaþýmý zaman belirleyici olarak tanýmlanýr ve þunlar birini
+ takip etmelidir: d (gün), h (saat), veya m (dakika). 1h30m
+ þeklindeki kombinasyonlar kullanýlamaz. Eðer zaman tanýmlayýcý öðe
+ konulmazsa varsayýlan olarak gün kabul edilir (yani +30 un manasý
+ 30 gündür). Zaman aþýmýna uðramayacak bir SGLINE eklemek için +0
+ kullanýn. Eklenecek realname mask ý + ile baþlýyorsa, o zaman
+ zaman aþýmý süresi varsayýlanla ayný olsa bile belirtilmelidir.
+ Mevcut SGLINE varsayýlan zaman aþýmý süresi STATS AKILL komutuyla
+ bulunabilir.
+ Not: realname maský boþluk içerebileceðinden bunla sebep arasýnda iki
+ nokta üstüste(:) kullanýlmalýdýr.
+
+ SGLINE DEL komutu belirtilen maský(eðer listede mevcutsa) SGLINE
+ listesinden siler. eðer bir kayýt numaralarý listesi belirtilmiþse
+ o kayýtlar silinir. (Aþaðýdaki LIST için verilmiþ örneði inceleyin.)
+
+ SGLINE LIST komutu SGLINE listesini görüntüler. Eðer bir yýldýzlý
+ mask verilmiþse, sadece o maskla uyuþan kayýtlarý içeren bir liste
+ görüntülenir. Eðer bir kayýt numaralarý listesi belirtilmiþse,
+ sadece o kayýtlar görüntülenir; örneðin:
+
+ SGLINE LIST 2-5,7-9
+ 2 den 5 e 7 den 9 a kadar olan SGLINE kayýtlarýný listeler.
+
+ SGLINE VIEW komutu SGLINE LIST komutunun daha açýklayýcý bilgi
+ veren þeklidir, ve SGLINE ý kimin eklediðini, eklendiði tarihi, ve
+ ne zaman sona ereceðini realname ve sebeple birlikte gösterir.
+
+ SGLINE CLEAR komutu SGLINE listesindeki tüm kayýtlarý siler.
+
+ Servis operatörlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_SQLINE
+ Kullanimi: SQLINE ADD [+zamanasimi] mask sebep
+ SQLINE DEL {mask | kayit-no | liste}
+ SQLINE LIST [mask | liste]
+ SQLINE VIEW [mask | liste]
+ SQLINE CLEAR
+
+ Servis adminlerinin SQLINE listesini yönetmelerini saglar.
+ Eger SQLINE listesindeki masklardan biriyle uyusan bir nick
+ servera baglanmaya çalisirsa, servisler buna izin vermezler.
+
+ eger maskin ilk karakteri # ise servisler onla uyusan
+ kanallarin kullanilmasina izin vermezler. (destekleyen IRCd
+ yazilimlarinda geçerlidir).
+
+ SQLINE ADD belirtilen maski belirtilen sebeple (mutlaka
+ belirtilmelidir) birlikte SQLINE listesine ekler. zaman asimi
+ ardinda d (gün), h (saat), veya m (dakika) olan bir sayi
+ olmalidir.. 1h30m seklindeki kombinasyonlar geçersizdir.
+ eger son ekleme harfi belirtilmemisse, varsayilan olarak gün
+ kullanilir. (yani +30 30 gün demektir). Zaman asimina ugramasini
+ istemediginiz bir SQLINE eklemek için +0 kullanin.
+ Egegr eklenecek maskin basinda + varsa, zaman asimi süresi
+ belirtilmelidir, aksi halde zaman asimi süresi varsayilanla ayni
+ olacaktir. Mevcut SQLINE varsayilan zaman asimi süresi STATS AKILL
+ komutuyla bulunabilir.
+
+ SQLINE DEL komutu belirtilen maski SQLINE listesinden siler.
+ Eger kayit numaralari listesi belirtilmisse, o kayitlari siler.
+ (Asagidaki örnegi inceleyin.)
+
+ SQLINE LIST komutu SQLINE listesini gösterir. Egegr bir mask
+ belirtilmisse, maskla uyusan kayitlar gösterilir. Egegr kayit
+ numaralari listesi belirtilmisse, o numaralara karsilik olan
+ kayitlar gösterilir; örnegin:
+
+ SQLINE LIST 2-5,7-9
+ 2 den 5 e ve 7 den 9 a kadar olan SQLINE kayitlari
+ gösterilir.
+
+ SQLINE VIEW komutu SQLINE LIST komutunun daha gelismisidir,
+ ve SQLINE kaydini ekleyeni, eklendigi tarihi, süresinin ne zaman
+ bitecegini, mask ve sebeple beraber gösterir.
+
+ SQLINE CLEAR SQLINE listesindeki tüm kayitlari temizler.
+
+ Servis operatörlerinin kullanimiyla sinirlidir.
+
+OPER_HELP_SZLINE
+ Kullanýmý: SZLINE ADD [+zamanaþýmý] mask sebep
+ SZLINE DEL {mask | kayýt-no | liste}
+ SZLINE LIST [mask | liste]
+ SZLINE VIEW [mask | liste]
+ SZLINE CLEAR
+
+ Servis operatörlerinin SZLINE listesi oluþturmalarýný saðlar.
+ Eðer SZLINE listesindeki bir IP numarasýyla uyuþan bir kiþi
+ servera baðlanmaya çalýþýrsa buna izin verilmez. (ve bu IP
+ numarasý PTR RR olsada olmasada gerçekleþtirilir).
+
+ SZLINE ADD komutu belirtilen IP maskýný SZLINE listesine
+ belirtilen bir sebeple(ki mutlaka belirtilmelidir) birlikte
+ ekler. zamanaþýmý zaman belirleyici olarak tanýmlanýr ve
+ þunlardan birini takip etmelidir: d (gün), h (saat), veya
+ m (dakika). 1h30m þeklindeki kombinasyonlar kullanýlamaz.
+ Eðer zaman tanýmlayýcý öðe belirtilmemiþse, varsayýlan olarak
+ gün kullanýlýr (yani +30 30 gün demektir). Zaman aþýmýna
+ uðramayacak bir SZLINE eklemek için +0 kullanýn. Eðer
+ eklenecek realname maský + ile baþlýyorsa, zaman aþýmý süresi
+ varsayýlanla ayný olsa bile belirtilmelidir. Mevcut SZLINE
+ varsayýlan zaman aþýmý süresi STATS AKILL komutuyla öðrenilebilir.
+
+ SZLINE DEL komutu belirtilen maský eðer mevcutsa SZLINE
+ listesinden siler. Eðer kayýt numaralarý listesi belirtilmiþse,
+ bu kayýtlar silinir. (LIST için verilmiþ aþaðýdaki örneði inceleyin.)
+
+ SZLINE LIST komutu SZLINE listesini görüntüler. Eðer yýldýzlý bir
+ mask belirtilmiþse, sadece o maskla uyuþan kayýtlar görüntülenir.
+ Eðer kayýt numaralarý listesi belirtilmiþse, sadece o kayýtlar
+ gösterilir; örneðin:
+
+ SZLINE LIST 2-5,7-9
+ 2 den 5 e 7 den 9 a kadar olan kayýtlarý görüntüler.
+
+ SZLINE VIEW komutu SZLINE LIST komutunun daha geniþ bilgi veren
+ bir þeklidir, ve SZLINE ý kimin eklediðini, eklendiði tarihi, ve ne
+ zaman sona ereceðini, IP maský ve sebeple birlikte görüntüler.
+
+ SZLINE CLEAR komutu SZLINE listesindeki tüm kayýtlarý siler.
+
+ Servis operatörlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_SET
+ Kullanýmý: SET özellik ayar
+
+ Çeþitli global servis özelliklerini ayarlar. Özellikler
+ aþaðýda tanýmlanmýþtýr:
+ READONLY Read-only ve read-write modunu ayarlar
+ LOGCHAN Report log messages to a channel
+ DEBUG Debug modunu aktifleþtirir yada kapatýr
+ NOEXPIRE No expire modunu aktifleþtirir yada kapatýr
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_SET_READONLY
+ Kullanýmý: SET READONLY {ON | OFF}
+
+ Read-only modunu açar yada kapatýr. Read-only modunda,
+ normal kullanýcýlar herhangi bir servis verisini deðiþtiremezler,
+ bunun içinde kanal ve nick access listeleri v.s. vardýr.
+ Yeterli ayrýcalýklarý olan IRCoplar servislerin AKILL listesini
+ deðiþtirebilir, nicklerin ve kanallarýn kaydýný silebilir yada
+ yasaklayabilir, fakat deðiþiklikler servisler kapatýlmadan yada
+ tekrar baþlatýlmadan önce read-only modu kapatýlmazsa kaydedilmez.
+
+ -readonly komut satýrý özelliðiyle aynýdýr.
+
+OPER_HELP_SET_LOGCHAN
+ Syntax: SET LOGCHAN {ON | OFF}
+
+ With this setting on, Services will send its logs to a specified
+ channel as well as the log file. LogChannel must also be defined
+ in the Services configuration file for this setting to be of any
+ use.
+
+ Note: This can have strong security implications if your log
+ channel is not properly secured.
+
+OPER_HELP_SET_DEBUG
+ Kullanýmý: SET DEBUG {ON | OFF | num}
+
+ Debug modunu açar yada kapatýr. Debug modunda, servislere
+ gönderilen ve alýnan tüm veriler diðer bir kaç debug
+ mesajlarýyla beraber bir kayýt dosyasýna yazýlýr. Eðer num
+ parametresi belirtilmiþse, debug modu num a baðlý debug
+ seviye ayarý ile aktifleþtirilir.
+
+ -debug komut satýrý özelliðiyle aynýdýr.
+
+OPER_HELP_SET_NOEXPIRE
+ Kullanýmý: SET NOEXPIRE {ON | OFF}
+
+ No expire modunu açar yada kapatýr. No expire modunda,
+ nickler, kanallar, akiller, ve exceptionlar mod kapanana
+ kadar zaman aþýmýna uðramazlar.
+
+ -noexpire komut satýrý özelliðiyle aynýdýr.
+
+OPER_HELP_SET_SUPERADMIN
+ Syntax: SET SUPERADMIN {ON | OFF}
+
+ Setting this will grant you extra privlages such as the
+ ability to be "founder" on all channel's etc...
+
+ This opion is _NOT_ persistant, and should only be used when
+ needed, and set back to OFF when no longer needed.
+
+
+OPER_HELP_NOOP
+ Kullanýmý: NOOP SET server
+ NOOP REVOKE server
+
+ NOOP SET komutu belirtilen serverdaki tüm O:line larý
+ siler ve tüm ircoplarý rehash komutunu kullanýp komutun
+ etkisini yok etmemeleri için killer.
+
+ NOOP REVOKE komutu belirtilen serverdaki tüm kaldýrýlmýþ
+ O:line larý yeniden oluþturur.
+
+ Not: server parametresinin doðruluðu servisler tarafýndan
+ kontrol edilmez.
+
+ Services adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_JUPE
+ Kullanýmý: JUPE server [sebep]
+
+ Servislere bir serverýn Jupiter yapýlmasýný söyler. -- Bu,
+ servislere bir sahte server baðlayarak, gerçek serverýn o
+ isimden baðlanmasýný engeller. JUPE modu standart SQUIT
+ kullanýlarak kaldýrýlabilir. Eðer sebep belirtilmiþse,
+ bu server bilgi satýrýna yazýlýr; belirtilmezse server bilgi
+ satýrýnda "Jupitered by <nick>" yazýsý yer alýr, ve serverý
+ jupiter edenin nicki yazýlýr.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_RAW
+ Kullanýmý: RAW yazý
+
+ Servislerin baðlý olduðu server a direk bir yazý gönderir.
+ Bu komutun kullaným alanlarý sýnýrlýdýr, ve yanlýþ kullanýlýrsa
+ networkte çok büyük hasara yol açabilir. Tam olarak ne
+ yaptýðýnýzý bilmiyorsanýz BU KOMUTU KULLANMAYIN!
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_UPDATE
+ Kullanýmý: UPDATE
+
+ Komutu gönderir gönderirmez servislerin tüm veri tabaný
+ dosyalarýný güncellemelerini saðlar.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_RELOAD
+ Kullanýmý: RELOAD
+
+ Servislerin conf dosyasýný yeniden yüklemesine neden olur.
+ Unutmayýnki bazý direktifler hala servislerin yeniden
+ baþlatýlmasýný gerektirir. (Servislerin nickleri, session
+ limitinin aktifleþtirilmesi, etc.)
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_QUIT
+ Kullanýmý: QUIT
+
+ Servislerin birden kapanmasýna neden olur; veritabanlarý
+ kaydedilmez. Bu komut veritabanlarýnýn hafýzadaki
+ kopyalarýna zarar gelmesinden korkuluyorsa ve
+ yedeklenmemiþlerse kullanýlmamalýdýr. Normal kapatmalar
+ için, SHUTDOWN komutunu kullanýn.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_SHUTDOWN
+ Kulanýmý: SHUTDOWN
+
+ Servislerin tüm veritabanlarýný kaydederek kapanmasýný saðlar.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_RESTART
+ Kullanýmý: RESTART
+
+ Servislerin tüm veritabanlarýný kaydederek yeniden
+ baþlamasýný saðlar.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_KILLCLONES
+ Kullanýmý: KILLCLONES nick
+
+ Hostnameleri ayný olan tüm kullanýcýlarý kill ler.
+ Geçici bir AKILL, *@host formatýnda, eklenerek
+ kullanýcýnýn hemen yeniden baðlanmasýna engel olunur.
+ Komutu kullananý, hangi hostname in etkilendiðini ve
+ kaç tane kullanýcýnýn kill lendiðini belirten bir wallop
+ gönderilir. Networkten sayýsýz clone larý temizlemek için
+ kullanýþlýdýr.
+
+ Servis operatörlerinin kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_CHANLIST
+ Kullanýmý: CHANLIST [{model | nick} [SECRET]]
+
+ Networkte o an kullanýlan kanallarý kayýtlý olsun olmasýn
+ listeler.
+
+ Eðer model belirtilmiþse, onla uyuþan kanallarý listeler.
+ Eðer nickname belirtilmiþse, o kullanýcýnýn bulunduðu
+ kanallarý listeler. Eðer SECRET belirtilmiþse, sadece model
+ le uyuþan ve +s veya +p modunda olan kanallar listelenir.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_USERLIST
+ Kullanýmý: USERLIST [{model | kanaladý} [INVISIBLE]]
+
+ Networkte o an bulunan tüm kullanýcýlarý kayýtlý olsun olmasýn
+ listeler.
+
+ Eðer model belirtilmiþse, onla uyuþan kullanýcýlarý listeler
+ (nick!user@host formatýnda olmalýdýr). Eðer kanaladý
+ belirtilmiþse, sadece o kanalda bulunan kullanýcýlarý listeler.
+ Eðer INVISIBLE belirtilmiþse, sadece +i modundaki kullanýcýlar
+ listelenir.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+OPER_HELP_CACHE
+ Kullanimi: CACHE DEL hostadi
+ CACHE LIST model [QUEUED | ALL]
+
+ CACHE DEL komutu belirtilen hostadini cache ten siler.
+ sadece hata kontrolü için kullanilir.
+
+ CACHE LIST komutu belirtilen modele uyan tüm proxy leri
+ listeler. Eger QUEUED özelligi belirtilmisse, siradaki veya
+ aktif taramalardaki proxy leri listeler. Eger ALL özelligi
+ belirtilmis ise tüm cache teki hostadlarini listeler.
+
+ Servis adminlerinin kullanimiyla sinirlidir..
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+OPER_HELP_MODLOAD
+ Syntax: MODLOAD FileName
+
+ This command loads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODUNLOAD
+ Syntax: MODUNLOAD FileName
+
+ This command unloads the module named FileName from the modules
+ directory.
+
+ Limited to Services Roots.
+
+OPER_HELP_MODINFO
+ Syntax: MODINFO FileName
+
+ This command lists information about the specified loaded module
+
+ Limited to Services Roots.
+
+OPER_HELP_MODLIST
+ Syntax: MODLIST
+
+ Lists all currently loaded modules.
+
+ Limited to Services Roots.
+
+
+###########################################################################
+#
+# BotServ help messages
+#
+###########################################################################
+
+BOT_HELP
+ %S kanalýnýzda bir botunuzun olmasýný saðlar. Bu
+ servis bot konfigürasyonundan anlamayanlar yada
+ bota izin vermeyen networkler için geliþtirilmiþtir.
+ Mevcut komutlar aþaðýda listelenmiþtir. Kullanmak için
+ /msg %S command yazýn. Belirli bir komut hakkýnda
+ daha fazla bilgi için, /msg %S HELP komut
+ yazýn.
+
+ BOTLIST Mevcut botlarý listeler
+ ASSIGN Kanala bot sokar
+ SET Bot özelliklerini ayarlar
+ KICK Atma özelliklerini ayarlar
+ BADWORDS Küfür listesi oluþturur
+
+ Diðer komutlar: ACT INFO SAY UNASSIGN
+
+ Kanalda en az %d kullanýcý olduðu zaman bot kanala girer.
+
+BOT_HELP_BOTLIST
+ Kullanýmý: BOTLIST
+
+ Networkte mevcut olan tüm botlarý listeler.
+
+BOT_HELP_ASSIGN
+ Kullanýmý: ASSIGN kanaladý botunnicki
+
+ Belirtilen nickteki botu belirtilen kanala sokar. Bundan
+ sonra botun ayarlarýný ihtiyaçlarýnýza uygun þekilde
+ yapabilirsiniz.
+
+BOT_HELP_UNASSIGN
+ Kullanýmý: UNASSIGN kanaladý
+
+ Belirtilen kanaldan botu çýkarýr. Bu komutu kullandýktan
+ sonra bot bir daha kanala girmeyecektir. Fakat yapýlmýþ bot
+ ayarlarý saklanýr, böylece istediðinz zaman tekrar ayar
+ yapmaya gerek olmadan kanala bot sokabilirsiniz.
+
+BOT_HELP_INFO
+ Kullanýmý: INFO {kanaladý | botunnicki}
+
+ Bir kanal yada bot hakkýnda %S bilgisini gösterir. Eðer
+ parametre kanalsa, aktif atma özellikleri hakkýnda bilgi
+ alýrsýnýz. Eðer parametre nickse, bot hakkýnda yaratýlma
+ zamaný veya bulunduðu kanal sayýsý gibi bilgiler alýrsýnýz.
+
+BOT_HELP_SET
+ Kullanýmý: SET kanaladý özellik parametre
+
+ Bot özelliklerini ayarlar. özellik þunlardan biri olabilir:
+
+ DONTKICKOPS Botun atmasýna karþý oplarý korur
+ DONTKICKVOICES Botun atmasýna karþý voice larý korur
+ GREET Greet mesajýný aktifleþtirir
+ FANTASY Fantazi komutlarýný aktifleþtirir
+ SYMBIOSIS Gerçek bot gibi davranmasýný saðlar.
+
+ Belirli bir komut hakkýnda daha fazla bilgi için
+ /msg %S HELP SET özellik yazýn.
+
+ Not: Bu komuta access eriþimi seviye(level) ayarýyla saðlanýr.
+
+BOT_HELP_SET_DONTKICKOPS
+ Kullanýmý: SET kanaladý DONTKICKOPS {ON|OFF}
+
+ Kanalda op korumasýný açar yada kapatýr.
+ Aktifleþtirildiði zaman, oplar bot tarafýnda NOKICK
+ seviyeleri olmasalar bile atýlmazlar.
+
+BOT_HELP_SET_DONTKICKVOICES
+ Kullanýmý: SET kanaladý DONTKICKVOICES {ON|OFF}
+
+ Kanalda voice korumasýný açar yada kapatýr.
+ Aktifleþtirildiði zaman, voice lar bot tarafýndan
+ NOKICK seviyeleri olmasalar bile atýlmazlar.
+
+BOT_HELP_SET_FANTASY
+ Kullanýmý: SET kanaladý FANTASY {ON|OFF}
+
+ Kanalda fantazi modunu açar yada kapatýr.
+ Aktifleþtirildiði zaman, kulanýcýlar kanalda
+ !op, !deop, !voice, !devoice, !kick, !kb,
+ !unban, !seen gibi komutlarý kullanabilirler.
+ (nasýl kullanýldýklarýný öðrenmek için; onlarý
+ nickle ve nicksiz kullanýn vede bazýlarýndada sebep
+ belirtin).
+
+ Unutmayýnki fantazi komutlarýný kullanmak
+ isteyen kullanýcýlarýn FANTASIA ve komutun
+ gerektirdiði diðer seviyelere yeterli access
+ seviyesi olmasý gereklidir. (örneðin, !op
+ komutunu kullanmak için, kullanýcýnýn OPDEOP
+ seviyesine yeterli access i olmalýdýr).
+
+BOT_HELP_SET_GREET
+ Kullanýmý: SET kanaladý GREET {ON|OFF}
+
+ Kanalda karþýlama modunu açar yada kapatýr.
+ Aktifleþtirildiði zaman, bot kanala giren
+ kullanýcýlara bir karþýlama mesajý gönderir,
+ tabi eðer bu kiþilerin yeterli access leri varsa.
+
+BOT_HELP_SET_SYMBIOSIS
+ Kullanýmý: SET kanaladý SYMBIOSIS {ON|OFF}
+
+ Kanalda simbiyoz modunu açar yada kapatýr.
+ Aktifleþtirildiði zaman bot %s'ün yaptýðý herþeyi
+ kendisi yapar. Modelar, kickler, ve giriþ mesajý gibi.
+
+BOT_HELP_KICK
+ Kullanýmý: KICK kanaladý özellik parametre
+
+ Botun kick lerini ayarlar. özellik þunlardan biri olabilir:
+
+ BOLDS Kalýn yazýda atar
+ BADWORDS Küfürde atar
+ CAPS Büyük yazýda atar
+ COLORS Renkli yazýda atar
+ FLOOD Flood da atar
+ REPEAT Kendini tekrar edenleri atar
+ REVERSES Ctrl+r nin kullanýlmasýnda atar
+ UNDERLINES Altýçizgili yazýda atar
+
+ Belirli bir özellik hakkýnda daha fazla bilgi için
+ /msg %S HELP KICK özellik yazýn.
+
+ Not: Bu komuta eriþim seviye(level) ayarýyla yapýlýr.
+
+BOT_HELP_KICK_BOLDS
+ Kullanýmý: KICK kanaladý BOLDS {ON|OFF} [böas]
+
+ Kalýn yazýda atmayý açar yada kapatýr.
+ Aktifleþtirildiðinde bu özellik bota kalýn yazý
+ kullananlarý atmasýný söyler.
+
+ böas banlamadan önce kiþinin kaç kez atýlacaðýný
+ belirler. Kaldýrmak için komutta böas ý belirtmeyin.
+
+BOT_HELP_KICK_COLORS
+ Kullanýmý: KICK kanaladý COLORS {ON|OFF} [böas]
+
+ Renkli yazýda atmayý açar yada kapatýr.
+ Aktifleþtirildiðinde bu özellik bota renkli yazý
+ kullananlarý atmasýný söyler.
+
+ böas banlamadan önce kiþinin kaç kez atýlacaðýný
+ belirler. Kaldýrmak için komutta böas ý belirtmeyin.
+
+BOT_HELP_KICK_REVERSES
+ Kullanýmý: KICK kanaladý REVERSES {ON|OFF} [böas]
+
+ Ctrl+r nin kullanýlmasýnda atmayý açar yada kapatýr.
+ Aktifleþtirildiðinde bu özellik bota Ctrl+r yi
+ kullananlarý atmasýný söyler.
+
+ böas banlamadan önce kiþinin kaç kez atýlacaðýný
+ belirler. Kaldýrmak için komutta böas ý belirtmeyin.
+
+BOT_HELP_KICK_UNDERLINES
+ Kullanýmý: KICK kanaladý UNDERLINES {ON|OFF} [böas]
+
+ Altýçizgili yazýda atmayý açar yada kapatýr.
+ Aktifleþtirildiðinde bu özellik bota altýçizgili
+ yazanlarý atmasýný söyler.
+
+ böas banlamadan önce kiþinin kaç kez atýlacaðýný
+ belirler. Kaldýrmak için komutta böas ý belirtmeyin.
+
+BOT_HELP_KICK_CAPS
+ Kullanýmý: KICK kanaladý CAPS {ON|OFF} [böas [min [yüzde]]]
+
+ Büyük yazýda atmayý açar yada kapatýr.
+ Aktifleþtirildiðinde bu özellik bota büyük yazý
+ kullananlarý atmasýný söyler.
+
+ Bot belirtilen en az(min) büyük harfin toplam yazýnýn
+ yüzdesine%% baðlý olarak atar. (Belirtilmemiþse,
+ varsayýlan olarak 10 karakter ve 25%% de atar).
+
+ böas banlamadan önce kiþinin kaç kez atýlacaðýný
+ belirler. Kaldýrmak için komutta böas ý belirtmeyin.
+
+BOT_HELP_KICK_FLOOD
+ Kullanýmý: KICK kanaladý FLOOD {ON|OFF} [böas [sýra [sn]]]
+
+ Flood da atmayý açar yada kapatýr. Aktifleþtirildiðinde
+ bu özellik bota sn saniyede enaz sýra sýrada flood
+ yapanlarý atmasýný söyler. (Belirtilmemiþse varsayýlan
+ olarak 10 saniyede 6 sýra da atar).
+
+ böas banlamadan önce kiþinin kaç kez atýlacaðýný
+ belirler. Kaldýrmak için komutta böas ý belirtmeyin.
+
+BOT_HELP_KICK_REPEAT
+ Kullanýmý: KICK #kanaladý REPEAT {ON|OFF} [böas [sayý]]
+
+ Tekrar yazýlan ayný yazýda atmayý açar yada kapar.
+ Aktifleþtirildiðinde bu özellik bota kendilerini
+ sayý kez tekrar edenleri atmasýný söyler. (Eðer
+ sayý belirtilmemiþse, varsayýlan olarak 3 tür).
+
+ böas banlamadan önce kiþinin kaç kez atýlacaðýný
+ belirler. Kaldýrmak için komutta böas ý belirtmeyin.
+
+BOT_HELP_KICK_BADWORDS
+ Kullanýmý: KICK #channel BADWORDS {ON|OFF} [böas]
+
+ Küfürde atmayý açar yada kapatýr. Aktifleþtirildiðinde
+ bu özellik bota küfür edenleri atmasýný söyler.
+
+ Bir kanal için küfür belirlemek için BADWORDS komutunu
+ kullanabilirsiniz. Ayrýntýlar için /msg %S HELP BADWORDS
+ yazýn.
+
+ böas banlamadan önce kiþinin kaç kez atýlacaðýný
+ belirler. Kaldýrmak için komutta böas ý belirtmeyin.
+
+BOT_HELP_BADWORDS
+ Kullanýmý: BADWORDS kanaladý ADD kelime [SINGLE | START | END]
+ BADWORDS kanaladý DEL {kelime | kayýt-no | liste}
+ BADWORDS kanaladý LIST [mask | liste]
+ BADWORDS kanaladý CLEAR
+
+ Bir kanal için küfür listesi düzenler. Küfür listesi
+ küfürde atma aktifleþtirildiði zaman hangi kelimelerde
+ atýlacaðýný belirler. Daha fazla bilgi için
+ /msg %S HELP KICK BADWORDS yazýn.
+
+ BADWORDS ADD komutu belirtilen kelimeyi küfür listesine
+ ekler. Eðer SINGLE parametresi belirtilmiþse, atma iþlemi
+ kullanýcý o kelimenin tamamýný söylerse yapýlýr. Eðer START
+ parametresi belirtilmiþse, kullanýcý o kelimeyle baþlayan
+ birþey söylediðinde atýlýr. Eðer END parametresi belirtilmiþse
+ kullanýcý o kelimeyle biten birþey söylediðinde atýlýr.
+ Eðer bir parametre kullanmazsanýz, atma iþlemi kullanýcý o
+ kelimeyi her kullandýðýnda yapýlýr.
+
+ BADWORDS DEL komutu belirtilen kelimeyi küfür listesinden
+ siler. Eðer kayýt numarasý listesi verilirse, o kelimeler
+ silinir. (LIST için aþaðýdaki örneði inceleyin)
+
+ BADWORDS LIST komutu küfür listesini görüntüler. Eðer
+ bir küfürün bir kýsmý belirtilmiþse, o kýsma uyan küfürler
+ listelenir. Eðer bir kayýt numarasý listesi belirtilmiþse,
+ sadece o küfürler listelenir; örneðin:
+
+ BADWORDS #kanaladý LIST 2-5,7-9
+ 2'den 5'e ve 7'den 9'a kadar olan küfürler
+ listelenir.
+
+ BADWORDS CLEAR komutu tüm küfür listesini temizler.
+
+BOT_HELP_SAY
+ Kullanýmý: SAY kanaladý yazý
+
+ Botun belirtilen yazýyý belirtilen kanalda söylemesini saðlar.
+
+BOT_HELP_ACT
+ Kullanýmý: ACT kanaladý yazý
+
+ Botun belirtilen yazýyla belirtilen kanalda "/me" komutunun
+ yaptýðýný kendi üzerinde yapmasýný saðlar.
+
+BOT_SERVADMIN_HELP
+
+ Aþaðýdaki komut Servis adminleri tarafýndan kullanýlýr:
+
+ BOT Networkün bot listesini düzenler
+
+BOT_SERVADMIN_HELP_BOT
+ Kullanýmý: BOT ADD nick user host gerçekismi
+ BOT CHANGE eskinick yeninick [user [host [gerçekismi]]]
+ BOT DEL nick
+ BOT LIST
+
+ Servis adminlerinin kullanýcýlarýn kanallarýnda kullanmasý
+ için botlarý yaratmasýný, deðiþtirmesini ve silmesini saðlar.
+
+ BOT ADD belirtilen nickte, username, hostname ve gerçek
+ isimde bir bot ekler. Doðruluk sýnamasý yapýlmadýðýnda komutu
+ kullanýrken çok dikkatli olun.
+ BOT CHANGE botun nickini, username ini, hostname ini veya
+ gerçek ismini silmeye gerek kalmadan deðiþtirmeyi saðlar.
+ BOT DEL belirtilen botu bot listesinden siler.
+ BOT LIST komutu BOTLIST ile aynýdýr ve sadece networkteki
+ mevcut botlarý listeler.
+
+ Not: Eðer botun nicki olarak, kayýtlý bir nick
+ kullanýrsanýz o nickin kaydý silinir(drop). Ayrýca
+ o an bir kuulanýcý bu nicki kullanýyorsa kill lenir.
+
+BOT_SERVADMIN_HELP_SET
+
+ Bu özellikleri servis adminlerini kullanabilir:
+
+ NOBOT Bir kanala bot girmesini engeller.
+ PRIVATE Botun IRC operatörleri haricinde kanallara
+ sokulmasini engeller
+
+
+BOT_SERVADMIN_HELP_SET_NOBOT
+ Kullanýmý: SET kanaladý NOBOT {ON|OFF}
+
+ Bu özellik bir kanalý bot sokulamaz hale getirir. Eðer
+ kanala zaten bir bot sokulmuþsa otomatik olarak o bot
+ kanaldan çýkarýlýr.
+
+ Servis adminlerinin Kullanýmýyla sýnýrlýdýr.
+
+BOT_SERVADMIN_HELP_SET_PRIVATE
+ Kullanýmý: SET botun-nicki PRIVATE {ON|OFF}
+
+ Bu özellik IRC Operatörleri disindaki userlarin bu
+ botlari kanallara sokmalarini engeller.
+
+ Bu komutu Servis Adminleri kullanabilir.
+HOST_EMPTY
+ The vhost list is empty.
+HOST_ENTRY
+ #%d Nick:%s, vhost:%s (%s - %s)
+HOST_IDENT_ENTRY
+ #%d Nick:%s, vhost:%s@%s (%s - %s)
+HOST_SET
+ vhost for %s set to %s.
+HOST_IDENT_SET
+ vhost for %s set to %s@%s.
+HOST_SETALL
+ vhost for group %s set to %s.
+HOST_DELALL
+ vhosts for group %s have been removed.
+HOST_DELALL_SYNTAX
+ Syntax: DELALL <nick>.
+HOST_IDENT_SETALL
+ vhost for group %s set to %s@%s.
+HOST_SET_ERROR
+ Error! A vhost can only contain A-Z, a-z, 0-9, '.' and '-'.
+HOST_SET_IDENT_ERROR
+ A vhost ident must be in the format of a valid ident
+HOST_SET_TOOLONG
+ Error! The vhost is too long, please use a host shorter than %d characters.
+HOST_SET_IDENTTOOLONG
+ Error! The Ident is too long, please use an ident shorter than %d characters.
+HOST_NOREG
+ User %s not found in the nickserv db.
+HOST_SET_SYNTAX
+ Syntax /msg %s set <nick> <hostmask>.
+HOST_SETALL_SYNTAX
+ Syntax /msg %s setall <nick> <hostmask>.
+HOST_DENIED
+ Access Denied.
+HOST_NOT_ASSIGNED
+ Please contact an Operator to get a vhost assigned to this nick.
+HOST_ACTIVATED
+ Your vhost of %s is now activated.
+HOST_IDENT_ACTIVATED
+ Your vhost of %s@%s is now activated.
+HOST_ID
+ Please identify to services first.
+HOST_NOT_REGED
+ You need to register before a vhost can be assigned to you.
+HOST_DEL
+ vhost for %s removed.
+HOST_DEL_SYNTAX
+ Syntax: /msg %s del <nick>.
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_OFF_UNREAL
+ Your vhost was removed. To re-enable the standard host cloaking, type /mode %s +x
+HOST_NO_VIDENT
+ Your IRCD does not support vIdent's, if this is incorrect, please report this as a possible bug
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_GROUP
+ All vhost's in the group %s have been set to %s
+HOST_IDENT_GROUP
+ All vhost's in the group %s have been set to %s@%s
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_LIST_FOOTER
+ Displayed all records (Count: %d)
+HOST_LIST_RANGE_FOOTER
+ Displayed records from %d to %d
+HOST_LIST_KEY_FOOTER
+ Displayed records matching key %s (Count: %d)
+
+###########################################################################
+#
+# HostServ Help messages
+#
+###########################################################################
+HOST_HELP
+ %S commands:
+ ON Activates your assigned vhost
+ OFF Deactivates your assigned vhost
+
+HOST_OPER_HELP
+ Commands available to services operators only:
+ SET Set the vhost of another user
+ SETALL Set the vhost for all nicks in a group
+ DEL Delete the vhost of another user
+ LIST Displays one or more vhost entries.
+
+HOST_ADMIN_HELP
+ Commands available to services admins only:
+
+HOST_HELP_ON
+ Syntax: ON
+
+ Activates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see the vhost instead of your real IP address.
+
+HOST_HELP_SET
+ Syntax: SET <nick> <hostmask>.
+
+ Sets the vhost for the given nick to that of the given
+ hostmask. If your IRCD supports vIdents, then using
+ SET <nick> <ident>@<hostmask> set idents for users as
+ well as vhosts.
+
+ Limited to Services operators.
+
+HOST_HELP_DELALL
+ Syntax: DELALL <nick>.
+
+ Deletes the vhost for all nick's in the same group as
+ that of the given nick.
+
+ Limited to Host Removers.
+
+
+HOST_HELP_SETALL
+ Syntax: SETALL <nick> <hostmask>.
+
+ Sets the vhost for all nicks in the same group as that
+ of the given nick. If your IRCD supports vIdents, then
+ using SETALL <nick> <ident>@<hostmask> will set idents
+ for users as well as vhosts.
+
+ * NOTE, this will not update the vhost for any nick's
+ added to the group after this command was used.
+
+ Limited to Services operators.
+
+HOST_HELP_OFF
+ Syntax: OFF
+
+ Deactivates the vhost currently assigned to the nick in use.
+ When you use this command any user who performs a /whois
+ on you will see your real IP address.
+
+HOST_HELP_DEL
+ Syntax: DEL <nick>
+
+ Deletes the vhost assigned to the given nick from the
+ database.
+
+ Limited to Services operators.
+
+HOST_HELP_LIST
+ Syntax: LIST [<key>|<#X-Y>]
+
+ This command lists registered vhosts to the operator
+ if a Key is specified, only entries whos nick or vhost match
+ the pattern given in <key> are displayed e.g. Rob* for all
+ entries beginning with "Rob"
+
+ If a #X-Y style is used, only entries between the range of X
+ and Y will be displayed, e.g. #1-3 will display the first 3
+ nick/vhost entries.
+
+ The list uses the value of NSListMax as a hard limit for the
+ number of items to display to a operator at any 1 time.
+
+ Limited to Services operators.
+
+HOST_HELP_GROUP
+ Syntax: GROUP
+
+ This command allows users to set the vhost of thier
+ CURRENT nick to be the vhost for all nicks in the same
+ group.
diff --git a/language.c b/language.c
new file mode 100644
index 000000000..b73e29f27
--- /dev/null
+++ b/language.c
@@ -0,0 +1,265 @@
+/* Multi-language support.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: language.c,v 1.9 2003/12/12 16:04:57 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "language.h"
+
+/*************************************************************************/
+
+/* The list of lists of messages. */
+char **langtexts[NUM_LANGS];
+
+/* The list of names of languages. */
+char *langnames[NUM_LANGS];
+
+/* Indexes of available languages: */
+int langlist[NUM_LANGS];
+
+/* Order in which languages should be displayed: (alphabetical) */
+static int langorder[NUM_LANGS] = {
+ LANG_EN_US, /* English (US) */
+ LANG_FR, /* French */
+ LANG_DE, /* German */
+ LANG_IT, /* Italian */
+ LANG_JA_JIS, /* Japanese (JIS encoding) */
+ LANG_JA_EUC, /* Japanese (EUC encoding) */
+ LANG_JA_SJIS, /* Japanese (SJIS encoding) */
+ LANG_PT, /* Portugese */
+ LANG_ES, /* Spanish */
+ LANG_TR, /* Turkish */
+ LANG_CAT, /* Catalan */
+ LANG_GR, /* Greek */
+ LANG_NL, /* Dutch */
+ LANG_RU, /* Russian */
+};
+
+/*************************************************************************/
+
+/* Load a language file. */
+
+static int read_int32(int32 * ptr, FILE * f)
+{
+ int a = fgetc(f);
+ int b = fgetc(f);
+ int c = fgetc(f);
+ int d = fgetc(f);
+ if (a == EOF || b == EOF || c == EOF || d == EOF)
+ return -1;
+ *ptr = a << 24 | b << 16 | c << 8 | d;
+ return 0;
+}
+
+static void load_lang(int index, const char *filename)
+{
+ char buf[256];
+ FILE *f;
+ int num, i;
+
+ if (debug) {
+ alog("debug: Loading language %d from file `languages/%s'",
+ index, filename);
+ }
+ snprintf(buf, sizeof(buf), "languages/%s", filename);
+ if (!(f = fopen(buf, "r"))) {
+ log_perror("Failed to load language %d (%s)", index, filename);
+ return;
+ } else if (read_int32(&num, f) < 0) {
+ alog("Failed to read number of strings for language %d (%s)",
+ index, filename);
+ return;
+ } else if (num != NUM_STRINGS) {
+ alog("Warning: Bad number of strings (%d, wanted %d) "
+ "for language %d (%s)", num, NUM_STRINGS, index, filename);
+ }
+ langtexts[index] = scalloc(sizeof(char *), NUM_STRINGS);
+ if (num > NUM_STRINGS)
+ num = NUM_STRINGS;
+ for (i = 0; i < num; i++) {
+ int32 pos, len;
+ fseek(f, i * 8 + 4, SEEK_SET);
+ if (read_int32(&pos, f) < 0 || read_int32(&len, f) < 0) {
+ alog("Failed to read entry %d in language %d (%s) TOC",
+ i, index, filename);
+ while (--i >= 0) {
+ if (langtexts[index][i])
+ free(langtexts[index][i]);
+ }
+ free(langtexts[index]);
+ langtexts[index] = NULL;
+ return;
+ }
+ if (len == 0) {
+ langtexts[index][i] = NULL;
+ } else if (len >= 65536) {
+ alog("Entry %d in language %d (%s) is too long (over 64k)--"
+ "corrupt TOC?", i, index, filename);
+ while (--i >= 0) {
+ if (langtexts[index][i])
+ free(langtexts[index][i]);
+ }
+ free(langtexts[index]);
+ langtexts[index] = NULL;
+ return;
+ } else if (len < 0) {
+ alog("Entry %d in language %d (%s) has negative length--"
+ "corrupt TOC?", i, index, filename);
+ while (--i >= 0) {
+ if (langtexts[index][i])
+ free(langtexts[index][i]);
+ }
+ free(langtexts[index]);
+ langtexts[index] = NULL;
+ return;
+ } else {
+ langtexts[index][i] = scalloc(len + 1, 1);
+ fseek(f, pos, SEEK_SET);
+ if (fread(langtexts[index][i], 1, len, f) != len) {
+ alog("Failed to read string %d in language %d (%s)",
+ i, index, filename);
+ while (--i >= 0) {
+ if (langtexts[index][i])
+ free(langtexts[index][i]);
+ }
+ free(langtexts[index]);
+ langtexts[index] = NULL;
+ return;
+ }
+ langtexts[index][i][len] = 0;
+ }
+ }
+ fclose(f);
+}
+
+/*************************************************************************/
+
+/* Initialize list of lists. */
+
+void lang_init()
+{
+ int i, j, n = 0;
+
+ load_lang(LANG_CAT, "cat");
+ load_lang(LANG_DE, "de");
+ load_lang(LANG_EN_US, "en_us");
+ load_lang(LANG_ES, "es");
+ load_lang(LANG_FR, "fr");
+ load_lang(LANG_GR, "gr");
+ load_lang(LANG_PT, "pt");
+ load_lang(LANG_TR, "tr");
+ load_lang(LANG_IT, "it");
+ load_lang(LANG_NL, "nl");
+ load_lang(LANG_RU, "ru");
+
+ for (i = 0; i < NUM_LANGS; i++) {
+ if (langtexts[langorder[i]] != NULL) {
+ langnames[langorder[i]] = langtexts[langorder[i]][LANG_NAME];
+ langlist[n++] = langorder[i];
+ for (j = 0; j < NUM_STRINGS; j++) {
+ if (!langtexts[langorder[i]][j]) {
+ langtexts[langorder[i]][j] =
+ langtexts[DEF_LANGUAGE][j];
+ }
+ if (!langtexts[langorder[i]][j]) {
+ langtexts[langorder[i]][j] = langtexts[LANG_EN_US][j];
+ }
+ }
+ }
+ }
+ while (n < NUM_LANGS)
+ langlist[n++] = -1;
+
+ /* Not what I intended to do, but these services are so archaïc
+ * that it's difficult to do more. */
+ if ((NSDefLanguage = langlist[NSDefLanguage]) < 0)
+ NSDefLanguage = DEF_LANGUAGE;
+
+ if (!langtexts[DEF_LANGUAGE])
+ fatal("Unable to load default language");
+ for (i = 0; i < NUM_LANGS; i++) {
+ if (!langtexts[i])
+ langtexts[i] = langtexts[DEF_LANGUAGE];
+ }
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Format a string in a strftime()-like way, but heed the user's language
+ * setting for month and day names. The string stored in the buffer will
+ * always be null-terminated, even if the actual string was longer than the
+ * buffer size.
+ * Assumption: No month or day name has a length (including trailing null)
+ * greater than BUFSIZE.
+ */
+
+int strftime_lang(char *buf, int size, User * u, int format, struct tm *tm)
+{
+ int language = u && u->na ? u->na->nc->language : NSDefLanguage;
+ char tmpbuf[BUFSIZE], buf2[BUFSIZE];
+ char *s;
+ int i, ret;
+
+ strscpy(tmpbuf, langtexts[language][format], sizeof(tmpbuf));
+ if ((s = langtexts[language][STRFTIME_DAYS_SHORT]) != NULL) {
+ for (i = 0; i < tm->tm_wday; i++)
+ s += strcspn(s, "\n") + 1;
+ i = strcspn(s, "\n");
+ strncpy(buf2, s, i);
+ buf2[i] = 0;
+ strnrepl(tmpbuf, sizeof(tmpbuf), "%a", buf2);
+ }
+ if ((s = langtexts[language][STRFTIME_DAYS_LONG]) != NULL) {
+ for (i = 0; i < tm->tm_wday; i++)
+ s += strcspn(s, "\n") + 1;
+ i = strcspn(s, "\n");
+ strncpy(buf2, s, i);
+ buf2[i] = 0;
+ strnrepl(tmpbuf, sizeof(tmpbuf), "%A", buf2);
+ }
+ if ((s = langtexts[language][STRFTIME_MONTHS_SHORT]) != NULL) {
+ for (i = 0; i < tm->tm_mon; i++)
+ s += strcspn(s, "\n") + 1;
+ i = strcspn(s, "\n");
+ strncpy(buf2, s, i);
+ buf2[i] = 0;
+ strnrepl(tmpbuf, sizeof(tmpbuf), "%b", buf2);
+ }
+ if ((s = langtexts[language][STRFTIME_MONTHS_LONG]) != NULL) {
+ for (i = 0; i < tm->tm_mon; i++)
+ s += strcspn(s, "\n") + 1;
+ i = strcspn(s, "\n");
+ strncpy(buf2, s, i);
+ buf2[i] = 0;
+ strnrepl(tmpbuf, sizeof(tmpbuf), "%B", buf2);
+ }
+ ret = strftime(buf, size, tmpbuf, tm);
+ if (ret == size)
+ buf[size - 1] = 0;
+ return ret;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Send a syntax-error message to the user. */
+
+void syntax_error(const char *service, User * u, const char *command,
+ int msgnum)
+{
+ const char *str = getstring(u->na, msgnum);
+ notice_lang(service, u, SYNTAX_ERROR, str);
+ notice_lang(service, u, MORE_INFO, service, command);
+}
+
+/*************************************************************************/
diff --git a/list.c b/list.c
new file mode 100644
index 000000000..0c3cc690f
--- /dev/null
+++ b/list.c
@@ -0,0 +1,178 @@
+/* Routines to handle `listnicks' and `listchans' invocations.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: list.c,v 1.5 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+void do_listnicks(int ac, char **av)
+{
+ int count = 0; /* Count only rather than display? */
+ int usage = 0; /* Display command usage? (>0 also indicates error) */
+ int i;
+
+ i = 1;
+ while (i < ac) {
+ if (av[i][0] == '-') {
+ switch (av[i][1]) {
+ case 'h':
+ usage = -1;
+ break;
+ case 'c':
+ if (i > 1)
+ usage = 1;
+ count = 1;
+ break;
+ case 'd':
+ if (av[i][2]) {
+ services_dir = av[i] + 2;
+ } else {
+ if (i >= ac - 1) {
+ usage = 1;
+ break;
+ }
+ ac--;
+ memmove(av + i, av + i + 1, sizeof(char *) * ac - i);
+ services_dir = av[i];
+ }
+ default:
+ usage = 1;
+ break;
+ } /* switch */
+ ac--;
+ if (i < ac)
+ memmove(av + i, av + i + 1, sizeof(char *) * ac - i);
+ } else {
+ if (count)
+ usage = 1;
+ i++;
+ }
+ }
+ if (usage) {
+ fprintf(stderr, "\
+\n\
+Usage: listnicks [-c] [-d data-dir] [nick [nick...]]\n\
+ -c: display only count of registered nicks\n\
+ (cannot be combined with nicks)\n\
+ nick: nickname(s) to display information for\n\
+\n\
+If no nicks are given, the entire nickname database is printed out in\n\
+compact format followed by the number of registered nicks (with -c, the\n\
+list is suppressed and only the count is printed). If one or more nicks\n\
+are given, detailed information about those nicks is displayed.\n\
+\n");
+ exit(usage > 0 ? 1 : 0);
+ }
+
+ if (chdir(services_dir) < 0) {
+ fprintf(stderr, "chdir(%s): %s\n", services_dir, strerror(errno));
+ exit(1);
+ }
+ if (!read_config(0))
+ exit(1);
+ load_ns_dbase();
+
+ lang_init();
+
+ if (ac > 1) {
+ for (i = 1; i < ac; i++)
+ listnicks(0, av[i]);
+ } else {
+ listnicks(count, NULL);
+ }
+ exit(0);
+}
+
+/*************************************************************************/
+
+void do_listchans(int ac, char **av)
+{
+ int count = 0; /* Count only rather than display? */
+ int usage = 0; /* Display command usage? (>0 also indicates error) */
+ int i;
+
+ i = 1;
+ while (i < ac) {
+ if (av[i][0] == '-') {
+ switch (av[i][1]) {
+ case 'h':
+ usage = -1;
+ break;
+ case 'c':
+ if (i > 1)
+ usage = 1;
+ count = 1;
+ break;
+ case 'd':
+ if (av[i][2]) {
+ services_dir = av[i] + 2;
+ } else {
+ if (i >= ac - 1) {
+ usage = 1;
+ break;
+ }
+ ac--;
+ memmove(av + i, av + i + 1, sizeof(char *) * ac - i);
+ services_dir = av[i];
+ }
+ default:
+ usage = 1;
+ break;
+ } /* switch */
+ ac--;
+ if (i < ac)
+ memmove(av + i, av + i + 1, sizeof(char *) * ac - i);
+ } else {
+ if (count)
+ usage = 1;
+ i++;
+ }
+ }
+ if (usage) {
+ fprintf(stderr, "\
+\n\
+Usage: listchans [-c] [-d data-dir] [channel [channel...]]\n\
+ -c: display only count of registered channels\n\
+ (cannot be combined with channels)\n\
+channel: channel(s) to display information for\n\
+\n\
+If no channels are given, the entire channel database is printed out in\n\
+compact format followed by the number of registered channels (with -c, the\n\
+list is suppressed and only the count is printed). If one or more channels\n\
+are given, detailed information about those channels is displayed.\n\
+\n");
+ exit(usage > 0 ? 1 : 0);
+ }
+
+ if (chdir(services_dir) < 0) {
+ fprintf(stderr, "chdir(%s): %s\n", services_dir, strerror(errno));
+ exit(1);
+ }
+ if (!read_config(0))
+ exit(1);
+ load_ns_dbase();
+ load_cs_dbase();
+
+ lang_init();
+
+ if (ac > 1) {
+ for (i = 1; i < ac; i++)
+ listchans(0, av[i]);
+ } else {
+ listchans(count, NULL);
+ }
+ exit(0);
+}
+
+/*************************************************************************/
diff --git a/log.c b/log.c
new file mode 100644
index 000000000..c215e2ad2
--- /dev/null
+++ b/log.c
@@ -0,0 +1,298 @@
+/* Logging routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: log.c,v 1.8 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+static FILE *logfile;
+
+static int curday = 0;
+
+/*************************************************************************/
+
+static int get_logname(char *name, int count, struct tm *tm)
+{
+
+ char timestamp[32];
+
+ if (!tm) {
+ time_t t;
+
+ time(&t);
+ tm = localtime(&t);
+ }
+
+ strftime(timestamp, count, "%Y%m%d", tm);
+ snprintf(name, count, "logs/%s.%s", log_filename, timestamp);
+ curday = tm->tm_yday;
+
+ return 1;
+}
+
+/*************************************************************************/
+
+static void remove_log(void)
+{
+ time_t t;
+ struct tm tm;
+
+ char name[PATH_MAX];
+
+ if (!KeepLogs)
+ return;
+
+ time(&t);
+ t -= (60 * 60 * 24 * KeepLogs);
+ tm = *localtime(&t);
+
+ if (!get_logname(name, sizeof(name), &tm))
+ return;
+ unlink(name);
+}
+
+/*************************************************************************/
+
+static void checkday(void)
+{
+ time_t t;
+ struct tm tm;
+
+ time(&t);
+ tm = *localtime(&t);
+
+ if (curday != tm.tm_yday) {
+ close_log();
+ remove_log();
+ open_log();
+ }
+}
+
+/*************************************************************************/
+
+/* Open the log file. Return -1 if the log file could not be opened, else
+ * return 0. */
+
+int open_log(void)
+{
+ char name[PATH_MAX];
+
+ if (logfile)
+ return 0;
+
+ if (!get_logname(name, sizeof(name), NULL))
+ return 0;
+ logfile = fopen(name, "a");
+
+ if (logfile)
+ setbuf(logfile, NULL);
+ return logfile != NULL ? 0 : -1;
+}
+
+/* Close the log file. */
+
+void close_log(void)
+{
+ if (!logfile)
+ return;
+ fclose(logfile);
+ logfile = NULL;
+}
+
+/*************************************************************************/
+
+/* Log stuff to the log file with a datestamp. Note that errno is
+ * preserved by this routine and log_perror().
+ */
+
+void alog(const char *fmt, ...)
+{
+ va_list args;
+ time_t t;
+ struct tm tm;
+ char buf[256];
+ int errno_save = errno;
+
+ checkday();
+
+ va_start(args, fmt);
+ time(&t);
+ tm = *localtime(&t);
+#if HAVE_GETTIMEOFDAY
+ if (debug) {
+ char *s;
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ strftime(buf, sizeof(buf) - 1, "[%b %d %H:%M:%S", &tm);
+ s = buf + strlen(buf);
+ s += snprintf(s, sizeof(buf) - (s - buf), ".%06d", tv.tv_usec);
+ strftime(s, sizeof(buf) - (s - buf) - 1, " %Y] ", &tm);
+ } else {
+#endif
+ strftime(buf, sizeof(buf) - 1, "[%b %d %H:%M:%S %Y] ", &tm);
+#if HAVE_GETTIMEOFDAY
+ }
+#endif
+ if (logfile) {
+ fputs(buf, logfile);
+ vfprintf(logfile, fmt, args);
+ fputc('\n', logfile);
+ }
+ if (nofork) {
+ fputs(buf, stderr);
+ vfprintf(stderr, fmt, args);
+ fputc('\n', stderr);
+ }
+
+ if (LogChannel && logchan && !debug && findchan(LogChannel)) {
+ char str[BUFSIZE];
+ vsnprintf(str, sizeof(str), fmt, args);
+ privmsg(s_GlobalNoticer, LogChannel, str);
+ }
+
+ errno = errno_save;
+}
+
+
+/* Like alog(), but tack a ": " and a system error message (as returned by
+ * strerror()) onto the end.
+ */
+
+void log_perror(const char *fmt, ...)
+{
+ va_list args;
+ time_t t;
+ struct tm tm;
+ char buf[256];
+ int errno_save = errno;
+
+ checkday();
+
+ va_start(args, fmt);
+ time(&t);
+ tm = *localtime(&t);
+#if HAVE_GETTIMEOFDAY
+ if (debug) {
+ char *s;
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ strftime(buf, sizeof(buf) - 1, "[%b %d %H:%M:%S", &tm);
+ s = buf + strlen(buf);
+ s += snprintf(s, sizeof(buf) - (s - buf), ".%06d", tv.tv_usec);
+ strftime(s, sizeof(buf) - (s - buf) - 1, " %Y] ", &tm);
+ } else {
+#endif
+ strftime(buf, sizeof(buf) - 1, "[%b %d %H:%M:%S %Y] ", &tm);
+#if HAVE_GETTIMEOFDAY
+ }
+#endif
+ if (logfile) {
+ fputs(buf, logfile);
+ vfprintf(logfile, fmt, args);
+ fprintf(logfile, ": %s\n", strerror(errno_save));
+ }
+ if (nofork) {
+ fputs(buf, stderr);
+ vfprintf(stderr, fmt, args);
+ fprintf(stderr, ": %s\n", strerror(errno_save));
+ }
+ errno = errno_save;
+}
+
+/*************************************************************************/
+
+/* We've hit something we can't recover from. Let people know what
+ * happened, then go down.
+ */
+
+void fatal(const char *fmt, ...)
+{
+ va_list args;
+ time_t t;
+ struct tm tm;
+ char buf[256], buf2[4096];
+
+ checkday();
+
+ va_start(args, fmt);
+ time(&t);
+ tm = *localtime(&t);
+#if HAVE_GETTIMEOFDAY
+ if (debug) {
+ char *s;
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ strftime(buf, sizeof(buf) - 1, "[%b %d %H:%M:%S", &tm);
+ s = buf + strlen(buf);
+ s += snprintf(s, sizeof(buf) - (s - buf), ".%06d", tv.tv_usec);
+ strftime(s, sizeof(buf) - (s - buf) - 1, " %Y] ", &tm);
+ } else {
+#endif
+ strftime(buf, sizeof(buf) - 1, "[%b %d %H:%M:%S %Y] ", &tm);
+#if HAVE_GETTIMEOFDAY
+ }
+#endif
+ vsnprintf(buf2, sizeof(buf2), fmt, args);
+ if (logfile)
+ fprintf(logfile, "%sFATAL: %s\n", buf, buf2);
+ if (nofork)
+ fprintf(stderr, "%sFATAL: %s\n", buf, buf2);
+ if (servsock >= 0)
+ wallops(NULL, "FATAL ERROR! %s", buf2);
+ exit(1);
+}
+
+
+/* Same thing, but do it like perror(). */
+
+void fatal_perror(const char *fmt, ...)
+{
+ va_list args;
+ time_t t;
+ struct tm tm;
+ char buf[256], buf2[4096];
+ int errno_save = errno;
+
+ checkday();
+
+ va_start(args, fmt);
+ time(&t);
+ tm = *localtime(&t);
+#if HAVE_GETTIMEOFDAY
+ if (debug) {
+ char *s;
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ strftime(buf, sizeof(buf) - 1, "[%b %d %H:%M:%S", &tm);
+ s = buf + strlen(buf);
+ s += snprintf(s, sizeof(buf) - (s - buf), ".%06d", tv.tv_usec);
+ strftime(s, sizeof(buf) - (s - buf) - 1, " %Y] ", &tm);
+ } else {
+#endif
+ strftime(buf, sizeof(buf) - 1, "[%b %d %H:%M:%S %Y] ", &tm);
+#if HAVE_GETTIMEOFDAY
+ }
+#endif
+ vsnprintf(buf2, sizeof(buf2), fmt, args);
+ if (logfile)
+ fprintf(logfile, "%sFATAL: %s: %s\n", buf, buf2,
+ strerror(errno_save));
+ if (stderr)
+ fprintf(stderr, "%sFATAL: %s: %s\n", buf, buf2,
+ strerror(errno_save));
+ if (servsock >= 0)
+ wallops(NULL, "FATAL ERROR! %s: %s", buf2, strerror(errno_save));
+ exit(1);
+}
+
+/*************************************************************************/
diff --git a/mail.c b/mail.c
new file mode 100644
index 000000000..342d9b0ad
--- /dev/null
+++ b/mail.c
@@ -0,0 +1,202 @@
+/* Mail utility routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: mail.c,v 1.9 2003/09/04 18:55:34 rob Exp $
+ *
+ */
+
+#include "services.h"
+#include "language.h"
+
+/* Begins to send a mail. Must be followed by a MailEnd call.
+ * Returns NULL if the call failed. Error messages are
+ * automatically sent to the user.
+ */
+
+MailInfo *MailRegBegin(User * u, NickRequest * nr, char *subject,
+ char *service)
+{
+ if (!u || !nr || !subject)
+ return NULL;
+
+ if (!UseMail) {
+ notice_lang(service, u, MAIL_DISABLED);
+ } else if ((time(NULL) - u->lastmail < MailDelay)
+ || (time(NULL) - nr->lastmail < MailDelay)) {
+ notice_lang(service, u, MAIL_DELAYED, MailDelay);
+ } else if (!nr->email) {
+ notice_lang(service, u, MAIL_INVALID, nr->nick);
+ } else {
+ MailInfo *mail;
+
+ mail = scalloc(sizeof(MailInfo), 1);
+ mail->sender = u;
+ mail->recipient = NULL;
+ mail->recip = nr;
+
+ if (!(mail->pipe = popen(SendMailPath, "w"))) {
+ free(mail);
+ notice_lang(service, u, MAIL_LATER);
+ return NULL;
+ }
+
+ fprintf(mail->pipe, "From: %s\n", SendFrom);
+ if (DontQuoteAddresses) {
+ fprintf(mail->pipe, "To: %s <%s>\n", nr->nick, nr->email);
+ } else {
+ fprintf(mail->pipe, "To: \"%s\" <%s>\n", nr->nick, nr->email);
+ }
+ fprintf(mail->pipe, "Subject: %s\n", subject);
+ return mail;
+ }
+
+ return NULL;
+}
+
+/* Begins to send a mail. Must be followed by a MailEnd call.
+ * Returns NULL if the call failed. Error messages are
+ * automatically sent to the user.
+ */
+
+MailInfo *MailBegin(User * u, NickCore * nc, char *subject, char *service)
+{
+ if (!u || !nc || !subject)
+ return NULL;
+
+ if (!UseMail) {
+ notice_lang(service, u, MAIL_DISABLED);
+ } else if (((time(NULL) - u->lastmail < MailDelay)
+ || (time(NULL) - nc->lastmail < MailDelay))
+ && !is_services_root(u)) {
+ notice_lang(service, u, MAIL_DELAYED, MailDelay);
+ } else if (!nc->email) {
+ notice_lang(service, u, MAIL_INVALID, nc->display);
+ } else {
+ MailInfo *mail;
+
+ mail = scalloc(sizeof(MailInfo), 1);
+ mail->sender = u;
+ mail->recipient = nc;
+ mail->recip = NULL;
+
+ if (!(mail->pipe = popen(SendMailPath, "w"))) {
+ free(mail);
+ notice_lang(service, u, MAIL_LATER);
+ return NULL;
+ }
+
+ fprintf(mail->pipe, "From: %s\n", SendFrom);
+ if (DontQuoteAddresses) {
+ fprintf(mail->pipe, "To: %s <%s>\n", nc->display, nc->email);
+ } else {
+ fprintf(mail->pipe, "To: \"%s\" <%s>\n", nc->display,
+ nc->email);
+ }
+ fprintf(mail->pipe, "Subject: %s\n", subject);
+
+ return mail;
+ }
+
+ return NULL;
+}
+
+/* Finish to send the mail. Cleanup everything. */
+
+void MailEnd(MailInfo * mail)
+{
+ if (!mail || !mail->sender || !mail->pipe)
+ return;
+
+ if (!mail->recipient && !mail->recip)
+ return;
+
+ pclose(mail->pipe);
+
+ mail->sender->lastmail = time(NULL);
+ if (mail->recipient)
+ mail->recipient->lastmail = time(NULL);
+ else
+ mail->recip->lastmail = time(NULL);
+
+
+ free(mail);
+}
+
+/* Resets the MailDelay protection */
+
+void MailReset(User * u, NickCore * nc)
+{
+ if (u)
+ u->lastmail = 0;
+ if (nc)
+ nc->lastmail = 0;
+}
+
+/* Checks whether we have a valid, common e-mail address.
+ * This is NOT entirely RFC compliant, and won't be so, because I said
+ * *common* cases. ;) It is very unlikely that e-mail addresses that
+ * are really being used will fail the check.
+ *
+ * FIXME: rewrite this a bit cleaner.
+ */
+
+int MailValidate(const char *email)
+{
+ int i, j, has_period = 0, len;
+ char copy[BUFSIZE], *domain;
+
+ static char specials[] =
+ { '(', ')', '<', '>', '@', ',', ';', ':', '\\', '\"', '[', ']',
+ ' '
+ };
+
+ if (!email)
+ return 0;
+ strcpy(copy, email);
+
+ domain = strchr(copy, '@');
+ if (!domain)
+ return 0;
+ *domain = '\0';
+ domain++;
+
+ /* Don't accept NULL copy or domain. */
+ if (*copy == 0 || *domain == 0)
+ return 0;
+
+ /* Check for forbidden characters in the name */
+ for (i = 0; i < strlen(copy); i++) {
+
+ if (copy[i] <= 31 || copy[i] >= 127)
+ return 0;
+ for (j = 0; j < 13; j++)
+ if (copy[i] == specials[j])
+ return 0;
+ }
+
+ /* Check for forbidden characters in the domain, and if it seems to be valid. */
+ for (i = 0; i < (len = strlen(domain)); i++) {
+ if (domain[i] <= 31 || domain[i] >= 127)
+ return 0;
+ for (j = 0; j < 13; j++)
+ if (domain[i] == specials[j])
+ return 0;
+ if (domain[i] == '.') {
+ if (i == 0 || i == len - 1)
+ return 0;
+ has_period = 1;
+ }
+ }
+
+ if (!has_period)
+ return 0;
+
+ return 1;
+}
diff --git a/main.c b/main.c
new file mode 100644
index 000000000..8c104ca0b
--- /dev/null
+++ b/main.c
@@ -0,0 +1,521 @@
+/* Services -- main source file.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id: main.c,v 1.23 2004/03/13 13:55:59 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "timeout.h"
+#include "version.h"
+#include "datafiles.h"
+
+/******** Global variables! ********/
+
+/* Command-line options: (note that configuration variables are in config.c) */
+char *services_dir = SERVICES_DIR; /* -dir dirname */
+char *log_filename = LOG_FILENAME; /* -log filename */
+int debug = 0; /* -debug */
+int readonly = 0; /* -readonly */
+int logchan = 0; /* -logchan */
+int skeleton = 0; /* -skeleton */
+int nofork = 0; /* -nofork */
+int forceload = 0; /* -forceload */
+int noexpire = 0; /* -noexpire */
+#ifdef IS44_CONVERTER
+int is44 = 0; /* -is44 */
+#endif
+
+#ifdef USE_RDB
+int do_mysql = 0; /* use mysql ? */
+#endif
+
+/* Set to 1 if we are to quit */
+int quitting = 0;
+
+/* Set to 1 if we are to quit after saving databases */
+int delayed_quit = 0;
+
+/* Contains a message as to why services is terminating */
+char *quitmsg = NULL;
+
+/* Input buffer - global, so we can dump it if something goes wrong */
+char inbuf[BUFSIZE];
+
+/* Socket for talking to server */
+int servsock = -1;
+
+/* Should we update the databases now? */
+int save_data = 0;
+
+/* At what time were we started? */
+time_t start_time;
+
+/* Parameters and environment */
+char **my_av, **my_envp;
+
+/******** Local variables! ********/
+
+/* Set to 1 if we are waiting for input */
+static int waiting = 0;
+
+/* Set to 1 after we've set everything up */
+static int started = 0;
+
+/*************************************************************************/
+
+/* Run expiration routines */
+
+static void expire_all(void)
+{
+ waiting = -3;
+ if (debug)
+ alog("debug: Running expire routines");
+ if (!skeleton) {
+ waiting = -21;
+ expire_nicks();
+ waiting = -22;
+ expire_chans();
+ waiting = -23;
+ expire_requests();
+ }
+ waiting = -25;
+ expire_akills();
+#ifdef IRC_BAHAMUT
+ waiting = -26;
+ expire_sglines();
+#endif
+ waiting = -28;
+ expire_sqlines();
+#ifdef IRC_BAHAMUT
+ waiting = -27;
+ expire_szlines();
+#endif
+#ifndef STREAMLINED
+ expire_exceptions();
+#endif
+#ifdef USE_THREADS
+ if (ProxyDetect)
+ proxy_expire();
+#endif
+}
+
+/*************************************************************************/
+
+void save_databases(void)
+{
+ waiting = -2;
+ if (debug)
+ alog("debug: Saving FFF databases");
+ waiting = -10;
+ backup_databases();
+ if (!skeleton) {
+ waiting = -11;
+ save_ns_dbase();
+ waiting = -12;
+ if (PreNickDBName) {
+ save_ns_req_dbase();
+ waiting = -13;
+ }
+ save_cs_dbase();
+ if (s_BotServ) {
+ waiting = -14;
+ save_bs_dbase();
+ }
+ if (s_HostServ) {
+ waiting = -15;
+ save_hs_dbase();
+ }
+ }
+ waiting = -16;
+ save_os_dbase();
+ waiting = -17;
+ save_news();
+ waiting = -18;
+ save_exceptions();
+
+#ifdef USE_RDB
+ if (do_mysql) {
+ if (debug)
+ alog("debug: Saving RDB databases");
+ waiting = -10;
+ if (!skeleton) {
+ waiting = -11;
+ save_ns_rdb_dbase();
+ waiting = -12;
+ save_cs_rdb_dbase();
+ if (PreNickDBName) {
+ save_ns_req_rdb_dbase();
+ waiting = -13;
+ }
+ /* Temporary fix to avoid unwanted timeouts... */
+ send_cmd(ServerName, "PONG %s", ServerName);
+ if (s_BotServ) {
+ waiting = -14;
+ save_bs_rdb_dbase();
+ }
+ if (s_HostServ) {
+ waiting = -15;
+ save_hs_rdb_dbase();
+ }
+ waiting = -16;
+ save_os_rdb_dbase();
+ waiting = -17;
+ save_rdb_news();
+ waiting = -18;
+ save_rdb_exceptions();
+ }
+ }
+#endif
+}
+
+/*************************************************************************/
+
+/* Restarts services */
+
+static void services_restart(void)
+{
+ alog("Restarting");
+ if (!quitmsg)
+ quitmsg = "Restarting";
+ send_cmd(ServerName, "SQUIT %s :%s", ServerName, quitmsg);
+ disconn(servsock);
+ close_log();
+#if defined(LINUX20) || defined(LINUX22)
+ pthread_kill_other_threads_np();
+#endif
+ execve(SERVICES_BIN, my_av, my_envp);
+ if (!readonly) {
+ open_log();
+ log_perror("Restart failed");
+ close_log();
+ }
+}
+
+/*************************************************************************/
+/**
+ * Added to allow do_restart from operserv access to the static functions without making them
+ * fair game to every other function - not exactly ideal :|
+ **/
+void do_restart_services(void)
+{
+ expire_all();
+ save_databases();
+ services_restart();
+ exit(1);
+}
+
+/*************************************************************************/
+
+/* Terminates services */
+
+static void services_shutdown(void)
+{
+ if (!quitmsg)
+ quitmsg = "Terminating, reason unknown";
+ alog("%s", quitmsg);
+ if (started)
+ send_cmd(ServerName, "SQUIT %s :%s", ServerName, quitmsg);
+ disconn(servsock);
+}
+
+/*************************************************************************/
+
+/* If we get a weird signal, come here. */
+
+void sighandler(int signum)
+{
+ if (started) {
+ if (signum == SIGHUP) { /* SIGHUP = save databases and restart */
+ signal(SIGHUP, SIG_IGN);
+ alog("Received SIGHUP, restarting.");
+
+ expire_all();
+ save_databases();
+
+ if (!quitmsg)
+ quitmsg = "Restarting on SIGHUP";
+
+#ifdef SERVICES_BIN
+ services_restart();
+ exit(1);
+#else
+ quitmsg =
+ "Restart attempt failed--SERVICES_BIN not defined (rerun configure)";
+#endif
+ } else if (signum == SIGTERM) {
+ signal(SIGTERM, SIG_IGN);
+ signal(SIGHUP, SIG_IGN);
+
+ alog("Received SIGTERM, exiting.");
+
+ expire_all();
+ save_databases();
+ quitmsg = "Shutting down on SIGTERM";
+ services_shutdown();
+ exit(0);
+ } else if (signum == SIGINT || signum == SIGQUIT) {
+ /* nothing -- terminate below */
+ } else if (!waiting) {
+ alog("PANIC! buffer = %s", inbuf);
+ /* Cut off if this would make IRC command >510 characters. */
+ if (strlen(inbuf) > 448) {
+ inbuf[446] = '>';
+ inbuf[447] = '>';
+ inbuf[448] = 0;
+ }
+ wallops(NULL, "PANIC! buffer = %s\r\n", inbuf);
+ } else if (waiting < 0) {
+ /* This is static on the off-chance we run low on stack */
+ static char buf[BUFSIZE];
+ switch (waiting) {
+ case -1:
+ snprintf(buf, sizeof(buf), "in timed_update");
+ break;
+ case -10:
+ snprintf(buf, sizeof(buf), "backing up databases");
+ break;
+ case -11:
+ snprintf(buf, sizeof(buf), "saving %s", NickDBName);
+ break;
+ case -12:
+ snprintf(buf, sizeof(buf), "saving %s", ChanDBName);
+ break;
+ case -13:
+ snprintf(buf, sizeof(buf), "saving %s", PreNickDBName);
+ break;
+ case -14:
+ snprintf(buf, sizeof(buf), "saving %s", BotDBName);
+ break;
+ case -15:
+ snprintf(buf, sizeof(buf), "saving %s", HostDBName);
+ break;
+ case -16:
+ snprintf(buf, sizeof(buf), "saving %s", OperDBName);
+ break;
+ case -17:
+ snprintf(buf, sizeof(buf), "saving %s", NewsDBName);
+ break;
+ case -18:
+ snprintf(buf, sizeof(buf), "saving %s", ExceptionDBName);
+ break;
+ case -21:
+ snprintf(buf, sizeof(buf), "expiring nicknames");
+ break;
+ case -22:
+ snprintf(buf, sizeof(buf), "expiring channels");
+ break;
+ case -25:
+ snprintf(buf, sizeof(buf), "expiring autokills");
+ break;
+#ifdef IRC_BAHAMUT
+ case -26:
+ snprintf(buf, sizeof(buf), "expiring SGLINEs");
+ break;
+ case -27:
+ snprintf(buf, sizeof(buf), "expiring SZLINEs");
+ break;
+#endif
+ case -28:
+ snprintf(buf, sizeof(buf), "expiring SQLINEs");
+ break;
+ default:
+ snprintf(buf, sizeof(buf), "waiting=%d", waiting);
+ }
+ wallops(NULL, "PANIC! %s (%s)", buf, strsignal(signum));
+ alog("PANIC! %s (%s)", buf, strsignal(signum));
+ }
+ }
+
+ if (
+#if !defined(USE_THREADS) || !defined(LINUX20)
+ signum == SIGUSR1 ||
+#endif
+ !(quitmsg = calloc(BUFSIZE, 1))) {
+ quitmsg = "Out of memory!";
+ } else {
+#if HAVE_STRSIGNAL
+ snprintf(quitmsg, BUFSIZE, "Services terminating: %s",
+ strsignal(signum));
+#else
+ snprintf(quitmsg, BUFSIZE, "Services terminating on signal %d",
+ signum);
+#endif
+ }
+ if (started) {
+ services_shutdown();
+ exit(0);
+ } else {
+ alog("%s", quitmsg);
+ if (isatty(2))
+ fprintf(stderr, "%s\n", quitmsg);
+ exit(1);
+ }
+}
+
+/*************************************************************************/
+
+/* Main routine. (What does it look like? :-) ) */
+
+int main(int ac, char **av, char **envp)
+{
+ volatile time_t last_update; /* When did we last update the databases? */
+ volatile time_t last_expire; /* When did we last expire nicks/channels? */
+ volatile time_t last_check; /* When did we last check timeouts? */
+ volatile time_t last_DefCon; /* When was DefCon last checked? */
+
+ int i;
+ char *progname;
+
+ my_av = av;
+ my_envp = envp;
+
+ /* Find program name. */
+ if ((progname = strrchr(av[0], '/')) != NULL)
+ progname++;
+ else
+ progname = av[0];
+
+ /* Were we run under "listnicks" or "listchans"? Do appropriate stuff
+ * if so. */
+ if (strcmp(progname, "listnicks") == 0) {
+ do_listnicks(ac, av);
+ return 0;
+ } else if (strcmp(progname, "listchans") == 0) {
+ do_listchans(ac, av);
+ return 0;
+ }
+
+
+ /* Initialization stuff. */
+ if ((i = init(ac, av)) != 0)
+ return i;
+
+
+ /* We have a line left over from earlier, so process it first. */
+ process();
+
+ /* Set up timers. */
+ last_update = time(NULL);
+ last_expire = time(NULL);
+ last_check = time(NULL);
+ last_DefCon = time(NULL);
+
+ started = 1;
+
+ /*** Main loop. ***/
+
+ while (!quitting) {
+ time_t t = time(NULL);
+
+ if (debug >= 2)
+ alog("debug: Top of main loop");
+
+ if (!noexpire && !readonly
+ && (save_data || t - last_expire >= ExpireTimeout)) {
+ expire_all();
+ last_expire = t;
+ }
+
+ if (!readonly && (save_data || t - last_update >= UpdateTimeout)) {
+ if (delayed_quit)
+ wallops(NULL,
+ "Updating databases on shutdown, please wait.");
+
+ save_databases();
+
+ if (save_data < 0)
+ break; /* out of main loop */
+
+ save_data = 0;
+ last_update = t;
+ }
+
+ if ((DefConTimeOut) && (t - last_DefCon >= dotime(DefConTimeOut))) {
+ resetDefCon(5);
+ last_DefCon = t;
+ }
+
+ if (delayed_quit)
+ break;
+
+ moduleCallBackRun();
+
+ waiting = -1;
+ if (t - last_check >= TimeoutCheck) {
+ check_timeouts();
+ last_check = t;
+ }
+
+ waiting = 1;
+ i = (int) (long) sgets2(inbuf, sizeof(inbuf), servsock);
+ waiting = 0;
+ if (i > 0) {
+ process();
+ } else if (i == 0) {
+ int errno_save = errno;
+ quitmsg = scalloc(BUFSIZE, 1);
+ if (quitmsg) {
+ snprintf(quitmsg, BUFSIZE, "Read error from server: %s",
+ strerror(errno_save));
+ } else {
+ quitmsg = "Read error from server";
+ }
+ quitting = 1;
+ }
+ waiting = -4;
+ }
+
+
+ /* Check for restart instead of exit */
+ if (save_data == -2) {
+#ifdef SERVICES_BIN
+ alog("Restarting");
+ if (!quitmsg)
+ quitmsg = "Restarting";
+ send_cmd(ServerName, "SQUIT %s :%s", ServerName, quitmsg);
+ disconn(servsock);
+ close_log();
+#if defined(LINUX20) || defined(LINUX22)
+ pthread_kill_other_threads_np();
+#endif
+ execve(SERVICES_BIN, av, envp);
+ if (!readonly) {
+ open_log();
+ log_perror("Restart failed");
+ close_log();
+ }
+ return 1;
+#else
+ quitmsg =
+ "Restart attempt failed--SERVICES_BIN not defined (rerun configure)";
+#endif
+ }
+
+ /* Disconnect and exit */
+ services_shutdown();
+ return 0;
+}
+
+/*************************************************************************/
diff --git a/memory.c b/memory.c
new file mode 100644
index 000000000..5bfcf395b
--- /dev/null
+++ b/memory.c
@@ -0,0 +1,96 @@
+/* Memory management routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: memory.c,v 1.7 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* smalloc, scalloc, srealloc, sstrdup:
+ * Versions of the memory allocation functions which will cause the
+ * program to terminate with an "Out of memory" error if the memory
+ * cannot be allocated. (Hence, the return value from these functions
+ * is never NULL.)
+ */
+
+void *smalloc(long size)
+{
+ void *buf;
+
+ if (!size) {
+ size = 1;
+ }
+ buf = malloc(size);
+ if (!buf)
+#if !defined(USE_THREADS) || !defined(LINUX20)
+ raise(SIGUSR1);
+#else
+ abort();
+#endif
+ return buf;
+}
+
+void *scalloc(long elsize, long els)
+{
+ void *buf;
+
+ if (!elsize || !els) {
+ elsize = els = 1;
+ }
+ buf = calloc(elsize, els);
+ if (!buf)
+#if !defined(USE_THREADS) || !defined(LINUX20)
+ raise(SIGUSR1);
+#else
+ abort();
+#endif
+ return buf;
+}
+
+void *srealloc(void *oldptr, long newsize)
+{
+ void *buf;
+
+ if (!newsize) {
+ newsize = 1;
+ }
+ buf = realloc(oldptr, newsize);
+ if (!buf)
+#if !defined(USE_THREADS) || !defined(LINUX20)
+ raise(SIGUSR1);
+#else
+ abort();
+#endif
+ return buf;
+}
+
+char *sstrdup(const char *s)
+{
+ char *t = strdup(s);
+ if (!t)
+#if !defined(USE_THREADS) || !defined(LINUX20)
+ raise(SIGUSR1);
+#else
+ abort();
+#endif
+ return t;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* In the future: malloc() replacements that tell us if we're leaking and
+ * maybe do sanity checks too... */
+
+/*************************************************************************/
diff --git a/memoserv.c b/memoserv.c
new file mode 100644
index 000000000..94f096df5
--- /dev/null
+++ b/memoserv.c
@@ -0,0 +1,1175 @@
+/* MemoServ functions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: memoserv.c,v 1.30 2004/03/22 18:52:47 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+/*************************************************************************/
+/* *INDENT-OFF* */
+
+NickCore *nclists[1024];
+static int delmemo(MemoInfo *mi, int num);
+static int do_help(User *u);
+static int do_send(User *u);
+void memo_send(User *u, char *name, char *text, int z);
+static int do_cancel(User *u);
+static int do_list(User *u);
+static int do_read(User *u);
+static int do_del(User *u);
+static int do_set(User *u);
+static int do_set_notify(User *u, MemoInfo *mi, char *param);
+static int do_set_limit(User *u, MemoInfo *mi, char *param);
+static int do_info(User *u);
+static int do_staff(User *u);
+static int do_sendall(User *u);
+void moduleAddMemoServCmds(void);
+/*************************************************************************/
+
+void moduleAddMemoServCmds(void) {
+ Command *c;
+ c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+ c = createCommand("SEND", do_send, NULL, MEMO_HELP_SEND, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+ c = createCommand("CANCEL", do_cancel, NULL, MEMO_HELP_CANCEL, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+ c = createCommand("LIST", do_list, NULL, MEMO_HELP_LIST, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+ c = createCommand("READ", do_read, NULL, MEMO_HELP_READ, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+ c = createCommand("DEL", do_del, NULL, MEMO_HELP_DEL, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+ c = createCommand("STAFF", do_staff, is_services_oper, MEMO_HELP_STAFF, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+ c = createCommand("SET", do_set, NULL, MEMO_HELP_SET, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+ c = createCommand("SET NOTIFY", NULL, NULL, MEMO_HELP_SET_NOTIFY, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+ c = createCommand("SET LIMIT", NULL, NULL, -1,MEMO_HELP_SET_LIMIT, MEMO_SERVADMIN_HELP_SET_LIMIT,MEMO_SERVADMIN_HELP_SET_LIMIT, MEMO_SERVADMIN_HELP_SET_LIMIT); addCoreCommand(MEMOSERV,c);
+ c = createCommand("INFO", do_info, NULL, -1,MEMO_HELP_INFO, MEMO_SERVADMIN_HELP_INFO,MEMO_SERVADMIN_HELP_INFO, MEMO_SERVADMIN_HELP_INFO); addCoreCommand(MEMOSERV,c);
+ c = createCommand("SENDALL", do_sendall, is_services_admin, MEMO_HELP_SENDALL, -1,-1,-1,-1); addCoreCommand(MEMOSERV,c);
+}
+
+/*************************************************************************/
+/*************************************************************************/
+/* *INDENT-ON* */
+
+/* MemoServ initialization. */
+
+void ms_init(void)
+{
+ Command *cmd;
+ moduleAddMemoServCmds();
+ cmd = findCommand(MEMOSERV, "SET LIMIT");
+ if (cmd)
+ cmd->help_param1 = (char *) (long) MSMaxMemos;
+}
+
+/*************************************************************************/
+
+/* memoserv: Main MemoServ routine.
+ * Note that the User structure passed to the do_* routines will
+ * always be valid (non-NULL) and will always have a valid
+ * NickInfo pointer in the `ni' field.
+ */
+
+void memoserv(User * u, char *buf)
+{
+ char *cmd, *s;
+
+ cmd = strtok(buf, " ");
+ if (!cmd) {
+ return;
+ } else if (stricmp(cmd, "\1PING") == 0) {
+ if (!(s = strtok(NULL, "")))
+ s = "\1";
+ notice(s_MemoServ, u->nick, "\1PING %s", s);
+ } else if (skeleton) {
+ notice_lang(s_MemoServ, u, SERVICE_OFFLINE, s_MemoServ);
+ } else {
+ if (!u->na && stricmp(cmd, "HELP") != 0)
+ notice_lang(s_MemoServ, u, NICK_NOT_REGISTERED_HELP,
+ s_NickServ);
+ else
+ mod_run_cmd(s_MemoServ, u, MEMOSERV, cmd);
+ }
+}
+
+/*************************************************************************/
+
+/* check_memos: See if the given user has any unread memos, and send a
+ * NOTICE to that user if so (and if the appropriate flag is
+ * set).
+ */
+
+void check_memos(User * u)
+{
+ NickCore *nc;
+ int i, newcnt = 0;
+
+ if (!(nc = (u->na ? u->na->nc : NULL)) || !nick_recognized(u) ||
+ !(nc->flags & NI_MEMO_SIGNON))
+ return;
+
+ for (i = 0; i < nc->memos.memocount; i++) {
+ if (nc->memos.memos[i].flags & MF_UNREAD)
+ newcnt++;
+ }
+ if (newcnt > 0) {
+ notice_lang(s_MemoServ, u,
+ newcnt == 1 ? MEMO_HAVE_NEW_MEMO : MEMO_HAVE_NEW_MEMOS,
+ newcnt);
+ if (newcnt == 1 && (nc->memos.memos[i - 1].flags & MF_UNREAD)) {
+ notice_lang(s_MemoServ, u, MEMO_TYPE_READ_LAST, s_MemoServ);
+ } else if (newcnt == 1) {
+ for (i = 0; i < nc->memos.memocount; i++) {
+ if (nc->memos.memos[i].flags & MF_UNREAD)
+ break;
+ }
+ notice_lang(s_MemoServ, u, MEMO_TYPE_READ_NUM, s_MemoServ,
+ nc->memos.memos[i].number);
+ } else {
+ notice_lang(s_MemoServ, u, MEMO_TYPE_LIST_NEW, s_MemoServ);
+ }
+ }
+ if (nc->memos.memomax > 0 && nc->memos.memocount >= nc->memos.memomax) {
+ if (nc->memos.memocount > nc->memos.memomax)
+ notice_lang(s_MemoServ, u, MEMO_OVER_LIMIT, nc->memos.memomax);
+ else
+ notice_lang(s_MemoServ, u, MEMO_AT_LIMIT, nc->memos.memomax);
+ }
+}
+
+/*************************************************************************/
+/*********************** MemoServ private routines ***********************/
+/*************************************************************************/
+
+/* Return the MemoInfo corresponding to the given nick or channel name.
+ * Return in `ischan' 1 if the name was a channel name, else 0.
+ */
+
+static MemoInfo *getmemoinfo(const char *name, int *ischan)
+{
+ if (*name == '#') {
+ ChannelInfo *ci;
+ if (ischan)
+ *ischan = 1;
+ ci = cs_findchan(name);
+ if (ci && !(ci->flags & CI_VERBOTEN))
+ return &ci->memos;
+ else
+ return NULL;
+ } else {
+ NickAlias *na;
+ if (ischan)
+ *ischan = 0;
+ na = findnick(name);
+ if (na && !(na->status & NS_VERBOTEN))
+ return &na->nc->memos;
+ else
+ return NULL;
+ }
+}
+
+/*************************************************************************/
+
+/* Delete a memo by number. Return 1 if the memo was found, else 0. */
+
+static int delmemo(MemoInfo * mi, int num)
+{
+ int i;
+
+ for (i = 0; i < mi->memocount; i++) {
+ if (mi->memos[i].number == num)
+ break;
+ }
+ if (i < mi->memocount) {
+ free(mi->memos[i].text); /* Deallocate memo text memory */
+ mi->memocount--; /* One less memo now */
+ if (i < mi->memocount) /* Move remaining memos down a slot */
+ memmove(mi->memos + i, mi->memos + i + 1,
+ sizeof(Memo) * (mi->memocount - i));
+ if (mi->memocount == 0) { /* If no more memos, free array */
+ free(mi->memos);
+ mi->memos = NULL;
+ }
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+/*************************************************************************/
+/*********************** MemoServ command routines ***********************/
+/*************************************************************************/
+
+/* Return a help message. */
+
+static int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_MemoServ, u, MEMO_HELP);
+ if (is_services_oper(u)) {
+ notice_help(s_MemoServ, u, MEMO_HELP_OPER);
+ }
+ if (is_services_admin(u)) {
+ notice_help(s_MemoServ, u, MEMO_HELP_ADMIN);
+ }
+ moduleDisplayHelp(3, u);
+ notice_help(s_MemoServ, u, MEMO_HELP_FOOTER, s_ChanServ);
+ } else {
+ mod_help_cmd(s_MemoServ, u, MEMOSERV, cmd);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Send a memo to a nick/channel. */
+
+static int do_send(User * u)
+{
+ char *name = strtok(NULL, " ");
+ char *text = strtok(NULL, "");
+ int z = 0;
+ memo_send(u, name, text, z);
+ return MOD_CONT;
+}
+
+/**
+ * Split from do_send, this way we can easily send a memo from any point :)
+ * u - sender User
+ * name - target name
+ * text - memo Text
+ * z - output level,
+ * 0 - reply to user
+ * 1 - silent
+ * 2 - silent with no delay timer
+ **/
+void memo_send(User * u, char *name, char *text, int z)
+{
+ int ischan;
+ Memo *m;
+ MemoInfo *mi;
+ time_t now = time(NULL);
+ char *source = u->na->nc->display;
+ int is_servadmin = is_services_admin(u);
+
+ if (readonly) {
+ notice_lang(s_MemoServ, u, MEMO_SEND_DISABLED);
+ } else if (checkDefCon(DEFCON_NO_NEW_MEMOS)) {
+ notice_lang(s_MemoServ, u, OPER_DEFCON_DENIED);
+ return;
+ } else if (!text) {
+ if (z == 0)
+ syntax_error(s_MemoServ, u, "SEND", MEMO_SEND_SYNTAX);
+
+ } else if (!nick_recognized(u)) {
+ if (z == 0)
+ notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+
+ } else if (!(mi = getmemoinfo(name, &ischan))) {
+ if (z == 0)
+ notice_lang(s_MemoServ, u,
+ ischan ? CHAN_X_NOT_REGISTERED :
+ NICK_X_NOT_REGISTERED, name);
+
+ } else if (z != 2 && MSSendDelay > 0 &&
+ u && u->lastmemosend + MSSendDelay > now && !is_servadmin) {
+ u->lastmemosend = now;
+ if (z == 0)
+ notice_lang(s_MemoServ, u, MEMO_SEND_PLEASE_WAIT, MSSendDelay);
+
+ } else if (mi->memomax == 0 && !is_servadmin) {
+ if (z == 0)
+ notice_lang(s_MemoServ, u, MEMO_X_GETS_NO_MEMOS, name);
+
+ } else if (mi->memomax > 0 && mi->memocount >= mi->memomax
+ && !is_servadmin) {
+ if (z == 0)
+ notice_lang(s_MemoServ, u, MEMO_X_HAS_TOO_MANY_MEMOS, name);
+
+ } else {
+ u->lastmemosend = now;
+ mi->memocount++;
+ mi->memos = srealloc(mi->memos, sizeof(Memo) * mi->memocount);
+ m = &mi->memos[mi->memocount - 1];
+ strscpy(m->sender, source, NICKMAX);
+ if (mi->memocount > 1) {
+ m->number = m[-1].number + 1;
+ if (m->number < 1) {
+ int i;
+ for (i = 0; i < mi->memocount; i++)
+ mi->memos[i].number = i + 1;
+ }
+ } else {
+ m->number = 1;
+ }
+ m->time = time(NULL);
+ m->text = sstrdup(text);
+ m->flags = MF_UNREAD;
+ if (z == 0)
+ notice_lang(s_MemoServ, u, MEMO_SENT, name);
+ if (!ischan) {
+ NickAlias *na;
+ NickCore *nc = (findnick(name))->nc;
+
+ if (MSNotifyAll) {
+ if ((nc->flags & NI_MEMO_RECEIVE)
+ && get_ignore(name) == NULL) {
+ int i;
+
+ for (i = 0; i < nc->aliases.count; i++) {
+ na = nc->aliases.list[i];
+ if (na->u && nick_identified(na->u))
+ notice_lang(s_MemoServ, na->u,
+ MEMO_NEW_MEMO_ARRIVED, source,
+ s_MemoServ, m->number);
+ }
+ } else {
+ if ((u = finduser(name)) && nick_identified(u))
+ notice_lang(s_MemoServ, u, MEMO_NEW_MEMO_ARRIVED,
+ source, s_MemoServ, m->number);
+ } /* if (flags & MEMO_RECEIVE) */
+ } /* if (MSNotifyAll) */
+ } else {
+ struct c_userlist *cu, *next;
+ Channel *c;
+
+ if (MSNotifyAll && (c = findchan(name))) {
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ if (check_access(cu->user, c->ci, CA_MEMO)) {
+ if (cu->user->na
+ && (cu->user->na->nc->flags & NI_MEMO_RECEIVE)
+ && get_ignore(cu->user->nick) == NULL) {
+ notice_lang(s_MemoServ, cu->user,
+ MEMO_NEW_X_MEMO_ARRIVED,
+ c->ci->name, s_MemoServ,
+ c->ci->name, m->number);
+ }
+ }
+ }
+ } /* MSNotifyAll */
+ } /* if (!ischan) */
+ } /* if command is valid */
+}
+
+/*************************************************************************/
+
+static int do_cancel(User * u)
+{
+ int ischan;
+ char *name = strtok(NULL, " ");
+ MemoInfo *mi;
+
+ if (!name) {
+ syntax_error(s_MemoServ, u, "CANCEL", MEMO_CANCEL_SYNTAX);
+
+ } else if (!nick_recognized(u)) {
+ notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+
+ } else if (!(mi = getmemoinfo(name, &ischan))) {
+ notice_lang(s_MemoServ, u,
+ ischan ? CHAN_X_NOT_REGISTERED : NICK_X_NOT_REGISTERED,
+ name);
+ } else {
+ int i;
+
+ for (i = mi->memocount - 1; i >= 0; i--) {
+ if ((mi->memos[i].flags & MF_UNREAD)
+ && !stricmp(mi->memos[i].sender, u->na->nc->display)) {
+ delmemo(mi, mi->memos[i].number);
+ notice_lang(s_MemoServ, u, MEMO_CANCELLED, name);
+ return MOD_CONT;
+ }
+ }
+
+ notice_lang(s_MemoServ, u, MEMO_CANCEL_NONE);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Display a single memo entry, possibly printing the header first. */
+
+static int list_memo(User * u, int index, MemoInfo * mi, int *sent_header,
+ int new, const char *chan)
+{
+ Memo *m;
+ char timebuf[64];
+ struct tm tm;
+
+ if (index < 0 || index >= mi->memocount)
+ return 0;
+ if (!*sent_header) {
+ if (chan) {
+ notice_lang(s_MemoServ, u,
+ new ? MEMO_LIST_CHAN_NEW_MEMOS :
+ MEMO_LIST_CHAN_MEMOS, chan, s_MemoServ, chan);
+ } else {
+ notice_lang(s_MemoServ, u,
+ new ? MEMO_LIST_NEW_MEMOS : MEMO_LIST_MEMOS,
+ u->nick, s_MemoServ);
+ }
+ notice_lang(s_MemoServ, u, MEMO_LIST_HEADER);
+ *sent_header = 1;
+ }
+ m = &mi->memos[index];
+ tm = *localtime(&m->time);
+ strftime_lang(timebuf, sizeof(timebuf),
+ u, STRFTIME_DATE_TIME_FORMAT, &tm);
+ timebuf[sizeof(timebuf) - 1] = 0; /* just in case */
+ notice_lang(s_MemoServ, u, MEMO_LIST_FORMAT,
+ (m->flags & MF_UNREAD) ? '*' : ' ',
+ m->number, m->sender, timebuf);
+ return 1;
+}
+
+static int list_memo_callback(User * u, int num, va_list args)
+{
+ MemoInfo *mi = va_arg(args, MemoInfo *);
+ int *sent_header = va_arg(args, int *);
+ const char *chan = va_arg(args, const char *);
+ int i;
+
+ for (i = 0; i < mi->memocount; i++) {
+ if (mi->memos[i].number == num)
+ break;
+ }
+ /* Range checking done by list_memo() */
+ return list_memo(u, i, mi, sent_header, 0, chan);
+}
+
+
+/* List the memos (if any) for the source nick or given channel. */
+
+static int do_list(User * u)
+{
+ char *param = strtok(NULL, " "), *chan = NULL;
+ ChannelInfo *ci;
+ MemoInfo *mi;
+ Memo *m;
+ int i;
+
+ if (param && *param == '#') {
+ chan = param;
+ param = strtok(NULL, " ");
+ if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan);
+ return MOD_CONT;
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan);
+ return MOD_CONT;
+ } else if (!check_access(u, ci, CA_MEMO)) {
+ notice_lang(s_MemoServ, u, ACCESS_DENIED);
+ return MOD_CONT;
+ }
+ mi = &ci->memos;
+ } else {
+ if (!nick_identified(u)) {
+ notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ return MOD_CONT;
+ }
+ mi = &u->na->nc->memos;
+ }
+ if (param && !isdigit(*param) && stricmp(param, "NEW") != 0) {
+ syntax_error(s_MemoServ, u, "LIST", MEMO_LIST_SYNTAX);
+ } else if (mi->memocount == 0) {
+ if (chan)
+ notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_MEMOS, chan);
+ else
+ notice_lang(s_MemoServ, u, MEMO_HAVE_NO_MEMOS);
+ } else {
+ int sent_header = 0;
+ if (param && isdigit(*param)) {
+ process_numlist(param, NULL, list_memo_callback, u,
+ mi, &sent_header, chan);
+ } else {
+ if (param) {
+ for (i = 0, m = mi->memos; i < mi->memocount; i++, m++) {
+ if (m->flags & MF_UNREAD)
+ break;
+ }
+ if (i == mi->memocount) {
+ if (chan)
+ notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_NEW_MEMOS,
+ chan);
+ else
+ notice_lang(s_MemoServ, u, MEMO_HAVE_NO_NEW_MEMOS);
+ return MOD_CONT;
+ }
+ }
+ for (i = 0, m = mi->memos; i < mi->memocount; i++, m++) {
+ if (param && !(m->flags & MF_UNREAD))
+ continue;
+ list_memo(u, i, mi, &sent_header, param != NULL, chan);
+ }
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Send a single memo to the given user. */
+
+static int read_memo(User * u, int index, MemoInfo * mi, const char *chan)
+{
+ Memo *m;
+ char timebuf[64];
+ struct tm tm;
+
+ if (index < 0 || index >= mi->memocount)
+ return 0;
+ m = &mi->memos[index];
+ tm = *localtime(&m->time);
+ strftime_lang(timebuf, sizeof(timebuf),
+ u, STRFTIME_DATE_TIME_FORMAT, &tm);
+ timebuf[sizeof(timebuf) - 1] = 0;
+ if (chan)
+ notice_lang(s_MemoServ, u, MEMO_CHAN_HEADER, m->number,
+ m->sender, timebuf, s_MemoServ, chan, m->number);
+ else
+ notice_lang(s_MemoServ, u, MEMO_HEADER, m->number,
+ m->sender, timebuf, s_MemoServ, m->number);
+ notice_lang(s_MemoServ, u, MEMO_TEXT, m->text);
+ m->flags &= ~MF_UNREAD;
+ return 1;
+}
+
+static int read_memo_callback(User * u, int num, va_list args)
+{
+ MemoInfo *mi = va_arg(args, MemoInfo *);
+ const char *chan = va_arg(args, const char *);
+ int i;
+
+ for (i = 0; i < mi->memocount; i++) {
+ if (mi->memos[i].number == num)
+ break;
+ }
+ /* Range check done in read_memo */
+ return read_memo(u, i, mi, chan);
+}
+
+
+/* Read memos. */
+
+static int do_read(User * u)
+{
+ MemoInfo *mi;
+ ChannelInfo *ci;
+ char *numstr = strtok(NULL, " "), *chan = NULL;
+ int num, count;
+
+ if (numstr && *numstr == '#') {
+ chan = numstr;
+ numstr = strtok(NULL, " ");
+ if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan);
+ return MOD_CONT;
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan);
+ return MOD_CONT;
+ } else if (!check_access(u, ci, CA_MEMO)) {
+ notice_lang(s_MemoServ, u, ACCESS_DENIED);
+ return MOD_CONT;
+ }
+ mi = &ci->memos;
+ } else {
+ if (!nick_identified(u)) {
+ notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ return MOD_CONT;
+ }
+ mi = &u->na->nc->memos;
+ }
+ num = numstr ? atoi(numstr) : -1;
+ if (!numstr
+ || (stricmp(numstr, "LAST") != 0 && stricmp(numstr, "NEW") != 0
+ && num <= 0)) {
+ syntax_error(s_MemoServ, u, "READ", MEMO_READ_SYNTAX);
+
+ } else if (mi->memocount == 0) {
+ if (chan)
+ notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_MEMOS, chan);
+ else
+ notice_lang(s_MemoServ, u, MEMO_HAVE_NO_MEMOS);
+
+ } else {
+ int i;
+
+ if (stricmp(numstr, "NEW") == 0) {
+ int readcount = 0;
+ for (i = 0; i < mi->memocount; i++) {
+ if (mi->memos[i].flags & MF_UNREAD) {
+ read_memo(u, i, mi, chan);
+ readcount++;
+ }
+ }
+ if (!readcount) {
+ if (chan)
+ notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_NEW_MEMOS,
+ chan);
+ else
+ notice_lang(s_MemoServ, u, MEMO_HAVE_NO_NEW_MEMOS);
+ }
+ } else if (stricmp(numstr, "LAST") == 0) {
+ for (i = 0; i < mi->memocount - 1; i++);
+ read_memo(u, i, mi, chan);
+ } else { /* number[s] */
+ if (!process_numlist(numstr, &count, read_memo_callback, u,
+ mi, chan)) {
+ if (count == 1)
+ notice_lang(s_MemoServ, u, MEMO_DOES_NOT_EXIST, num);
+ else
+ notice_lang(s_MemoServ, u, MEMO_LIST_NOT_FOUND,
+ numstr);
+ }
+ }
+
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Delete a single memo from a MemoInfo. */
+
+static int del_memo_callback(User * u, int num, va_list args)
+{
+ MemoInfo *mi = va_arg(args, MemoInfo *);
+ int *last = va_arg(args, int *);
+ int *last0 = va_arg(args, int *);
+ char **end = va_arg(args, char **);
+ int *left = va_arg(args, int *);
+
+ if (delmemo(mi, num)) {
+ if (num != (*last) + 1) {
+ if (*last != -1) {
+ int len;
+ if (*last0 != *last)
+ len = snprintf(*end, *left, ",%d-%d", *last0, *last);
+ else
+ len = snprintf(*end, *left, ",%d", *last);
+ *end += len;
+ *left -= len;
+ }
+ *last0 = num;
+ }
+ *last = num;
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+/* Delete memos. */
+
+static int do_del(User * u)
+{
+ MemoInfo *mi;
+ ChannelInfo *ci;
+ char *numstr = strtok(NULL, ""), *chan = NULL;
+ int last, last0, i;
+ char buf[BUFSIZE], *end;
+ int delcount, count, left;
+
+ if (numstr && *numstr == '#') {
+ chan = strtok(numstr, " ");
+ numstr = strtok(NULL, "");
+ if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan);
+ return MOD_CONT;
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan);
+ return MOD_CONT;
+ } else if (!check_access(u, ci, CA_MEMO)) {
+ notice_lang(s_MemoServ, u, ACCESS_DENIED);
+ return MOD_CONT;
+ }
+ mi = &ci->memos;
+ } else {
+ if (!nick_identified(u)) {
+ notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ return MOD_CONT;
+ }
+ mi = &u->na->nc->memos;
+ }
+ if (!numstr
+ || (!isdigit(*numstr) && stricmp(numstr, "ALL") != 0
+ && stricmp(numstr, "LAST") != 0)) {
+ syntax_error(s_MemoServ, u, "DEL", MEMO_DEL_SYNTAX);
+ } else if (mi->memocount == 0) {
+ if (chan)
+ notice_lang(s_MemoServ, u, MEMO_X_HAS_NO_MEMOS, chan);
+ else
+ notice_lang(s_MemoServ, u, MEMO_HAVE_NO_MEMOS);
+ } else {
+ if (isdigit(*numstr)) {
+ /* Delete a specific memo or memos. */
+ last = -1; /* Last memo deleted */
+ last0 = -1; /* Beginning of range of last memos deleted */
+ end = buf;
+ left = sizeof(buf);
+ delcount =
+ process_numlist(numstr, &count, del_memo_callback, u, mi,
+ &last, &last0, &end, &left);
+ if (last != -1) {
+ /* Some memos got deleted; tell them which ones. */
+ if (delcount > 1) {
+ if (last0 != last)
+ end += snprintf(end, sizeof(buf) - (end - buf),
+ ",%d-%d", last0, last);
+ else
+ end += snprintf(end, sizeof(buf) - (end - buf),
+ ",%d", last);
+ /* "buf+1" here because *buf == ',' */
+ notice_lang(s_MemoServ, u, MEMO_DELETED_SEVERAL,
+ buf + 1);
+ } else {
+ notice_lang(s_MemoServ, u, MEMO_DELETED_ONE, last);
+ }
+ } else {
+ /* No memos were deleted. Tell them so. */
+ if (count == 1)
+ notice_lang(s_MemoServ, u, MEMO_DOES_NOT_EXIST,
+ atoi(numstr));
+ else
+ notice_lang(s_MemoServ, u, MEMO_DELETED_NONE);
+ }
+ } else if (stricmp(numstr, "LAST") == 0) {
+ /* Delete last memo. */
+ for (i = 0; i < mi->memocount; i++)
+ last = mi->memos[i].number;
+ delmemo(mi, last);
+ notice_lang(s_MemoServ, u, MEMO_DELETED_ONE, last);
+ } else {
+ /* Delete all memos. */
+ for (i = 0; i < mi->memocount; i++)
+ free(mi->memos[i].text);
+ free(mi->memos);
+ mi->memos = NULL;
+ mi->memocount = 0;
+ if (chan)
+ notice_lang(s_MemoServ, u, MEMO_CHAN_DELETED_ALL, chan);
+ else
+ notice_lang(s_MemoServ, u, MEMO_DELETED_ALL);
+ }
+
+ /* Reset the order */
+ for (i = 0; i < mi->memocount; i++)
+ mi->memos[i].number = i + 1;
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ char *param = strtok(NULL, "");
+ MemoInfo *mi = &u->na->nc->memos;
+
+ if (readonly) {
+ notice_lang(s_MemoServ, u, MEMO_SET_DISABLED);
+ return MOD_CONT;
+ }
+ if (!param) {
+ syntax_error(s_MemoServ, u, "SET", MEMO_SET_SYNTAX);
+ } else if (!nick_identified(u)) {
+ notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ return MOD_CONT;
+ } else if (stricmp(cmd, "NOTIFY") == 0) {
+ do_set_notify(u, mi, param);
+ } else if (stricmp(cmd, "LIMIT") == 0) {
+ do_set_limit(u, mi, param);
+ } else {
+ notice_lang(s_MemoServ, u, MEMO_SET_UNKNOWN_OPTION, cmd);
+ notice_lang(s_MemoServ, u, MORE_INFO, s_MemoServ, "SET");
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_notify(User * u, MemoInfo * mi, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ u->na->nc->flags |= NI_MEMO_SIGNON | NI_MEMO_RECEIVE;
+ notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_ON, s_MemoServ);
+ } else if (stricmp(param, "LOGON") == 0) {
+ u->na->nc->flags |= NI_MEMO_SIGNON;
+ u->na->nc->flags &= ~NI_MEMO_RECEIVE;
+ notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_LOGON, s_MemoServ);
+ } else if (stricmp(param, "NEW") == 0) {
+ u->na->nc->flags &= ~NI_MEMO_SIGNON;
+ u->na->nc->flags |= NI_MEMO_RECEIVE;
+ notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_NEW, s_MemoServ);
+ } else if (stricmp(param, "OFF") == 0) {
+ u->na->nc->flags &= ~(NI_MEMO_SIGNON | NI_MEMO_RECEIVE);
+ notice_lang(s_MemoServ, u, MEMO_SET_NOTIFY_OFF, s_MemoServ);
+ } else {
+ syntax_error(s_MemoServ, u, "SET NOTIFY", MEMO_SET_NOTIFY_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_limit(User * u, MemoInfo * mi, char *param)
+{
+ char *p1 = strtok(param, " ");
+ char *p2 = strtok(NULL, " ");
+ char *p3 = strtok(NULL, " ");
+ char *user = NULL, *chan = NULL;
+ int32 limit;
+ NickAlias *na = u->na;
+ ChannelInfo *ci = NULL;
+ int is_servadmin = is_services_admin(u);
+
+ if (p1 && *p1 == '#') {
+ chan = p1;
+ p1 = p2;
+ p2 = p3;
+ p3 = strtok(NULL, " ");
+ if (!(ci = cs_findchan(chan))) {
+ notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, chan);
+ return MOD_CONT;
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, chan);
+ return MOD_CONT;
+ } else if (!is_servadmin && !check_access(u, ci, CA_MEMO)) {
+ notice_lang(s_MemoServ, u, ACCESS_DENIED);
+ return MOD_CONT;
+ }
+ mi = &ci->memos;
+ }
+ if (is_servadmin) {
+ if (p2 && stricmp(p2, "HARD") != 0 && !chan) {
+ if (!(na = findnick(p1))) {
+ notice_lang(s_MemoServ, u, NICK_X_NOT_REGISTERED, p1);
+ return MOD_CONT;
+ }
+ user = p1;
+ mi = &na->nc->memos;
+ p1 = p2;
+ p2 = p3;
+ } else if (!p1) {
+ syntax_error(s_MemoServ, u, "SET LIMIT",
+ MEMO_SET_LIMIT_SERVADMIN_SYNTAX);
+ return MOD_CONT;
+ }
+ if ((!isdigit(*p1) && stricmp(p1, "NONE") != 0) ||
+ (p2 && stricmp(p2, "HARD") != 0)) {
+ syntax_error(s_MemoServ, u, "SET LIMIT",
+ MEMO_SET_LIMIT_SERVADMIN_SYNTAX);
+ return MOD_CONT;
+ }
+ if (chan) {
+ if (p2)
+ ci->flags |= CI_MEMO_HARDMAX;
+ else
+ ci->flags &= ~CI_MEMO_HARDMAX;
+ } else {
+ if (p2)
+ na->nc->flags |= NI_MEMO_HARDMAX;
+ else
+ na->nc->flags &= ~NI_MEMO_HARDMAX;
+ }
+ limit = atoi(p1);
+ if (limit < 0 || limit > 32767) {
+ notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_OVERFLOW, 32767);
+ limit = 32767;
+ }
+ if (stricmp(p1, "NONE") == 0)
+ limit = -1;
+ } else {
+ if (!p1 || p2 || !isdigit(*p1)) {
+ syntax_error(s_MemoServ, u, "SET LIMIT",
+ MEMO_SET_LIMIT_SYNTAX);
+ return MOD_CONT;
+ }
+ if (chan && (ci->flags & CI_MEMO_HARDMAX)) {
+ notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_FORBIDDEN, chan);
+ return MOD_CONT;
+ } else if (!chan && (na->nc->flags & NI_MEMO_HARDMAX)) {
+ notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT_FORBIDDEN);
+ return MOD_CONT;
+ }
+ limit = atoi(p1);
+ /* The first character is a digit, but we could still go negative
+ * from overflow... watch out! */
+ if (limit < 0 || (MSMaxMemos > 0 && limit > MSMaxMemos)) {
+ if (chan) {
+ notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_TOO_HIGH,
+ chan, MSMaxMemos);
+ } else {
+ notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT_TOO_HIGH,
+ MSMaxMemos);
+ }
+ return MOD_CONT;
+ } else if (limit > 32767) {
+ notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_OVERFLOW, 32767);
+ limit = 32767;
+ }
+ }
+ mi->memomax = limit;
+ if (limit > 0) {
+ if (!chan && na->nc == u->na->nc)
+ notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT, limit);
+ else
+ notice_lang(s_MemoServ, u, MEMO_SET_LIMIT,
+ chan ? chan : user, limit);
+ } else if (limit == 0) {
+ if (!chan && na->nc == u->na->nc)
+ notice_lang(s_MemoServ, u, MEMO_SET_YOUR_LIMIT_ZERO);
+ else
+ notice_lang(s_MemoServ, u, MEMO_SET_LIMIT_ZERO,
+ chan ? chan : user);
+ } else {
+ if (!chan && na->nc == u->na->nc)
+ notice_lang(s_MemoServ, u, MEMO_UNSET_YOUR_LIMIT);
+ else
+ notice_lang(s_MemoServ, u, MEMO_UNSET_LIMIT,
+ chan ? chan : user);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_info(User * u)
+{
+ MemoInfo *mi;
+ NickAlias *na = NULL;
+ ChannelInfo *ci = NULL;
+ char *name = strtok(NULL, " ");
+ int is_servadmin = is_services_admin(u);
+ int hardmax = 0;
+
+ if (is_servadmin && name && *name != '#') {
+ na = findnick(name);
+ if (!na) {
+ notice_lang(s_MemoServ, u, NICK_X_NOT_REGISTERED, name);
+ return MOD_CONT;
+ }
+ mi = &na->nc->memos;
+ hardmax = na->nc->flags & NI_MEMO_HARDMAX ? 1 : 0;
+ } else if (name && *name == '#') {
+ ci = cs_findchan(name);
+ if (!ci) {
+ notice_lang(s_MemoServ, u, CHAN_X_NOT_REGISTERED, name);
+ return MOD_CONT;
+ } else if (ci->flags & CI_VERBOTEN) {
+ notice_lang(s_MemoServ, u, CHAN_X_FORBIDDEN, name);
+ return MOD_CONT;
+ } else if (!check_access(u, ci, CA_MEMO)) {
+ notice_lang(s_MemoServ, u, ACCESS_DENIED);
+ return MOD_CONT;
+ }
+ mi = &ci->memos;
+ hardmax = ci->flags & CI_MEMO_HARDMAX ? 1 : 0;
+ } else if (name) { /* It's not a chan and we aren't services admin */
+ notice_lang(s_MemoServ, u, ACCESS_DENIED);
+ return MOD_CONT;
+ } else { /* !name */
+ if (!nick_identified(u)) {
+ notice_lang(s_MemoServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ return MOD_CONT;
+ }
+ mi = &u->na->nc->memos;
+ hardmax = u->na->nc->flags & NI_MEMO_HARDMAX ? 1 : 0;
+ }
+
+ if (name && (ci || na->nc != u->na->nc)) {
+
+ if (!mi->memocount) {
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_NO_MEMOS, name);
+ } else if (mi->memocount == 1) {
+ if (mi->memos[0].flags & MF_UNREAD)
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_MEMO_UNREAD, name);
+ else
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_MEMO, name);
+ } else {
+ int count = 0, i;
+ for (i = 0; i < mi->memocount; i++) {
+ if (mi->memos[i].flags & MF_UNREAD)
+ count++;
+ }
+ if (count == mi->memocount)
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_MEMOS_ALL_UNREAD,
+ name, count);
+ else if (count == 0)
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_MEMOS, name,
+ mi->memocount);
+ else if (count == 0)
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_MEMOS_ONE_UNREAD,
+ name, mi->memocount);
+ else
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_MEMOS_SOME_UNREAD,
+ name, mi->memocount, count);
+ }
+ if (mi->memomax >= 0) {
+ if (hardmax)
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_HARD_LIMIT, name,
+ mi->memomax);
+ else
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_LIMIT, name,
+ mi->memomax);
+ } else {
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_NO_LIMIT, name);
+ }
+
+ /* I ripped this code out of ircservices 4.4.5, since I didn't want
+ to rewrite the whole thing (it pisses me off). */
+ if (na) {
+ if ((na->nc->flags & NI_MEMO_RECEIVE)
+ && (na->nc->flags & NI_MEMO_SIGNON)) {
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_NOTIFY_ON, name);
+ } else if (na->nc->flags & NI_MEMO_RECEIVE) {
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_NOTIFY_RECEIVE,
+ name);
+ } else if (na->nc->flags & NI_MEMO_SIGNON) {
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_NOTIFY_SIGNON,
+ name);
+ } else {
+ notice_lang(s_MemoServ, u, MEMO_INFO_X_NOTIFY_OFF, name);
+ }
+ }
+
+ } else { /* !name || (!ci || na->nc == u->na->nc) */
+
+ if (!mi->memocount) {
+ notice_lang(s_MemoServ, u, MEMO_INFO_NO_MEMOS);
+ } else if (mi->memocount == 1) {
+ if (mi->memos[0].flags & MF_UNREAD)
+ notice_lang(s_MemoServ, u, MEMO_INFO_MEMO_UNREAD);
+ else
+ notice_lang(s_MemoServ, u, MEMO_INFO_MEMO);
+ } else {
+ int count = 0, i;
+ for (i = 0; i < mi->memocount; i++) {
+ if (mi->memos[i].flags & MF_UNREAD)
+ count++;
+ }
+ if (count == mi->memocount)
+ notice_lang(s_MemoServ, u, MEMO_INFO_MEMOS_ALL_UNREAD,
+ count);
+ else if (count == 0)
+ notice_lang(s_MemoServ, u, MEMO_INFO_MEMOS, mi->memocount);
+ else if (count == 1)
+ notice_lang(s_MemoServ, u, MEMO_INFO_MEMOS_ONE_UNREAD,
+ mi->memocount);
+ else
+ notice_lang(s_MemoServ, u, MEMO_INFO_MEMOS_SOME_UNREAD,
+ mi->memocount, count);
+ }
+
+ if (mi->memomax == 0) {
+ if (!is_servadmin && hardmax)
+ notice_lang(s_MemoServ, u, MEMO_INFO_HARD_LIMIT_ZERO);
+ else
+ notice_lang(s_MemoServ, u, MEMO_INFO_LIMIT_ZERO);
+ } else if (mi->memomax > 0) {
+ if (!is_servadmin && hardmax)
+ notice_lang(s_MemoServ, u, MEMO_INFO_HARD_LIMIT,
+ mi->memomax);
+ else
+ notice_lang(s_MemoServ, u, MEMO_INFO_LIMIT, mi->memomax);
+ } else {
+ notice_lang(s_MemoServ, u, MEMO_INFO_NO_LIMIT);
+ }
+
+ /* Ripped too. But differently because of a seg fault (loughs) */
+ if ((u->na->nc->flags & NI_MEMO_RECEIVE)
+ && (u->na->nc->flags & NI_MEMO_SIGNON)) {
+ notice_lang(s_MemoServ, u, MEMO_INFO_NOTIFY_ON);
+ } else if (u->na->nc->flags & NI_MEMO_RECEIVE) {
+ notice_lang(s_MemoServ, u, MEMO_INFO_NOTIFY_RECEIVE);
+ } else if (u->na->nc->flags & NI_MEMO_SIGNON) {
+ notice_lang(s_MemoServ, u, MEMO_INFO_NOTIFY_SIGNON);
+ } else {
+ notice_lang(s_MemoServ, u, MEMO_INFO_NOTIFY_OFF);
+ }
+ }
+ return MOD_CONT; /* if (name && (ci || na->nc != u->na->nc)) */
+}
+
+/*************************************************************************/
+/**
+ * Allow the easy sending of memo's to all user's on the oper/admin/root lists
+ * - Rob
+ * Opers in several lists won't get the memo twice from now on
+ * - Certus
+ **/
+
+static int do_staff(User * u)
+{
+ NickCore *nc;
+ int i, z = 0;
+ char *text = strtok(NULL, "");
+
+ if (readonly) {
+ notice_lang(s_MemoServ, u, MEMO_SEND_DISABLED);
+ return MOD_CONT;
+ } else if (checkDefCon(DEFCON_NO_NEW_MEMOS)) {
+ notice_lang(s_MemoServ, u, OPER_DEFCON_DENIED);
+ return MOD_CONT;
+ } else if (text == NULL) {
+ syntax_error(s_MemoServ, u, "SEND", MEMO_SEND_SYNTAX);
+ return MOD_CONT;
+ }
+
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ if (nick_is_services_oper(nc))
+ memo_send(u, nc->display, text, z);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+/**
+ * Send a memo to all registered nicks
+ * - Certus - 06/06/2003
+ **/
+static int do_sendall(User * u)
+{
+ int i, z = 1;
+ NickCore *nc;
+ char *text = strtok(NULL, "");
+
+
+
+ if (readonly) {
+ notice_lang(s_MemoServ, u, MEMO_SEND_DISABLED);
+ return MOD_CONT;
+ } else if (checkDefCon(DEFCON_NO_NEW_MEMOS)) {
+ notice_lang(s_MemoServ, u, OPER_DEFCON_DENIED);
+ return MOD_CONT;
+ } else if (!text) {
+ syntax_error(s_MemoServ, u, "SENDALL", MEMO_SEND_SYNTAX);
+ return MOD_CONT;
+ }
+
+
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ if (stricmp(u->nick, nc->display) != 0)
+ memo_send(u, nc->display, text, z);
+ } /* /nc */
+ } /* /i */
+
+ notice_lang(s_MemoServ, u, MEMO_MASS_SENT);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
diff --git a/messages.c b/messages.c
new file mode 100644
index 000000000..1123df345
--- /dev/null
+++ b/messages.c
@@ -0,0 +1,1196 @@
+/* Definitions of IRC message functions and list of messages.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: messages.c,v 1.31 2004/02/15 18:34:40 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "messages.h"
+#include "language.h"
+
+static char *uplink;
+int servernum;
+/* List of messages is at the bottom of the file. */
+
+/*************************************************************************/
+/*************************************************************************/
+
+static int m_nickcoll(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ if (!skeleton && !readonly)
+ introduce_user(av[0]);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_ping(char *source, int ac, char **av)
+{
+ if (ac < 1)
+ return MOD_CONT;
+ send_cmd(ServerName, "PONG %s %s", ac > 1 ? av[1] : ServerName, av[0]);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_away(char *source, int ac, char **av)
+{
+ User *u = finduser(source);
+
+ if (u && (ac == 0 || *av[0] == 0)) /* un-away */
+ check_memos(u);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+
+#ifdef IRC_BAHAMUT
+
+static int m_cs(char *source, int ac, char **av)
+{
+ User *u;
+ time_t starttime, stoptime; /* When processing started and finished */
+
+ if (ac < 1 || skeleton)
+ return MOD_CONT;
+
+ u = finduser(source);
+
+ if (!u) {
+ alog("%s: user record for %s not found", s_ChanServ, source);
+ notice(s_ChanServ, source, getstring(NULL, USER_RECORD_NOT_FOUND));
+ return MOD_CONT;
+ }
+
+ /* Check if we should ignore. Operators always get through. */
+ if (allow_ignore && !is_oper(u)) {
+ IgnoreData *ign = get_ignore(source);
+ if (ign && ign->time > time(NULL)) {
+ alog("Ignored message from %s: \"%s\"", source, inbuf);
+ return MOD_CONT;
+ }
+ }
+
+ starttime = time(NULL);
+ if (!is_oper(u) && CSOpersOnly)
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ else
+ chanserv(u, av[0]);
+
+ /* Add to ignore list if the command took a significant amount of time. */
+ if (allow_ignore) {
+ stoptime = time(NULL);
+ if (stoptime > starttime && *source && !strchr(source, '.'))
+ add_ignore(source, stoptime - starttime);
+ }
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+#ifdef IRC_BAHAMUT
+
+static int m_hs(char *source, int ac, char **av)
+{
+ User *u;
+ time_t starttime, stoptime; /* When processing started and finished */
+
+ if (ac < 1 || skeleton)
+ return MOD_CONT;
+
+ u = finduser(source);
+
+ if (!u) {
+ alog("%s: user record for %s not found", s_HelpServ, source);
+ notice(s_HelpServ, source, getstring(NULL, USER_RECORD_NOT_FOUND));
+ return MOD_CONT;
+ }
+
+ /* Check if we should ignore. Operators always get through. */
+ if (allow_ignore && !is_oper(u)) {
+ IgnoreData *ign = get_ignore(source);
+ if (ign && ign->time > time(NULL)) {
+ alog("Ignored message from %s: \"%s\"", source, inbuf);
+ return MOD_CONT;
+ }
+ }
+
+ starttime = time(NULL);
+
+ notice_help(s_HelpServ, u, HELP_HELP, s_NickServ, s_ChanServ,
+ s_MemoServ);
+ if (s_BotServ)
+ notice_help(s_HelpServ, u, HELP_HELP_BOT, s_BotServ);
+
+ /* Add to ignore list if the command took a significant amount of time. */
+ if (allow_ignore) {
+ stoptime = time(NULL);
+ if (stoptime > starttime && *source && !strchr(source, '.'))
+ add_ignore(source, stoptime - starttime);
+ }
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+static int m_join(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_join(source, ac, av);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_kick(char *source, int ac, char **av)
+{
+ if (ac != 3)
+ return MOD_CONT;
+ do_kick(source, ac, av);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_kill(char *source, int ac, char **av)
+{
+ BotInfo *bi;
+
+ if (ac != 2)
+ return MOD_CONT;
+ /* Recover if someone kills us. */
+ if (stricmp(av[0], s_OperServ) == 0 ||
+ (s_OperServAlias && stricmp(av[0], s_OperServAlias) == 0) ||
+ stricmp(av[0], s_NickServ) == 0 ||
+ (s_NickServAlias && stricmp(av[0], s_NickServAlias) == 0) ||
+ stricmp(av[0], s_ChanServ) == 0 ||
+ (s_ChanServAlias && stricmp(av[0], s_ChanServAlias) == 0) ||
+ stricmp(av[0], s_MemoServ) == 0 ||
+ (s_MemoServAlias && stricmp(av[0], s_MemoServAlias) == 0) ||
+ (s_HostServ && stricmp(av[0], s_HostServ) == 0) ||
+ (s_HostServAlias && stricmp(av[0], s_HostServAlias) == 0) ||
+ (s_BotServ && stricmp(av[0], s_BotServ) == 0) ||
+ (s_BotServAlias && stricmp(av[0], s_BotServAlias) == 0) ||
+ stricmp(av[0], s_HelpServ) == 0 ||
+ (s_HelpServAlias && stricmp(av[0], s_HelpServAlias) == 0) ||
+ (s_DevNull && stricmp(av[0], s_DevNull) == 0) ||
+ (s_DevNullAlias && stricmp(av[0], s_DevNullAlias) == 0) ||
+ stricmp(av[0], s_GlobalNoticer) == 0 ||
+ (s_GlobalNoticerAlias && stricmp(av[0], s_GlobalNoticerAlias) == 0)
+ ) {
+ if (!readonly && !skeleton)
+ introduce_user(av[0]);
+ } else if (s_BotServ && (bi = findbot(av[0]))) {
+ if (!readonly && !skeleton) {
+ introduce_user(av[0]);
+ bot_rejoin_all(bi);
+ }
+ } else {
+ do_kill(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_mode(char *source, int ac, char **av)
+{
+ if (*av[0] == '#' || *av[0] == '&') {
+ if (ac < 2)
+ return MOD_CONT;
+ do_cmode(source, ac, av);
+ } else {
+ if (ac != 2)
+ return MOD_CONT;
+ do_umode(source, ac, av);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_motd(char *source, int ac, char **av)
+{
+ FILE *f;
+ char buf[BUFSIZE];
+
+ f = fopen(MOTDFilename, "r");
+ send_cmd(ServerName, "375 %s :- %s Message of the Day",
+ source, ServerName);
+ if (f) {
+ while (fgets(buf, sizeof(buf), f)) {
+ buf[strlen(buf) - 1] = 0;
+ send_cmd(ServerName, "372 %s :- %s", source, buf);
+ }
+ fclose(f);
+ } else {
+ send_cmd(ServerName, "372 %s :- MOTD file not found! Please "
+ "contact your IRC administrator.", source);
+ }
+ send_cmd(ServerName, "376 %s :End of /MOTD command.", source);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+#ifdef IRC_BAHAMUT
+
+static int m_ms(char *source, int ac, char **av)
+{
+ User *u;
+ time_t starttime, stoptime; /* When processing started and finished */
+
+ if (ac < 1 || skeleton)
+ return MOD_CONT;
+
+ u = finduser(source);
+
+ if (!u) {
+ alog("%s: user record for %s not found", s_MemoServ, source);
+ notice(s_MemoServ, source, getstring(NULL, USER_RECORD_NOT_FOUND));
+ return MOD_CONT;
+ }
+
+ /* Check if we should ignore. Operators always get through. */
+ if (allow_ignore && !is_oper(u)) {
+ IgnoreData *ign = get_ignore(source);
+ if (ign && ign->time > time(NULL)) {
+ alog("Ignored message from %s: \"%s\"", source, inbuf);
+ return MOD_CONT;
+ }
+ }
+
+ starttime = time(NULL);
+
+ memoserv(u, av[0]);
+
+ /* Add to ignore list if the command took a significant amount of time. */
+ if (allow_ignore) {
+ stoptime = time(NULL);
+ if (stoptime > starttime && *source && !strchr(source, '.'))
+ add_ignore(source, stoptime - starttime);
+ }
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+static int m_nick(char *source, int ac, char **av)
+{
+ if (ac != 2) {
+#if defined(IRC_HYBRID)
+ User *user = do_nick(source, av[0], av[4], av[5], av[6], av[7],
+ strtoul(av[2], NULL, 10), 0);
+ if (user)
+ set_umode(user, 1, &av[3]);
+#else
+#if defined(IRC_BAHAMUT)
+#if defined(IRC_ULTIMATE3)
+ User *user = do_nick(source, av[0], av[4], av[5], av[6], av[9],
+ strtoul(av[2], NULL, 10), strtoul(av[7], NULL,
+ 0),
+ strtoul(av[8], NULL, 0), "*");
+# else
+ User *user = do_nick(source, av[0], av[4], av[5], av[6], av[9],
+ strtoul(av[2], NULL, 10), strtoul(av[7], NULL,
+ 0),
+ strtoul(av[8], NULL, 0));
+# endif
+ if (user)
+ set_umode(user, 1, &av[3]);
+#elif defined(IRC_UNREAL)
+ if (ac == 7) {
+ /* For some reasons, Unreal sends this sometimes */
+ do_nick(source, av[0], av[3], av[4], av[5], av[6],
+ strtoul(av[2], NULL, 10), 0, "*");
+ } else {
+ User *user = do_nick(source, av[0], av[3], av[4], av[5], av[9],
+ strtoul(av[2], NULL, 10), strtoul(av[6],
+ NULL,
+ 0),
+ av[8]);
+
+ if (user)
+ set_umode(user, 1, &av[7]);
+ }
+#else
+# if defined(IRC_ULTIMATE)
+ if (ac == 7) {
+ do_nick(source, av[0], av[3], av[4], av[5], av[6],
+ strtoul(av[2], NULL, 10), 0);
+ } else {
+ do_nick(source, av[0], av[3], av[4], av[5], av[7],
+ strtoul(av[2], NULL, 10), strtoul(av[6], NULL, 0));
+ }
+/* PTlink IRCd - PTS4 */
+#elif defined(IRC_PTLINK)
+ User *user = do_nick(source, av[0], av[4], av[6], av[7], av[8],
+ strtoul(av[2], NULL, 10), 0, av[5]);
+ if (user)
+ set_umode(user, 1, &av[3]);
+#else
+ do_nick(source, av[0], av[3], av[4], av[5], av[7],
+ strtoul(av[2], NULL, 10), strtoul(av[6], NULL, 0));
+# endif
+#endif
+#endif
+ } else {
+ do_nick(source, av[0], NULL, NULL, NULL, NULL,
+ strtoul(av[1], NULL, 10), 0);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+#ifdef IRC_ULTIMATE3
+
+static int m_client(char *source, int ac, char **av)
+{
+ if (ac != 2) {
+ User *user = do_nick(source, av[0], av[5], av[6], av[8], av[11],
+ strtoul(av[2], NULL, 10), strtoul(av[9], NULL,
+ 0),
+ strtoul(av[10], NULL, 0), av[7]);
+ if (user) {
+ set_umode(user, 1, &av[3]);
+ }
+ }
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+#ifdef IRC_BAHAMUT
+
+static int m_ns(char *source, int ac, char **av)
+{
+ User *u;
+ time_t starttime, stoptime; /* When processing started and finished */
+
+ if (ac < 1 || skeleton)
+ return MOD_CONT;
+
+ u = finduser(source);
+
+ if (!u) {
+ alog("%s: user record for %s not found", s_NickServ, source);
+ notice(s_NickServ, source, getstring(NULL, USER_RECORD_NOT_FOUND));
+ return MOD_CONT;
+ }
+
+ /* Check if we should ignore. Operators always get through. */
+ if (allow_ignore && !is_oper(u)) {
+ IgnoreData *ign = get_ignore(source);
+ if (ign && ign->time > time(NULL)) {
+ alog("Ignored message from %s: \"%s\"", source, inbuf);
+ return MOD_CONT;
+ }
+ }
+
+ starttime = time(NULL);
+
+ nickserv(u, av[0]);
+
+ /* Add to ignore list if the command took a significant amount of time. */
+ if (allow_ignore) {
+ stoptime = time(NULL);
+ if (stoptime > starttime && *source && !strchr(source, '.'))
+ add_ignore(source, stoptime - starttime);
+ }
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+#ifdef IRC_PTLINK
+/*
+ * Note: This function has no validation whatsoever. Also, as of PTlink6.15.1
+ * when you /deoper you get to keep your vindent, but you lose your vhost. In
+ * that case serives will *NOT* modify it's internal record for the vhost. We
+ * need to address this in the future.
+ */
+static int m_newmask(char *source, int ac, char **av)
+{
+ User *u;
+ char *newhost = NULL, *newuser = NULL;
+
+ if (ac != 1)
+ return MOD_CONT;
+ u = finduser(source);
+
+ if (!u) {
+ alog("user: NEWMASK for nonexistent user %s", av[0]);
+ return MOD_CONT;
+ }
+
+ newuser = myStrGetOnlyToken(av[0], '@', 0);
+ if (newuser) {
+ newhost = myStrGetTokenRemainder(av[0], '@', 1);
+ change_user_username(u, newuser);
+ } else {
+ newhost = av[0];
+ }
+
+ if (*newhost == '@')
+ newhost++;
+
+ if (newhost) {
+ change_user_host(u, newhost);
+ }
+
+ return MOD_CONT;
+}
+#endif
+
+
+/*************************************************************************/
+
+#ifdef IRC_BAHAMUT
+
+static int m_os(char *source, int ac, char **av)
+{
+ User *u;
+ time_t starttime, stoptime; /* When processing started and finished */
+
+ if (ac < 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+
+ if (!u) {
+ alog("%s: user record for %s not found", s_OperServ, source);
+ notice(s_OperServ, source, getstring(NULL, USER_RECORD_NOT_FOUND));
+ return MOD_CONT;
+ }
+
+ /* Check if we should ignore. Operators always get through. */
+ if (allow_ignore && !is_oper(u)) {
+ IgnoreData *ign = get_ignore(source);
+ if (ign && ign->time > time(NULL)) {
+ alog("Ignored message from %s: \"%s\"", source, inbuf);
+ return MOD_CONT;
+ }
+ }
+
+ starttime = time(NULL);
+
+ if (is_oper(u)) {
+ operserv(u, av[0]);
+ } else {
+ notice_lang(s_OperServ, u, ACCESS_DENIED);
+
+ if (WallBadOS)
+ wallops(s_OperServ,
+ "Denied access to %s from %s!%s@%s (non-oper)",
+ s_OperServ, u->nick, u->username, u->host);
+ }
+
+ /* Add to ignore list if the command took a significant amount of time. */
+ if (allow_ignore) {
+ stoptime = time(NULL);
+ if (stoptime > starttime && *source && !strchr(source, '.'))
+ add_ignore(source, stoptime - starttime);
+ }
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+static int m_part(char *source, int ac, char **av)
+{
+ if (ac < 1 || ac > 2)
+ return MOD_CONT;
+ do_part(source, ac, av);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_privmsg(char *source, int ac, char **av)
+{
+ char *s;
+ time_t starttime, stoptime; /* When processing started and finished */
+
+ BotInfo *bi;
+ ChannelInfo *ci;
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(source);
+
+ if (!u) {
+ alog("%s: user record for %s not found", av[1], source);
+ notice(av[1], source, getstring(NULL, USER_RECORD_NOT_FOUND));
+ return MOD_CONT;
+ }
+
+ if (*av[0] == '#') {
+ if (s_BotServ && (ci = cs_findchan(av[0])))
+ if (!(ci->flags & CI_VERBOTEN) && ci->c && ci->bi) /* Some paranoia checks */
+ botchanmsgs(u, ci, av[1]);
+ } else {
+
+ /* Check if we should ignore. Operators always get through. */
+ if (allow_ignore && !is_oper(u)) {
+ IgnoreData *ign = get_ignore(source);
+ if (ign && ign->time > time(NULL)) {
+ alog("Ignored message from %s: \"%s\"", source, inbuf);
+ return MOD_CONT;
+ }
+ }
+
+ /* If a server is specified (nick@server format), make sure it matches
+ * us, and strip it off. */
+ s = strchr(av[0], '@');
+ if (s) {
+ *s++ = 0;
+ if (stricmp(s, ServerName) != 0)
+ return MOD_CONT;
+ }
+
+ starttime = time(NULL);
+
+ if ((stricmp(av[0], s_OperServ) == 0)
+ || (s_OperServAlias && (stricmp(av[0], s_OperServAlias) == 0))) {
+ if (is_oper(u)) {
+ operserv(u, av[1]);
+ } else {
+ notice_lang(s_OperServ, u, ACCESS_DENIED);
+
+ if (WallBadOS)
+ wallops(s_OperServ,
+ "Denied access to %s from %s!%s@%s (non-oper)",
+ s_OperServ, u->nick, u->username, u->host);
+ }
+ } else if ((stricmp(av[0], s_NickServ) == 0)
+ || (s_NickServAlias
+ && (stricmp(av[0], s_NickServAlias) == 0))) {
+ nickserv(u, av[1]);
+ } else if ((stricmp(av[0], s_ChanServ) == 0)
+ || (s_ChanServAlias
+ && (stricmp(av[0], s_ChanServAlias) == 0))) {
+ if (!is_oper(u) && CSOpersOnly)
+ notice_lang(s_ChanServ, u, ACCESS_DENIED);
+ else
+ chanserv(u, av[1]);
+ } else if ((stricmp(av[0], s_MemoServ) == 0)
+ || (s_MemoServAlias
+ && (stricmp(av[0], s_MemoServAlias) == 0))) {
+ memoserv(u, av[1]);
+ } else if (s_HostServ && ((stricmp(av[0], s_HostServ) == 0)
+ || (s_HostServAlias
+ && (stricmp(av[0], s_HostServAlias)
+ == 0)))) {
+ hostserv(u, av[1]);
+ } else if (s_HelpServ && ((stricmp(av[0], s_HelpServ) == 0)
+ || (s_HelpServAlias
+ && (stricmp(av[0], s_HelpServAlias)
+ == 0)))) {
+ helpserv(u, av[1]);
+ } else if (s_BotServ && ((stricmp(av[0], s_BotServ) == 0)
+ || (s_BotServAlias
+ && (stricmp(av[0], s_BotServAlias) ==
+ 0)))) {
+ botserv(u, av[1]);
+/* This HelpServ code is history since HelpServ is a REAL service */
+
+/* } else if ((stricmp(av[0], s_HelpServ) == 0)
+ || (s_HelpServAlias
+ && (stricmp(av[0], s_HelpServAlias) == 0))) {
+ notice_help(s_HelpServ, u, HELP_HELP, s_NickServ, s_ChanServ,
+ s_MemoServ);
+ if (s_BotServ)
+ notice_help(s_HelpServ, u, HELP_HELP_BOT, s_BotServ); */
+ } else if (s_BotServ && (bi = findbot(av[0]))) {
+ botmsgs(u, bi, av[1]);
+ }
+
+ /* Add to ignore list if the command took a significant amount of time. */
+ if (allow_ignore) {
+ stoptime = time(NULL);
+ if (stoptime > starttime && *source && !strchr(source, '.'))
+ add_ignore(source, stoptime - starttime);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_quit(char *source, int ac, char **av)
+{
+ if (ac != 1)
+ return MOD_CONT;
+ do_quit(source, ac, av);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_server(char *source, int ac, char **av)
+{
+ if (!stricmp(av[1], "1"))
+ uplink = sstrdup(av[0]);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+#if defined(IRC_ULTIMATE3)
+
+static int m_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ if (debug)
+ alog("user: SETHOST for nonexistent user %s", av[0]);
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+
+static int m_chghost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ alog("user: CHGHOST for nonexistent user %s", av[0]);
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_sethost(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ if (debug)
+ alog("user: SETHOST for nonexistent user %s", source);
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[0]);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_chgident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ alog("user: CHGIDENT for nonexistent user %s", av[0]);
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[1]);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_setident(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ alog("user: SETIDENT for nonexistent user %s", source);
+ return MOD_CONT;
+ }
+
+ change_user_username(u, av[0]);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_chgname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ alog("user: CHGNAME for nonexistent user %s", av[0]);
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[1]);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_setname(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 1)
+ return MOD_CONT;
+
+ u = finduser(source);
+ if (!u) {
+ alog("user: SETNAME for nonexistent user %s", source);
+ return MOD_CONT;
+ }
+
+ change_user_realname(u, av[0]);
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+#if defined(IRC_BAHAMUT) || defined(IRC_HYBRID) || defined(IRC_PTLINK)
+
+static int m_sjoin(char *source, int ac, char **av)
+{
+ do_sjoin(source, ac, av);
+ return MOD_CONT;
+}
+
+#endif
+
+/*************************************************************************/
+
+static int m_stats(char *source, int ac, char **av)
+{
+ int i;
+ User *u;
+ NickCore *nc;
+
+ if (ac < 1)
+ return MOD_CONT;
+
+ switch (*av[0]) {
+ case 'l':
+ u = finduser(source);
+
+ if (u && is_oper(u)) {
+
+ if (servernum == 1) {
+ send_cmd(NULL,
+ "211 %s Server SendBuf SentBytes SentMsgs RecvBuf "
+ "RecvBytes RecvMsgs ConnTime", source);
+ send_cmd(NULL, "211 %s %s %d %d %d %d %d %d %ld", source,
+ RemoteServer, write_buffer_len(), total_written,
+ -1, read_buffer_len(), total_read, -1,
+ time(NULL) - start_time);
+ } else if (servernum == 2) {
+ send_cmd(NULL,
+ "211 %s Server SendBuf SentBytes SentMsgs RecvBuf "
+ "RecvBytes RecvMsgs ConnTime", source);
+ send_cmd(NULL, "211 %s %s %d %d %d %d %d %d %ld", source,
+ RemoteServer2, write_buffer_len(), total_written,
+ -1, read_buffer_len(), total_read, -1,
+ time(NULL) - start_time);
+ } else if (servernum == 3) {
+ send_cmd(NULL,
+ "211 %s Server SendBuf SentBytes SentMsgs RecvBuf "
+ "RecvBytes RecvMsgs ConnTime", source);
+ send_cmd(NULL, "211 %s %s %d %d %d %d %d %d %ld", source,
+ RemoteServer3, write_buffer_len(), total_written,
+ -1, read_buffer_len(), total_read, -1,
+ time(NULL) - start_time);
+ }
+ }
+
+ send_cmd(NULL, "219 %s l :End of /STATS report.", source);
+ break;
+ case 'o':
+ case 'O':
+/* Check whether the user is an operator */
+ u = finduser(source);
+ if (u && !is_oper(u) && HideStatsO) {
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *av[0]);
+ } else {
+ for (i = 0; i < RootNumber; i++)
+ send_cmd(NULL, "243 %s O * * %s Root 0", source,
+ ServicesRoots[i]);
+ for (i = 0; i < servadmins.count && (nc = servadmins.list[i]);
+ i++)
+ send_cmd(NULL, "243 %s O * * %s Admin 0", source,
+ nc->display);
+ for (i = 0; i < servopers.count && (nc = servopers.list[i]);
+ i++)
+ send_cmd(NULL, "243 %s O * * %s Oper 0", source,
+ nc->display);
+
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source,
+ *av[0]);
+ }
+
+ break;
+
+ case 'u':{
+ int uptime = time(NULL) - start_time;
+ send_cmd(NULL, "242 %s :Services up %d day%s, %02d:%02d:%02d",
+ source, uptime / 86400,
+ (uptime / 86400 == 1) ? "" : "s",
+ (uptime / 3600) % 24, (uptime / 60) % 60,
+ uptime % 60);
+ send_cmd(NULL,
+ "250 %s :Current users: %d (%d ops); maximum %d",
+ source, usercnt, opcnt, maxusercnt);
+ send_cmd(NULL, "219 %s u :End of /STATS report.", source);
+ break;
+ } /* case 'u' */
+
+ default:
+ send_cmd(NULL, "219 %s %c :End of /STATS report.", source, *av[0]);
+ break;
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int m_time(char *source, int ac, char **av)
+{
+ time_t t;
+ struct tm *tm;
+ char buf[64];
+
+ time(&t);
+ tm = localtime(&t);
+ strftime(buf, sizeof(buf), "%a %b %d %H:%M:%S %Y %Z", tm);
+ send_cmd(NULL, "391 :%s", buf);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+#ifdef IRC_HYBRID
+static int m_topic(char *source, int ac, char **av)
+{
+ if (ac == 4) {
+ do_topic(source, ac, av);
+ } else {
+ Channel *c = findchan(av[0]);
+ time_t topic_time = time(NULL);
+
+ if (!c) {
+ alog("channel: TOPIC %s for nonexistent channel %s",
+ merge_args(ac - 1, av + 1), av[0]);
+ return MOD_CONT;
+ }
+
+ if (check_topiclock(c, topic_time))
+ return MOD_CONT;
+
+ if (c->topic) {
+ free(c->topic);
+ c->topic = NULL;
+ }
+ if (ac > 1 && *av[1])
+ c->topic = sstrdup(av[1]);
+
+ strscpy(c->topic_setter, source, sizeof(c->topic_setter));
+ c->topic_time = topic_time;
+
+ record_topic(av[0]);
+ }
+ return MOD_CONT;
+}
+#else
+/*************************************************************************/
+static int m_topic(char *source, int ac, char **av)
+{
+ if (ac != 4)
+ return MOD_CONT;
+ do_topic(source, ac, av);
+ return MOD_CONT;
+}
+#endif
+/*************************************************************************/
+
+int m_version(char *source, int ac, char **av)
+{
+ if (source)
+ send_cmd(ServerName, "351 %s Anope-%s %s :%s -- %s",
+ source, version_number, ServerName, version_flags,
+ version_build);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int m_whois(char *source, int ac, char **av)
+{
+ BotInfo *bi;
+ const char *clientdesc;
+
+ if (source && ac >= 1) {
+ if (stricmp(av[0], s_NickServ) == 0)
+ clientdesc = desc_NickServ;
+ else if (stricmp(av[0], s_ChanServ) == 0)
+ clientdesc = desc_ChanServ;
+ else if (stricmp(av[0], s_MemoServ) == 0)
+ clientdesc = desc_MemoServ;
+ else if (s_BotServ && stricmp(av[0], s_BotServ) == 0)
+ clientdesc = desc_BotServ;
+ else if (s_HostServ && stricmp(av[0], s_HostServ) == 0)
+ clientdesc = desc_HostServ;
+ else if (stricmp(av[0], s_HelpServ) == 0)
+ clientdesc = desc_HelpServ;
+ else if (stricmp(av[0], s_OperServ) == 0)
+ clientdesc = desc_OperServ;
+ else if (stricmp(av[0], s_GlobalNoticer) == 0)
+ clientdesc = desc_GlobalNoticer;
+ else if (s_DevNull && stricmp(av[0], s_DevNull) == 0)
+ clientdesc = desc_DevNull;
+ else if (s_BotServ && (bi = findbot(av[0]))) {
+ /* Bots are handled separately */
+ send_cmd(ServerName, "311 %s %s %s %s * :%s", source, bi->nick,
+ bi->user, bi->host, bi->real);
+ send_cmd(ServerName, "307 %s :%s is a registered nick", source,
+ bi->nick);
+ send_cmd(ServerName, "312 %s %s %s :%s", source, bi->nick,
+ ServerName, ServerDesc);
+ send_cmd(ServerName,
+ "317 %s %s %ld %ld :seconds idle, signon time",
+ source, bi->nick, time(NULL) - bi->lastmsg,
+ start_time);
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source,
+ bi->nick);
+ return MOD_CONT;
+ } else {
+ send_cmd(ServerName, "401 %s %s :No such service.", source,
+ av[0]);
+ return MOD_CONT;
+ }
+ send_cmd(ServerName, "311 %s %s %s %s * :%s", source, av[0],
+ ServiceUser, ServiceHost, clientdesc);
+ send_cmd(ServerName, "312 %s %s %s :%s", source, av[0], ServerName,
+ ServerDesc);
+ send_cmd(ServerName,
+ "317 %s %s %ld %ld :seconds idle, signon time", source,
+ av[0], time(NULL) - start_time, start_time);
+ send_cmd(ServerName, "318 %s %s :End of /WHOIS list.", source,
+ av[0]);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+#ifdef IRC_VIAGRA
+int m_vs(char *source, int ac, char **av)
+{
+ User *u;
+
+ if (ac != 2)
+ return MOD_CONT;
+
+ u = finduser(av[0]);
+ if (!u) {
+ alog("user: VS for nonexistent user %s", av[0]);
+ return MOD_CONT;
+ }
+
+ change_user_host(u, av[1]);
+ return MOD_CONT;
+
+}
+#endif
+
+/*************************************************************************/
+
+/* *INDENT-OFF* */
+void moduleAddMsgs(void) {
+ Message *m;
+ m = createMessage("401", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("436", m_nickcoll); addCoreMessage(IRCD,m);
+ m = createMessage("AWAY", m_away); addCoreMessage(IRCD,m);
+ m = createMessage("INVITE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("JOIN", m_join); addCoreMessage(IRCD,m);
+ m = createMessage("KICK", m_kick); addCoreMessage(IRCD,m);
+ m = createMessage("KILL", m_kill); addCoreMessage(IRCD,m);
+ m = createMessage("MODE", m_mode); addCoreMessage(IRCD,m);
+ m = createMessage("MOTD", m_motd); addCoreMessage(IRCD,m);
+ m = createMessage("NICK", m_nick); addCoreMessage(IRCD,m);
+ m = createMessage("NOTICE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("PART", m_part); addCoreMessage(IRCD,m);
+ m = createMessage("PASS", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("PING", m_ping); addCoreMessage(IRCD,m);
+ m = createMessage("PRIVMSG", m_privmsg); addCoreMessage(IRCD,m);
+ m = createMessage("QUIT", m_quit); addCoreMessage(IRCD,m);
+ m = createMessage("SERVER", m_server); addCoreMessage(IRCD,m);
+ m = createMessage("SQUIT", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("STATS", m_stats); addCoreMessage(IRCD,m);
+ m = createMessage("TIME", m_time); addCoreMessage(IRCD,m);
+ m = createMessage("TOPIC", m_topic); addCoreMessage(IRCD,m);
+ m = createMessage("USER", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("VERSION", m_version); addCoreMessage(IRCD,m);
+ m = createMessage("WALLOPS", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("WHOIS", m_whois); addCoreMessage(IRCD,m);
+
+ /* DALnet specific messages */
+ m = createMessage("AKILL", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("GLOBOPS", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("GNOTICE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("GOPER", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("RAKILL", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SILENCE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVSKILL", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVSMODE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNICK", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVSNOOP", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SQLINE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("UNSQLINE", NULL); addCoreMessage(IRCD,m);
+
+ /* DreamForge specific messages */
+#ifdef IRC_DREAMFORGE
+ m = createMessage("PROTOCTL", NULL); addCoreMessage(IRCD,m);
+#endif
+
+ /* Bahamut specific messages */
+#ifdef IRC_BAHAMUT
+ m = createMessage("CAPAB", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("CS", m_cs); addCoreMessage(IRCD,m);
+ m = createMessage("HS", m_hs); addCoreMessage(IRCD,m);
+ m = createMessage("MS", m_ms); addCoreMessage(IRCD,m);
+ m = createMessage("NS", m_ns); addCoreMessage(IRCD,m);
+ m = createMessage("OS", m_os); addCoreMessage(IRCD,m);
+ m = createMessage("RS", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SGLINE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", m_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SS", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SZLINE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("UNSGLINE", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("UNSZLINE", NULL); addCoreMessage(IRCD,m);
+#endif
+ /* Hyb Messages */
+#ifdef IRC_HYBRID
+ m = createMessage("CAPAB", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", m_sjoin); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO", NULL); addCoreMessage(IRCD,m);
+#endif
+
+
+#ifdef IRC_ULTIMATE
+ m = createMessage("CHGHOST", m_chghost); addCoreMessage(IRCD,m);
+ m = createMessage("CHGIDENT", m_chgident); addCoreMessage(IRCD,m);
+ m = createMessage("CHGNAME", m_chgname); addCoreMessage(IRCD,m);
+ m = createMessage("NETINFO", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SETHOST", m_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("SETIDENT", m_setident); addCoreMessage(IRCD,m);
+ m = createMessage("SETNAME", m_setname); addCoreMessage(IRCD,m);
+ m = createMessage("VCTRL", NULL); addCoreMessage(IRCD,m);
+#endif
+
+#ifdef IRC_PTLINK
+ m = createMessage("NEWMASK" , m_newmask); addCoreMessage(IRCD,m);
+ m = createMessage("CAPAB" , NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVINFO" , NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SVSINFO" , NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SJOIN", m_sjoin); addCoreMessage(IRCD,m);
+#endif
+
+#ifdef IRC_UNREAL
+ m = createMessage("CHGHOST", m_chghost); addCoreMessage(IRCD,m);
+ m = createMessage("CHGIDENT", m_chgident); addCoreMessage(IRCD,m);
+ m = createMessage("CHGNAME", m_chgname); addCoreMessage(IRCD,m);
+ m = createMessage("NETINFO", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("SETHOST", m_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("SETIDENT", m_setident); addCoreMessage(IRCD,m);
+ m = createMessage("SETNAME", m_setname); addCoreMessage(IRCD,m);
+#endif
+#ifdef IRC_VIAGRA
+ m = createMessage("CHGHOST", m_chghost); addCoreMessage(IRCD,m);
+ m = createMessage("CHGIDENT", m_chgident); addCoreMessage(IRCD,m);
+ m = createMessage("CHGNAME", m_chgname); addCoreMessage(IRCD,m);
+ m = createMessage("SETHOST", m_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("SETIDENT", m_setident); addCoreMessage(IRCD,m);
+ m = createMessage("SETNAME", m_setname); addCoreMessage(IRCD,m);
+ m = createMessage("VS", m_vs); addCoreMessage(IRCD,m);
+#endif
+#ifdef IRC_ULTIMATE3
+ m = createMessage("SETHOST", m_sethost); addCoreMessage(IRCD,m);
+ m = createMessage("NETINFO", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("GCONNECT", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("NETGLOBAL", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("CHATOPS", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("NETCTRL", NULL); addCoreMessage(IRCD,m);
+ m = createMessage("CLIENT", m_client); addCoreMessage(IRCD,m);
+ m = createMessage("SMODE", NULL); addCoreMessage(IRCD,m);
+#endif
+}
+
+/* *INDENT-ON* */
+/*************************************************************************/
+
+Message *find_message(const char *name)
+{
+ Message *m;
+ m = findMessage(IRCD, name);
+ return m;
+}
+
+/*************************************************************************/
diff --git a/messages.h b/messages.h
new file mode 100644
index 000000000..33150ca37
--- /dev/null
+++ b/messages.h
@@ -0,0 +1,23 @@
+/* Declarations of IRC message structures, variables, and functions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: messages.h,v 1.5 2003/07/20 01:15:49 dane Exp $
+ *
+ */
+
+/*************************************************************************/
+#include "modules.h"
+
+extern Message messages[];
+extern void moduleAddMsgs(void);
+extern Message *find_message(const char *name);
+
+
+/*************************************************************************/
diff --git a/misc.c b/misc.c
new file mode 100644
index 000000000..02ab31aba
--- /dev/null
+++ b/misc.c
@@ -0,0 +1,642 @@
+/* Miscellaneous routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: misc.c,v 1.14 2004/01/31 18:57:18 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "language.h"
+
+/* Cheaper than isspace() or isblank() */
+#define issp(c) ((c) == 32)
+
+/*************************************************************************/
+
+/* toupper/tolower: Like the ANSI functions, but make sure we return an
+ * int instead of a (signed) char.
+ */
+
+int toupper(char c)
+{
+ if (islower(c))
+ return (unsigned char) c - ('a' - 'A');
+ else
+ return (unsigned char) c;
+}
+
+int tolower(char c)
+{
+ if (isupper(c))
+ return (unsigned char) c + ('a' - 'A');
+ else
+ return (unsigned char) c;
+}
+
+/*************************************************************************/
+
+/* strscpy: Copy at most len-1 characters from a string to a buffer, and
+ * add a null terminator after the last character copied.
+ */
+
+char *strscpy(char *d, const char *s, size_t len)
+{
+ char *d_orig = d;
+
+ if (!len)
+ return d;
+ while (--len && (*d++ = *s++));
+ *d = '\0';
+ return d_orig;
+}
+
+/*************************************************************************/
+
+/* stristr: Search case-insensitively for string s2 within string s1,
+ * returning the first occurrence of s2 or NULL if s2 was not
+ * found.
+ */
+
+char *stristr(char *s1, char *s2)
+{
+ register char *s = s1, *d = s2;
+
+ while (*s1) {
+ if (tolower(*s1) == tolower(*d)) {
+ s1++;
+ d++;
+ if (*d == 0)
+ return s;
+ } else {
+ s = ++s1;
+ d = s2;
+ }
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* strnrepl: Replace occurrences of `old' with `new' in string `s'. Stop
+ * replacing if a replacement would cause the string to exceed
+ * `size' bytes (including the null terminator). Return the
+ * string.
+ */
+
+char *strnrepl(char *s, int32 size, const char *old, const char *new)
+{
+ char *ptr = s;
+ int32 left = strlen(s);
+ int32 avail = size - (left + 1);
+ int32 oldlen = strlen(old);
+ int32 newlen = strlen(new);
+ int32 diff = newlen - oldlen;
+
+ while (left >= oldlen) {
+ if (strncmp(ptr, old, oldlen) != 0) {
+ left--;
+ ptr++;
+ continue;
+ }
+ if (diff > avail)
+ break;
+ if (diff != 0)
+ memmove(ptr + oldlen + diff, ptr + oldlen, left + 1);
+ strncpy(ptr, new, newlen);
+ ptr += newlen;
+ left -= oldlen;
+ }
+ return s;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* merge_args: Take an argument count and argument vector and merge them
+ * into a single string in which each argument is separated by
+ * a space.
+ */
+
+char *merge_args(int argc, char **argv)
+{
+ int i;
+ static char s[4096];
+ char *t;
+
+ t = s;
+ for (i = 0; i < argc; i++)
+ t += snprintf(t, sizeof(s) - (t - s), "%s%s", *argv++,
+ (i < argc - 1) ? " " : "");
+ return s;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* match_wild: Attempt to match a string to a pattern which might contain
+ * '*' or '?' wildcards. Return 1 if the string matches the
+ * pattern, 0 if not.
+ */
+
+static int do_match_wild(const char *pattern, const char *str, int docase)
+{
+ char c;
+ const char *s;
+
+ /* This WILL eventually terminate: either by *pattern == 0, or by a
+ * trailing '*'. */
+
+ for (;;) {
+ switch (c = *pattern++) {
+ case 0:
+ if (!*str)
+ return 1;
+ return 0;
+ case '?':
+ if (!*str)
+ return 0;
+ str++;
+ break;
+ case '*':
+ if (!*pattern)
+ return 1; /* trailing '*' matches everything else */
+ s = str;
+ while (*s) {
+ if ((docase ? (*s == *pattern)
+ : (tolower(*s) == tolower(*pattern)))
+ && do_match_wild(pattern, s, docase))
+ return 1;
+ s++;
+ }
+ break;
+ default:
+ if (docase ? (*str++ != c) : (tolower(*str++) != tolower(c)))
+ return 0;
+ break;
+ } /* switch */
+ }
+}
+
+
+int match_wild(const char *pattern, const char *str)
+{
+ return do_match_wild(pattern, str, 1);
+}
+
+int match_wild_nocase(const char *pattern, const char *str)
+{
+ return do_match_wild(pattern, str, 0);
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Process a string containing a number/range list in the form
+ * "n1[-n2][,n3[-n4]]...", calling a caller-specified routine for each
+ * number in the list. If the callback returns -1, stop immediately.
+ * Returns the sum of all nonnegative return values from the callback.
+ * If `count' is non-NULL, it will be set to the total number of times the
+ * callback was called.
+ *
+ * The callback should be of type range_callback_t, which is defined as:
+ * int (*range_callback_t)(User *u, int num, va_list args)
+ */
+
+int process_numlist(const char *numstr, int *count_ret,
+ range_callback_t callback, User * u, ...)
+{
+ int n1, n2, i;
+ int res = 0, retval = 0, count = 0;
+ va_list args;
+
+ va_start(args, u);
+
+ /*
+ * This algorithm ignores invalid characters, ignores a dash
+ * when it precedes a comma, and ignores everything from the
+ * end of a valid number or range to the next comma or null.
+ */
+ for (;;) {
+ n1 = n2 = strtol(numstr, (char **) &numstr, 10);
+ numstr += strcspn(numstr, "0123456789,-");
+ if (*numstr == '-') {
+ numstr++;
+ numstr += strcspn(numstr, "0123456789,");
+ if (isdigit(*numstr)) {
+ n2 = strtol(numstr, (char **) &numstr, 10);
+ numstr += strcspn(numstr, "0123456789,-");
+ }
+ }
+ for (i = n1; i <= n2 && i >= 0; i++) {
+ int res = callback(u, i, args);
+ count++;
+ if (res < 0)
+ break;
+ retval += res;
+ if (count >= 32767) {
+ if (count_ret)
+ *count_ret = count;
+ return retval;
+ }
+ }
+ if (res < -1)
+ break;
+ numstr += strcspn(numstr, ",");
+ if (*numstr)
+ numstr++;
+ else
+ break;
+ }
+ if (count_ret)
+ *count_ret = count;
+ return retval;
+}
+
+/*************************************************************************/
+
+/* dotime: Return the number of seconds corresponding to the given time
+ * string. If the given string does not represent a valid time,
+ * return -1.
+ *
+ * A time string is either a plain integer (representing a number
+ * of seconds), or an integer followed by one of these characters:
+ * "s" (seconds), "m" (minutes), "h" (hours), or "d" (days).
+ */
+
+int dotime(const char *s)
+{
+ int amount;
+
+ amount = strtol(s, (char **) &s, 10);
+ if (*s) {
+ switch (*s) {
+ case 's':
+ return amount;
+ case 'm':
+ return amount * 60;
+ case 'h':
+ return amount * 3600;
+ case 'd':
+ return amount * 86400;
+ default:
+ return -1;
+ }
+ } else {
+ return amount;
+ }
+}
+
+/*************************************************************************/
+
+/* Expresses in a string the period of time represented by a given amount
+ of seconds (with days/hours/minutes). */
+
+char *duration(NickAlias * na, char *buf, int bufsize, time_t seconds)
+{
+ int days = 0, hours = 0, minutes = 0;
+ int need_comma = 0;
+
+ char buf2[64], *end;
+ char *comma = getstring(na, COMMA_SPACE);
+
+ /* We first calculate everything */
+ days = seconds / 86400;
+ seconds -= (days * 86400);
+ hours = seconds / 3600;
+ seconds -= (hours * 3600);
+ minutes = seconds / 60;
+
+ if (!days && !hours && !minutes) {
+ snprintf(buf, bufsize,
+ getstring(na,
+ (seconds <=
+ 1 ? DURATION_SECOND : DURATION_SECONDS)),
+ seconds);
+ } else {
+ end = buf;
+ if (days) {
+ snprintf(buf2, sizeof(buf2),
+ getstring(na,
+ (days == 1 ? DURATION_DAY : DURATION_DAYS)),
+ days);
+ end += snprintf(end, bufsize - (end - buf), "%s", buf2);
+ need_comma = 1;
+ }
+ if (hours) {
+ snprintf(buf2, sizeof(buf2),
+ getstring(na,
+ (hours ==
+ 1 ? DURATION_HOUR : DURATION_HOURS)),
+ hours);
+ end +=
+ snprintf(end, bufsize - (end - buf), "%s%s",
+ (need_comma ? comma : ""), buf2);
+ need_comma = 1;
+ }
+ if (minutes) {
+ snprintf(buf2, sizeof(buf2),
+ getstring(na,
+ (minutes ==
+ 1 ? DURATION_MINUTE : DURATION_MINUTES)),
+ minutes);
+ end +=
+ snprintf(end, bufsize - (end - buf), "%s%s",
+ (need_comma ? comma : ""), buf2);
+ need_comma = 1;
+ }
+ }
+
+ return buf;
+}
+
+/*************************************************************************/
+
+/* Generates a human readable string of type "expires in ..." */
+
+char *expire_left(NickAlias * na, char *buf, int len, time_t expires)
+{
+ time_t now = time(NULL);
+
+ if (!expires) {
+ strncpy(buf, getstring(na, NO_EXPIRE), len);
+ } else if (expires <= now) {
+ strncpy(buf, getstring(na, EXPIRES_SOON), len);
+ } else {
+ time_t diff = expires - now + 59;
+
+ if (diff >= 86400) {
+ int days = diff / 86400;
+ snprintf(buf, len,
+ getstring(na, (days == 1) ? EXPIRES_1D : EXPIRES_D),
+ days);
+ } else {
+ if (diff <= 3600) {
+ int minutes = diff / 60;
+ snprintf(buf, len,
+ getstring(na,
+ (minutes ==
+ 1) ? EXPIRES_1M : EXPIRES_M), minutes);
+ } else {
+ int hours = diff / 3600, minutes;
+ diff -= (hours * 3600);
+ minutes = diff / 60;
+ snprintf(buf, len,
+ getstring(na,
+ ((hours == 1
+ && minutes ==
+ 1) ? EXPIRES_1H1M : ((hours == 1
+ && minutes !=
+ 1) ? EXPIRES_1HM
+ : ((hours != 1
+ && minutes ==
+ 1) ?
+ EXPIRES_H1M :
+ EXPIRES_HM)))),
+ hours, minutes);
+ }
+ }
+ }
+
+ return buf;
+}
+
+/**
+ * Return 1 if a host is valid, 0 if it isnt.
+ * host = string to check
+ * type = format, 1 = ip4addr, 2 = hostname
+ *
+ * shortname = ( letter / digit ) *( letter / digit / "-" ) *( letter / digit )
+ * hostname = shortname *( "." shortname )
+ * ip4addr = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit
+ *
+ **/
+
+int doValidHost(const char *host, int type)
+{
+ int idx = 0;
+ int len = 0;
+ int sec_len = 0;
+ int dots = 1;
+ if (type != 1 && type != 2) {
+ return 0;
+ }
+ if (!host) {
+ return 0;
+ }
+
+ len = strlen(host);
+
+ if (len > HOSTMAX) {
+ return 0;
+ }
+
+ switch (type) {
+ case 1:
+ for (idx = 0; idx < len; idx++) {
+ if (isdigit(host[idx])) {
+ if (sec_len < 3) {
+ sec_len++;
+ } else {
+ return 0;
+ }
+ } else {
+ if (idx == 0) {
+ return 0;
+ } /* cant start with a non-digit */
+ if (host[idx] != '.') {
+ return 0;
+ } /* only . is a valid non-digit */
+ if (sec_len > 3) {
+ return 0;
+ } /* sections cant be more than 3 digits */
+ sec_len = 0;
+ dots++;
+ }
+ }
+ if (dots != 4) {
+ return 0;
+ }
+ break;
+ case 2:
+ dots = 0;
+ for (idx = 0; idx < len; idx++) {
+ if (!isalnum(host[idx])) {
+ if (idx == 0) {
+ return 0;
+ }
+ if ((host[idx] != '.') && (host[idx] != '-')) {
+ return 0;
+ }
+ if (host[idx] == '.') {
+ dots++;
+ }
+ }
+ }
+ if (host[len - 1] == '.') {
+ return 0;
+ }
+ /**
+ * Ultimate3 dosnt like a non-dotted hosts at all, nor does unreal,
+ * so just dont allow them.
+ **/
+ if (dots == 0) {
+ return 0;
+ }
+
+ break;
+ }
+ return 1;
+}
+
+/**
+ * Return 1 if a host is valid, 0 if it isnt.
+ * host = string to check
+ * type = format, 1 = ip4addr, 2 = hostname, 3 = either
+ *
+ * shortname = ( letter / digit ) *( letter / digit / "-" ) *( letter / digit )
+ * hostname = shortname *( "." shortname )
+ * ip4addr = 1*3digit "." 1*3digit "." 1*3digit "." 1*3digit
+ *
+ **/
+int isValidHost(const char *host, int type)
+{
+ int status = 0;
+ if (type == 3) {
+ if (!(status = doValidHost(host, 1))) {
+ status = doValidHost(host, 2);
+ }
+ } else {
+ status = doValidHost(host, type);
+ }
+ return status;
+}
+
+int isvalidchar(const char c)
+{
+ if (((c >= 'A') && (c <= 'Z')) ||
+ ((c >= 'a') && (c <= 'z')) ||
+ ((c >= '0') && (c <= '9')) || (c == '.') || (c == '-'))
+ return 1;
+ else
+ return 0;
+}
+
+char *myStrGetToken(const char *str, const char dilim, int token_number)
+{
+ int len, idx, counter = 0, start_pos = 0;
+ char *substring = NULL;
+ if (!str) {
+ return NULL;
+ }
+ len = strlen(str);
+ for (idx = 0; idx <= len; idx++) {
+ if ((str[idx] == dilim) || (idx == len)) {
+ if (counter == token_number) {
+ substring = myStrSubString(str, start_pos, idx);
+ counter++;
+ } else {
+ start_pos = idx + 1;
+ counter++;
+ }
+ }
+ }
+ return substring;
+}
+
+char *myStrGetOnlyToken(const char *str, const char dilim,
+ int token_number)
+{
+ int len, idx, counter = 0, start_pos = 0;
+ char *substring = NULL;
+ if (!str) {
+ return NULL;
+ }
+ len = strlen(str);
+ for (idx = 0; idx <= len; idx++) {
+ if (str[idx] == dilim) {
+ if (counter == token_number) {
+ if (str[idx] == '\r')
+ substring = myStrSubString(str, start_pos, idx - 1);
+ else
+ substring = myStrSubString(str, start_pos, idx);
+ counter++;
+ } else {
+ start_pos = idx + 1;
+ counter++;
+ }
+ }
+ }
+ return substring;
+}
+
+char *myStrGetTokenRemainder(const char *str, const char dilim,
+ int token_number)
+{
+ int len, idx, counter = 0, start_pos = 0;
+ char *substring = NULL;
+ if (!str) {
+ return NULL;
+ }
+ len = strlen(str);
+
+ for (idx = 0; idx <= len; idx++) {
+ if ((str[idx] == dilim) || (idx == len)) {
+ if (counter == token_number) {
+ substring = myStrSubString(str, start_pos, len);
+ counter++;
+ } else {
+ start_pos = idx + 1;
+ counter++;
+ }
+ }
+ }
+ return substring;
+}
+
+char *myStrSubString(const char *src, int start, int end)
+{
+ char *substring = NULL;
+ int len, idx;
+ if (!src) {
+ return NULL;
+ }
+ len = strlen(src);
+ if (((start >= 0) && (end <= len)) && (end > start)) {
+ substring = (char *) malloc(sizeof(char) * ((end - start) + 1));
+ for (idx = 0; idx <= end - start; idx++) {
+ substring[idx] = src[start + idx];
+ }
+ substring[end - start] = '\0';
+ }
+ return substring;
+}
+
+void doCleanBuffer(char *str)
+{
+ char *in = str;
+ char *out = str;
+ char ch;
+
+ while (issp(ch = *in++));
+ if (ch != '\0')
+ for (;;) {
+ *out++ = ch;
+ ch = *in++;
+ if (ch == '\0')
+ break;
+ if (!issp(ch))
+ continue;
+ while (issp(ch = *in++));
+ if (ch == '\0')
+ break;
+ *out++ = ' ';
+ }
+ *out = ch; // == '\0'
+}
diff --git a/modules.c b/modules.c
new file mode 100644
index 000000000..99654792b
--- /dev/null
+++ b/modules.c
@@ -0,0 +1,1399 @@
+/* Modular support
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: modules.c,v 1.37 2004/03/11 16:50:01 rob Exp $
+ *
+ */
+#include "modules.h"
+#include "language.h"
+
+/*
+ * Disable the modules on OpenBSD (for now)
+ * there is work in progress for this.
+ */
+#ifdef __OpenBSD__
+#ifdef USE_MODULES
+#undef USE_MODULES
+#endif /* USE_MODULES */
+#endif /* __OpenBSD__ */
+
+#ifdef USE_MODULES
+#include <dlfcn.h>
+#endif
+
+/**
+ * Declare all the list's we want to use here
+ **/
+CommandHash *HOSTSERV[MAX_CMD_HASH];
+CommandHash *BOTSERV[MAX_CMD_HASH];
+CommandHash *MEMOSERV[MAX_CMD_HASH];
+CommandHash *NICKSERV[MAX_CMD_HASH];
+CommandHash *CHANSERV[MAX_CMD_HASH];
+CommandHash *HELPSERV[MAX_CMD_HASH];
+CommandHash *OPERSERV[MAX_CMD_HASH];
+MessageHash *IRCD[MAX_CMD_HASH];
+ModuleHash *MODULE_HASH[MAX_CMD_HASH];
+
+Module *mod_current_module;
+char *mod_current_module_name = NULL;
+char *mod_current_buffer = NULL;
+int mod_current_op;
+User *mod_current_user;
+ModuleCallBack *moduleCallBackHead = NULL;
+int displayCommand(Command * c);
+int displayCommandFromHash(CommandHash * cmdTable[], char *name);
+int displayMessageFromHashl(char *name);
+int displayMessage(Message * m);
+
+/*******************************************************************************
+ * Module Functions
+ *******************************************************************************/
+void modules_init(void)
+{
+#ifdef USE_MODULES
+ int idx;
+ Module *m;
+ for (idx = 0; idx < ModulesNumber; idx++) {
+ m = findModule(ModulesAutoload[idx]);
+ if (!m) {
+ m = createModule(ModulesAutoload[idx]);
+ mod_current_module = m;
+ mod_current_user = NULL;
+ alog("trying to load [%s]", mod_current_module->name);
+ alog("status: [%d]", loadModule(mod_current_module, NULL));
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+ }
+ }
+#endif
+}
+
+void modules_delayed_init(void)
+{
+#ifdef USE_MODULES
+ int idx;
+ Module *m;
+ for (idx = 0; idx < ModulesDelayedNumber; idx++) {
+ m = findModule(ModulesDelayedAutoload[idx]);
+ if (!m) {
+ m = createModule(ModulesDelayedAutoload[idx]);
+ mod_current_module = m;
+ mod_current_user = NULL;
+ alog("trying to load [%s]", mod_current_module->name);
+ alog("status: [%d]", loadModule(mod_current_module, NULL));
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+ }
+ }
+#endif
+}
+
+Module *createModule(char *filename)
+{
+ Module *m;
+ if (!filename) {
+ return NULL;
+ }
+ if ((m = malloc(sizeof(Module))) == NULL) {
+ fatal("Out of memory!");
+ }
+ m->name = sstrdup(filename); /* Our Name */
+ m->handle = NULL; /* Handle */
+ m->version = NULL;
+ m->author = NULL;
+ m->nickHelp = NULL;
+ m->chanHelp = NULL;
+ m->memoHelp = NULL;
+ m->botHelp = NULL;
+ m->operHelp = NULL;
+ m->hostHelp = NULL;
+ m->helpHelp = NULL;
+
+ return m; /* return a nice new module */
+}
+
+int destroyModule(Module * m)
+{
+ if (!m) {
+ return MOD_ERR_PARAMS;
+ }
+ if (m->name) {
+ free(m->name);
+ }
+ if (m->filename) {
+ remove(m->filename);
+ free(m->filename);
+ }
+ m->handle = NULL;
+ if (m->author) {
+ free(m->author);
+ }
+ if (m->version) {
+ free(m->version);
+ }
+ /* No need to free our cmd/msg list, as they will always be empty by the module is destroyed */
+ free(m);
+ return MOD_ERR_OK;
+}
+
+int addModule(Module * m)
+{
+ int index = 0;
+ ModuleHash *current = NULL;
+ ModuleHash *newHash = NULL;
+ ModuleHash *lastHash = NULL;
+
+ index = CMD_HASH(m->name);
+
+ for (current = MODULE_HASH[index]; current; current = current->next) {
+ if (strcasecmp(m->name, current->name) == 0)
+ return MOD_ERR_EXISTS;
+ lastHash = current;
+ }
+
+ if ((newHash = malloc(sizeof(ModuleHash))) == NULL) {
+ fatal("Out of memory");
+ }
+ m->time = time(NULL);
+ newHash->next = NULL;
+ newHash->name = sstrdup(m->name);
+ newHash->m = m;
+
+ if (lastHash == NULL)
+ MODULE_HASH[index] = newHash;
+ else
+ lastHash->next = newHash;
+ return MOD_ERR_OK;
+}
+
+int delModule(Module * m)
+{
+ int index = 0;
+ ModuleHash *current = NULL;
+ ModuleHash *lastHash = NULL;
+
+ if (!m) {
+ return MOD_ERR_PARAMS;
+ }
+
+ index = CMD_HASH(m->name);
+
+ for (current = MODULE_HASH[index]; current; current = current->next) {
+ if (strcasecmp(m->name, current->name) == 0) {
+ if (!lastHash) {
+ MODULE_HASH[index] = current->next;
+ } else {
+ lastHash->next = current->next;
+ }
+ destroyModule(current->m);
+ free(current->name);
+ free(current);
+ return MOD_ERR_OK;
+ }
+ lastHash = current;
+ }
+ return MOD_ERR_NOEXIST;
+}
+
+Module *findModule(char *name)
+{
+ int idx;
+ ModuleHash *current = NULL;
+ if (!name) {
+ return NULL;
+ }
+ idx = CMD_HASH(name);
+
+ for (current = MODULE_HASH[idx]; current; current = current->next) {
+ if (stricmp(name, current->name) == 0) {
+ return current->m;
+ }
+ }
+ return NULL;
+
+}
+
+int moduleCopyFile(char *name)
+{
+#ifdef USE_MODULES
+ int ch;
+ FILE *source, *target;
+ char output[4096];
+ char input[4096];
+ int len;
+
+ strncpy(output, MODULE_PATH, 4095); /* Get full path with .so extension */
+ strncpy(input, MODULE_PATH, 4095); /* Get full path with .so extension */
+ len = strlen(output);
+ strncat(output, "runtime/", 4095 - len);
+ len += strlen(output);
+ strncat(output, name, 4095 - len);
+ strncat(input, name, 4095 - len);
+ len += strlen(output);
+ strncat(output, ".so", 4095 - len);
+ strncat(input, ".so", 4095 - len);
+
+ if ((source = fopen(input, "r")) == NULL) {
+ return MOD_ERR_NOEXIST;
+ }
+
+ if ((target = fopen(output, "w")) == NULL) {
+ return MOD_ERR_FILE_IO;
+ }
+ while ((ch = fgetc(source)) != EOF) {
+ fputc(ch, target);
+ }
+ fclose(source);
+ if (fclose(target) != 0) {
+ return MOD_ERR_FILE_IO;
+ }
+#endif
+ return MOD_ERR_OK;
+}
+
+int loadModule(Module * m, User * u)
+{
+#ifdef USE_MODULES
+ char buf[4096];
+ int len;
+ const char *err;
+ int (*func) (int, char **);
+ int ret = 0;
+ Module *m2;
+ if (!m || !m->name) {
+ return MOD_ERR_PARAMS;
+ }
+ if (m->handle) {
+ return MOD_ERR_EXISTS;
+ }
+ if ((m2 = findModule(m->name)) != NULL) {
+ return MOD_ERR_EXISTS;
+ }
+
+ moduleCopyFile(m->name);
+
+ strncpy(buf, MODULE_PATH, 4095); /* Get full path with .so extension */
+ len = strlen(buf);
+ strncat(buf, "runtime/", 4095 - len);
+ len += strlen(buf);
+ strncat(buf, m->name, 4095 - len);
+ len += strlen(buf);
+ strncat(buf, ".so", 4095 - len);
+
+ m->filename = sstrdup(buf);
+#ifdef HAS_RTLD_LOCAL
+ m->handle = dlopen(m->filename, RTLD_LAZY | RTLD_LOCAL);
+#else
+ m->handle = dlopen(m->filename, RTLD_LAZY);
+#endif
+ if ((err = dlerror()) != NULL) {
+ alog(err);
+ if (u) {
+ notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, m->name);
+ }
+ return MOD_ERR_NOLOAD;
+ }
+
+ func = dlsym(m->handle, "AnopeInit");
+ if ((err = dlerror()) != NULL) {
+ dlclose(m->handle); /* If no AnopeInit - it isnt an Anope Module, close it */
+ return MOD_ERR_NOLOAD;
+ }
+ if (func) {
+ mod_current_module_name = m->name;
+ ret = func(0, NULL); /* exec AnopeInit */
+ if (ret == MOD_STOP) {
+ alog("%s requested unload...", m->name);
+ unloadModule(m, NULL);
+ mod_current_module_name = NULL;
+ return MOD_ERR_NOLOAD;
+ }
+
+ mod_current_module_name = NULL;
+ }
+
+ if (u) {
+ wallops(s_OperServ, "%s loaded module %s", u->nick, m->name);
+ notice_lang(s_OperServ, u, OPER_MODULE_LOADED, m->name);
+ }
+ addModule(m);
+ return MOD_ERR_OK;
+
+#else
+ return MOD_ERR_NOLOAD;
+#endif
+}
+
+int unloadModule(Module * m, User * u)
+{
+#ifdef USE_MODULES
+ void (*func) ();
+
+ if (!m || !m->handle) {
+ if (u) {
+ notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, m->name);
+ }
+ return MOD_ERR_PARAMS;
+ }
+
+ if (prepForUnload(mod_current_module) != MOD_ERR_OK) {
+ return MOD_ERR_UNKNOWN;
+ }
+
+ func = dlsym(m->handle, "AnopeFini");
+ if (func) {
+ func(); /* exec AnopeFini */
+ }
+
+ if ((dlclose(m->handle)) != 0) {
+ alog(dlerror());
+ if (u) {
+ notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, m->name);
+ }
+ return MOD_ERR_NOUNLOAD;
+ } else {
+ if (u) {
+ wallops(s_OperServ, "%s unloaded module %s", u->nick, m->name);
+ notice_lang(s_OperServ, u, OPER_MODULE_UNLOADED, m->name);
+ }
+ delModule(m);
+ return MOD_ERR_OK;
+ }
+#else
+ return MOD_ERR_NOUNLOAD;
+#endif
+}
+
+int prepForUnload(Module * m)
+{
+ int idx;
+ CommandHash *current = NULL;
+ MessageHash *mcurrent = NULL;
+ Command *c;
+ Message *msg;
+
+ if (!m) {
+ return MOD_ERR_PARAMS;
+ }
+
+ /* Kill any active callbacks this module has */
+ moduleCallBackPrepForUnload(m->name);
+
+ /**
+ * ok, im going to walk every hash looking for commands we own, now, not exactly elegant or efficiant :)
+ **/
+ for (idx = 0; idx < MAX_CMD_HASH; idx++) {
+ for (current = HS_cmdTable[idx]; current; current = current->next) {
+ for (c = current->c; c; c = c->next) {
+ if ((c->mod_name) && (strcmp(c->mod_name, m->name) == 0)) {
+ moduleDelCommand(HOSTSERV, c->name);
+ }
+ }
+ }
+
+ for (current = BS_cmdTable[idx]; current; current = current->next) {
+ for (c = current->c; c; c = c->next) {
+ if ((c->mod_name) && (strcmp(c->mod_name, m->name) == 0)) {
+ moduleDelCommand(BOTSERV, c->name);
+ }
+ }
+ }
+
+ for (current = MS_cmdTable[idx]; current; current = current->next) {
+ for (c = current->c; c; c = c->next) {
+ if ((c->mod_name) && (strcmp(c->mod_name, m->name) == 0)) {
+ moduleDelCommand(MEMOSERV, c->name);
+ }
+ }
+ }
+
+ for (current = NS_cmdTable[idx]; current; current = current->next) {
+ for (c = current->c; c; c = c->next) {
+ if ((c->mod_name) && (strcmp(c->mod_name, m->name) == 0)) {
+ moduleDelCommand(NICKSERV, c->name);
+ }
+ }
+ }
+
+ for (current = CS_cmdTable[idx]; current; current = current->next) {
+ for (c = current->c; c; c = c->next) {
+ if ((c->mod_name) && (strcmp(c->mod_name, m->name) == 0)) {
+ moduleDelCommand(CHANSERV, c->name);
+ }
+ }
+ }
+
+ for (current = HE_cmdTable[idx]; current; current = current->next) {
+ for (c = current->c; c; c = c->next) {
+ if ((c->mod_name) && (strcmp(c->mod_name, m->name) == 0)) {
+ moduleDelCommand(HELPSERV, c->name);
+ }
+ }
+ }
+
+ for (current = OS_cmdTable[idx]; current; current = current->next) {
+ for (c = current->c; c; c = c->next) {
+ if ((c->mod_name) && (stricmp(c->mod_name, m->name) == 0)) {
+ moduleDelCommand(OPERSERV, c->name);
+ }
+ }
+ }
+
+ for (mcurrent = IRCD[idx]; mcurrent; mcurrent = mcurrent->next) {
+ for (msg = mcurrent->m; msg; msg = msg->next) {
+ if ((msg->mod_name)
+ && (stricmp(msg->mod_name, m->name) == 0)) {
+ moduleDelMessage(msg->name);
+ }
+ }
+ }
+ }
+ return MOD_ERR_OK;
+}
+
+/*******************************************************************************
+ * Command Functions
+ *******************************************************************************/
+Command *createCommand(const char *name, int (*func) (User * u),
+ int (*has_priv) (User * u), int help_all,
+ int help_reg, int help_oper, int help_admin,
+ int help_root)
+{
+ Command *c;
+ if ((c = malloc(sizeof(Command))) == NULL) {
+ fatal("Out of memory!");
+ }
+ c->name = sstrdup(name);
+ c->routine = func;
+ c->has_priv = has_priv;
+ c->helpmsg_all = help_all;
+ c->helpmsg_reg = help_reg;
+ c->helpmsg_oper = help_oper;
+ c->helpmsg_admin = help_admin;
+ c->helpmsg_root = help_root;
+ c->help_param1 = NULL;
+ c->help_param2 = NULL;
+ c->help_param3 = NULL;
+ c->help_param4 = NULL;
+ c->next = NULL;
+ c->mod_name = NULL;
+ c->service = NULL;
+ c->all_help = NULL;
+ c->regular_help = NULL;
+ c->oper_help = NULL;
+ c->admin_help = NULL;
+ c->root_help = NULL;
+ return c;
+}
+
+int destroyCommand(Command * c)
+{
+ if (!c) {
+ return MOD_ERR_PARAMS;
+ }
+ if (c->core == 1) {
+ return MOD_ERR_UNKNOWN;
+ }
+ if (c->name) {
+ free(c->name);
+ }
+ c->routine = NULL;
+ c->has_priv = NULL;
+ c->helpmsg_all = -1;
+ c->helpmsg_reg = -1;
+ c->helpmsg_oper = -1;
+ c->helpmsg_admin = -1;
+ c->helpmsg_root = -1;
+ if (c->help_param1) {
+ free(c->help_param1);
+ }
+ if (c->help_param2) {
+ free(c->help_param2);
+ }
+ if (c->help_param3) {
+ free(c->help_param3);
+ }
+ if (c->help_param4) {
+ free(c->help_param4);
+ }
+ if (c->mod_name) {
+ free(c->mod_name);
+ }
+ if (c->service) {
+ free(c->service);
+ }
+ c->next = NULL;
+ free(c);
+ return MOD_ERR_OK;
+}
+
+int addCoreCommand(CommandHash * cmdTable[], Command * c)
+{
+ if (!cmdTable || !c) {
+ return MOD_ERR_PARAMS;
+ }
+ c->core = 1;
+ c->next = NULL;
+ return addCommand(cmdTable, c, 0);
+}
+
+int moduleAddCommand(CommandHash * cmdTable[], Command * c, int pos)
+{
+ int status;
+
+ if (!cmdTable || !c) {
+ return MOD_ERR_PARAMS;
+ }
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ } /* shouldnt happen */
+ c->core = 0;
+ c->mod_name = sstrdup(mod_current_module->name);
+
+ if (cmdTable == HOSTSERV) {
+ c->service = sstrdup(s_HostServ);
+ } else if (cmdTable == BOTSERV) {
+ c->service = sstrdup(s_BotServ);
+ } else if (cmdTable == MEMOSERV) {
+ c->service = sstrdup(s_MemoServ);
+ } else if (cmdTable == CHANSERV) {
+ c->service = sstrdup(s_ChanServ);
+ } else if (cmdTable == NICKSERV) {
+ c->service = sstrdup(s_NickServ);
+ } else if (cmdTable == HELPSERV) {
+ c->service = sstrdup(s_HelpServ);
+ } else if (cmdTable == OPERSERV) {
+ c->service = sstrdup(s_OperServ);
+ } else
+ c->service = sstrdup("Unknown");
+
+ if (debug)
+ displayCommandFromHash(cmdTable, c->name);
+ status = addCommand(cmdTable, c, pos);
+ if (debug)
+ displayCommandFromHash(cmdTable, c->name);
+ if (status != MOD_ERR_OK) {
+ alog("ERROR! [%d]", status);
+ }
+ return status;
+}
+
+int moduleDelCommand(CommandHash * cmdTable[], char *name)
+{
+ Command *c = NULL;
+ Command *cmd = NULL;
+ int status = 0;
+
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ }
+
+ c = findCommand(cmdTable, name);
+ if (!c) {
+ return MOD_ERR_NOEXIST;
+ }
+
+
+ for (cmd = c; cmd; cmd = cmd->next) {
+ if (cmd->mod_name
+ && strcasecmp(cmd->mod_name, mod_current_module->name) == 0) {
+ if (debug) {
+ displayCommandFromHash(cmdTable, name);
+ }
+ status = delCommand(cmdTable, cmd, mod_current_module->name);
+ if (debug) {
+ displayCommandFromHash(cmdTable, name);
+ }
+ }
+ }
+ return status;
+}
+
+int displayCommandFromHash(CommandHash * cmdTable[], char *name)
+{
+ CommandHash *current = NULL;
+ int index = 0;
+ index = CMD_HASH(name);
+ if (debug > 1) {
+ alog("trying to display command %s", name);
+ }
+ for (current = cmdTable[index]; current; current = current->next) {
+ if (strcasecmp(name, current->name) == 0) {
+ displayCommand(current->c);
+ }
+ }
+ if (debug > 1) {
+ alog("done displaying command %s", name);
+ }
+ return 0;
+}
+
+
+int displayCommand(Command * c)
+{
+ Command *cmd = NULL;
+ int i = 0;
+ alog("Displaying command list for %s", c->name);
+ for (cmd = c; cmd; cmd = cmd->next) {
+ alog("%d: %p", ++i, cmd);
+ }
+ alog("end");
+ return 0;
+}
+
+int displayMessageFromHash(char *name)
+{
+ MessageHash *current = NULL;
+ int index = 0;
+ index = CMD_HASH(name);
+ if (debug > 1) {
+ alog("trying to display message %s", name);
+ }
+ for (current = IRCD[index]; current; current = current->next) {
+ if (strcasecmp(name, current->name) == 0) {
+ displayMessage(current->m);
+ }
+ }
+ if (debug > 1) {
+ alog("done displaying message %s", name);
+ }
+ return 0;
+}
+
+int displayMessage(Message * m)
+{
+ Message *msg = NULL;
+ int i = 0;
+ alog("Displaying message list for %s", m->name);
+ for (msg = m; msg; msg = msg->next) {
+ alog("%d: %p", ++i, msg);
+ }
+ alog("end");
+ return 0;
+}
+
+
+/**
+ * Add a command to a command table
+ * only add if were unique, pos = 0;
+ * if we want it at the "head" of that command, pos = 1
+ * at the tail, pos = 2
+ **/
+int addCommand(CommandHash * cmdTable[], Command * c, int pos)
+{
+ /* We can assume both param's have been checked by this point.. */
+ int index = 0;
+ CommandHash *current = NULL;
+ CommandHash *newHash = NULL;
+ CommandHash *lastHash = NULL;
+ Command *tail = NULL;
+
+ if (!cmdTable || !c || (pos < 0 || pos > 2)) {
+ return MOD_ERR_PARAMS;
+ }
+
+ index = CMD_HASH(c->name);
+
+ for (current = cmdTable[index]; current; current = current->next) {
+ if ((c->service) && (current->c) && (current->c->service)
+ && (!strcmp(c->service, current->c->service) == 0)) {
+ continue;
+ }
+ if ((strcasecmp(c->name, current->name) == 0)) { /* the cmd exist's we are a addHead */
+ if (pos == 1) {
+ c->next = current->c;
+ current->c = c;
+ if (debug)
+ alog("existing cmd: (%p), new cmd (%p)", c->next, c);
+ return MOD_ERR_OK;
+ } else if (pos == 2) {
+
+ tail = current->c;
+ while (tail->next)
+ tail = tail->next;
+ if (debug)
+ alog("existing cmd: (%p), new cmd (%p)", tail, c);
+ tail->next = c;
+ c->next = NULL;
+
+ return MOD_ERR_OK;
+ } else
+ return MOD_ERR_EXISTS;
+ }
+ lastHash = current;
+ }
+
+ if ((newHash = malloc(sizeof(CommandHash))) == NULL) {
+ fatal("Out of memory");
+ }
+ newHash->next = NULL;
+ newHash->name = sstrdup(c->name);
+ newHash->c = c;
+
+ if (lastHash == NULL)
+ cmdTable[index] = newHash;
+ else
+ lastHash->next = newHash;
+
+ return MOD_ERR_OK;
+}
+
+int delCommand(CommandHash * cmdTable[], Command * c, char *mod_name)
+{
+ int index = 0;
+ CommandHash *current = NULL;
+ CommandHash *lastHash = NULL;
+ Command *tail = NULL, *last = NULL;
+
+ if (!c || !cmdTable) {
+ return MOD_ERR_PARAMS;
+ }
+
+ index = CMD_HASH(c->name);
+ for (current = cmdTable[index]; current; current = current->next) {
+ if (strcasecmp(c->name, current->name) == 0) {
+ if (!lastHash) {
+ tail = current->c;
+ if (tail->next) {
+ while (tail) {
+ if (mod_name && tail->mod_name
+ && (stricmp(mod_name, tail->mod_name) == 0)) {
+ if (last) {
+ last->next = tail->next;
+ } else {
+ current->c = tail->next;
+ }
+ return MOD_ERR_OK;
+ }
+ last = tail;
+ tail = tail->next;
+ }
+ } else {
+ cmdTable[index] = current->next;
+ free(current->name);
+ return MOD_ERR_OK;
+ }
+ } else {
+ tail = current->c;
+ if (tail->next) {
+ while (tail) {
+ if (mod_name && tail->mod_name
+ && (stricmp(mod_name, tail->mod_name) == 0)) {
+ if (last) {
+ last->next = tail->next;
+ } else {
+ current->c = tail->next;
+ }
+ return MOD_ERR_OK;
+ }
+ last = tail;
+ tail = tail->next;
+ }
+ } else {
+ lastHash->next = current->next;
+ free(current->name);
+ return MOD_ERR_OK;
+ }
+ }
+ }
+ lastHash = current;
+ }
+ return MOD_ERR_NOEXIST;
+}
+
+Command *findCommand(CommandHash * cmdTable[], const char *name)
+{
+ int idx;
+ CommandHash *current = NULL;
+ if (!cmdTable || !name) {
+ return NULL;
+ }
+
+ idx = CMD_HASH(name);
+
+ for (current = cmdTable[idx]; current; current = current->next) {
+ if (stricmp(name, current->name) == 0) {
+ return current->c;
+ }
+ }
+ return NULL;
+}
+
+/*******************************************************************************
+ * Message Functions
+ *******************************************************************************/
+
+Message *createMessage(char *name,
+ int (*func) (char *source, int ac, char **av))
+{
+ Message *m = NULL;
+ if (!name || !func) {
+ return NULL;
+ }
+ if ((m = malloc(sizeof(Message))) == NULL) {
+ fatal("Out of memory!");
+ }
+ m->name = sstrdup(name);
+ m->func = func;
+ m->mod_name = NULL;
+ m->next = NULL;
+ return m;
+}
+
+Message *findMessage(MessageHash * msgTable[], const char *name)
+{
+ int idx;
+ MessageHash *current = NULL;
+ if (!msgTable || !name) {
+ return NULL;
+ }
+ idx = CMD_HASH(name);
+
+ for (current = msgTable[idx]; current; current = current->next) {
+ if (stricmp(name, current->name) == 0) {
+ return current->m;
+ }
+ }
+ return NULL;
+}
+
+int addMessage(MessageHash * msgTable[], Message * m, int pos)
+{
+ /* We can assume both param's have been checked by this point.. */
+ int index = 0;
+ MessageHash *current = NULL;
+ MessageHash *newHash = NULL;
+ MessageHash *lastHash = NULL;
+ Message *tail = NULL;
+
+ if (!msgTable || !m || (pos < 0 || pos > 2)) {
+ return MOD_ERR_PARAMS;
+ }
+
+ index = CMD_HASH(m->name);
+
+ for (current = msgTable[index]; current; current = current->next) {
+ if (strcasecmp(m->name, current->name) == 0) { /* the msg exist's we are a addHead */
+ if (pos == 1) {
+ m->next = current->m;
+ current->m = m;
+ if (debug)
+ alog("existing msg: (%p), new msg (%p)", m->next, m);
+ return MOD_ERR_OK;
+ } else if (pos == 2) {
+ tail = current->m;
+ while (tail->next)
+ tail = tail->next;
+ if (debug)
+ alog("existing msg: (%p), new msg (%p)", tail, m);
+ tail->next = m;
+ m->next = NULL;
+ return MOD_ERR_OK;
+ } else
+ return MOD_ERR_EXISTS;
+ }
+ lastHash = current;
+ }
+
+ if ((newHash = malloc(sizeof(MessageHash))) == NULL) {
+ fatal("Out of memory");
+ }
+ newHash->next = NULL;
+ newHash->name = sstrdup(m->name);
+ newHash->m = m;
+
+ if (lastHash == NULL)
+ msgTable[index] = newHash;
+ else
+ lastHash->next = newHash;
+ return MOD_ERR_OK;
+}
+
+int addCoreMessage(MessageHash * msgTable[], Message * m)
+{
+ if (!msgTable || !m) {
+ return MOD_ERR_PARAMS;
+ }
+ m->core = 1;
+ return addMessage(msgTable, m, 0);
+}
+
+int moduleAddMessage(Message * m, int pos)
+{
+ int status;
+
+ if (!m) {
+ return MOD_ERR_PARAMS;
+ }
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ } /* shouldnt happen */
+ m->core = 0;
+ m->mod_name = sstrdup(mod_current_module->name);
+
+ status = addMessage(IRCD, m, pos);
+ if (debug) {
+ displayMessageFromHash(m->name);
+ }
+ return status;
+}
+
+int moduleDelMessage(char *name)
+{
+ Message *m;
+ int status;
+
+ if (!mod_current_module) {
+ return MOD_ERR_UNKNOWN;
+ }
+ m = findMessage(IRCD, name);
+ if (!m) {
+ return MOD_ERR_NOEXIST;
+ }
+
+ status = delMessage(IRCD, m, mod_current_module->name);
+ if (debug) {
+ displayMessageFromHash(m->name);
+ }
+ return status;
+}
+
+int delMessage(MessageHash * msgTable[], Message * m, char *mod_name)
+{
+ int index = 0;
+ MessageHash *current = NULL;
+ MessageHash *lastHash = NULL;
+ Message *tail = NULL, *last = NULL;
+
+ if (!m || !msgTable) {
+ return MOD_ERR_PARAMS;
+ }
+
+ index = CMD_HASH(m->name);
+
+ for (current = msgTable[index]; current; current = current->next) {
+ if (strcasecmp(m->name, current->name) == 0) {
+ if (!lastHash) {
+ tail = current->m;
+ if (tail->next) {
+ while (tail) {
+ if (mod_name && tail->mod_name
+ && (stricmp(mod_name, tail->mod_name) == 0)) {
+ if (last) {
+ last->next = tail->next;
+ } else {
+ current->m = tail->next;
+ }
+ return MOD_ERR_OK;
+ }
+ last = tail;
+ tail = tail->next;
+ }
+ } else {
+ msgTable[index] = current->next;
+ free(current->name);
+ return MOD_ERR_OK;
+ }
+ } else {
+ tail = current->m;
+ if (tail->next) {
+ while (tail) {
+ if (mod_name && tail->mod_name
+ && (stricmp(mod_name, tail->mod_name) == 0)) {
+ if (last) {
+ last->next = tail->next;
+ } else {
+ current->m = tail->next;
+ }
+ return MOD_ERR_OK;
+ }
+ last = tail;
+ tail = tail->next;
+ }
+ } else {
+ lastHash->next = current->next;
+ free(current->name);
+ return MOD_ERR_OK;
+ }
+ }
+ }
+ lastHash = current;
+ }
+ return MOD_ERR_NOEXIST;
+}
+
+int destroyMessage(Message * m)
+{
+ if (!m) {
+ return MOD_ERR_PARAMS;
+ }
+ if (m->name) {
+ free(m->name);
+ }
+ m->func = NULL;
+ if (m->mod_name) {
+ free(m->mod_name);
+ }
+ m->next = NULL;
+ return MOD_ERR_OK;
+}
+
+void moduleAddVersion(char *version)
+{
+ if (mod_current_module && version) {
+ mod_current_module->version = sstrdup(version);
+ }
+}
+
+void moduleAddAuthor(char *author)
+{
+ if (mod_current_module && author) {
+ mod_current_module->author = sstrdup(author);
+ }
+}
+
+/*******************************************************************************
+ * Module Callback Functions
+ *******************************************************************************/
+int moduleAddCallback(char *name, time_t when,
+ int (*func) (int argc, char *argv[]), int argc,
+ char **argv)
+{
+ ModuleCallBack *new, *tmp, *prev;
+ int i;
+ new = malloc(sizeof(ModuleCallBack));
+ if (!new)
+ return MOD_ERR_MEMORY;
+
+ if (name)
+ new->name = sstrdup(name);
+ else
+ new->name = NULL;
+ new->when = when;
+ if (mod_current_module_name) {
+ new->owner_name = sstrdup(mod_current_module_name);
+ } else {
+ new->owner_name = NULL;
+ }
+ new->func = func;
+ new->argc = argc;
+ new->argv = malloc(sizeof(char *) * argc);
+ for (i = 0; i < argc; i++) {
+ new->argv[i] = sstrdup(argv[i]);
+ }
+ new->next = NULL;
+
+ if (moduleCallBackHead == NULL) {
+ moduleCallBackHead = new;
+ } else { /* find place in list */
+ tmp = moduleCallBackHead;
+ prev = tmp;
+ if (new->when < tmp->when) {
+ new->next = tmp;
+ moduleCallBackHead = new;
+ } else {
+ while (tmp && new->when >= tmp->when) {
+ prev = tmp;
+ tmp = tmp->next;
+ }
+ prev->next = new;
+ new->next = tmp;
+ }
+ }
+ if (debug)
+ alog("Added module CallBack: [%s] due to execute at %ld",
+ new->name ? new->name : "?", new->when);
+ return MOD_ERR_OK;
+}
+
+void moduleCallBackRun(void)
+{
+ ModuleCallBack *tmp;
+ if (!moduleCallBackHead) {
+ return;
+ }
+ tmp = moduleCallBackHead;
+ if (tmp->when <= time(NULL)) {
+ if (debug)
+ alog("Executing callback: %s", tmp->name ? tmp->name : "?");
+ if (tmp->func) {
+ tmp->func(tmp->argc, tmp->argv);
+ moduleCallBackDeleteEntry(NULL); /* delete the head */
+ }
+ }
+ return;
+}
+
+void moduleCallBackDeleteEntry(ModuleCallBack * prev)
+{
+ ModuleCallBack *tmp = NULL;
+ int i;
+ if (prev == NULL) {
+ tmp = moduleCallBackHead;
+ moduleCallBackHead = tmp->next;
+ } else {
+ tmp = prev->next;
+ prev->next = tmp->next;
+ }
+ if (tmp->name)
+ free(tmp->name);
+ if (tmp->owner_name)
+ free(tmp->owner_name);
+ tmp->func = NULL;
+ for (i = 0; i < tmp->argc; i++) {
+ free(tmp->argv[i]);
+ }
+ tmp->argc = 0;
+ tmp->next = NULL;
+ free(tmp);
+}
+
+
+ModuleCallBack *moduleCallBackFindEntry(char *mod_name, boolean * found)
+{
+ ModuleCallBack *prev = NULL, *current = NULL;
+ *found = false;
+ current = moduleCallBackHead;
+ while (current != NULL) {
+ if (current->owner_name
+ && (strcmp(mod_name, current->owner_name) == 0)) {
+ *found = true;
+ break;
+ } else {
+ prev = current;
+ current = current->next;
+ }
+ }
+ if (current == moduleCallBackHead) {
+ return NULL;
+ } else {
+ return prev;
+ }
+}
+
+void moduleDelCallback(char *name)
+{
+ ModuleCallBack *current = NULL;
+ ModuleCallBack *prev = NULL, *tmp = NULL;
+ int del = 0;
+ if (!mod_current_module_name) {
+ return;
+ }
+ if (!name) {
+ return;
+ }
+ current = moduleCallBackHead;
+ while (current) {
+ if ((current->owner_name) && (current->name)) {
+ if ((strcmp(mod_current_module_name, current->owner_name) == 0)
+ && (strcmp(current->name, name) == 0)) {
+ if (debug) {
+ alog("Removing CallBack %s for module %s", name,
+ mod_current_module_name);
+ }
+ tmp = current->next; /* get a pointer to the next record, as once we delete this record, we'll lose it :) */
+ moduleCallBackDeleteEntry(prev); /* delete this record */
+ del = 1; /* set the record deleted flag */
+ }
+ }
+ if (del == 1) { /* if a record was deleted */
+ current = tmp; /* use the value we stored in temp */
+ tmp = NULL; /* clear it for next time */
+ del = 0; /* reset the flag */
+ } else {
+ prev = current; /* just carry on as normal */
+ current = current->next;
+ }
+ }
+}
+
+void moduleCallBackPrepForUnload(char *mod_name)
+{
+ boolean found = false;
+ ModuleCallBack *tmp = NULL;
+
+ tmp = moduleCallBackFindEntry(mod_name, &found);
+ while (found) {
+ if (debug) {
+ alog("Removing CallBack for module %s", mod_name);
+ }
+ moduleCallBackDeleteEntry(tmp);
+ tmp = moduleCallBackFindEntry(mod_name, &found);
+ }
+}
+
+char *moduleGetLastBuffer(void)
+{
+ char *tmp = NULL;
+ if (mod_current_buffer) {
+ tmp = strchr(mod_current_buffer, ' ');
+ if (tmp) {
+ tmp++;
+ }
+ }
+ return tmp;
+}
+
+/*******************************************************************************
+ * Module HELP Functions
+ *******************************************************************************/
+int moduleAddRootHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->root_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+int moduleAddAdminHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->admin_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+int moduleAddOperHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->oper_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+int moduleAddRegHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->regular_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+int moduleAddHelp(Command * c, int (*func) (User * u))
+{
+ if (c) {
+ c->all_help = func;
+ return MOD_STOP;
+ }
+ return MOD_CONT;
+}
+
+void moduleSetNickHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->nickHelp = func;
+ }
+}
+
+void moduleSetChanHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->chanHelp = func;
+ }
+}
+
+void moduleSetMemoHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->memoHelp = func;
+ }
+}
+
+void moduleSetBotHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->botHelp = func;
+ }
+}
+
+void moduleSetOperHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->operHelp = func;
+ }
+}
+
+void moduleSetHostHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->hostHelp = func;
+ }
+}
+
+void moduleSetHelpHelp(void (*func) (User * u))
+{
+ if (mod_current_module) {
+ mod_current_module->helpHelp = func;
+ }
+}
+
+void moduleDisplayHelp(int service, User * u)
+{
+#ifdef USE_MODULES
+ int idx;
+ int header_shown = 0;
+ ModuleHash *current = NULL;
+
+ for (idx = 0; idx != MAX_CMD_HASH; idx++) {
+ for (current = MODULE_HASH[idx]; current; current = current->next) {
+ if ((service == 1) && current->m->nickHelp) {
+ if (header_shown == 0) {
+ notice_lang(s_NickServ, u, MODULE_HELP_HEADER);
+ header_shown = 1;
+ }
+ current->m->nickHelp(u);
+ } else if ((service == 2) && current->m->chanHelp) {
+ if (header_shown == 0) {
+ notice_lang(s_ChanServ, u, MODULE_HELP_HEADER);
+ header_shown = 1;
+ }
+ current->m->chanHelp(u);
+ } else if ((service == 3) && current->m->memoHelp) {
+ if (header_shown == 0) {
+ notice_lang(s_MemoServ, u, MODULE_HELP_HEADER);
+ header_shown = 1;
+ }
+ current->m->memoHelp(u);
+ } else if ((service == 4) && current->m->botHelp) {
+ if (header_shown == 0) {
+ notice_lang(s_BotServ, u, MODULE_HELP_HEADER);
+ header_shown = 1;
+ }
+ current->m->botHelp(u);
+ } else if ((service == 5) && current->m->operHelp) {
+ if (header_shown == 0) {
+ notice_lang(s_OperServ, u, MODULE_HELP_HEADER);
+ header_shown = 1;
+ }
+ current->m->operHelp(u);
+ } else if ((service == 6) && current->m->hostHelp) {
+ if (header_shown == 0) {
+ notice_lang(s_HostServ, u, MODULE_HELP_HEADER);
+ header_shown = 1;
+ }
+ current->m->hostHelp(u);
+ } else if ((service == 7) && current->m->helpHelp) {
+ if (header_shown == 0) {
+ notice_lang(s_HelpServ, u, MODULE_HELP_HEADER);
+ header_shown = 1;
+ }
+ current->m->helpHelp(u);
+ }
+ }
+ }
+#endif
+}
+
+
+/* EOF */
diff --git a/modules.h b/modules.h
new file mode 100644
index 000000000..d56ce33cb
--- /dev/null
+++ b/modules.h
@@ -0,0 +1,223 @@
+/* Modular support
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: modules.h,v 1.16 2004/03/11 16:50:01 rob Exp $
+ */
+
+#ifndef MODULES_H
+#define MODULES_H
+
+#include <time.h>
+#include "services.h"
+#include <stdio.h>
+
+/*************************************************************************/
+#define CMD_HASH(x) (((x)[0]&31)<<5 | ((x)[1]&31)) /* Will gen a hash from a string :) */
+#define MAX_CMD_HASH 1024
+
+#define MOD_STOP 1
+#define MOD_CONT 0
+
+#define HOSTSERV HS_cmdTable /* using HOSTSERV etc. looks nicer than HS_cmdTable for modules */
+#define BOTSERV BS_cmdTable
+#define MEMOSERV MS_cmdTable
+#define NICKSERV NS_cmdTable
+#define CHANSERV CS_cmdTable
+#define HELPSERV HE_cmdTable
+#define OPERSERV OS_cmdTable
+#define IRCD IRCD_cmdTable
+#define MODULE_HASH Module_table
+
+/**********************************************************************
+ * Module Returns
+ **********************************************************************/
+ #define MOD_ERR_OK 0
+ #define MOD_ERR_MEMORY 1
+ #define MOD_ERR_PARAMS 2
+ #define MOD_ERR_EXISTS 3
+ #define MOD_ERR_NOEXIST 4
+ #define MOD_ERR_NOUSER 5
+ #define MOD_ERR_NOLOAD 6
+ #define MOD_ERR_NOUNLOAD 7
+ #define MOD_ERR_SYNTAX 8
+ #define MOD_ERR_NODELETE 9
+ #define MOD_ERR_UNKNOWN 10
+ #define MOD_ERR_FILE_IO 11
+
+ /*************************************************************************/
+
+/* Structure for information about a *Serv command. */
+
+typedef struct Command_ Command;
+typedef struct CommandHash_ CommandHash;
+typedef struct Module_ Module;
+typedef struct ModuleHash_ ModuleHash;
+typedef struct Message_ Message;
+typedef struct MessageHash_ MessageHash;
+typedef struct ModuleCallBack_ ModuleCallBack;
+
+extern CommandHash *HOSTSERV[MAX_CMD_HASH];
+extern CommandHash *BOTSERV[MAX_CMD_HASH];
+extern CommandHash *MEMOSERV[MAX_CMD_HASH];
+extern CommandHash *NICKSERV[MAX_CMD_HASH];
+extern CommandHash *CHANSERV[MAX_CMD_HASH];
+extern CommandHash *HELPSERV[MAX_CMD_HASH];
+extern CommandHash *OPERSERV[MAX_CMD_HASH];
+extern MessageHash *IRCD[MAX_CMD_HASH];
+
+struct Module_ {
+ char *name;
+ char *filename;
+ void *handle;
+ time_t time;
+ char *version;
+ char *author;
+
+ void (*nickHelp)(User *u); /* service 1 */
+ void (*chanHelp)(User *u); /* 2 */
+ void (*memoHelp)(User *u); /* 3 */
+ void (*botHelp)(User *u); /* 4 */
+ void (*operHelp)(User *u); /* 5 */
+ void (*hostHelp)(User *u); /* 6 */
+ void (*helpHelp)(User *u); /* 7 */
+
+// CommandHash *cmdList[MAX_CMD_HASH];
+ MessageHash *msgList[MAX_CMD_HASH];
+};
+
+struct ModuleHash_ {
+ char *name;
+ Module *m;
+ ModuleHash *next;
+};
+
+struct Command_ {
+ char *name;
+ int (*routine)(User *u);
+ int (*has_priv)(User *u); /* Returns 1 if user may use command, else 0 */
+
+ /* Regrettably, these are hard-coded to correspond to current privilege
+ * levels (v4.0). Suggestions for better ways to do this are
+ * appreciated.
+ */
+ int helpmsg_all; /* Displayed to all users; -1 = no message */
+ int helpmsg_reg; /* Displayed to regular users only */
+ int helpmsg_oper; /* Displayed to Services operators only */
+ int helpmsg_admin; /* Displayed to Services admins only */
+ int helpmsg_root; /* Displayed to Services root only */
+ char *help_param1;
+ char *help_param2;
+ char *help_param3;
+ char *help_param4;
+
+ /* Module related stuff */
+ int core; /* Can this command be deleted? */
+ char *mod_name; /* Name of the module who owns us, NULL for core's */
+ char *service; /* Service we provide this command for */
+ int (*all_help)(User *u);
+ int (*regular_help)(User *u);
+ int (*oper_help)(User *u);
+ int (*admin_help)(User *u);
+ int (*root_help)(User *u);
+
+ Command *next; /* Next command responsible for the same command */
+};
+
+struct CommandHash_ {
+ char *name; /* Name of the command */
+ Command *c; /* Actual command */
+ CommandHash *next; /* Next command */
+};
+
+struct Message_ {
+ char *name;
+ int (*func)(char *source, int ac, char **av);
+ int core;
+ char *mod_name;
+ Message *next;
+};
+
+struct MessageHash_ {
+ char *name;
+ Message *m;
+ MessageHash *next;
+};
+
+struct ModuleCallBack_ {
+ char *name;
+ char *owner_name;
+ time_t when;
+ int (*func)(int argc, char *argv[]);
+ int argc;
+ char **argv;
+ ModuleCallBack *next;
+};
+
+/*************************************************************************/
+/* Module Managment Functions */
+Module *createModule(char *filename); /* Create a new module, using the given name */
+int destroyModule(Module *m); /* Delete the module */
+int addModule(Module *m); /* Add a module to the module hash */
+int delModule(Module *m); /* Remove a module from the module hash */
+Module *findModule(char *name); /* Find a module */
+int loadModule(Module *m,User *u); /* Load the given module into the program */
+int unloadModule(Module *m, User *u); /* Unload the given module from the pro */
+int prepForUnload(Module *m); /* Prepare the module for unload */
+void moduleAddVersion(char *version);
+void moduleAddAuthor(char *author);
+void modules_init(void);
+void modules_delayed_init(void);
+void moduleCallBackPrepForUnload(char *mod_name);
+void moduleCallBackDeleteEntry(ModuleCallBack * prev);
+char *moduleGetLastBuffer(void);
+void moduleSetHelpHelp(void (*func) (User * u));
+void moduleDisplayHelp(int service, User *u);
+void moduleSetHostHelp(void (*func) (User * u));
+void moduleSetOperHelp(void (*func) (User * u));
+void moduleSetBotHelp(void (*func) (User * u));
+void moduleSetMemoHelp(void (*func) (User * u));
+void moduleSetChanHelp(void (*func) (User * u));
+void moduleSetNickHelp(void (*func) (User * u));
+int moduleAddHelp(Command * c, int (*func) (User * u));
+int moduleAddRegHelp(Command * c, int (*func) (User * u));
+int moduleAddOperHelp(Command * c, int (*func) (User * u));
+int moduleAddAdminHelp(Command * c, int (*func) (User * u));
+int moduleAddRootHelp(Command * c, int (*func) (User * u));
+/*************************************************************************/
+/*************************************************************************/
+/* Command Managment Functions */
+Command *createCommand(const char *name,int (*func)(User *u),int (*has_priv)(User *u),int help_all, int help_reg, int help_oper, int help_admin,int help_root);
+int destroyCommand(Command *c); /* destroy a command */
+int addCoreCommand(CommandHash *cmdTable[], Command *c); /* Add a command to a command table */
+int moduleAddCommand(CommandHash *cmdTable[], Command *c, int pos);
+int addCommand(CommandHash *cmdTable[], Command *c,int pos);
+int delCommand(CommandHash *cmdTable[], Command *c,char *mod_name); /* Del a command from a cmd table */
+int moduleDelCommand(CommandHash *cmdTable[],char *name); /* Del a command from a cmd table */
+Command *findCommand(CommandHash *cmdTable[], const char *name); /* Find a command */
+/*************************************************************************/
+/*************************************************************************/
+/* Message Managment Functions */
+Message *createMessage(char *name,int (*func)(char *source, int ac, char **av));
+Message *findMessage(MessageHash *msgTable[], const char *name); /* Find a Message */
+int addMessage(MessageHash *msgTable[], Message *m, int pos); /* Add a Message to a Message table */
+int addCoreMessage(MessageHash *msgTable[], Message *m); /* Add a Message to a Message table */
+int moduleAddMessage(Message *m, int pos);
+int delMessage(MessageHash *msgTable[], Message *m, char *mod_name); /* Del a Message from a msg table */
+int moduleDelMessage(char *name);
+int destroyMessage(Message *m); /* destroy a Message*/
+Message *findMessage(MessageHash *msgTable[], const char *name);
+/*************************************************************************/
+int moduleAddCallback(char *name,time_t when,int (*func)(int argc, char *argv[]),int argc, char **argv);
+void moduleDelCallback(char *name);
+void moduleCallBackRun(void);
+/*************************************************************************/
+
+#endif
+/* EOF */
diff --git a/modules/Makefile b/modules/Makefile
new file mode 100644
index 000000000..797cee008
--- /dev/null
+++ b/modules/Makefile
@@ -0,0 +1,26 @@
+include ../Makefile.inc
+include ./Makefile.inc
+
+OBJECTS= $(SRCS:.c=.o)
+SO_FILES=$(OBJECTS:.o=.s)
+CDEFS= -g -rdynamic -Wall
+CFLAGS=$(BASE_CFLAGS) $(CDEFS)
+
+all: $(OBJECTS)
+
+install: $(SO_FILES)
+ $(CP_ALL) ./*.so $(MODULE_PATH)
+
+distclean: clean spotless
+
+.c.o:
+ $(CC) $(CFLAGS) -c $<
+
+.o.s:
+ ld -shared $< -o $*.so
+
+clean:
+ rm -f *.o core
+
+spotless: clean
+ rm -f *.so Makefile.inc
diff --git a/modules/README b/modules/README
new file mode 100644
index 000000000..6aee0ac47
--- /dev/null
+++ b/modules/README
@@ -0,0 +1 @@
+Please read the "MODULES" file located on the "docs" directory.
diff --git a/modules/compile.sh b/modules/compile.sh
new file mode 100755
index 000000000..912780b65
--- /dev/null
+++ b/modules/compile.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+# Disabled for Anope 1.6 until we figure out a better way to
+# download modules safely.
+# if [ "$1" = "getmods" ] ; then
+# wget -nv -r -l 1 -A c -nd -nc http://modules.anope.org/download/
+# rm -f robots.txt
+# exit 0
+# fi
+
+if [ ! -f ../Makefile.inc ]; then
+ echo ""
+ echo "*** ERROR: Unable to find ../Makefile.inc. You must ./configure Anope before"
+ echo "*** ERROR: compiling modules. Please read the INSTALL document for details."
+ echo ""
+ exit 1
+fi
+
+echo -n "SRCS=" > ./Makefile.inc
+FIRST=1
+for oldfile in *.c
+do
+ if [ "$FIRST" = 1 ] ; then
+ echo -n " "$oldfile >> ./Makefile.inc
+ else
+ echo "\\" >> ./Makefile.inc
+ echo -n " " $oldfile >> ./Makefile.inc
+ fi
+ FIRST=0
+done
+echo "" >> ./Makefile.inc
+
+make
+
+if [ "$1" = "install" ] ; then
+ make install
+fi
diff --git a/modules/configure b/modules/configure
new file mode 100755
index 000000000..5d75aaad9
--- /dev/null
+++ b/modules/configure
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+echo -n "SRCS=" > ./Makefile.inc
+FIRST=1
+for oldfile in *.c
+do
+ if [ "$FIRST" = 1 ] ; then
+ echo -n " "$oldfile >> ./Makefile.inc
+ else
+ echo "\\" >> ./Makefile.inc
+ echo -n " " $oldfile >> ./Makefile.inc
+ fi
+ FIRST=0
+done
+echo "" >> ./Makefile.inc
+
+cat <<EOT
+All done! Now run "make" (or possibly "gmake") to compile your modules.
+See the INSTALL, README and FAQ files if you have any problems.
+EOT
+exit 0
diff --git a/modules/hs_moo.c b/modules/hs_moo.c
new file mode 100644
index 000000000..97d48ae04
--- /dev/null
+++ b/modules/hs_moo.c
@@ -0,0 +1,99 @@
+/**
+ * This is an EXAMPLE module, which adds the "moo" command to HostServ
+ *
+ * This command does NOT do anything useful at all!
+ *
+ * Please visit http://modules.anope.org for useful modules!
+ *
+ **/
+#include "module.h"
+
+#define AUTHOR "Anope" /* Set the Author for a modinfo reply */
+#define VERSION "1.1" /* Set the version for a modinfo reply */
+
+int hs_moo_show(User * u); /* Function to use when a /hs moo command is recived */
+int test(int argc, char **argv);
+void myHostServHelp(User *u); /* Function to display out help in a /hs help response */
+int myHostServMooHelp(User *u); /* Function to display help to _everyone_ when a /hs help moo is called*/
+int myHostServMooRegHelp(User *u); /* Function to display extra help to regular-users when a /hs help moo is called*/
+int myHostServMooOperHelp(User *u); /* Function to display extra help to opers when a /hs help moo is called*/
+int myHostServMooAdminHelp(User *u); /* Function to display extra help to admins when a /hs help moo is called*/
+int myHostServMooRootHelp(User *u); /* Function to display extra help to roors when a /hs help moo is called*/
+
+int AnopeInit(int argc, char **argv) /* This will be executed when the module is loaded */
+{
+ Command *c; /* Pointer to a Command */
+ c = createCommand("moo", hs_moo_show, NULL, -1, -1, -1, -1, -1); /* Create a new command "moo" pointing to hs_moo */
+
+ moduleAddHelp(c,myHostServMooHelp); /* add help for all users to this command */
+ moduleAddRegHelp(c,myHostServMooRegHelp); /* add extra regular-user only help to this command */
+ moduleAddOperHelp(c,myHostServMooOperHelp); /* add extra oper only help to this command */
+ moduleAddAdminHelp(c,myHostServMooAdminHelp); /* add extra admin only help to this command */
+ moduleAddRootHelp(c,myHostServMooRootHelp); /* add extra root only help to this command */
+
+ moduleSetHostHelp(myHostServHelp); /* add us to the .hs help list */
+
+
+ alog("hs_moo.so: Add Command 'moo' Status: %d", /* Log the command being added */
+ moduleAddCommand(HOSTSERV, c, MOD_HEAD)); /* And add it to the HOSTSERV cmd table */
+ moduleAddCallback("test",time(NULL)+dotime("15s"),test,0,NULL); /* set a call-back function to exec in 3 mins time */
+ moduleDelCallback("test");
+ moduleAddAuthor(AUTHOR); /* tell Anope about the author */
+ moduleAddVersion(VERSION); /* Tell Anope about the verison */
+ return MOD_CONT;
+}
+
+int hs_moo_show(User * u)
+{
+ notice(s_HostServ, u->nick, "MOO! - This command was loaded via a module!"); /* Just notice the user */
+ return MOD_STOP; /* MOD_STOP means we will NOT pass control back to other */
+} /* modules waiting to handle the /hs moo command! */
+
+int test(int argc, char **argv) {
+ alog("CallBack from hs_moo with %d paramaters",argc);
+ return MOD_CONT;
+}
+
+
+/***************************************************************************************************************************************/
+/* The code below here shows various ways of dealing with the module help system */
+/***************************************************************************************************************************************/
+
+void myHostServHelp(User *u) {
+ notice(s_HostServ,u->nick, " MOO Moo's at the user!"); /* this will appear in the help list */
+}
+
+int myHostServMooHelp(User *u) {
+ notice(s_HostServ,u->nick,"Syntax: Moo"); /* this will be sent to everyone who does /msg hostserv help moo */
+ notice(s_HostServ,u->nick,"This command is an example provided");
+ notice(s_HostServ,u->nick,"by the Anope development team.");
+ return MOD_CONT; /* allow any other module's with help for /hs moo to run */
+}
+
+int myHostServMooRootHelp(User *u) { /* this will only be sent to ROOTS ONLY who /msg hostserv moo */
+ myHostServMooAdminHelp(u); /* this line lets us show roots the ADMIN help as well as the root help */
+ notice(s_HostServ,u->nick,"Only roots will see this part of the help");
+ return MOD_CONT;
+}
+
+int myHostServMooAdminHelp(User *u) { /* this will only be sent to ADMINS ONLY who /msg hostserv moo */
+ myHostServMooOperHelp(u); /* this line lets us show admins the OPER help as well as the admin help */
+ notice(s_HostServ,u->nick,"Only admins will see this part of the help");
+ notice(s_HostServ,u->nick,"why not visit us on www.anope.org ?");
+ return MOD_CONT;
+}
+
+int myHostServMooOperHelp(User *u) { /* this will only be sent to OPERS ONLY who /msg hostserv moo */
+ notice(s_HostServ,u->nick,"Only opers will see this part of the help");
+ notice(s_HostServ,u->nick,"for more help/support with modules");
+ notice(s_HostServ,u->nick,"visit us on irc.anope.org #anope! :)");
+ return MOD_CONT;
+}
+
+int myHostServMooRegHelp(User *u) { /* this will only be sent to REGULAR USERS ONLY who /msg hostserv moo */
+ notice(s_HostServ,u->nick,"Only non-opers will see this part of the help");
+ notice(s_HostServ,u->nick,"as we've left it hidden from opers");
+ return MOD_CONT;
+}
+
+/* EOF */
diff --git a/modules/ircd_catserv.c b/modules/ircd_catserv.c
new file mode 100644
index 000000000..436b18dcc
--- /dev/null
+++ b/modules/ircd_catserv.c
@@ -0,0 +1,128 @@
+/**
+ * Simple module to load up a client called CatServ and process commands for it
+ * This module is an example, and has no useful purpose!
+ *
+ * Please visit http://modules.anope.org for useful modules!
+ *
+ **/
+
+#include "module.h"
+
+#define AUTHOR "Anope"
+#define VERSION "1.1"
+
+int my_privmsg(char *source, int ac, char **av);
+CommandHash *Catserv_cmdTable[MAX_CMD_HASH];
+
+void addClient(char *nick, char *realname);
+void addMessageList(void);
+void delClient(void);
+char *s_CatServ = "CatServ";
+void catserv(User * u, char *buf);
+
+int do_meow(User * u);
+int do_purr(User * u);
+
+int AnopeInit(int argc, char **argv)
+{
+ Message *msg = NULL;
+ int status;
+ msg = createMessage("PRIVMSG", my_privmsg);
+ status = moduleAddMessage(msg, MOD_HEAD);
+ if (status == MOD_ERR_OK) {
+ addClient(s_CatServ, "meow!");
+ addMessageList();
+ }
+ moduleAddAuthor(AUTHOR);
+ moduleAddVersion(VERSION);
+ alog("ircd_catserv.so: loaded, message status [%d]", status);
+ return MOD_CONT;
+}
+
+void AnopeFini(void)
+{
+ delClient();
+}
+
+int my_privmsg(char *source, int ac, char **av)
+{
+ User *u;
+ char *s;
+
+ /* First, some basic checks */
+ if (ac != 2)
+ return MOD_CONT; /* bleh */
+ if (!(u = finduser(source))) {
+ return MOD_CONT;
+ } /* non-user source */
+ if (*av[0] == '#') {
+ return MOD_CONT;
+ }
+ /* Channel message */
+ /* we should prolly honour the ignore list here, but i cba for this... */
+ s = strchr(av[0], '@');
+ if (s) {
+ *s++ = 0;
+ if (stricmp(s, ServerName) != 0)
+ return MOD_CONT;
+ }
+ if ((stricmp(av[0], s_CatServ)) == 0) { /* its for US! */
+ catserv(u, av[1]);
+ return MOD_STOP;
+ } else { /* ok it isnt us, let the old code have it */
+ return MOD_CONT;
+ }
+}
+
+void addClient(char *nick, char *realname)
+{
+ NEWNICK(nick, "catserv", "meow.meow.land", realname, "+", 1);
+}
+
+void delClient(void)
+{
+ send_cmd(s_CatServ, "QUIT :Module Unloaded!");
+}
+
+void addMessageList(void)
+{
+ Command *c;
+ c = createCommand("meow", do_meow, NULL, -1, -1, -1, -1, -1);
+ addCommand(Catserv_cmdTable, c, MOD_UNIQUE);
+ c = createCommand("purr", do_purr, NULL, -1, -1, -1, -1, -1);
+ addCommand(Catserv_cmdTable, c, MOD_UNIQUE);
+}
+
+/*****************************************************************************/
+/* Main CatServ routine. */
+void catserv(User * u, char *buf)
+{
+ char *cmd, *s;
+
+ cmd = strtok(buf, " ");
+
+ if (!cmd) {
+ return;
+ } else if (stricmp(cmd, "\1PING") == 0) {
+ if (!(s = strtok(NULL, "")))
+ s = "\1";
+ notice(s_CatServ, u->nick, "\1PING %s", s);
+ } else if (skeleton) {
+ notice_lang(s_CatServ, u, SERVICE_OFFLINE, s_CatServ);
+ } else {
+ mod_run_cmd(s_CatServ, u, Catserv_cmdTable, cmd);
+ }
+}
+
+int do_meow(User * u)
+{
+ notice(s_CatServ, u->nick, "MEOW!");
+ return MOD_STOP;
+}
+
+int do_purr(User * u)
+{
+ notice(s_CatServ, u->nick, "PURR!");
+ return MOD_STOP;
+}
+
diff --git a/modules/module.h b/modules/module.h
new file mode 100644
index 000000000..336762955
--- /dev/null
+++ b/modules/module.h
@@ -0,0 +1,9 @@
+#include "../services.h"
+#include "../commands.h"
+#include "../language.h"
+#include "../modules.h"
+
+#define MOD_UNIQUE 0
+#define MOD_HEAD 1
+#define MOD_TAIL 2
+
diff --git a/mysql.c b/mysql.c
new file mode 100644
index 000000000..3ca449c5f
--- /dev/null
+++ b/mysql.c
@@ -0,0 +1,869 @@
+/* MySQL functions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: mysql.c,v 1.33 2004/03/14 13:02:53 rob Exp $
+ *
+ */
+#include "services.h"
+
+/*************************************************************************/
+
+/* Database Global Variables */
+MYSQL *mysql; /* MySQL Handler */
+MYSQL_RES *mysql_res; /* MySQL Result */
+MYSQL_FIELD *mysql_fields; /* MySQL Fields */
+MYSQL_ROW mysql_row; /* MySQL Row */
+
+/*************************************************************************/
+
+void db_mysql_error(int severity, char *msg)
+{
+ static char buf[512];
+
+ if (mysql_error(mysql)) {
+ snprintf(buf, sizeof(buf), "MySQL %s %s: %s", msg,
+ severity == MYSQL_WARNING ? "warning" : "error",
+ mysql_error(mysql));
+ } else {
+ snprintf(buf, sizeof(buf), "MySQL %s %s", msg,
+ severity == MYSQL_WARNING ? "warning" : "error");
+ }
+
+ log_perror(buf);
+
+ if (severity == MYSQL_ERROR) {
+ log_perror("MySQL FATAL error... aborting.");
+ exit(0);
+ }
+
+}
+
+/*************************************************************************/
+
+int db_mysql_init()
+{
+
+ /* If the host is not defined, assume we don't want MySQL */
+ if (!MysqlHost) {
+ do_mysql = 0;
+ alog("MySQL has been disabled.");
+ } else {
+ do_mysql = 1;
+ alog("MySQL has been enabled.");
+ }
+ return 1;
+
+}
+
+/*************************************************************************/
+
+int db_mysql_open()
+{
+ /* If MySQL is disabled, return 0 */
+ if (!do_mysql)
+ return 0;
+
+ mysql = mysql_init(NULL);
+ if (mysql == NULL)
+ db_mysql_error(MYSQL_WARNING, "Unable to create mysql object");
+
+ if (!MysqlPort)
+ MysqlPort = 3306;
+
+ if (MysqlSock) {
+ if ((!mysql_real_connect
+ (mysql, MysqlHost, MysqlUser, MysqlPass, MysqlName, MysqlPort,
+ MysqlSock, 0))) {
+ log_perror("Cant connect to MySQL: %s\n", mysql_error(mysql));
+ return 0;
+ }
+ } else {
+ if ((!mysql_real_connect
+ (mysql, MysqlHost, MysqlUser, MysqlPass, MysqlName, MysqlPort,
+ NULL, 0))) {
+ log_perror("Cant connect to MySQL: %s\n", mysql_error(mysql));
+ return 0;
+ }
+ }
+
+ return 1;
+
+}
+
+/*************************************************************************/
+
+int db_mysql_query(char *sql)
+{
+
+ int result, lcv;
+
+ result = mysql_query(mysql, sql);
+
+ if (result) {
+ switch (mysql_errno(mysql)) {
+ case CR_SERVER_GONE_ERROR:
+ case CR_SERVER_LOST:
+
+ for (lcv = 0; lcv < MysqlRetries; lcv++) {
+ if (db_mysql_open()) {
+ result = mysql_query(mysql, sql);
+ return (result);
+ }
+ sleep(MysqlRetryGap);
+ }
+
+ /* If we get here, we could not connect. */
+ log_perror("Unable to reconnect to database: %s\n",
+ mysql_error(mysql));
+ db_mysql_error(MYSQL_ERROR, "connect");
+
+ /* Never reached. */
+ break;
+
+ default:
+ /* Unhandled error. */
+ return (result);
+ }
+ }
+
+ return (0);
+
+}
+
+/*************************************************************************/
+
+char *db_mysql_quote(char *sql)
+{
+ int slen;
+ char *quoted;
+
+ if (!sql) {
+ return sstrdup("");
+ }
+
+ slen = strlen(sql);
+ quoted = malloc((1 + (slen * 2)) * sizeof(char));
+
+ mysql_real_escape_string(mysql, quoted, sql, slen);
+ return quoted;
+
+}
+
+/*************************************************************************/
+
+/* I don't like using res here, maybe we can pass it as a param? */
+int db_mysql_close()
+{
+ if (mysql_res)
+ mysql_free_result(mysql_res);
+ mysql_close(mysql);
+ return 1;
+}
+
+/*************************************************************************/
+
+/*
+ * NickServ Specific Secion
+ */
+
+/*************************************************************************/
+void db_mysql_save_ns_req(NickRequest * nr)
+{
+ char *qnick, *qpasscode, *qpassword, *qemail;
+ char sqlcmd[MAX_SQL_BUF];
+
+ qnick = db_mysql_quote(nr->nick);
+ qpasscode = db_mysql_quote(nr->passcode);
+ qpassword = db_mysql_quote(nr->password);
+ qemail = db_mysql_quote(nr->email);
+
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "REPLACE anope_ns_request (nick,passcode,password,email,requested,active)"
+ " VALUES ('%s','%s','%s','%s','%d','1')",
+ qnick, qpasscode, qpassword, qemail, (int) nr->requested);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(qnick);
+ free(qpasscode);
+ free(qpassword);
+ free(qemail);
+}
+
+char *db_mysql_secure(char *pass)
+{
+
+ char epass[BUFSIZE];
+
+ if (!pass) {
+ snprintf(epass, sizeof(epass), "''");
+ } else if ((!MysqlSecure) || (strcmp(MysqlSecure, "") == 0)) {
+ snprintf(epass, sizeof(epass), "'%s'", pass);
+ } else if (strcmp(MysqlSecure, "des") == 0) {
+ snprintf(epass, sizeof(epass), "ENCRYPT('%s')", pass);
+ } else if (strcmp(MysqlSecure, "md5") == 0) {
+ snprintf(epass, sizeof(epass), "MD5('%s')", pass);
+ } else if (strcmp(MysqlSecure, "sha") == 0) {
+ snprintf(epass, sizeof(epass), "SHA('%s')", pass);
+ } else {
+ snprintf(epass, sizeof(epass), "ENCODE('%s','%s')", pass,
+ MysqlSecure);
+ }
+
+ return sstrdup(epass);
+
+}
+
+/*************************************************************************/
+void db_mysql_save_ns_core(NickCore * nc)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ int j;
+ char **access;
+ Memo *memos;
+ char *cnick, *cpass, *epass, *cemail, *cgreet, *curl, *caccess,
+ *msender, *mtext;
+
+ cnick = db_mysql_quote(nc->display);
+ cpass = db_mysql_quote(nc->pass);
+ cemail = db_mysql_quote(nc->email);
+ cgreet = db_mysql_quote(nc->greet);
+ curl = db_mysql_quote(nc->url);
+
+ epass = db_mysql_secure(cpass);
+ free(cpass);
+
+ /* Let's take care of the core itself */
+ /* Update the existing records */
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "UPDATE anope_ns_core SET pass=%s,email='%s',greet='%s',icq='%d',url='%s',flags='%d',"
+ "language='%d',accesscount='%d',memocount='%d',memomax='%d',channelcount='%d'"
+ ",channelmax='%d',active='1' WHERE display='%s'",
+ epass, cemail, cgreet, nc->icq, curl, nc->flags,
+ nc->language, nc->accesscount, nc->memos.memocount,
+ nc->memos.memomax, nc->channelcount, nc->channelmax, cnick);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+
+ /* need to write a wrapper for mysql_affected_rows */
+ /* Our previous UPDATE affected no rows, therefore this is a new record */
+ if ((int) mysql_affected_rows(mysql) <= 0) {
+
+ /* Let's take care of the core itself */
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_ns_core (display,pass,email,greet,icq,url,flags,"
+ "language,accesscount,memocount,memomax,channelcount,channelmax,active)"
+ " VALUES ('%s',%s,'%s','%s','%d','%s','%d','%d','%d','%d','%d','%d','%d','1')",
+ cnick, epass, cemail, cgreet, nc->icq, curl, nc->flags,
+ nc->language, nc->accesscount, nc->memos.memocount,
+ nc->memos.memomax, nc->channelcount, nc->channelmax);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ }
+
+ /* Now let's do the access */
+ for (j = 0, access = nc->access; j < nc->accesscount; j++, access++) {
+ caccess = db_mysql_quote(*access);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_ns_access (display,access) VALUES ('%s','%s')",
+ cnick, caccess);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(caccess);
+ }
+
+ /* And... memos */
+ memos = nc->memos.memos;
+ for (j = 0; j < nc->memos.memocount; j++, memos++) {
+ msender = db_mysql_quote(memos->sender);
+ mtext = db_mysql_quote(memos->text);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_ms_info (receiver,number,flags,time,sender,text,serv)"
+ " VALUES ('%s','%d','%d','%d','%s','%s','NICK')",
+ cnick, memos->number, memos->flags,
+ (int) memos->time, msender, mtext);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(msender);
+ free(mtext);
+ }
+
+ free(cnick);
+ free(epass);
+ free(cemail);
+ free(cgreet);
+ free(curl);
+}
+
+
+/*************************************************************************/
+void db_mysql_save_ns_alias(NickAlias * na)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ char *nnick, *nlmask, *nlrname, *nlquit, *nncnick;
+ nnick = db_mysql_quote(na->nick);
+ nlmask = db_mysql_quote(na->last_usermask);
+ nlrname = db_mysql_quote(na->last_realname);
+ nlquit = db_mysql_quote(na->last_quit);
+ nncnick = db_mysql_quote(na->nc->display);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "UPDATE anope_ns_alias SET last_usermask='%s',last_realname='%s',last_quit='%s',time_registered='%d',last_seen='%d',status='%d',display='%s',active='1' WHERE nick='%s'",
+ nlmask, nlrname, nlquit, (int) na->time_registered,
+ (int) na->last_seen, (int) na->status, nncnick, nnick);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ /* Our previous UPDATE affected no rows, therefore this is a new record */
+ if ((int) mysql_affected_rows(mysql) <= 0) {
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT INTO anope_ns_alias (nick,last_usermask,last_realname,last_quit,time_registered,last_seen,status,display,active) VALUES ('%s','%s','%s','%s','%d','%d','%d','%s','1')",
+ nnick, nlmask, nlrname, nlquit, (int) na->time_registered,
+ (int) na->last_seen, (int) na->status, nncnick);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ }
+
+ free(nnick);
+ free(nlmask);
+ free(nlrname);
+ free(nlquit);
+ free(nncnick);
+
+ return;
+}
+
+/*************************************************************************/
+
+/*
+ * ChanServ Specific Secion
+ */
+
+/*************************************************************************/
+void db_mysql_save_cs_info(ChannelInfo * ci)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ int j, position;
+ Memo *memos;
+ char *ciname, *cifoundernick, *cisuccessornick, *cifounderpass,
+ *cidesc, *ciurl, *ciemail, *cilasttopic, *cilasttopicsetter,
+ *ciforbidby, *ciforbidreason, *cimlock_key, *cimlock_flood,
+ *cimlock_redirect, *cientrymsg, *cibotnick, *msender, *mtext,
+ *ciaccessdisp, *ciakickdisp, *ciakickreason, *ciakickcreator,
+ *cbadwords, *efounderpass;
+
+ ciname = db_mysql_quote(ci->name);
+ cifoundernick =
+ ci->founder ? db_mysql_quote(ci->founder->display) : "";
+ cisuccessornick =
+ ci->successor ? db_mysql_quote(ci->successor->display) : "";
+ cifounderpass = db_mysql_quote(ci->founderpass);
+ cidesc = db_mysql_quote(ci->desc);
+ ciurl = db_mysql_quote(ci->url);
+ ciemail = db_mysql_quote(ci->email);
+ cilasttopic = db_mysql_quote(ci->last_topic);
+ cilasttopicsetter = db_mysql_quote(ci->last_topic_setter);
+ ciforbidby = db_mysql_quote(ci->forbidby);
+ ciforbidreason = db_mysql_quote(ci->forbidreason);
+ cimlock_key = db_mysql_quote(ci->mlock_key);
+#ifdef HAS_FMODE
+ cimlock_flood = db_mysql_quote(ci->mlock_flood);
+#else
+ cimlock_flood = NULL;
+#endif
+#ifdef HAS_LMODE
+ cimlock_redirect = db_mysql_quote(ci->mlock_redirect);
+#else
+ cimlock_redirect = NULL;
+#endif
+ cientrymsg = db_mysql_quote(ci->entry_message);
+ cibotnick = ci->bi ? db_mysql_quote(ci->bi->nick) : "";
+
+ efounderpass = db_mysql_secure(cifounderpass);
+ free(cifounderpass);
+
+ /* Let's take care of the core itself */
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "UPDATE anope_cs_info SET founder='%s',successor='%s',founderpass=%s,"
+ "descr='%s',url='%s',email='%s',time_registered='%d',last_used='%d',"
+ "last_topic='%s',last_topic_setter='%s',last_topic_time='%d',flags='%d',"
+ "forbidby='%s',forbidreason='%s',bantype='%d',accesscount='%d',"
+ "akickcount='%d',mlock_on='%d',mlock_off='%d',mlock_limit='%d',"
+ "mlock_key='%s',mlock_flood='%s',mlock_redirect='%s',entry_message='%s',"
+ "memomax='%d',botnick='%s',botflags='%d',ttb='%d',bwcount='%d',"
+ "capsmin='%d',capspercent='%d',floodlines='%d',floodsecs='%d',"
+ "repeattimes='%d',active='1' WHERE name='%s'",
+ cifoundernick,
+ cisuccessornick,
+ efounderpass, cidesc, ciurl, ciemail,
+ (int) ci->time_registered, (int) ci->last_used,
+ cilasttopic, cilasttopicsetter,
+ (int) ci->last_topic_time, (int) ci->flags,
+ ciforbidby, ciforbidreason, (int) ci->bantype,
+ (int) ci->accesscount, (int) ci->akickcount,
+ (int) ci->mlock_on, (int) ci->mlock_off,
+ (int) ci->mlock_limit, cimlock_key,
+#ifdef HAS_FMODE
+ cimlock_flood,
+#else
+ "",
+#endif
+#ifdef HAS_LMODE
+ cimlock_redirect,
+#else
+ "",
+#endif
+ cientrymsg,
+ (int) ci->memos.memomax,
+ cibotnick,
+ (int) ci->botflags,
+ (int) ci->ttb,
+ (int) ci->bwcount,
+ (int) ci->capsmin,
+ (int) ci->capspercent,
+ (int) ci->floodlines,
+ (int) ci->floodsecs, (int) ci->repeattimes, ciname);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+
+ /* Our previous UPDATE affected no rows, therefore this is a new record */
+ if ((int) mysql_affected_rows(mysql) <= 0) {
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_cs_info (name,founder,successor,founderpass,"
+ "descr,url,email,time_registered,last_used,last_topic,last_topic_setter"
+ ",last_topic_time,flags,forbidby,forbidreason,bantype,accesscount,akickcount"
+ ",mlock_on,mlock_off,mlock_limit,mlock_key,mlock_flood,mlock_redirect,"
+ "entry_message,botnick,botflags,bwcount,capsmin,capspercent,floodlines,"
+ "floodsecs,repeattimes,active) VALUES ('%s','%s','%s',%s,'%s','%s','%s'"
+ ",'%d','%d','%s','%s','%d','%d','%s','%s','%d','%d','%d','%d','%d','%d',"
+ "'%s','%s','%s','%s','%s','%d','%d','%d','%d','%d','%d','%d','1')",
+ ciname,
+ cifoundernick,
+ cisuccessornick,
+ efounderpass, cidesc, ciurl, ciemail,
+ (int) ci->time_registered, (int) ci->last_used,
+ cilasttopic, cilasttopicsetter,
+ (int) ci->last_topic_time, (int) ci->flags,
+ ciforbidby, ciforbidreason, (int) ci->bantype,
+ (int) ci->accesscount, (int) ci->akickcount,
+ (int) ci->mlock_on, (int) ci->mlock_off,
+ (int) ci->mlock_limit, cimlock_key,
+#ifdef HAS_FMODE
+ cimlock_flood,
+#else
+ "",
+#endif
+#ifdef HAS_LMODE
+ cimlock_redirect,
+#else
+ "",
+#endif
+ cientrymsg,
+ cibotnick,
+ (int) ci->botflags,
+ (int) ci->bwcount,
+ (int) ci->capsmin,
+ (int) ci->capspercent,
+ (int) ci->floodlines,
+ (int) ci->floodsecs, (int) ci->repeattimes);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ }
+
+ /* Memos */
+ memos = ci->memos.memos;
+ for (j = 0; j < ci->memos.memocount; j++, memos++) {
+ msender = db_mysql_quote(memos->sender);
+ mtext = db_mysql_quote(memos->text);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_ms_info (receiver,number,flags,time,sender,text,serv)"
+ " VALUES ('%s','%d','%d','%d','%s','%s','CHAN')",
+ ciname, memos->number, memos->flags,
+ (int) memos->time, msender, mtext);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(msender);
+ free(mtext);
+ }
+
+ /* Access */
+ for (j = 0; j < ci->accesscount; j++) {
+ if (ci->access[j].in_use) {
+ ciaccessdisp = db_mysql_quote(ci->access[j].nc->display);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_cs_access (in_use,level,display,channel,last_seen)"
+ " VALUES ('%d','%d','%s','%s','%d')",
+ (int) ci->access[j].in_use, (int) ci->access[j].level,
+ ciaccessdisp, ciname, (int) ci->access[j].last_seen);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(ciaccessdisp);
+ }
+ }
+
+ /* Levels */
+ position = 0;
+ for (j = 0; j < CA_SIZE; j++) {
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_cs_levels (channel, position, level) VALUES ('%s','%d','%d')",
+ ciname, position++, (int) ci->levels[j]);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ }
+
+ /* Akicks */
+ for (j = 0; j < ci->akickcount; j++) {
+ ciakickdisp =
+ ci->akick[j].flags & AK_USED ? ci->akick[j].
+ flags & AK_ISNICK ? db_mysql_quote(ci->akick[j].u.nc->
+ display) :
+ db_mysql_quote(ci->akick[j].u.mask) : "";
+ ciakickreason =
+ ci->akick[j].flags & AK_USED ? db_mysql_quote(ci->akick[j].
+ reason) : "";
+ ciakickcreator =
+ ci->akick[j].flags & AK_USED ? db_mysql_quote(ci->akick[j].
+ creator) : "";
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_cs_akicks (channel, flags, dmask, reason, creator,"
+ " addtime) VALUES ('%s','%d','%s','%s','%s','%d')",
+ ciname, (int) ci->akick[j].flags, ciakickdisp,
+ ciakickreason, ciakickcreator,
+ ci->akick[j].flags & AK_USED ? (int) ci->akick[j].
+ addtime : 0);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ if (ci->akick[j].flags & AK_USED) {
+ free(ciakickdisp);
+ free(ciakickreason);
+ free(ciakickcreator);
+ }
+ }
+
+ /* Bad Words */
+ for (j = 0; j < ci->bwcount; j++) {
+ if (ci->badwords[j].in_use) {
+ cbadwords = db_mysql_quote(ci->badwords[j].word);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_cs_badwords (channel, word, type)"
+ " VALUES ('%s','%s','%d')", ciname, cbadwords,
+ (int) ci->badwords[j].type);
+ free(cbadwords);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ }
+ }
+
+ free(ciname);
+ if (!(ci->flags & CI_VERBOTEN)) {
+ free(cifoundernick);
+ if (strlen(cisuccessornick) > 0)
+ free(cisuccessornick);
+ free(efounderpass);
+ free(cidesc);
+ free(ciurl);
+ free(ciemail);
+ free(cilasttopic);
+ free(cilasttopicsetter);
+ free(cimlock_key);
+ free(cimlock_flood);
+ free(cimlock_redirect);
+ free(cientrymsg);
+ if (ci->bi)
+ free(cibotnick);
+ } else {
+ free(ciforbidby);
+ free(ciforbidreason);
+ }
+
+ return;
+}
+
+/*************************************************************************/
+
+
+/*
+ * OperServ Specific Section
+ */
+
+/*************************************************************************/
+void db_mysql_save_os_db(unsigned int maxucnt, unsigned int maxutime,
+ SList * ak, SList * sgl, SList * sql, SList * szl,
+ HostCache * hc)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ Akill *t_ak;
+ SXLine *t_sl;
+ HostCache *t_hc;
+ char *takuser, *takhost, *takby, *takreason, *tslmask, *tslby,
+ *tslreason, *thchost;
+
+ int i, j;
+
+ rdb_clear_table("anope_os_core");
+
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_os_core (maxusercnt,maxusertime,akills_count,"
+ "sglines_count,sqlines_count,szlines_count) VALUES "
+ "('%d','%d','%d','%d','%d','%d')", maxucnt, maxutime,
+ ak->count, sgl->count, sql->count, szl->count);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+
+ /* now the akills saving */
+ rdb_clear_table("anope_os_akills");
+
+ j = ak->count;
+ for (i = 0; i < j; i++) {
+ t_ak = ak->list[i];
+ takuser = db_mysql_quote(t_ak->user);
+ takhost = db_mysql_quote(t_ak->host);
+ takby = db_mysql_quote(t_ak->by);
+ takreason = db_mysql_quote(t_ak->reason);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_os_akills (user,host,xby,reason,seton,expire) VALUES ('%s','%s','%s','%s','%d','%d')",
+ takuser,
+ takhost,
+ takby, takreason, (int) t_ak->seton, (int) t_ak->expires);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(takuser);
+ free(takhost);
+ free(takby);
+ free(takreason);
+ }
+
+/* sglines save */
+ rdb_clear_table("anope_os_sglines");
+
+ j = sgl->count;
+ for (i = 0; i < j; i++) {
+ t_sl = sgl->list[i];
+ tslmask = db_mysql_quote(t_sl->mask);
+ tslby = db_mysql_quote(t_sl->by);
+ tslreason = db_mysql_quote(t_sl->reason);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_os_sglines (mask,xby,reason,seton,expire) VALUES"
+ " ('%s','%s','%s','%d','%d')",
+ tslmask,
+ tslby, tslreason, (int) t_sl->seton, (int) t_sl->expires);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(tslmask);
+ free(tslby);
+ free(tslreason);
+ }
+
+/* sqlines save */
+ rdb_clear_table("anope_os_sqlines");
+
+ j = sql->count;
+ for (i = 0; i < j; i++) {
+ t_sl = sql->list[i];
+ tslmask = db_mysql_quote(t_sl->mask);
+ tslby = db_mysql_quote(t_sl->by);
+ tslreason = db_mysql_quote(t_sl->reason);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_os_sqlines (mask,xby,reason,seton,expire) VALUES ('%s','%s','%s','%d','%d')",
+ tslmask,
+ tslby, tslreason, (int) t_sl->seton, (int) t_sl->expires);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(tslmask);
+ free(tslby);
+ free(tslreason);
+ }
+
+/* szlines save */
+ rdb_clear_table("anope_os_szlines");
+
+ j = szl->count;
+ for (i = 0; i < j; i++) {
+ t_sl = szl->list[i];
+ tslmask = db_mysql_quote(t_sl->mask);
+ tslby = db_mysql_quote(t_sl->by);
+ tslreason = db_mysql_quote(t_sl->reason);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_os_szlines (mask,xby,reason,seton,expire) VALUES"
+ " ('%s','%s','%s','%d','%d')",
+ tslmask,
+ tslby, tslreason, (int) t_sl->seton, (int) t_sl->expires);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(tslmask);
+ free(tslby);
+ free(tslreason);
+ }
+
+/* and finally we save hcache */
+ rdb_clear_table("anope_os_hcache");
+ for (i = 0; i < 1024; i++) {
+ for (t_hc = hcache[i]; t_hc; t_hc = t_hc->next) {
+ /* Don't save in-progress scans */
+ if (t_hc->status < HC_NORMAL)
+ continue;
+ thchost = db_mysql_quote(t_hc->host);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_os_hcache (mask,status,used) VALUES ('%s','%d','%d')",
+ thchost, (int) t_hc->status, (int) t_hc->used);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(thchost);
+ }
+ }
+
+ return;
+}
+
+/*************************************************************************/
+void db_mysql_save_news(NewsItem * ni)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ char *nitext, *niwho;
+ nitext = db_mysql_quote(ni->text);
+ niwho = db_mysql_quote(ni->who);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_os_news (type,num,ntext,who,`time`)"
+ " VALUES ('%d','%d','%s','%s','%d')",
+ ni->type, ni->num, nitext, niwho, (int) ni->time);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(nitext);
+ free(niwho);
+
+ return;
+}
+
+/*************************************************************************/
+void db_mysql_save_exceptions(Exception * e)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ char *emask, *ewho, *ereason;
+ emask = db_mysql_quote(e->mask);
+ ewho = db_mysql_quote(e->who);
+ ereason = db_mysql_quote(e->reason);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_os_exceptions (mask,lim,who,reason,`time`,expires)"
+ " VALUES ('%s','%d','%s','%s','%d','%d')",
+ emask, e->limit, ewho,
+ ereason, (int) e->time, (int) e->expires);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(emask);
+ free(ewho);
+ free(ereason);
+ return;
+}
+
+/*************************************************************************/
+
+
+/*
+ * HostServ Specific Section
+ */
+
+/*************************************************************************/
+/* TODO: Add vident to tables! */
+void db_mysql_save_hs_core(HostCore * hc)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ char *hcnick, *hcvident, *hcvhost, *hccreator;
+ hcnick = db_mysql_quote(hc->nick);
+ hcvident = db_mysql_quote(hc->vIdent);
+ hcvhost = db_mysql_quote(hc->vHost);
+ hccreator = db_mysql_quote(hc->creator);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_hs_core (nick,vident,vhost,creator,`time`)"
+ " VALUES ('%s','%s','%s','%s','%d')",
+ hcnick, hcvident, hcvhost, hccreator, (int) hc->time);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(hcnick);
+ free(hcvident);
+ free(hcvhost);
+ free(hccreator);
+
+ return;
+}
+
+/*************************************************************************/
+
+/*
+ * HostServ Specific Section
+ */
+
+/*************************************************************************/
+void db_mysql_save_bs_core(BotInfo * bi)
+{
+ char sqlcmd[MAX_SQL_BUF];
+ char *binick, *biuser, *bihost, *bireal;
+ binick = db_mysql_quote(bi->nick);
+ biuser = db_mysql_quote(bi->user);
+ bihost = db_mysql_quote(bi->host);
+ bireal = db_mysql_quote(bi->real);
+ snprintf(sqlcmd, MAX_SQL_BUF,
+ "INSERT DELAYED INTO anope_bs_core (nick,user,host,rname,flags,created"
+ ",chancount) VALUES ('%s','%s','%s','%s','%d','%d','%d')",
+ binick, biuser,
+ bihost, bireal, bi->flags, (int) bi->created, bi->chancount);
+ if (db_mysql_query(sqlcmd)) {
+ log_perror("Can't create sql query: %s", sqlcmd);
+ db_mysql_error(MYSQL_WARNING, "query");
+ }
+ free(binick);
+ free(biuser);
+ free(bihost);
+ free(bireal);
+}
+
+/*************************************************************************/
diff --git a/news.c b/news.c
new file mode 100644
index 000000000..4255e5d7d
--- /dev/null
+++ b/news.c
@@ -0,0 +1,541 @@
+/* News functions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: news.c,v 1.11 2004/01/31 17:03:52 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+/*************************************************************************/
+
+static int32 nnews = 0;
+static int32 news_size = 0;
+static NewsItem *news = NULL;
+
+/*************************************************************************/
+
+/* List of messages for each news type. This simplifies message sending. */
+
+#define MSG_SYNTAX 0
+#define MSG_LIST_HEADER 1
+#define MSG_LIST_ENTRY 2
+#define MSG_LIST_NONE 3
+#define MSG_ADD_SYNTAX 4
+#define MSG_ADD_FULL 5
+#define MSG_ADDED 6
+#define MSG_DEL_SYNTAX 7
+#define MSG_DEL_NOT_FOUND 8
+#define MSG_DELETED 9
+#define MSG_DEL_NONE 10
+#define MSG_DELETED_ALL 11
+#define MSG_MAX 11
+
+struct newsmsgs {
+ int16 type;
+ char *name;
+ int msgs[MSG_MAX + 1];
+};
+
+/* *INDENT-OFF* */
+
+struct newsmsgs msgarray[] = {
+ { NEWS_LOGON, "LOGON",
+ { NEWS_LOGON_SYNTAX,
+ NEWS_LOGON_LIST_HEADER,
+ NEWS_LOGON_LIST_ENTRY,
+ NEWS_LOGON_LIST_NONE,
+ NEWS_LOGON_ADD_SYNTAX,
+ NEWS_LOGON_ADD_FULL,
+ NEWS_LOGON_ADDED,
+ NEWS_LOGON_DEL_SYNTAX,
+ NEWS_LOGON_DEL_NOT_FOUND,
+ NEWS_LOGON_DELETED,
+ NEWS_LOGON_DEL_NONE,
+ NEWS_LOGON_DELETED_ALL
+ }
+ },
+ { NEWS_OPER, "OPER",
+ { NEWS_OPER_SYNTAX,
+ NEWS_OPER_LIST_HEADER,
+ NEWS_OPER_LIST_ENTRY,
+ NEWS_OPER_LIST_NONE,
+ NEWS_OPER_ADD_SYNTAX,
+ NEWS_OPER_ADD_FULL,
+ NEWS_OPER_ADDED,
+ NEWS_OPER_DEL_SYNTAX,
+ NEWS_OPER_DEL_NOT_FOUND,
+ NEWS_OPER_DELETED,
+ NEWS_OPER_DEL_NONE,
+ NEWS_OPER_DELETED_ALL
+ }
+ },
+ { NEWS_RANDOM, "RANDOM",
+ { NEWS_RANDOM_SYNTAX,
+ NEWS_RANDOM_LIST_HEADER,
+ NEWS_RANDOM_LIST_ENTRY,
+ NEWS_RANDOM_LIST_NONE,
+ NEWS_RANDOM_ADD_SYNTAX,
+ NEWS_RANDOM_ADD_FULL,
+ NEWS_RANDOM_ADDED,
+ NEWS_RANDOM_DEL_SYNTAX,
+ NEWS_RANDOM_DEL_NOT_FOUND,
+ NEWS_RANDOM_DELETED,
+ NEWS_RANDOM_DEL_NONE,
+ NEWS_RANDOM_DELETED_ALL
+ }
+ }
+};
+
+/* *INDENT-ON* */
+
+static int *findmsgs(int16 type, char **typename)
+{
+ int i;
+ for (i = 0; i < lenof(msgarray); i++) {
+ if (msgarray[i].type == type) {
+ if (typename)
+ *typename = msgarray[i].name;
+ return msgarray[i].msgs;
+ }
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Called by the main OperServ routine in response to a NEWS command. */
+static void do_news(User * u, int16 type);
+
+/* Lists all a certain type of news. */
+static void do_news_list(User * u, int16 type, int *msgs);
+
+/* Add news items. */
+static void do_news_add(User * u, int16 type, int *msgs,
+ const char *typename);
+static int add_newsitem(User * u, const char *text, int16 type);
+
+/* Delete news items. */
+static void do_news_del(User * u, int16 type, int *msgs,
+ const char *typename);
+static int del_newsitem(int num, int16 type);
+
+/*************************************************************************/
+/****************************** Statistics *******************************/
+/*************************************************************************/
+
+void get_news_stats(long *nrec, long *memuse)
+{
+ long mem;
+ int i;
+
+ mem = sizeof(NewsItem) * news_size;
+ for (i = 0; i < nnews; i++)
+ mem += strlen(news[i].text) + 1;
+ *nrec = nnews;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+/*********************** News item loading/saving ************************/
+/*************************************************************************/
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ if (!forceload) \
+ fatal("Read error on %s", NewsDBName); \
+ nnews = i; \
+ break; \
+ } \
+} while (0)
+
+void load_news()
+{
+ dbFILE *f;
+ int i;
+ int16 n;
+ int32 tmp32;
+
+ if (!(f = open_db(s_OperServ, NewsDBName, "r", NEWS_VERSION)))
+ return;
+ switch (i = get_file_version(f)) {
+ case 9:
+ case 8:
+ case 7:
+ SAFE(read_int16(&n, f));
+ nnews = n;
+ if (nnews < 8)
+ news_size = 16;
+ else if (nnews >= 16384)
+ news_size = 32767;
+ else
+ news_size = 2 * nnews;
+ news = scalloc(sizeof(*news) * news_size, 1);
+ if (!nnews) {
+ close_db(f);
+ return;
+ }
+ for (i = 0; i < nnews; i++) {
+ SAFE(read_int16(&news[i].type, f));
+ SAFE(read_int32(&news[i].num, f));
+ SAFE(read_string(&news[i].text, f));
+ SAFE(read_buffer(news[i].who, f));
+ SAFE(read_int32(&tmp32, f));
+ news[i].time = tmp32;
+ }
+ break;
+
+ default:
+ fatal("Unsupported version (%d) on %s", i, NewsDBName);
+ } /* switch (ver) */
+
+ close_db(f);
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ restore_db(f); \
+ log_perror("Write error on %s", NewsDBName); \
+ if (time(NULL) - lastwarn > WarningTimeout) { \
+ wallops(NULL, "Write error on %s: %s", NewsDBName, \
+ strerror(errno)); \
+ lastwarn = time(NULL); \
+ } \
+ return; \
+ } \
+} while (0)
+
+void save_news()
+{
+ dbFILE *f;
+ int i;
+ static time_t lastwarn = 0;
+
+ if (!(f = open_db(s_OperServ, NewsDBName, "w", NEWS_VERSION)))
+ return;
+ SAFE(write_int16(nnews, f));
+ for (i = 0; i < nnews; i++) {
+ SAFE(write_int16(news[i].type, f));
+ SAFE(write_int32(news[i].num, f));
+ SAFE(write_string(news[i].text, f));
+ SAFE(write_buffer(news[i].who, f));
+ SAFE(write_int32(news[i].time, f));
+ }
+ close_db(f);
+}
+
+#undef SAFE
+
+void save_rdb_news()
+{
+#ifdef USE_RDB
+ int i;
+ NewsItem *ni;
+
+ if (!rdb_open())
+ return;
+
+ rdb_clear_table("anope_os_news");
+ for (i = 0; i < nnews; i++) {
+ ni = &news[i];
+ rdb_save_news(ni);
+ }
+
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+/***************************** News display ******************************/
+/*************************************************************************/
+
+void display_news(User * u, int16 type)
+{
+ int msg;
+
+ if (type == NEWS_LOGON) {
+ msg = NEWS_LOGON_TEXT;
+ } else if (type == NEWS_OPER) {
+ msg = NEWS_OPER_TEXT;
+ } else if (type == NEWS_RANDOM) {
+ msg = NEWS_RANDOM_TEXT;
+ } else {
+ alog("news: Invalid type (%d) to display_news()", type);
+ return;
+ }
+
+ if (type == NEWS_RANDOM) {
+ static int current_news = -1;
+ int count = 0;
+
+ if (!nnews)
+ return;
+
+ while (count++ < nnews) {
+ if (++current_news >= nnews)
+ current_news = 0;
+
+ if (news[current_news].type == type) {
+ struct tm *tm;
+ char timebuf[64];
+
+ tm = localtime(&news[current_news].time);
+ strftime_lang(timebuf, sizeof(timebuf), u,
+ STRFTIME_SHORT_DATE_FORMAT, tm);
+ notice_lang(s_GlobalNoticer, u, msg, timebuf,
+ news[current_news].text);
+
+ return;
+ }
+ }
+ } else {
+ int i, count = 0; /* Number we're going to show--not more than 3 */
+
+ for (i = nnews - 1; i >= 0; i--) {
+ if (count >= 3)
+ break;
+ if (news[i].type == type)
+ count++;
+ }
+ while (++i < nnews) {
+ if (news[i].type == type) {
+ struct tm *tm;
+ char timebuf[64];
+
+ tm = localtime(&news[i].time);
+ strftime_lang(timebuf, sizeof(timebuf), u,
+ STRFTIME_SHORT_DATE_FORMAT, tm);
+ notice_lang(s_GlobalNoticer, u, msg, timebuf,
+ news[i].text);
+ }
+ }
+ }
+}
+
+/*************************************************************************/
+/***************************** News editing ******************************/
+/*************************************************************************/
+
+/* Declared in extern.h */
+int do_logonnews(User * u)
+{
+ do_news(u, NEWS_LOGON);
+ return MOD_CONT;
+}
+
+/* Declared in extern.h */
+int do_opernews(User * u)
+{
+ do_news(u, NEWS_OPER);
+ return MOD_CONT;
+}
+
+/* Declared in extern.h */
+int do_randomnews(User * u)
+{
+ do_news(u, NEWS_RANDOM);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Main news command handling routine. */
+void do_news(User * u, short type)
+{
+ int is_servadmin = is_services_admin(u);
+ char *cmd = strtok(NULL, " ");
+ char *typename;
+ int *msgs;
+
+ msgs = findmsgs(type, &typename);
+ if (!msgs) {
+ alog("news: Invalid type to do_news()");
+ return;
+ }
+
+ if (!cmd)
+ cmd = "";
+
+ if (stricmp(cmd, "LIST") == 0) {
+ do_news_list(u, type, msgs);
+ } else if (stricmp(cmd, "ADD") == 0) {
+ if (is_servadmin)
+ do_news_add(u, type, msgs, typename);
+ else
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+
+ } else if (stricmp(cmd, "DEL") == 0) {
+ if (is_servadmin)
+ do_news_del(u, type, msgs, typename);
+ else
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+
+ } else {
+ char buf[32];
+ snprintf(buf, sizeof(buf), "%sNEWS", typename);
+ syntax_error(s_OperServ, u, buf, msgs[MSG_SYNTAX]);
+ }
+}
+
+/*************************************************************************/
+
+/* Handle a {LOGON,OPER}NEWS LIST command. */
+
+static void do_news_list(User * u, int16 type, int *msgs)
+{
+ int i, count = 0;
+ char timebuf[64];
+ struct tm *tm;
+
+ for (i = 0; i < nnews; i++) {
+ if (news[i].type == type) {
+ if (count == 0)
+ notice_lang(s_OperServ, u, msgs[MSG_LIST_HEADER]);
+ tm = localtime(&news[i].time);
+ strftime_lang(timebuf, sizeof(timebuf),
+ u, STRFTIME_DATE_TIME_FORMAT, tm);
+ notice_lang(s_OperServ, u, msgs[MSG_LIST_ENTRY],
+ news[i].num, timebuf,
+ *news[i].who ? news[i].who : "<unknown>",
+ news[i].text);
+ count++;
+ }
+ }
+ if (count == 0)
+ notice_lang(s_OperServ, u, msgs[MSG_LIST_NONE]);
+ else {
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "News");
+ }
+}
+
+/*************************************************************************/
+
+/* Handle a {LOGON,OPER}NEWS ADD command. */
+
+static void do_news_add(User * u, int16 type, int *msgs,
+ const char *typename)
+{
+ char *text = strtok(NULL, "");
+
+ if (!text) {
+ char buf[32];
+ snprintf(buf, sizeof(buf), "%sNEWS", typename);
+ syntax_error(s_OperServ, u, buf, msgs[MSG_ADD_SYNTAX]);
+ } else {
+ int n = add_newsitem(u, text, type);
+ if (n < 0)
+ notice_lang(s_OperServ, u, msgs[MSG_ADD_FULL]);
+ else
+ notice_lang(s_OperServ, u, msgs[MSG_ADDED], n);
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ }
+}
+
+
+/* Actually add a news item. Return the number assigned to the item, or -1
+ * if the news list is full (32767 items).
+ */
+
+static int add_newsitem(User * u, const char *text, short type)
+{
+ int i, num;
+
+ if (nnews >= 32767)
+ return -1;
+
+ if (nnews >= news_size) {
+ if (news_size < 8)
+ news_size = 8;
+ else
+ news_size *= 2;
+ news = srealloc(news, sizeof(*news) * news_size);
+ }
+ num = 0;
+ for (i = nnews - 1; i >= 0; i--) {
+ if (news[i].type == type) {
+ num = news[i].num;
+ break;
+ }
+ }
+ news[nnews].type = type;
+ news[nnews].num = num + 1;
+ news[nnews].text = sstrdup(text);
+ news[nnews].time = time(NULL);
+ strscpy(news[nnews].who, u->nick, NICKMAX);
+ nnews++;
+ return num + 1;
+}
+
+/*************************************************************************/
+
+/* Handle a {LOGON,OPER}NEWS DEL command. */
+
+static void do_news_del(User * u, int16 type, int *msgs,
+ const char *typename)
+{
+ char *text = strtok(NULL, " ");
+ int i;
+
+ if (!text) {
+ char buf[32];
+ snprintf(buf, sizeof(buf), "%sNEWS", typename);
+ syntax_error(s_OperServ, u, buf, msgs[MSG_DEL_SYNTAX]);
+ } else {
+ if (stricmp(text, "ALL") != 0) {
+ int num = atoi(text);
+ if (num > 0 && del_newsitem(num, type)) {
+ notice_lang(s_OperServ, u, msgs[MSG_DELETED], num);
+ /* Reset the order - #0000397 */
+ for (i = 0; i < nnews; i++)
+ news[i].num = i + 1;
+ } else
+ notice_lang(s_OperServ, u, msgs[MSG_DEL_NOT_FOUND], num);
+ } else {
+ if (del_newsitem(0, type))
+ notice_lang(s_OperServ, u, msgs[MSG_DELETED_ALL]);
+ else
+ notice_lang(s_OperServ, u, msgs[MSG_DEL_NONE]);
+ }
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ }
+}
+
+
+/* Actually delete a news item. If `num' is 0, delete all news items of
+ * the given type. Returns the number of items deleted.
+ */
+
+static int del_newsitem(int num, short type)
+{
+ int i;
+ int count = 0;
+
+ for (i = 0; i < nnews; i++) {
+ if (news[i].type == type && (num == 0 || news[i].num == num)) {
+ free(news[i].text);
+ count++;
+ nnews--;
+ if (i < nnews)
+ memcpy(news + i, news + i + 1,
+ sizeof(*news) * (nnews - i));
+ i--;
+ }
+ }
+ return count;
+}
+
+/*************************************************************************/
diff --git a/nickserv.c b/nickserv.c
new file mode 100644
index 000000000..f6365ab93
--- /dev/null
+++ b/nickserv.c
@@ -0,0 +1,4010 @@
+/* NickServ functions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: nickserv.c,v 1.93 2004/03/13 03:25:59 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+/*************************************************************************/
+
+#define HASH(nick) ((tolower((nick)[0])&31)<<5 | (tolower((nick)[1])&31))
+
+NickAlias *nalists[1024];
+NickCore *nclists[1024];
+NickRequest *nrlists[1024];
+
+static int guestnum; /* Current guest number */
+
+#define TO_COLLIDE 0 /* Collide the user with this nick */
+#define TO_RELEASE 1 /* Release a collided nick */
+
+/*************************************************************************/
+
+extern char *getvHost(char *nick);
+
+static int is_on_access(User * u, NickCore * nc);
+static void alpha_insert_alias(NickAlias * na);
+static void insert_core(NickCore * nc);
+static void insert_requestnick(NickRequest * nr);
+static NickAlias *makenick(const char *nick);
+static NickRequest *makerequest(const char *nick);
+static NickAlias *makealias(const char *nick, NickCore * nc);
+static void change_core_display(NickCore * nc, char *newdisplay);
+static int group_identified(User * u, NickCore * nc);
+
+static void collide(NickAlias * na, int from_timeout);
+static void release(NickAlias * na, int from_timeout);
+static void add_ns_timeout(NickAlias * na, int type, time_t delay);
+static void del_ns_timeout(NickAlias * na, int type);
+int delnickrequest(NickRequest * nr);
+NickRequest *findrequestnick(const char *nick);
+static int do_sendregmail(User * u, NickRequest * nr);
+static int do_setmodes(User * u);
+
+static int do_help(User * u);
+static int do_register(User * u);
+static int do_confirm(User * u);
+static int do_group(User * u);
+static int do_nickupdate(User * u);
+static int do_identify(User * u);
+static int do_logout(User * u);
+static int do_drop(User * u);
+static int do_set(User * u);
+static int do_set_display(User * u, NickCore * nc, char *param);
+static int do_set_password(User * u, NickCore * nc, char *param);
+static int do_set_language(User * u, NickCore * nc, char *param);
+static int do_set_url(User * u, NickCore * nc, char *param);
+static int do_set_email(User * u, NickCore * nc, char *param);
+static int do_set_greet(User * u, NickCore * nc, char *param);
+static int do_set_icq(User * u, NickCore * nc, char *param);
+static int do_set_kill(User * u, NickCore * nc, char *param);
+static int do_set_secure(User * u, NickCore * nc, char *param);
+static int do_set_private(User * u, NickCore * nc, char *param);
+static int do_set_msg(User * u, NickCore * nc, char *param);
+static int do_set_hide(User * u, NickCore * nc, char *param);
+static int do_set_noexpire(User * u, NickAlias * nc, char *param);
+static int do_access(User * u);
+static int do_info(User * u);
+static int do_list(User * u);
+static int do_alist(User * u);
+static int do_glist(User * u);
+static int do_recover(User * u);
+static int do_release(User * u);
+static int do_ghost(User * u);
+static int do_status(User * u);
+static int do_getpass(User * u);
+static int do_getemail(User * u);
+static int do_sendpass(User * u);
+static int do_forbid(User * u);
+static int do_resend(User * u);
+
+/* Obsolete commands */
+static int do_link(User * u);
+static int do_unlink(User * u);
+static int do_listlinks(User * u);
+
+
+/*************************************************************************/
+/* *INDENT-OFF* */
+void moduleAddNickServCmds(void) {
+ Command *c;
+ c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("REGISTER", do_register, NULL, NICK_HELP_REGISTER, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("RESEND", do_resend, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("CONFIRM", do_confirm, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("GROUP", do_group, NULL, NICK_HELP_GROUP, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("UPDATE", do_nickupdate, NULL, NICK_HELP_UPDATE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("ID", do_identify, NULL, NICK_HELP_IDENTIFY, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("IDENTIFY", do_identify, NULL, NICK_HELP_IDENTIFY, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SIDENTIFY",do_identify, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("LOGOUT", do_logout, NULL, -1,NICK_HELP_LOGOUT, NICK_SERVADMIN_HELP_LOGOUT,NICK_SERVADMIN_HELP_LOGOUT, NICK_SERVADMIN_HELP_LOGOUT); addCoreCommand(NICKSERV,c);
+ c = createCommand("DROP", do_drop, NULL, -1,NICK_HELP_DROP, NICK_SERVADMIN_HELP_DROP,NICK_SERVADMIN_HELP_DROP, NICK_SERVADMIN_HELP_DROP); addCoreCommand(NICKSERV,c);
+ c = createCommand("LINK", do_link, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("UNLINK", do_unlink, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("LISTLINKS",do_listlinks,NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("ACCESS", do_access, NULL, NICK_HELP_ACCESS, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET", do_set, NULL, NICK_HELP_SET,-1, NICK_SERVADMIN_HELP_SET,NICK_SERVADMIN_HELP_SET, NICK_SERVADMIN_HELP_SET); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET DISPLAY", NULL, NULL, NICK_HELP_SET_DISPLAY, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET PASSWORD", NULL, NULL, NICK_HELP_SET_PASSWORD, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET URL", NULL, NULL, NICK_HELP_SET_URL, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET EMAIL", NULL, NULL, NICK_HELP_SET_EMAIL, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET ICQ", NULL, NULL, NICK_HELP_SET_ICQ, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET GREET", NULL, NULL, NICK_HELP_SET_GREET, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET KILL", NULL, NULL, NICK_HELP_SET_KILL, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET SECURE", NULL, NULL, NICK_HELP_SET_SECURE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET PRIVATE", NULL, NULL, NICK_HELP_SET_PRIVATE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET MSG", NULL, NULL, NICK_HELP_SET_MSG, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET HIDE", NULL, NULL, NICK_HELP_SET_HIDE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SET NOEXPIRE", NULL, NULL, -1, -1,NICK_SERVADMIN_HELP_SET_NOEXPIRE,NICK_SERVADMIN_HELP_SET_NOEXPIRE,NICK_SERVADMIN_HELP_SET_NOEXPIRE); addCoreCommand(NICKSERV,c);
+ c = createCommand("RECOVER", do_recover, NULL, NICK_HELP_RECOVER, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("RELEASE", do_release, NULL, NICK_HELP_RELEASE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("GHOST", do_ghost, NULL, NICK_HELP_GHOST, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("INFO", do_info, NULL, NICK_HELP_INFO,-1, NICK_HELP_INFO, NICK_SERVADMIN_HELP_INFO,NICK_SERVADMIN_HELP_INFO); addCoreCommand(NICKSERV,c);
+ c = createCommand("LIST", do_list, NULL, -1,NICK_HELP_LIST, NICK_SERVADMIN_HELP_LIST,NICK_SERVADMIN_HELP_LIST, NICK_SERVADMIN_HELP_LIST); addCoreCommand(NICKSERV,c);
+ c = createCommand("ALIST", do_alist, NULL, -1,NICK_HELP_ALIST, NICK_SERVADMIN_HELP_ALIST,NICK_SERVADMIN_HELP_ALIST, NICK_SERVADMIN_HELP_ALIST); addCoreCommand(NICKSERV,c);
+ c = createCommand("GLIST", do_glist, NULL, -1,NICK_HELP_GLIST, NICK_SERVADMIN_HELP_GLIST,NICK_SERVADMIN_HELP_GLIST, NICK_SERVADMIN_HELP_GLIST); addCoreCommand(NICKSERV,c);
+ c = createCommand("STATUS", do_status, NULL, NICK_HELP_STATUS, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("SENDPASS", do_sendpass, NULL, NICK_HELP_SENDPASS, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
+ c = createCommand("GETPASS", do_getpass, is_services_admin, -1,-1, NICK_SERVADMIN_HELP_GETPASS,NICK_SERVADMIN_HELP_GETPASS, NICK_SERVADMIN_HELP_GETPASS); addCoreCommand(NICKSERV,c);
+ c = createCommand("GETEMAIL", do_getemail, is_services_admin, -1,-1, NICK_SERVADMIN_HELP_GETEMAIL,NICK_SERVADMIN_HELP_GETEMAIL, NICK_SERVADMIN_HELP_GETEMAIL); addCoreCommand(NICKSERV,c);
+ c = createCommand("FORBID", do_forbid, is_services_admin, -1,-1, NICK_SERVADMIN_HELP_FORBID,NICK_SERVADMIN_HELP_FORBID, NICK_SERVADMIN_HELP_FORBID); addCoreCommand(NICKSERV,c);
+}
+/* *INDENT-ON* */
+/*************************************************************************/
+/*************************************************************************/
+
+/* Display total number of registered nicks and info about each; or, if
+ * a specific nick is given, display information about that nick (like
+ * /msg NickServ INFO <nick>). If count_only != 0, then only display the
+ * number of registered nicks (the nick parameter is ignored).
+ */
+
+void listnicks(int count_only, const char *nick)
+{
+ int count = 0;
+ NickAlias *na;
+ int i;
+ char *end;
+
+ if (count_only) {
+
+ for (i = 0; i < 1024; i++) {
+ for (na = nalists[i]; na; na = na->next)
+ count++;
+ }
+ printf("%d nicknames registered.\n", count);
+
+ } else if (nick) {
+
+ struct tm *tm;
+ char buf[512];
+ static const char commastr[] = ", ";
+ int need_comma = 0;
+
+ if (!(na = findnick(nick))) {
+ printf("%s not registered.\n", nick);
+ return;
+ } else if (na->status & NS_VERBOTEN) {
+ printf("%s is FORBIDden.\n", nick);
+ return;
+ }
+ printf("%s is %s\n", nick, na->last_realname);
+ printf("Last seen address: %s\n", na->last_usermask);
+ tm = localtime(&na->time_registered);
+ strftime(buf, sizeof(buf),
+ getstring(NULL, STRFTIME_DATE_TIME_FORMAT), tm);
+ printf(" Time registered: %s\n", buf);
+ tm = localtime(&na->last_seen);
+ strftime(buf, sizeof(buf),
+ getstring(NULL, STRFTIME_DATE_TIME_FORMAT), tm);
+ printf(" Last seen time: %s\n", buf);
+ if (na->nc->url)
+ printf(" URL: %s\n", na->nc->url);
+ if (na->nc->email)
+ printf(" E-mail address: %s\n", na->nc->email);
+ if (na->nc->icq)
+ printf(" ICQ #: %d\n", na->nc->icq);
+ if (na->nc->greet)
+ printf(" Greet: %s\n", na->nc->greet);
+ *buf = 0;
+ end = buf;
+ if (na->nc->flags & NI_KILLPROTECT) {
+ end +=
+ snprintf(end, sizeof(buf) - (end - buf),
+ "Kill protection");
+ need_comma = 1;
+ }
+ if (na->nc->flags & NI_SECURE) {
+ end += snprintf(buf, sizeof(buf) - (end - buf), "%sSecurity",
+ need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ if (na->nc->flags & NI_PRIVATE) {
+ end += snprintf(buf, sizeof(buf) - (end - buf), "%sPrivate",
+ need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ if (na->status & NS_NO_EXPIRE) {
+ end += snprintf(buf, sizeof(buf) - (end - buf), "%sNo Expire",
+ need_comma ? commastr : "");
+ need_comma = 1;
+ }
+ printf(" Options: %s\n", *buf ? buf : "None");
+
+ } else {
+
+ for (i = 0; i < 1024; i++) {
+ for (na = nalists[i]; na; na = na->next) {
+ printf(" %s %-20s %s\n",
+ na->status & NS_NO_EXPIRE ? "!" : " ",
+ na->nick, na->status & NS_VERBOTEN ?
+ "Disallowed (FORBID)" : na->last_usermask);
+ count++;
+ }
+ }
+ printf("%d nicknames registered.\n", count);
+
+ }
+}
+
+/*************************************************************************/
+
+/* Return information on memory use. Assumes pointers are valid. */
+
+void get_aliases_stats(long *nrec, long *memuse)
+{
+ long count = 0, mem = 0;
+ int i;
+ NickAlias *na;
+
+ for (i = 0; i < 1024; i++) {
+ for (na = nalists[i]; na; na = na->next) {
+ count++;
+ mem += sizeof(*na);
+ if (na->nick)
+ mem += strlen(na->nick) + 1;
+ if (na->last_usermask)
+ mem += strlen(na->last_usermask) + 1;
+ if (na->last_realname)
+ mem += strlen(na->last_realname) + 1;
+ if (na->last_quit)
+ mem += strlen(na->last_quit) + 1;
+ }
+ }
+ *nrec = count;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+
+/* Return information on memory use. Assumes pointers are valid. */
+
+void get_core_stats(long *nrec, long *memuse)
+{
+ long count = 0, mem = 0;
+ int i, j;
+ NickCore *nc;
+ char **accptr;
+
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ count++;
+ mem += sizeof(*nc);
+
+ if (nc->display)
+ mem += strlen(nc->display) + 1;
+ if (nc->pass)
+ mem += strlen(nc->pass) + 1;
+
+ if (nc->url)
+ mem += strlen(nc->url) + 1;
+ if (nc->email)
+ mem += strlen(nc->email) + 1;
+ if (nc->greet)
+ mem += strlen(nc->greet) + 1;
+
+ mem += sizeof(char *) * nc->accesscount;
+ for (accptr = nc->access, j = 0; j < nc->accesscount;
+ accptr++, j++) {
+ if (*accptr)
+ mem += strlen(*accptr) + 1;
+ }
+
+ mem += nc->memos.memocount * sizeof(Memo);
+ for (j = 0; j < nc->memos.memocount; j++) {
+ if (nc->memos.memos[j].text)
+ mem += strlen(nc->memos.memos[j].text) + 1;
+ }
+
+ mem += sizeof(void *) * nc->aliases.count;
+ }
+ }
+ *nrec = count;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* NickServ initialization. */
+
+void ns_init(void)
+{
+ moduleAddNickServCmds();
+ guestnum = time(NULL);
+ while (guestnum > 9999999)
+ guestnum -= 10000000;
+}
+
+/*************************************************************************/
+
+/* Main NickServ routine. */
+
+void nickserv(User * u, char *buf)
+{
+ char *cmd, *s;
+
+ cmd = strtok(buf, " ");
+
+ if (!cmd) {
+ return;
+ } else if (stricmp(cmd, "\1PING") == 0) {
+ if (!(s = strtok(NULL, "")))
+ s = "\1";
+ notice(s_NickServ, u->nick, "\1PING %s", s);
+ } else if (skeleton) {
+ notice_lang(s_NickServ, u, SERVICE_OFFLINE, s_NickServ);
+ } else {
+ mod_run_cmd(s_NickServ, u, NICKSERV, cmd);
+ }
+
+}
+
+/*************************************************************************/
+
+/* Load/save data files. */
+
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ if (!forceload) \
+ fatal("Read error on %s", NickDBName); \
+ failed = 1; \
+ break; \
+ } \
+} while (0)
+
+/* Loads NickServ database versions 5 to 11 (<= 4 is not supported) */
+
+void load_old_ns_dbase(void)
+{
+ dbFILE *f;
+ int ver, i, j, c;
+ NickAlias *na, *na2, *next;
+ NickCore *nc;
+ int failed = 0;
+
+ int16 tmp16;
+ int32 tmp32;
+
+ char bufn[NICKMAX], bufp[PASSMAX];
+ char *email, *greet, *url, *forbidby, *forbidreason;
+ uint32 icq;
+
+ if (!(f = open_db(s_NickServ, NickDBName, "r", NICK_VERSION)))
+ return;
+
+ ver = get_file_version(f);
+ if (ver <= 4) {
+ fatal("Unsupported version number (%d) on %s", ver, NickDBName);
+ close_db(f);
+ return;
+ }
+
+ for (i = 0; i < 256 && !failed; i++) {
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1)
+ fatal("Invalid format in %s", NickDBName);
+
+ na = scalloc(sizeof(NickAlias), 1);
+
+ SAFE(read_buffer(bufn, f));
+ na->nick = sstrdup(bufn);
+ SAFE(read_buffer(bufp, f)); /* Will be used later if needed */
+
+ SAFE(read_string(&url, f));
+ SAFE(read_string(&email, f));
+ if (ver >= 10)
+ SAFE(read_int32(&icq, f));
+ else
+ icq = 0;
+ if (ver >= 9)
+ SAFE(read_string(&greet, f));
+ else
+ greet = NULL;
+
+ SAFE(read_string(&na->last_usermask, f));
+ SAFE(read_string(&na->last_realname, f));
+ SAFE(read_string(&na->last_quit, f));
+
+ SAFE(read_int32(&tmp32, f));
+ na->time_registered = tmp32;
+ SAFE(read_int32(&tmp32, f));
+ na->last_seen = tmp32;
+
+ SAFE(read_int16(&na->status, f));
+ na->status &= ~NS_TEMPORARY;
+#ifdef USE_ENCRYPTION
+ if (!(na->status & (NS_OLD_ENCRYPTEDPW | NS_VERBOTEN))) {
+ if (debug)
+ alog("debug: %s: encrypting password for `%s' on load",
+ s_NickServ, na->nick);
+ if (encrypt_in_place(bufp, PASSMAX) < 0)
+ fatal("%s: Can't encrypt `%s' nickname password!",
+ s_NickServ, na->nick);
+ na->status |= NS_OLD_ENCRYPTEDPW;
+ }
+#else
+ if (na->status & NS_OLD_ENCRYPTEDPW) {
+ /* Bail: it makes no sense to continue with encrypted
+ * passwords, since we won't be able to verify them */
+ fatal
+ ("%s: load database: password for %s encrypted but encryption disabled, aborting",
+ s_NickServ, na->nick);
+ }
+#endif
+ if (ver >= 9) {
+ SAFE(read_string(&forbidby, f));
+ SAFE(read_string(&forbidreason, f));
+ /* Cleanup */
+ if (forbidby && *forbidby == '@') {
+ free(forbidby);
+ forbidby = NULL;
+ }
+ if (forbidreason && *forbidreason == 0) {
+ free(forbidreason);
+ forbidreason = NULL;
+ }
+ } else {
+ forbidby = NULL;
+ forbidreason = NULL;
+ }
+
+ if (na->status & NS_VERBOTEN) {
+ if (na->last_usermask)
+ free(na->last_usermask);
+ if (na->last_realname)
+ free(na->last_realname);
+
+ na->last_usermask = forbidby;
+ na->last_realname = forbidreason;
+ } else {
+ if (!na->last_usermask)
+ na->last_usermask = sstrdup("");
+ if (!na->last_realname)
+ na->last_realname = sstrdup("");
+ }
+
+ /* Store the reference for later resolving */
+ SAFE(read_string((char **) &na->nc, f));
+ SAFE(read_int16(&tmp16, f)); /* Was linkcount */
+
+ if (na->nc) {
+ SAFE(read_int16(&tmp16, f)); /* Was channelcount */
+ } else {
+ /* This nick was a master nick, so it also has all the
+ * core info! =)
+ */
+ nc = scalloc(1, sizeof(NickCore));
+ slist_init(&nc->aliases);
+
+ /* The initial display is what used to be the master nick */
+ nc->display = sstrdup(na->nick);
+
+ /* We grabbed info before; fill the appropriate fields now */
+ if (*bufp)
+ nc->pass = sstrdup(bufp);
+ else
+ nc->pass = NULL; /* Which may be the case for forbidden nicks .. */
+
+ nc->email = email;
+ nc->greet = greet;
+ nc->icq = icq;
+ nc->url = url;
+
+ /* We check whether the e-mail is valid because it was not tested
+ * in older versions.
+ */
+ if (ver <= 10 && nc->email && !MailValidate(nc->email)) {
+ free(nc->email);
+ nc->email = NULL;
+ }
+
+ SAFE(read_int32(&nc->flags, f));
+ if (!NSAllowKillImmed)
+ nc->flags &= ~NI_KILL_IMMED;
+
+ /* Status flags cleanup */
+ if (na->status & NS_OLD_ENCRYPTEDPW) {
+ nc->flags |= NI_ENCRYPTEDPW;
+ na->status &= ~NS_OLD_ENCRYPTEDPW;
+ }
+
+ /* Add services opers and admins to the appropriate list, but
+ only if the database version is equal to or more than 10. */
+ if (ver >= 10) {
+ if (nc->flags & NI_SERVICES_ADMIN)
+ slist_add(&servadmins, nc);
+ if (nc->flags & NI_SERVICES_OPER)
+ slist_add(&servopers, nc);
+ }
+
+ /* Add the Services root flag if needed. */
+ if (nc)
+ for (j = 0; j < RootNumber; j++)
+ if (!stricmp(ServicesRoots[j], na->nick))
+ nc->flags |= NI_SERVICES_ROOT;
+
+ SAFE(read_int16(&nc->accesscount, f));
+ if (nc->accesscount) {
+ char **access;
+ access = scalloc(sizeof(char *) * nc->accesscount, 1);
+ nc->access = access;
+ for (j = 0; j < nc->accesscount; j++, access++)
+ SAFE(read_string(access, f));
+ }
+
+ SAFE(read_int16(&nc->memos.memocount, f));
+ SAFE(read_int16(&nc->memos.memomax, f));
+ if (nc->memos.memocount) {
+ Memo *memos;
+ memos = scalloc(sizeof(Memo) * nc->memos.memocount, 1);
+ nc->memos.memos = memos;
+
+ for (j = 0; j < nc->memos.memocount; j++, memos++) {
+ SAFE(read_int32(&memos->number, f));
+ SAFE(read_int16(&memos->flags, f));
+ SAFE(read_int32(&tmp32, f));
+ memos->time = tmp32;
+ SAFE(read_buffer(memos->sender, f));
+ SAFE(read_string(&memos->text, f));
+ }
+ }
+
+ /* We read the channel count, but don't take care of it.
+ load_cs_dbase will regenerate it correctly. */
+ SAFE(read_int16(&tmp16, f));
+ SAFE(read_int16(&nc->channelmax, f));
+ if (ver == 5)
+ nc->channelmax = CSMaxReg;
+
+ SAFE(read_int16(&nc->language, f));
+
+ if (ver >= 11 && ver < 13) {
+ char *s;
+
+ SAFE(read_int16(&tmp16, f));
+ SAFE(read_int32(&tmp32, f));
+ SAFE(read_int16(&tmp16, f));
+ SAFE(read_string(&s, f));
+ }
+
+ /* Set us as being a master nick; fill the nc field also.
+ The NS_MASTER flag will not be cleared in this function. */
+ na->status |= NS_MASTER;
+ na->nc = nc;
+ slist_add(&nc->aliases, na);
+
+ /* Insert our new core in the core list */
+ insert_core(nc);
+ }
+
+ alpha_insert_alias(na);
+
+ } /* while (getc_db(f) != 0) */
+ } /* for (i) */
+
+ /* Now resolve what were called links */
+ for (i = 0; i < 1024; i++) {
+ for (na = nalists[i]; na; na = next) {
+ next = na->next;
+
+ /* Master nicks are already resolved */
+ if (na->status & NS_MASTER)
+ continue;
+
+ na2 = na;
+ /* While the reference resolves and it's not a master nick */
+ while ((na2 = findnick((char *) na2->nc))
+ && !(na2->status & NS_MASTER));
+
+ /* It didn't resolve. This is problematic since there is no core. :/
+ We delete the nick. */
+ if (!na2) {
+ alog("%s: while loading database: %s was linked to inexistant %s", s_NickServ, na->nick, (char *) na->nc);
+ delnick(na);
+ continue;
+ }
+
+ /* OK we have information on the core. We mark the current alias
+ as a master nick because it now contains a valid core. */
+ na->nc = na2->nc;
+ na->status |= NS_MASTER;
+ slist_add(&na->nc->aliases, na);
+ }
+ }
+
+ close_db(f);
+}
+
+void load_ns_req_db(void)
+{
+ dbFILE *f;
+ int i, c, ver;
+ NickRequest *nr;
+ int32 tmp32;
+ int failed = 0;
+
+ if (!(f = open_db(s_NickServ, PreNickDBName, "r", PRE_NICK_VERSION)))
+ return;
+ ver = get_file_version(f);
+ for (i = 0; i < 1024 && !failed; i++) {
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1)
+ fatal("Invalid format in %s", PreNickDBName);
+ nr = scalloc(1, sizeof(NickRequest));
+ SAFE(read_string(&nr->nick, f));
+ SAFE(read_string(&nr->passcode, f));
+ SAFE(read_string(&nr->password, f));
+ SAFE(read_string(&nr->email, f));
+ SAFE(read_int32(&tmp32, f));
+ nr->requested = tmp32;
+ insert_requestnick(nr);
+ }
+ }
+ close_db(f);
+}
+
+void load_ns_dbase(void)
+{
+ dbFILE *f;
+ int ver, i, j, c;
+ NickAlias *na, **nalast, *naprev;
+ NickCore *nc, **nclast, *ncprev;
+ int failed = 0;
+ int16 tmp16;
+ int32 tmp32;
+ char *s;
+
+ if (!(f = open_db(s_NickServ, NickDBName, "r", NICK_VERSION)))
+ return;
+
+ ver = get_file_version(f);
+
+ if (ver <= 11) {
+ close_db(f);
+ load_old_ns_dbase();
+ return;
+ }
+
+ /* First we load nick cores */
+ for (i = 0; i < 1024 && !failed; i++) {
+ nclast = &nclists[i];
+ ncprev = NULL;
+
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1)
+ fatal("Invalid format in %s", NickDBName);
+
+ nc = scalloc(1, sizeof(NickCore));
+ *nclast = nc;
+ nclast = &nc->next;
+ nc->prev = ncprev;
+ ncprev = nc;
+
+ slist_init(&nc->aliases);
+
+ SAFE(read_string(&nc->display, f));
+ SAFE(read_string(&nc->pass, f));
+
+ SAFE(read_string(&nc->email, f));
+ SAFE(read_string(&nc->greet, f));
+ SAFE(read_int32(&nc->icq, f));
+ SAFE(read_string(&nc->url, f));
+
+ SAFE(read_int32(&nc->flags, f));
+ if (!NSAllowKillImmed)
+ nc->flags &= ~NI_KILL_IMMED;
+#ifdef USE_ENCRYPTION
+ if (nc->pass && !(nc->flags & NI_ENCRYPTEDPW)) {
+ if (debug)
+ alog("debug: %s: encrypting password for `%s' on load",
+ s_NickServ, nc->display);
+ if (encrypt_in_place(nc->pass, PASSMAX) < 0)
+ fatal("%s: Can't encrypt `%s' nickname password!",
+ s_NickServ, nc->display);
+ nc->flags |= NI_ENCRYPTEDPW;
+ }
+#else
+ if (nc->flags & NI_ENCRYPTEDPW) {
+ /* Bail: it makes no sense to continue with encrypted
+ * passwords, since we won't be able to verify them */
+ fatal
+ ("%s: load database: password for %s encrypted but encryption disabled, aborting",
+ s_NickServ, nc->display);
+ }
+#endif
+ SAFE(read_int16(&nc->language, f));
+
+ /* Add services opers and admins to the appropriate list, but
+ only if the database version is more than 10. */
+ if (nc->flags & NI_SERVICES_ADMIN)
+ slist_add(&servadmins, nc);
+ if (nc->flags & NI_SERVICES_OPER)
+ slist_add(&servopers, nc);
+
+ SAFE(read_int16(&nc->accesscount, f));
+ if (nc->accesscount) {
+ char **access;
+ access = scalloc(sizeof(char *) * nc->accesscount, 1);
+ nc->access = access;
+ for (j = 0; j < nc->accesscount; j++, access++)
+ SAFE(read_string(access, f));
+ }
+
+ SAFE(read_int16(&nc->memos.memocount, f));
+ SAFE(read_int16(&nc->memos.memomax, f));
+ if (nc->memos.memocount) {
+ Memo *memos;
+ memos = scalloc(sizeof(Memo) * nc->memos.memocount, 1);
+ nc->memos.memos = memos;
+ for (j = 0; j < nc->memos.memocount; j++, memos++) {
+ SAFE(read_int32(&memos->number, f));
+ SAFE(read_int16(&memos->flags, f));
+ SAFE(read_int32(&tmp32, f));
+ memos->time = tmp32;
+ SAFE(read_buffer(memos->sender, f));
+ SAFE(read_string(&memos->text, f));
+ }
+ }
+
+ SAFE(read_int16(&nc->channelcount, f));
+ SAFE(read_int16(&tmp16, f));
+ nc->channelmax = CSMaxReg;
+
+ if (ver < 13) {
+ /* Used to be dead authentication system */
+ SAFE(read_int16(&tmp16, f));
+ SAFE(read_int32(&tmp32, f));
+ SAFE(read_int16(&tmp16, f));
+ SAFE(read_string(&s, f));
+ }
+
+ } /* while (getc_db(f) != 0) */
+ *nclast = NULL;
+ } /* for (i) */
+
+ for (i = 0; i < 1024 && !failed; i++) {
+ nalast = &nalists[i];
+ naprev = NULL;
+ while ((c = getc_db(f)) == 1) {
+ if (c != 1)
+ fatal("Invalid format in %s", NickDBName);
+
+ na = scalloc(1, sizeof(NickAlias));
+
+ SAFE(read_string(&na->nick, f));
+
+ SAFE(read_string(&na->last_usermask, f));
+ SAFE(read_string(&na->last_realname, f));
+ SAFE(read_string(&na->last_quit, f));
+
+ SAFE(read_int32(&tmp32, f));
+ na->time_registered = tmp32;
+ SAFE(read_int32(&tmp32, f));
+ na->last_seen = tmp32;
+ SAFE(read_int16(&na->status, f));
+ na->status &= ~NS_TEMPORARY;
+
+ SAFE(read_string(&s, f));
+ na->nc = findcore(s);
+ free(s);
+
+ slist_add(&na->nc->aliases, na);
+
+ if (!(na->status & NS_VERBOTEN)) {
+ if (!na->last_usermask)
+ na->last_usermask = sstrdup("");
+ if (!na->last_realname)
+ na->last_realname = sstrdup("");
+ }
+
+ na->nc->flags &= ~NI_SERVICES_ROOT;
+
+ *nalast = na;
+ nalast = &na->next;
+ na->prev = naprev;
+ naprev = na;
+
+ } /* while (getc_db(f) != 0) */
+
+ *nalast = NULL;
+ } /* for (i) */
+
+ close_db(f);
+
+ for (i = 0; i < 1024; i++) {
+ NickAlias *next;
+
+ for (na = nalists[i]; na; na = next) {
+ next = na->next;
+ /* We check for coreless nicks (although it should never happen) */
+ if (!na->nc) {
+ alog("%s: while loading database: %s has no core! We delete it.", s_NickServ, na->nick);
+ delnick(na);
+ continue;
+ }
+
+ /* Add the Services root flag if needed. */
+ for (j = 0; j < RootNumber; j++)
+ if (!stricmp(ServicesRoots[j], na->nick))
+ na->nc->flags |= NI_SERVICES_ROOT;
+ }
+ }
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ restore_db(f); \
+ log_perror("Write error on %s", NickDBName); \
+ if (time(NULL) - lastwarn > WarningTimeout) { \
+ wallops(NULL, "Write error on %s: %s", NickDBName, \
+ strerror(errno)); \
+ lastwarn = time(NULL); \
+ } \
+ return; \
+ } \
+} while (0)
+
+
+
+void save_ns_dbase(void)
+{
+ dbFILE *f;
+ int i, j;
+ NickAlias *na;
+ NickCore *nc;
+ char **access;
+ Memo *memos;
+ static time_t lastwarn = 0;
+
+ if (!(f = open_db(s_NickServ, NickDBName, "w", NICK_VERSION)))
+ return;
+
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ SAFE(write_int8(1, f));
+
+ SAFE(write_string(nc->display, f));
+ SAFE(write_string(nc->pass, f));
+
+ SAFE(write_string(nc->email, f));
+ SAFE(write_string(nc->greet, f));
+ SAFE(write_int32(nc->icq, f));
+ SAFE(write_string(nc->url, f));
+
+ SAFE(write_int32(nc->flags, f));
+ SAFE(write_int16(nc->language, f));
+
+ SAFE(write_int16(nc->accesscount, f));
+ for (j = 0, access = nc->access; j < nc->accesscount;
+ j++, access++)
+ SAFE(write_string(*access, f));
+
+ SAFE(write_int16(nc->memos.memocount, f));
+ SAFE(write_int16(nc->memos.memomax, f));
+ memos = nc->memos.memos;
+ for (j = 0; j < nc->memos.memocount; j++, memos++) {
+ SAFE(write_int32(memos->number, f));
+ SAFE(write_int16(memos->flags, f));
+ SAFE(write_int32(memos->time, f));
+ SAFE(write_buffer(memos->sender, f));
+ SAFE(write_string(memos->text, f));
+ }
+
+ SAFE(write_int16(nc->channelcount, f));
+ SAFE(write_int16(nc->channelmax, f));
+
+ } /* for (nc) */
+
+ SAFE(write_int8(0, f));
+
+ } /* for (i) */
+
+ for (i = 0; i < 1024; i++) {
+ for (na = nalists[i]; na; na = na->next) {
+ SAFE(write_int8(1, f));
+
+ SAFE(write_string(na->nick, f));
+
+ SAFE(write_string(na->last_usermask, f));
+ SAFE(write_string(na->last_realname, f));
+ SAFE(write_string(na->last_quit, f));
+
+ SAFE(write_int32(na->time_registered, f));
+ SAFE(write_int32(na->last_seen, f));
+
+ SAFE(write_int16(na->status, f));
+
+ SAFE(write_string(na->nc->display, f));
+
+ } /* for (na) */
+ SAFE(write_int8(0, f));
+ } /* for (i) */
+
+ close_db(f);
+
+}
+
+void save_ns_req_dbase(void)
+{
+ dbFILE *f;
+ int i;
+ NickRequest *nr;
+ static time_t lastwarn = 0;
+
+ if (!(f = open_db(s_NickServ, PreNickDBName, "w", PRE_NICK_VERSION)))
+ return;
+
+ for (i = 0; i < 1024; i++) {
+ for (nr = nrlists[i]; nr; nr = nr->next) {
+ SAFE(write_int8(1, f));
+ SAFE(write_string(nr->nick, f));
+ SAFE(write_string(nr->passcode, f));
+ SAFE(write_string(nr->password, f));
+ SAFE(write_string(nr->email, f));
+ SAFE(write_int32(nr->requested, f));
+ SAFE(write_int8(0, f));
+ }
+ }
+ close_db(f);
+
+}
+
+#undef SAFE
+
+void save_ns_rdb_dbase(void)
+{
+#ifdef USE_RDB
+ int i;
+ NickAlias *na;
+ NickCore *nc;
+
+ if (!rdb_open())
+ return;
+
+ rdb_tag_table("anope_ns_core");
+ rdb_tag_table("anope_ns_alias");
+ rdb_scrub_table("anope_ms_info", "serv='NICK'");
+ rdb_clear_table("anope_ns_access");
+
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ rdb_save_ns_core(nc);
+
+ } /* for (nc) */
+ } /* for (i) */
+
+ for (i = 0; i < 1024; i++) {
+ for (na = nalists[i]; na; na = na->next) {
+ rdb_save_ns_alias(na);
+
+ } /* for (na) */
+ } /* for (i) */
+
+ rdb_scrub_table("anope_ns_core", "active='0'");
+ rdb_scrub_table("anope_ns_alias", "active='0'");
+ rdb_close();
+#endif
+}
+
+void save_ns_req_rdb_dbase(void)
+{
+#ifdef USE_RDB
+ int i;
+ NickRequest *nr;
+
+ if (!rdb_open())
+ return;
+
+ rdb_tag_table("anope_ns_request");
+
+ for (i = 0; i < 1024; i++) {
+ for (nr = nrlists[i]; nr; nr = nr->next) {
+ rdb_save_ns_req(nr);
+ }
+ }
+
+ rdb_scrub_table("anope_ns_request", "active='0'");
+ rdb_close();
+#endif
+
+}
+
+/*************************************************************************/
+
+/* Check whether a user is on the access list of the nick they're using If
+ * not, send warnings as appropriate. If so (and not NI_SECURE), update
+ * last seen info.
+ * Return 1 if the user is valid and recognized, 0 otherwise (note
+ * that this means an NI_SECURE nick will return 0 from here).
+ * If the user's nick is not registered, 0 is returned.
+ */
+
+int validate_user(User * u)
+{
+ NickAlias *na;
+ NickRequest *nr;
+
+ int on_access;
+
+ if ((nr = findrequestnick(u->nick))) {
+ notice_lang(s_NickServ, u, NICK_IS_PREREG);
+ }
+
+ if (!(na = u->na))
+ return 0;
+
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_MAY_NOT_BE_USED);
+ collide(na, 0);
+ return 0;
+ }
+
+ on_access = is_on_access(u, na->nc);
+ if (on_access)
+ na->status |= NS_ON_ACCESS;
+
+ if (!(na->nc->flags & NI_SECURE) && on_access) {
+ na->status |= NS_RECOGNIZED;
+ na->last_seen = time(NULL);
+ if (na->last_usermask)
+ free(na->last_usermask);
+ na->last_usermask =
+ scalloc(strlen(GetIdent(u)) + strlen(GetHost(u)) + 2, 1);
+ sprintf(na->last_usermask, "%s@%s", GetIdent(u), GetHost(u));
+ if (na->last_realname)
+ free(na->last_realname);
+ na->last_realname = sstrdup(u->realname);
+ return 1;
+ }
+
+ if (on_access || !(na->nc->flags & NI_KILL_IMMED)) {
+ if (na->nc->flags & NI_SECURE)
+ notice_lang(s_NickServ, u, NICK_IS_SECURE, s_NickServ);
+ else
+ notice_lang(s_NickServ, u, NICK_IS_REGISTERED, s_NickServ);
+ }
+
+ if ((na->nc->flags & NI_KILLPROTECT) && !on_access) {
+ if (na->nc->flags & NI_KILL_IMMED) {
+ notice_lang(s_NickServ, u, FORCENICKCHANGE_NOW);
+ collide(na, 0);
+ } else if (na->nc->flags & NI_KILL_QUICK) {
+ notice_lang(s_NickServ, u, FORCENICKCHANGE_IN_20_SECONDS);
+ add_ns_timeout(na, TO_COLLIDE, 20);
+ } else {
+ notice_lang(s_NickServ, u, FORCENICKCHANGE_IN_1_MINUTE);
+ add_ns_timeout(na, TO_COLLIDE, 60);
+ }
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Cancel validation flags for a nick (i.e. when the user with that nick
+ * signs off or changes nicks). Also cancels any impending collide. */
+
+void cancel_user(User * u)
+{
+ NickAlias *na = u->na;
+
+ if (na) {
+ if (na->status & NS_GUESTED) {
+ NEWNICK(u->nick, NSEnforcerUser, NSEnforcerHost,
+ "Services Enforcer", "+", 0);
+ add_ns_timeout(na, TO_RELEASE, NSReleaseTimeout);
+ na->status &= ~NS_TEMPORARY;
+ na->status |= NS_KILL_HELD;
+ } else {
+ na->status &= ~NS_TEMPORARY;
+ }
+
+ del_ns_timeout(na, TO_COLLIDE);
+ }
+}
+
+/*************************************************************************/
+
+/* Return whether a user has identified for their nickname. */
+
+int nick_identified(User * u)
+{
+ return u->na && (u->na->status & NS_IDENTIFIED);
+}
+
+/*************************************************************************/
+
+/* Return whether a user is recognized for their nickname. */
+
+int nick_recognized(User * u)
+{
+ return u->na && (u->na->status & (NS_IDENTIFIED | NS_RECOGNIZED));
+}
+
+/*************************************************************************/
+
+/* Returns whether a user is identified AND in the group nc */
+
+static int group_identified(User * u, NickCore * nc)
+{
+ return nick_identified(u) && u->na->nc == nc;
+}
+
+/*************************************************************************/
+
+/* Remove all nicks which have expired. Also update last-seen time for all
+ * nicks.
+ */
+
+void expire_nicks()
+{
+ int i;
+ NickAlias *na, *next;
+ time_t now = time(NULL);
+
+ for (i = 0; i < 1024; i++) {
+ for (na = nalists[i]; na; na = next) {
+ next = na->next;
+
+ if (na->u
+ && ((na->nc->flags & NI_SECURE) ? nick_identified(na->u) :
+ nick_recognized(na->u))) {
+ if (debug >= 2)
+ alog("debug: NickServ: updating last seen time for %s",
+ na->nick);
+ na->last_seen = now;
+ continue;
+ }
+
+ if (NSExpire && now - na->last_seen >= NSExpire
+ && !(na->status & (NS_VERBOTEN | NS_NO_EXPIRE))) {
+ alog("Expiring nickname %s (group: %s) (e-mail: %s)",
+ na->nick, na->nc->display,
+ (na->nc->email ? na->nc->email : "none"));
+ delnick(na);
+ }
+ }
+ }
+}
+
+void expire_requests()
+{
+ int i;
+ NickRequest *nr, *next;
+ time_t now = time(NULL);
+ for (i = 0; i < 1024; i++) {
+ for (nr = nrlists[i]; nr; nr = next) {
+ next = nr->next;
+ if (NSRExpire && now - nr->requested >= NSRExpire) {
+ alog("Request for nick %s expiring", nr->nick);
+ delnickrequest(nr);
+ }
+ }
+ }
+}
+
+/*************************************************************************/
+/*************************************************************************/
+/* Return the NickRequest structire for the given nick, or NULL */
+
+NickRequest *findrequestnick(const char *nick)
+{
+ NickRequest *nr;
+
+ if (!nick)
+ return NULL;
+ for (nr = nrlists[HASH(nick)]; nr; nr = nr->next) {
+ if (stricmp(nr->nick, nick) == 0)
+ return nr;
+ }
+ return NULL;
+}
+
+/* Return the NickAlias structure for the given nick, or NULL if the nick
+ * isn't registered. */
+
+NickAlias *findnick(const char *nick)
+{
+ NickAlias *na;
+
+ for (na = nalists[HASH(nick)]; na; na = na->next) {
+ if (stricmp(na->nick, nick) == 0)
+ return na;
+ }
+
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Return the NickCore structure for the given nick, or NULL if the core
+ * doesn't exist. */
+
+NickCore *findcore(const char *nick)
+{
+ NickCore *nc;
+
+ for (nc = nclists[HASH(nick)]; nc; nc = nc->next) {
+ if (stricmp(nc->display, nick) == 0)
+ return nc;
+ }
+
+ return NULL;
+}
+
+/*************************************************************************/
+/*********************** NickServ private routines ***********************/
+/*************************************************************************/
+
+/* Is the given user's address on the given nick's access list? Return 1
+ * if so, 0 if not. */
+
+static int is_on_access(User * u, NickCore * nc)
+{
+ int i;
+ char *buf;
+#ifdef HAS_VHOST
+ char *buf2 = NULL;
+#endif
+
+ if (nc->accesscount == 0)
+ return 0;
+
+ buf = scalloc(strlen(u->username) + strlen(u->host) + 2, 1);
+ sprintf(buf, "%s@%s", u->username, u->host);
+#ifdef HAS_VHOST
+ if (u->vhost) {
+ buf2 = scalloc(strlen(u->username) + strlen(u->vhost) + 2, 1);
+ sprintf(buf2, "%s@%s", u->username, u->vhost);
+ }
+#endif
+
+ for (i = 0; i < nc->accesscount; i++) {
+ if (match_wild_nocase(nc->access[i], buf)
+#ifdef HAS_VHOST
+ || (u->vhost ? match_wild_nocase(nc->access[i], buf2) : 0)
+#endif
+ ) {
+ free(buf);
+#ifdef HAS_VHOST
+ free(buf2);
+#endif
+ return 1;
+ }
+ }
+ free(buf);
+#ifdef HAS_VHOST
+ free(buf2);
+#endif
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Insert a nick alias alphabetically into the database. */
+
+static void alpha_insert_alias(NickAlias * na)
+{
+ NickAlias *ptr, *prev;
+ char *nick = na->nick;
+ int index = HASH(nick);
+
+ for (prev = NULL, ptr = nalists[index];
+ ptr && stricmp(ptr->nick, nick) < 0; prev = ptr, ptr = ptr->next);
+ na->prev = prev;
+ na->next = ptr;
+ if (!prev)
+ nalists[index] = na;
+ else
+ prev->next = na;
+ if (ptr)
+ ptr->prev = na;
+}
+
+/*************************************************************************/
+
+/* Insert a nick core into the database. */
+
+static void insert_core(NickCore * nc)
+{
+ int index = HASH(nc->display);
+
+ nc->prev = NULL;
+ nc->next = nclists[index];
+ if (nc->next)
+ nc->next->prev = nc;
+ nclists[index] = nc;
+}
+
+/*************************************************************************/
+static void insert_requestnick(NickRequest * nr)
+{
+ int index = HASH(nr->nick);
+
+ nr->prev = NULL;
+ nr->next = nrlists[index];
+ if (nr->next)
+ nr->next->prev = nr;
+ nrlists[index] = nr;
+}
+
+/*************************************************************************/
+/* Creates a new Nick Request */
+static NickRequest *makerequest(const char *nick)
+{
+ NickRequest *nr;
+
+ nr = scalloc(1, sizeof(NickRequest));
+ nr->nick = sstrdup(nick);
+ insert_requestnick(nr);
+ alog("%s: Nick %s has been requested", s_NickServ, nr->nick);
+ return nr;
+}
+
+
+
+/* Creates a full new nick (alias + core) in NickServ database. */
+
+static NickAlias *makenick(const char *nick)
+{
+ NickAlias *na;
+ NickCore *nc;
+
+ /* First make the core */
+ nc = scalloc(1, sizeof(NickCore));
+ nc->display = sstrdup(nick);
+ slist_init(&nc->aliases);
+ insert_core(nc);
+ alog("%s: group %s has been created", s_NickServ, nc->display);
+
+ /* Then make the alias */
+ na = scalloc(1, sizeof(NickAlias));
+ na->nick = sstrdup(nick);
+ na->nc = nc;
+ slist_add(&nc->aliases, na);
+ alpha_insert_alias(na);
+ return na;
+}
+
+/*************************************************************************/
+
+/* Creates a new alias in NickServ database. */
+
+static NickAlias *makealias(const char *nick, NickCore * nc)
+{
+ NickAlias *na;
+
+ /* Just need to make the alias */
+ na = scalloc(1, sizeof(NickAlias));
+ na->nick = sstrdup(nick);
+ na->nc = nc;
+ slist_add(&nc->aliases, na);
+ alpha_insert_alias(na);
+ return na;
+}
+
+/*************************************************************************/
+
+/* Sets nc->display to newdisplay. If newdisplay is NULL, it will change
+ * it to the first alias in the list.
+ */
+
+static void change_core_display(NickCore * nc, char *newdisplay)
+{
+ if (!newdisplay) {
+ NickAlias *na;
+
+ if (nc->aliases.count <= 0)
+ return;
+
+ na = nc->aliases.list[0];
+ newdisplay = na->nick;
+ }
+
+ /* Log ... */
+ alog("%s: changing %s nickname group display to %s", s_NickServ,
+ nc->display, newdisplay);
+
+#ifdef USE_RDB
+ /* Reflect this change in the database right away. This
+ * ensures that we know how to deal with this "new" nick
+ * on the next /OS UPDATE might need it on /NS DROP too...
+ */
+ if (rdb_open()) {
+ rdb_ns_set_display(newdisplay, nc->display);
+ rdb_close();
+ }
+#endif
+
+ /* Remove the core from the list */
+ if (nc->next)
+ nc->next->prev = nc->prev;
+ if (nc->prev)
+ nc->prev->next = nc->next;
+ else
+ nclists[HASH(nc->display)] = nc->next;
+
+ free(nc->display);
+ nc->display = sstrdup(newdisplay);
+ insert_core(nc);
+
+}
+
+/*************************************************************************/
+
+/* Deletes the core. This must be called only when there is no more
+ * aliases for it, because no cleanup is done.
+ * This function removes all references to the core as well.
+ */
+
+static int delcore(NickCore * nc)
+{
+ int i;
+#ifdef USE_RDB
+ static char clause[128];
+#endif
+ /* (Hopefully complete) cleanup */
+ cs_remove_nick(nc);
+ os_remove_nick(nc);
+
+ /* Remove the core from the list */
+ if (nc->next)
+ nc->next->prev = nc->prev;
+ if (nc->prev)
+ nc->prev->next = nc->next;
+ else
+ nclists[HASH(nc->display)] = nc->next;
+
+ /* Log .. */
+ alog("%s: deleting nickname group %s", s_NickServ, nc->display);
+
+#ifdef USE_RDB
+ /* Reflect this change in the database right away. */
+ if (rdb_open()) {
+
+ snprintf(clause, sizeof(clause), "display='%s'", nc->display);
+ rdb_scrub_table("anope_ns_access", clause);
+ rdb_scrub_table("anope_ns_core", clause);
+ rdb_scrub_table("anope_cs_access", clause);
+ /* I'm unsure how to clean up the OS ADMIN/OPER list on the db */
+ /* I wish the "display" primary key would be the same on all tables */
+ snprintf(clause, sizeof(clause), "receiver='%s' AND serv='NICK'",
+ nc->display);
+ rdb_scrub_table("anope_ms_info", clause);
+ rdb_close();
+ }
+#endif
+
+ /* Now we can safely free it. */
+ free(nc->display);
+ if (nc->pass)
+ free(nc->pass);
+
+ if (nc->email)
+ free(nc->email);
+ if (nc->greet)
+ free(nc->greet);
+ if (nc->url)
+ free(nc->url);
+
+ if (nc->access) {
+ for (i = 0; i < nc->accesscount; i++) {
+ if (nc->access[i])
+ free(nc->access[i]);
+ }
+ free(nc->access);
+ }
+
+ if (nc->memos.memos) {
+ for (i = 0; i < nc->memos.memocount; i++) {
+ if (nc->memos.memos[i].text)
+ free(nc->memos.memos[i].text);
+ }
+ free(nc->memos.memos);
+ }
+
+ free(nc);
+
+ return 1;
+}
+
+
+/*************************************************************************/
+int delnickrequest(NickRequest * nr)
+{
+ if (nr) {
+ nrlists[HASH(nr->nick)] = nr->next;
+ if (nr->nick)
+ free(nr->nick);
+ if (nr->passcode)
+ free(nr->passcode);
+ if (nr->password)
+ free(nr->password);
+ if (nr->email)
+ free(nr->email);
+ free(nr);
+ }
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Deletes an alias. The core will also be deleted if it has no more
+ * nicks attached to it. Easy but powerful.
+ * Well, we must also take care that the nick being deleted is not
+ * the core display, and if so, change it to the next alias in the list,
+ * otherwise weird things will happen.
+ * Returns 1 on success, 0 otherwise.
+ */
+
+int delnick(NickAlias * na)
+{
+#ifdef USE_RDB
+ static char clause[128];
+#endif
+ /* First thing to do: remove any timeout belonging to the nick we're deleting */
+ clean_ns_timeouts(na);
+
+ /* Second thing to do: look for an user using the alias
+ * being deleted, and make appropriate changes */
+
+ if (na->u) {
+ na->u->na = NULL;
+
+#ifndef IRC_PTLINK
+ change_user_mode(na->u, "-r+d", "1");
+#else
+ change_user_mode(na->u, "-r", NULL);
+#endif
+
+
+ }
+
+ delHostCore(na->nick); /* delete any vHost's for this nick */
+
+ /* Accept nicks that have no core, because of database load functions */
+ if (na->nc) {
+ /* Next: see if our core is still useful. */
+ slist_remove(&na->nc->aliases, na);
+ if (na->nc->aliases.count == 0) {
+ if (!delcore(na->nc))
+ return 0;
+ na->nc = NULL;
+ } else {
+ /* Display updating stuff */
+ if (!stricmp(na->nick, na->nc->display))
+ change_core_display(na->nc, NULL);
+ }
+ }
+
+ /* Remove us from the aliases list */
+ if (na->next)
+ na->next->prev = na->prev;
+ if (na->prev)
+ na->prev->next = na->next;
+ else
+ nalists[HASH(na->nick)] = na->next;
+
+#ifdef USE_RDB
+ /* Reflect this change in the database right away. */
+ if (rdb_open()) {
+
+ snprintf(clause, sizeof(clause), "nick='%s'", na->nick);
+ rdb_scrub_table("anope_ns_alias", clause);
+ rdb_close();
+ }
+#endif
+
+ free(na->nick);
+ if (na->last_usermask)
+ free(na->last_usermask);
+ if (na->last_realname)
+ free(na->last_realname);
+ if (na->last_quit)
+ free(na->last_quit);
+
+ free(na);
+
+
+ return 1;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Collide a nick.
+ *
+ * When connected to a network using DALnet servers, version 4.4.15 and above,
+ * Services is now able to force a nick change instead of killing the user.
+ * The new nick takes the form "Guest######". If a nick change is forced, we
+ * do not introduce the enforcer nick until the user's nick actually changes.
+ * This is watched for and done in cancel_user(). -TheShadow
+ */
+
+static void collide(NickAlias * na, int from_timeout)
+{
+ char guestnick[NICKMAX];
+
+ if (!from_timeout)
+ del_ns_timeout(na, TO_COLLIDE);
+
+ /* Old system was unsure since there can be more than one collide
+ * per second. So let use another safer method.
+ * --lara
+ */
+
+ snprintf(guestnick, sizeof(guestnick), "%s%d", NSGuestNickPrefix,
+ guestnum++);
+#ifdef IRC_HYBRID
+ kill_user(s_NickServ, na->nick, "Services nickname-enforcer kill");
+#else
+ notice_lang(s_NickServ, na->u, FORCENICKCHANGE_CHANGING, guestnick);
+ send_cmd(NULL, "SVSNICK %s %s :%ld", na->nick, guestnick, time(NULL));
+ na->status |= NS_GUESTED;
+#endif
+}
+
+/*************************************************************************/
+
+/* Release hold on a nick. */
+
+static void release(NickAlias * na, int from_timeout)
+{
+ if (!from_timeout)
+ del_ns_timeout(na, TO_RELEASE);
+ send_cmd(na->nick, "QUIT");
+ na->status &= ~NS_KILL_HELD;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+static struct my_timeout {
+ struct my_timeout *next, *prev;
+ NickAlias *na;
+ Timeout *to;
+ int type;
+} *my_timeouts;
+
+/*************************************************************************/
+
+/* Remove a collide/release timeout from our private list. */
+
+static void rem_ns_timeout(NickAlias * na, int type)
+{
+ struct my_timeout *t, *t2;
+
+ t = my_timeouts;
+ while (t) {
+ if (t->na == na && t->type == type) {
+ t2 = t->next;
+ if (t->next)
+ t->next->prev = t->prev;
+ if (t->prev)
+ t->prev->next = t->next;
+ else
+ my_timeouts = t->next;
+ free(t);
+ t = t2;
+ } else {
+ t = t->next;
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* Collide a nick on timeout. */
+
+static void timeout_collide(Timeout * t)
+{
+ NickAlias *na = t->data;
+
+ rem_ns_timeout(na, TO_COLLIDE);
+ /* If they identified or don't exist anymore, don't kill them. */
+ if ((na->status & NS_IDENTIFIED) || !na->u
+ || na->u->my_signon > t->settime)
+ return;
+ /* The RELEASE timeout will always add to the beginning of the
+ * list, so we won't see it. Which is fine because it can't be
+ * triggered yet anyway. */
+ collide(na, 1);
+}
+
+/*************************************************************************/
+
+/* Release a nick on timeout. */
+
+static void timeout_release(Timeout * t)
+{
+ NickAlias *na = t->data;
+
+ rem_ns_timeout(na, TO_RELEASE);
+ release(na, 1);
+}
+
+/*************************************************************************/
+
+/* Add a collide/release timeout. */
+
+void add_ns_timeout(NickAlias * na, int type, time_t delay)
+{
+ Timeout *to;
+ struct my_timeout *t;
+ void (*timeout_routine) (Timeout *);
+
+ if (type == TO_COLLIDE)
+ timeout_routine = timeout_collide;
+ else if (type == TO_RELEASE)
+ timeout_routine = timeout_release;
+ else {
+ alog("NickServ: unknown timeout type %d! na=%p (%s), delay=%ld",
+ type, na, na->nick, delay);
+ return;
+ }
+
+ to = add_timeout(delay, timeout_routine, 0);
+ to->data = na;
+
+ t = scalloc(sizeof(struct my_timeout), 1);
+ t->na = na;
+ t->to = to;
+ t->type = type;
+
+ t->prev = NULL;
+ t->next = my_timeouts;
+ my_timeouts = t;
+ /* Andy Church should stop coding while being drunk.
+ * Here's the two lines he forgot that produced the timed_update evil bug
+ * and a *big* memory leak.
+ */
+ if (t->next)
+ t->next->prev = t;
+}
+
+/*************************************************************************/
+
+/* Delete a collide/release timeout. */
+
+static void del_ns_timeout(NickAlias * na, int type)
+{
+ struct my_timeout *t, *t2;
+
+ t = my_timeouts;
+ while (t) {
+ if (t->na == na && t->type == type) {
+ t2 = t->next;
+ if (t->next)
+ t->next->prev = t->prev;
+ if (t->prev)
+ t->prev->next = t->next;
+ else
+ my_timeouts = t->next;
+ del_timeout(t->to);
+ free(t);
+ t = t2;
+ } else {
+ t = t->next;
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* Deletes all timeouts belonging to a given nick.
+ * This should only be called before nick deletion.
+ */
+
+void clean_ns_timeouts(NickAlias * na)
+{
+ struct my_timeout *t, *next;
+
+ for (t = my_timeouts; t; t = next) {
+ next = t->next;
+ if (t->na == na) {
+ if (debug)
+ alog("%s: deleting timeout type %d from %s", s_NickServ,
+ t->type, t->na->nick);
+ /* If the timeout has the TO_RELEASE type, we should release the user */
+ if (t->type == TO_RELEASE)
+ release(na, 1);
+ if (t->next)
+ t->next->prev = t->prev;
+ if (t->prev)
+ t->prev->next = t->next;
+ else
+ my_timeouts = t->next;
+ del_timeout(t->to);
+ free(t);
+ }
+ }
+}
+
+/*************************************************************************/
+/*********************** NickServ command routines ***********************/
+/*************************************************************************/
+
+/* Return a help message. */
+
+static int do_help(User * u)
+{
+ char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_NickServ, u, NICK_HELP);
+ if (NSExpire >= 86400)
+ notice_help(s_NickServ, u, NICK_HELP_EXPIRES,
+ NSExpire / 86400);
+ if (is_services_oper(u))
+ notice_help(s_NickServ, u, NICK_SERVADMIN_HELP);
+ moduleDisplayHelp(1, u);
+ } else if (stricmp(cmd, "SET LANGUAGE") == 0) {
+ int i;
+ notice_help(s_NickServ, u, NICK_HELP_SET_LANGUAGE);
+ for (i = 0; i < NUM_LANGS && langlist[i] >= 0; i++)
+ notice_user(s_NickServ, u, " %2d) %s", i + 1,
+ langnames[langlist[i]]);
+ } else {
+ mod_help_cmd(s_NickServ, u, NICKSERV, cmd);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Register a nick. */
+
+static int do_register(User * u)
+{
+ NickRequest *nr = NULL, *anr = NULL;
+ int prefixlen = strlen(NSGuestNickPrefix);
+ int nicklen = strlen(u->nick);
+ char *pass = strtok(NULL, " ");
+ char *email = strtok(NULL, " ");
+ char passcode[11];
+ int idx, min = 1, max = 62;
+ int chars[] =
+ { ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
+ 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
+ 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
+ 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
+ };
+
+ if (readonly) {
+ notice_lang(s_NickServ, u, NICK_REGISTRATION_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (checkDefCon(DEFCON_NO_NEW_NICKS)) {
+ notice_lang(s_NickServ, u, OPER_DEFCON_DENIED);
+ return MOD_CONT;
+ }
+
+ if ((anr = findrequestnick(u->nick))) {
+ notice_lang(s_NickServ, u, NICK_REQUESTED);
+ return MOD_CONT;
+ }
+ /* Prevent "Guest" nicks from being registered. -TheShadow */
+
+ /* Guest nick can now have a series of between 1 and 7 digits.
+ * --lara
+ */
+ if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1 &&
+ stristr(u->nick, NSGuestNickPrefix) == u->nick &&
+ strspn(u->nick + prefixlen, "1234567890") == nicklen - prefixlen) {
+ notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED, u->nick);
+ return MOD_CONT;
+ }
+
+ if (!pass || (NSForceEmail && !email)) {
+ syntax_error(s_NickServ, u, "REGISTER",
+ NICK_REGISTER_SYNTAX_EMAIL);
+ } else if (time(NULL) < u->lastnickreg + NSRegDelay) {
+ notice_lang(s_NickServ, u, NICK_REG_PLEASE_WAIT, NSRegDelay);
+ } else if (u->na) { /* i.e. there's already such a nick regged */
+ if (u->na->status & NS_VERBOTEN) {
+ alog("%s: %s@%s tried to register FORBIDden nick %s",
+ s_NickServ, u->username, GetHost(u), u->nick);
+ notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED, u->nick);
+ } else {
+ notice_lang(s_NickServ, u, NICK_ALREADY_REGISTERED, u->nick);
+ }
+ } else if (stricmp(u->nick, pass) == 0
+ || (StrictPasswords && strlen(pass) < 5)) {
+ notice_lang(s_NickServ, u, MORE_OBSCURE_PASSWORD);
+ } else if (email && !MailValidate(email)) {
+ notice_lang(s_NickServ, u, MAIL_X_INVALID, email);
+ } else {
+#ifdef USE_ENCRYPTION
+ if (strlen(pass) > PASSMAX) {
+ pass[PASSMAX] = 0;
+ notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, PASSMAX);
+ }
+#else
+ if (strlen(pass) > PASSMAX - 1) { /* -1 for null byte */
+ pass[PASSMAX] = 0;
+ notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, PASSMAX - 1);
+ }
+#endif
+ srand((unsigned) time(NULL));
+ for (idx = 0; idx < 9; idx++) {
+ passcode[idx] =
+ chars[(1 +
+ (int) (((float) (max - min)) * rand() /
+ (RAND_MAX + 1.0)) + min)];
+ } passcode[idx] = '\0';
+ nr = makerequest(u->nick);
+ nr->passcode = sstrdup(passcode);
+ nr->password = sstrdup(pass);
+ if (email) {
+ nr->email = sstrdup(email);
+ }
+ nr->requested = time(NULL);
+ if (NSEmailReg) {
+ if (do_sendregmail(u, nr) == 0) {
+ notice_lang(s_NickServ, u, NICK_ENTER_REG_CODE, email,
+ s_NickServ);
+ alog("%s: sent registration verification code to %s",
+ s_NickServ, nr->email);
+ } else {
+ alog("%s: Unable to send registration verification mail",
+ s_NickServ);
+ notice_lang(s_NickServ, u, NICK_REG_UNABLE);
+ delnickrequest(nr); /* Delete the NickRequest if we couldnt send the mail */
+ return MOD_CONT;
+ }
+ } else {
+ do_confirm(u);
+ }
+
+ }
+ return MOD_CONT;
+}
+
+
+static int do_resend(User * u)
+{
+ NickRequest *nr = NULL;
+ if (NSEmailReg) {
+ if ((nr = findrequestnick(u->nick))) {
+ if (do_sendregmail(u, nr) == 0) {
+ notice_lang(s_NickServ, u, NICK_REG_RESENT, nr->email);
+ alog("%s: re-sent registration verification code for %s to %s", s_NickServ, nr->nick, nr->email);
+ } else {
+ alog("%s: Unable to re-send registration verification mail for %s", s_NickServ, nr->nick);
+ return MOD_CONT;
+ }
+ }
+ }
+ return MOD_CONT;
+}
+
+static int do_sendregmail(User * u, NickRequest * nr)
+{
+ MailInfo *mail = NULL;
+ char buf[BUFSIZE];
+
+ if (!(nr || u)) {
+ return -1;
+ }
+ snprintf(buf, sizeof(buf), getstring2(NULL, NICK_REG_MAIL_SUBJECT),
+ nr->nick);
+ mail = MailRegBegin(u, nr, buf, s_NickServ);
+ if (!mail) {
+ return -1;
+ }
+ fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_HEAD));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_1), nr->nick);
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_2), s_NickServ,
+ nr->passcode);
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_3));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_4));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_5),
+ NetworkName);
+ fprintf(mail->pipe, "\n.\n");
+ MailEnd(mail);
+ return 0;
+}
+
+static int do_confirm(User * u)
+{
+
+ NickRequest *nr = NULL;
+ NickAlias *na = NULL;
+ char *passcode = strtok(NULL, " ");
+ char *pass = NULL;
+ char *email = NULL;
+ int forced = 0;
+ User *utmp = NULL;
+#ifdef USE_ENCRYPTION
+ int len;
+#endif
+ nr = findrequestnick(u->nick);
+
+ if (NSEmailReg) {
+ if (!passcode) {
+ notice_lang(s_NickServ, u, NICK_CONFIRM_INVALID);
+ return MOD_CONT;
+ }
+
+ if (!nr) {
+ if (is_services_admin(u)) {
+/* If an admin, thier nick is obviously already regged, so look at the passcode to get the nick
+ of the user they are trying to validate, and push that user through regardless of passcode */
+ nr = findrequestnick(passcode);
+ if (nr) {
+ utmp = finduser(passcode);
+ if (utmp) {
+ sprintf(passcode,
+ "FORCE_ACTIVATION_DUE_TO_OPER_CONFIRM %s",
+ nr->passcode);
+ passcode = strtok(passcode, " ");
+ notice_lang(s_NickServ, u, NICK_FORCE_REG,
+ nr->nick);
+ do_confirm(utmp);
+ return MOD_CONT;
+ } else {
+ passcode = sstrdup(nr->passcode);
+ forced = 1;
+ }
+ } else {
+ notice_lang(s_NickServ, u, NICK_CONFIRM_NOT_FOUND,
+ s_NickServ);
+ return MOD_CONT;
+ }
+ } else {
+ notice_lang(s_NickServ, u, NICK_CONFIRM_NOT_FOUND,
+ s_NickServ);
+ return MOD_CONT;
+ }
+ }
+
+ if (stricmp(nr->passcode, passcode) != 0) {
+ notice_lang(s_NickServ, u, NICK_CONFIRM_INVALID);
+ return MOD_CONT;
+ }
+ }
+
+ if (!nr) {
+ notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);
+ return MOD_CONT;
+ }
+ pass = sstrdup(nr->password);
+
+ if (nr->email) {
+ email = sstrdup(nr->email);
+ }
+ na = makenick(nr->nick);
+
+ if (na) {
+ int i;
+#if !defined(IRC_PTLINK)
+ char tsbuf[16];
+#endif
+
+#ifdef USE_ENCRYPTION
+ len = strlen(pass);
+ na->nc->pass = smalloc(PASSMAX);
+ if (encrypt(pass, len, na->nc->pass, PASSMAX) < 0) {
+ memset(pass, 0, strlen(pass));
+ alog("%s: Failed to encrypt password for %s (register)",
+ s_NickServ, nr->nick);
+ notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);
+ return MOD_CONT;
+ }
+ memset(pass, 0, strlen(pass));
+ na->status = NS_IDENTIFIED | NS_RECOGNIZED;
+ na->nc->flags |= NI_ENCRYPTEDPW;
+#else
+ na->nc->pass = sstrdup(pass);
+ na->status = NS_IDENTIFIED | NS_RECOGNIZED;
+#endif
+ na->nc->flags |= NSDefFlags;
+ for (i = 0; i < RootNumber; i++) {
+ if (!stricmp(ServicesRoots[i], nr->nick)) {
+ na->nc->flags |= NI_SERVICES_ROOT;
+ break;
+ }
+ }
+ na->nc->memos.memomax = MSMaxMemos;
+ na->nc->channelmax = CSMaxReg;
+ if (forced == 1) {
+ na->last_usermask = sstrdup("*@*");
+ na->last_realname = sstrdup("unknown");
+ } else {
+ na->last_usermask =
+ scalloc(strlen(GetIdent(u)) + strlen(GetHost(u)) + 2, 1);
+ sprintf(na->last_usermask, "%s@%s", GetIdent(u), GetHost(u));
+ na->last_realname = sstrdup(u->realname);
+ }
+ na->time_registered = na->last_seen = time(NULL);
+ na->nc->accesscount = 1;
+ na->nc->access = scalloc(sizeof(char *), 1);
+ na->nc->access[0] = create_mask(u);
+ na->nc->language = NSDefLanguage;
+ if (email)
+ na->nc->email = sstrdup(email);
+ if (forced != 1) {
+ u->na = na;
+ na->u = u;
+ alog("%s: '%s' registered by %s@%s (e-mail: %s)", s_NickServ,
+ u->nick, u->username, GetHost(u),
+ (email ? email : "none"));
+ notice_lang(s_NickServ, u, NICK_REGISTERED, u->nick,
+ na->nc->access[0]);
+#ifndef USE_ENCRYPTION
+ notice_lang(s_NickServ, u, NICK_PASSWORD_IS, na->nc->pass);
+#endif
+ u->lastnickreg = time(NULL);
+#if !defined(IRC_PTLINK)
+ snprintf(tsbuf, sizeof(tsbuf), "%lu", u->timestamp);
+ change_user_mode(u, "+rd", tsbuf);
+#else
+ change_user_mode(u, "+r", NULL);
+#endif
+
+ } else {
+ notice_lang(s_NickServ, u, NICK_FORCE_REG, nr->nick);
+ }
+ delnickrequest(nr); /* remove the nick request */
+ } else {
+ alog("%s: makenick(%s) failed", s_NickServ, u->nick);
+ notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);
+ }
+
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Register a nick in a specified group. */
+
+static int do_group(User * u)
+{
+ NickAlias *na, *target;
+ char *nick = strtok(NULL, " ");
+ char *pass = strtok(NULL, " ");
+ int i;
+#if !defined(IRC_PTLINK)
+ char tsbuf[16];
+#endif
+
+ if (NSEmailReg && (findrequestnick(u->nick))) {
+ notice_lang(s_NickServ, u, NICK_REQUESTED);
+ return MOD_CONT;
+ }
+
+ if (readonly) {
+ notice_lang(s_NickServ, u, NICK_GROUP_DISABLED);
+ return MOD_CONT;
+ }
+ if (checkDefCon(DEFCON_NO_NEW_NICKS)) {
+ notice_lang(s_NickServ, u, OPER_DEFCON_DENIED);
+ return MOD_CONT;
+ }
+
+ if (!nick || !pass) {
+ syntax_error(s_NickServ, u, "GROUP", NICK_GROUP_SYNTAX);
+ } else if (time(NULL) < u->lastnickreg + NSRegDelay) {
+ notice_lang(s_NickServ, u, NICK_GROUP_PLEASE_WAIT, NSRegDelay);
+ } else if (u->na && (u->na->status & NS_VERBOTEN)) {
+ alog("%s: %s@%s tried to use GROUP from FORBIDden nick %s",
+ s_NickServ, u->username, GetHost(u), u->nick);
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, u->nick);
+ } else if (u->na && NSNoGroupChange) {
+ notice_lang(s_NickServ, u, NICK_GROUP_CHANGE_DISABLED, s_NickServ);
+ } else if (u->na && !nick_identified(u)) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ } else if (!(target = findnick(nick))) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ } else if (target->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
+ } else if (u->na && target->nc == u->na->nc) {
+ notice_lang(s_NickServ, u, NICK_GROUP_SAME, target->nick);
+ } else if (NSMaxAliases && (target->nc->aliases.count >= NSMaxAliases)
+ && !nick_is_services_admin(target->nc)) {
+ notice_lang(s_NickServ, u, NICK_GROUP_TOO_MANY, target->nick,
+ s_NickServ, s_NickServ);
+ } else if (check_password(pass, target->nc->pass) != 1) {
+ alog("%s: Failed GROUP for %s!%s@%s (invalid password)",
+ s_NickServ, u->nick, u->username, GetHost(u));
+ notice_lang(s_NickServ, u, PASSWORD_INCORRECT);
+ bad_password(u);
+ } else {
+ /* If the nick is already registered, drop it.
+ * If not, check that it is valid.
+ */
+ if (u->na) {
+ delnick(u->na);
+ } else {
+ int prefixlen = strlen(NSGuestNickPrefix);
+ int nicklen = strlen(u->nick);
+
+ if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1
+ && stristr(u->nick, NSGuestNickPrefix) == u->nick
+ && strspn(u->nick + prefixlen,
+ "1234567890") == nicklen - prefixlen) {
+ notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
+ u->nick);
+ return MOD_CONT;
+ }
+ }
+ na = makealias(u->nick, target->nc);
+
+ if (na) {
+ na->last_usermask =
+ scalloc(strlen(GetIdent(u)) + strlen(GetHost(u)) + 2, 1);
+ sprintf(na->last_usermask, "%s@%s", GetIdent(u), GetHost(u));
+ na->last_realname = sstrdup(u->realname);
+ na->time_registered = na->last_seen = time(NULL);
+ na->status = NS_IDENTIFIED | NS_RECOGNIZED;
+
+ if (!(na->nc->flags & NI_SERVICES_ROOT)) {
+ for (i = 0; i < RootNumber; i++) {
+ if (!stricmp(ServicesRoots[i], u->nick)) {
+ na->nc->flags |= NI_SERVICES_ROOT;
+ break;
+ }
+ }
+ }
+
+ u->na = na;
+ na->u = u;
+
+#ifdef USE_RDB
+ /* Is this really needed? Since this is a new alias it will get
+ * its unique id on the next update, since it was previously
+ * deleted by delnick. Must observe...
+ */
+ if (rdb_open()) {
+ rdb_save_ns_alias(na);
+ rdb_close();
+ }
+#endif
+ alog("%s: %s!%s@%s makes %s join group of %s (%s) (e-mail: %s)", s_NickServ, u->nick, u->username, GetHost(u), u->nick, target->nick, target->nc->display, (target->nc->email ? target->nc->email : "none"));
+ notice_lang(s_NickServ, u, NICK_GROUP_JOINED, target->nick);
+
+ u->lastnickreg = time(NULL);
+#if !defined(IRC_PTLINK)
+ snprintf(tsbuf, sizeof(tsbuf), "%lu", u->timestamp);
+ change_user_mode(u, "+rd", tsbuf);
+#else
+ change_user_mode(u, "+r", NULL);
+#endif
+
+ check_memos(u);
+ } else {
+ alog("%s: makealias(%s) failed", s_NickServ, u->nick);
+ notice_lang(s_NickServ, u, NICK_GROUP_FAILED);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_nickupdate(User * u)
+{
+ NickAlias *na;
+
+ if (!nick_identified(u)) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ } else {
+ na = u->na;
+ if (NSModeOnID)
+ do_setmodes(u);
+ check_memos(u);
+ if (na->last_realname)
+ free(na->last_realname);
+ na->last_realname = sstrdup(u->realname);
+ na->status |= NS_IDENTIFIED;
+ na->last_seen = time(NULL);
+ do_on_id(u);
+ notice_lang(s_NickServ, u, NICK_UPDATE_SUCCESS, s_NickServ);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_identify(User * u)
+{
+ char *pass = strtok(NULL, " ");
+ NickAlias *na;
+ NickRequest *nr;
+ int res;
+#if !defined(IRC_PTLINK)
+ char tsbuf[16];
+#endif
+
+ if (!pass) {
+ syntax_error(s_NickServ, u, "IDENTIFY", NICK_IDENTIFY_SYNTAX);
+ } else if (!(na = u->na)) {
+ if ((nr = findrequestnick(u->nick))) {
+ notice_lang(s_NickServ, u, NICK_IS_PREREG);
+ } else {
+ notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
+ }
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else if (!(res = check_password(pass, na->nc->pass))) {
+ alog("%s: Failed IDENTIFY for %s!%s@%s", s_NickServ, u->nick,
+ u->username, GetHost(u));
+ notice_lang(s_NickServ, u, PASSWORD_INCORRECT);
+ bad_password(u);
+ } else if (res == -1) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_FAILED);
+ } else if (nick_identified(u)) {
+ notice_lang(s_NickServ, u, NICK_ALREADY_IDENTIFIED);
+ } else {
+ if (!(na->status & NS_IDENTIFIED) && !(na->status & NS_RECOGNIZED)) {
+ if (na->last_usermask)
+ free(na->last_usermask);
+ na->last_usermask =
+ scalloc(strlen(GetIdent(u)) + strlen(GetHost(u)) + 2, 1);
+ sprintf(na->last_usermask, "%s@%s", GetIdent(u), GetHost(u));
+ if (na->last_realname)
+ free(na->last_realname);
+ na->last_realname = sstrdup(u->realname);
+ }
+
+ na->status |= NS_IDENTIFIED;
+ na->last_seen = time(NULL);
+
+#ifndef IRC_PTLINK
+ snprintf(tsbuf, sizeof(tsbuf), "%lu", u->timestamp);
+ change_user_mode(u, "+rd", tsbuf);
+#else
+ change_user_mode(u, "+r", "");
+#endif /* IRC_PTLINK */
+
+
+ alog("%s: %s!%s@%s identified for nick %s", s_NickServ, u->nick,
+ u->username, GetHost(u), u->nick);
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_SUCCEEDED);
+ do_on_id(u);
+ if (NSModeOnID) {
+ do_setmodes(u);
+ }
+
+ if (NSForceEmail && u->na && !u->na->nc->email) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_EMAIL_REQUIRED);
+ notice_help(s_NickServ, u, NICK_IDENTIFY_EMAIL_HOWTO);
+ }
+
+ if (!(na->status & NS_RECOGNIZED))
+ check_memos(u);
+ }
+ return MOD_CONT;
+}
+
+int should_mode_change(int16 status, int16 mode)
+{
+ switch (mode) {
+ case CUS_OP:
+ if (status & CUS_OP) {
+ return 0;
+ }
+ break;
+ case CUS_VOICE:
+ if (status & CUS_OP) {
+ return 0;
+ }
+#ifdef HAS_HALFOP
+ if (status & CUS_HALFOP) {
+ return 0;
+ }
+#endif
+ if (status & CUS_VOICE) {
+ return 0;
+ }
+ return 1;
+ break;
+#ifdef HAS_HALFOP
+
+
+ case CUS_HALFOP:
+ if (status & CUS_OP) {
+ return 0;
+ }
+ if (status & CUS_HALFOP) {
+ return 0;
+ }
+ return 1;
+ break;
+#endif
+#ifdef IRC_UNREAL
+ case CUS_OWNER:
+ if (status & CUS_OWNER) {
+ return 0;
+ }
+ break;
+ case CUS_PROTECT:
+ if (status & CUS_OWNER) {
+ return 0;
+ }
+ if (status & CUS_PROTECT) {
+ return 0;
+ }
+ break;
+#endif
+#ifdef IRC_VIAGRA
+ case CUS_OWNER:
+ if (status & CUS_OWNER) {
+ return 0;
+ }
+ break;
+ case CUS_PROTECT:
+ if (status & CUS_OWNER) {
+ return 0;
+ }
+ if (status & CUS_PROTECT) {
+ return 0;
+ }
+ break;
+#endif
+#ifdef IRC_ULTIMATE3
+ case CUS_PROTECT:
+ if (status & CUS_PROTECT) {
+ return 0;
+ }
+ break;
+#endif
+ }
+ return 1;
+}
+
+static int do_setmodes(User * u)
+{
+ struct u_chanlist *uc;
+ Channel *c;
+ char *chan;
+
+ /* Walk users current channels */
+ for (uc = u->chans; uc; uc = uc->next) {
+ if ((c = uc->chan)) {
+ chan = c->name;
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+ if (should_mode_change(uc->status, CUS_OWNER)
+ && check_should_owner(u, chan)) {
+ chan_set_user_status(c, u, CUS_OWNER);
+ } else
+#endif
+#if defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_ULTIMATE3)
+ if (should_mode_change(uc->status, CUS_PROTECT)
+ && check_should_protect(u, chan)) {
+ chan_set_user_status(c, u, CUS_PROTECT);
+ } else
+#endif
+ if (should_mode_change(uc->status, CUS_OP)
+ && check_should_op(u, chan)) {
+ chan_set_user_status(c, u, CUS_OP);
+ } else
+#ifdef HAS_HALFOP
+ if (should_mode_change(uc->status, CUS_HALFOP)
+ && check_should_halfop(u, chan)) {
+ chan_set_user_status(c, u, CUS_HALFOP);
+ } else
+#endif
+ if (should_mode_change(uc->status, CUS_VOICE)
+ && check_should_voice(u, chan)) {
+ chan_set_user_status(c, u, CUS_VOICE);
+ }
+ }
+ }
+ return MOD_CONT;
+}
+
+
+/*************************************************************************/
+
+static int do_logout(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *param = strtok(NULL, " ");
+ User *u2;
+
+ if (!is_services_admin(u) && nick) {
+ syntax_error(s_NickServ, u, "LOGOUT", NICK_LOGOUT_SYNTAX);
+ } else if (!(u2 = (nick ? finduser(nick) : u))) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
+ } else if (!u2->na) {
+ if (nick)
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ else
+ notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
+ } else if (u2->na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, u2->na->nick);
+ } else if (!nick && !nick_identified(u)) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ } else if (nick && is_services_admin(u2)) {
+ notice_lang(s_NickServ, u, NICK_LOGOUT_SERVICESADMIN, nick);
+ } else {
+ if (nick && param && !stricmp(param, "REVALIDATE")) {
+ cancel_user(u2);
+ validate_user(u2);
+ } else {
+ u2->na->status &= ~(NS_IDENTIFIED | NS_RECOGNIZED);
+ }
+
+ change_user_mode(u2, "-r+d", "1");
+
+ u->isSuperAdmin = 0; /* Dont let people logout and remain a SuperAdmin */
+ alog("%s: %s!%s@%s logged out nickname %s", s_NickServ, u->nick,
+ u->username, GetHost(u), u2->nick);
+
+ if (nick)
+ notice_lang(s_NickServ, u, NICK_LOGOUT_X_SUCCEEDED, nick);
+ else
+ notice_lang(s_NickServ, u, NICK_LOGOUT_SUCCEEDED);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_drop(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ NickAlias *na;
+ NickRequest *nr = NULL;
+ int is_servadmin = is_services_admin(u);
+ int is_mine; /* Does the nick being dropped belong to the user that is dropping? */
+
+ if (readonly && !is_servadmin) {
+ notice_lang(s_NickServ, u, NICK_DROP_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (!(na = (nick ? findnick(nick) : u->na))) {
+ if (nick) {
+ if ((nr = findrequestnick(nick)) && is_servadmin) {
+ if (readonly)
+ notice_lang(s_NickServ, u, READ_ONLY_MODE);
+ if (WallDrop)
+ wallops(s_NickServ, "\2%s\2 used DROP on \2%s\2",
+ u->nick, nick);
+ alog("%s: %s!%s@%s dropped nickname %s (e-mail: %s)",
+ s_NickServ, u->nick, u->username, GetHost(u),
+ nr->nick, nr->email);
+ delnickrequest(nr);
+ notice_lang(s_NickServ, u, NICK_X_DROPPED, nick);
+ } else {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ }
+ } else
+ notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
+ return MOD_CONT;
+ }
+
+ is_mine = (u->na && (u->na->nc == na->nc));
+
+ if (is_mine && !nick_identified(u)) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ } else if (!is_mine && !is_servadmin) {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ } else if (NSSecureAdmins && !is_mine && nick_is_services_admin(na->nc)
+ && !is_services_root(u)) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ } else {
+ if (readonly)
+ notice_lang(s_NickServ, u, READ_ONLY_MODE);
+
+ alog("%s: %s!%s@%s dropped nickname %s (group %s) (e-mail: %s)",
+ s_NickServ, u->nick, u->username, GetHost(u), na->nick,
+ na->nc->display, (na->nc->email ? na->nc->email : "none"));
+ delnick(na);
+
+ if (!is_mine) {
+ if (WallDrop)
+ wallops(s_NickServ, "\2%s\2 used DROP on \2%s\2", u->nick,
+ nick);
+ notice_lang(s_NickServ, u, NICK_X_DROPPED, nick);
+ } else {
+ if (nick)
+ notice_lang(s_NickServ, u, NICK_X_DROPPED, nick);
+ else
+ notice_lang(s_NickServ, u, NICK_DROPPED);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ char *param = strtok(NULL, " ");
+
+ NickAlias *na;
+ int is_servadmin = is_services_admin(u);
+ int set_nick = 0;
+
+ if (readonly) {
+ notice_lang(s_NickServ, u, NICK_SET_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (is_servadmin && cmd && (na = findnick(cmd))) {
+ cmd = param;
+ param = strtok(NULL, " ");
+ set_nick = 1;
+ } else {
+ na = u->na;
+ }
+
+ if (!param
+ && (!cmd
+ || (stricmp(cmd, "URL") != 0 && stricmp(cmd, "EMAIL") != 0
+ && stricmp(cmd, "GREET") != 0
+ && stricmp(cmd, "ICQ") != 0))) {
+ if (is_servadmin) {
+ syntax_error(s_NickServ, u, "SET", NICK_SET_SERVADMIN_SYNTAX);
+ } else {
+ syntax_error(s_NickServ, u, "SET", NICK_SET_SYNTAX);
+ }
+ } else if (!na) {
+ notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else if (!is_servadmin && !nick_identified(u)) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+ } else if (stricmp(cmd, "DISPLAY") == 0) {
+ do_set_display(u, na->nc, param);
+ } else if (stricmp(cmd, "PASSWORD") == 0) {
+ do_set_password(u, na->nc, param);
+ } else if (stricmp(cmd, "LANGUAGE") == 0) {
+ do_set_language(u, na->nc, param);
+ } else if (stricmp(cmd, "URL") == 0) {
+ do_set_url(u, na->nc, param);
+ } else if (stricmp(cmd, "EMAIL") == 0) {
+ do_set_email(u, na->nc, param);
+ } else if (stricmp(cmd, "ICQ") == 0) {
+ do_set_icq(u, na->nc, param);
+ } else if (stricmp(cmd, "GREET") == 0) {
+ do_set_greet(u, na->nc, param);
+ } else if (stricmp(cmd, "KILL") == 0) {
+ do_set_kill(u, na->nc, param);
+ } else if (stricmp(cmd, "SECURE") == 0) {
+ do_set_secure(u, na->nc, param);
+ } else if (stricmp(cmd, "PRIVATE") == 0) {
+ do_set_private(u, na->nc, param);
+ } else if (stricmp(cmd, "MSG") == 0) {
+ do_set_msg(u, na->nc, param);
+ } else if (stricmp(cmd, "HIDE") == 0) {
+ do_set_hide(u, na->nc, param);
+ } else if (stricmp(cmd, "NOEXPIRE") == 0) {
+ do_set_noexpire(u, na, param);
+ } else {
+ if (is_servadmin)
+ notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK,
+ cmd);
+ else
+ notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION, cmd);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_display(User * u, NickCore * nc, char *param)
+{
+ int i;
+ NickAlias *na;
+
+ /* First check whether param is a valid nick of the group */
+ for (i = 0; i < nc->aliases.count; i++) {
+ na = nc->aliases.list[i];
+ if (!stricmp(na->nick, param)) {
+ param = na->nick; /* Because case may differ */
+ break;
+ }
+ }
+
+ if (i == nc->aliases.count) {
+ notice_lang(s_NickServ, u, NICK_SET_DISPLAY_INVALID);
+ return MOD_CONT;
+ }
+
+ change_core_display(nc, param);
+ notice_lang(s_NickServ, u, NICK_SET_DISPLAY_CHANGED, nc->display);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_password(User * u, NickCore * nc, char *param)
+{
+ int len = strlen(param);
+
+ if (NSSecureAdmins && u->na->nc != nc && nick_is_services_admin(nc)
+ && !is_services_root(u)) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ } else if (stricmp(nc->display, param) == 0
+ || (StrictPasswords && len < 5)) {
+ notice_lang(s_NickServ, u, MORE_OBSCURE_PASSWORD);
+ return MOD_CONT;
+ }
+
+ if (nc->pass)
+ free(nc->pass);
+
+#ifdef USE_ENCRYPTION
+ nc->pass = smalloc(PASSMAX);
+
+ if (encrypt(param, len, nc->pass, PASSMAX) < 0) {
+ memset(param, 0, len);
+ alog("%s: Failed to encrypt password for %s (set)", s_NickServ,
+ nc->display);
+ notice_lang(s_NickServ, u, NICK_SET_PASSWORD_FAILED);
+ return MOD_CONT;
+ }
+
+ memset(param, 0, len);
+ notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED);
+#else
+ nc->pass = sstrdup(param);
+ notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED_TO, nc->pass);
+#endif
+
+ if (u->na && u->na->nc != nc && is_services_admin(u)) {
+ alog("%s: %s!%s@%s used SET PASSWORD as Services admin on %s (e-mail: %s)", s_NickServ, u->nick, u->username, GetHost(u), nc->display, (nc->email ? nc->email : "none"));
+ if (WallSetpass)
+ wallops(s_NickServ,
+ "\2%s\2 used SET PASSWORD as Services admin on \2%s\2",
+ u->nick, nc->display);
+ } else {
+ alog("%s: %s!%s@%s (e-mail: %s) changed its password.", s_NickServ,
+ u->nick, u->username, GetHost(u),
+ (nc->email ? nc->email : "none"));
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_language(User * u, NickCore * nc, char *param)
+{
+ int langnum;
+
+ if (param[strspn(param, "0123456789")] != 0) { /* i.e. not a number */
+ syntax_error(s_NickServ, u, "SET LANGUAGE",
+ NICK_SET_LANGUAGE_SYNTAX);
+ return MOD_CONT;
+ }
+ langnum = atoi(param) - 1;
+ if (langnum < 0 || langnum >= NUM_LANGS || langlist[langnum] < 0) {
+ notice_lang(s_NickServ, u, NICK_SET_LANGUAGE_UNKNOWN, langnum + 1,
+ s_NickServ);
+ return MOD_CONT;
+ }
+ nc->language = langlist[langnum];
+ notice_lang(s_NickServ, u, NICK_SET_LANGUAGE_CHANGED);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_url(User * u, NickCore * nc, char *param)
+{
+ if (nc->url)
+ free(nc->url);
+
+ if (param) {
+ nc->url = sstrdup(param);
+ notice_lang(s_NickServ, u, NICK_SET_URL_CHANGED, param);
+ } else {
+ nc->url = NULL;
+ notice_lang(s_NickServ, u, NICK_SET_URL_UNSET);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_email(User * u, NickCore * nc, char *param)
+{
+ if (!param && NSForceEmail) {
+ notice_lang(s_NickServ, u, NICK_SET_EMAIL_UNSET_IMPOSSIBLE);
+ return MOD_CONT;
+ } else if (param && !MailValidate(param)) {
+ notice_lang(s_NickServ, u, MAIL_X_INVALID, param);
+ return MOD_CONT;
+ }
+
+ alog("%s: %s!%s@%s (e-mail: %s) changed its e-mail to %s.", s_NickServ,
+ u->nick, u->username, GetHost(u),
+ (nc->email ? nc->email : "none"), (param ? param : "none"));
+
+ if (nc->email)
+ free(nc->email);
+
+ if (param) {
+ nc->email = sstrdup(param);
+ notice_lang(s_NickServ, u, NICK_SET_EMAIL_CHANGED, param);
+ } else {
+ nc->email = NULL;
+ notice_lang(s_NickServ, u, NICK_SET_EMAIL_UNSET);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_icq(User * u, NickCore * nc, char *param)
+{
+ if (param) {
+ int32 tmp = atol(param);
+ if (!tmp) {
+ notice_lang(s_NickServ, u, NICK_SET_ICQ_INVALID, param);
+ } else {
+ nc->icq = tmp;
+ notice_lang(s_NickServ, u, NICK_SET_ICQ_CHANGED, param);
+ }
+ } else {
+ nc->icq = 0;
+ notice_lang(s_NickServ, u, NICK_SET_ICQ_UNSET);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_greet(User * u, NickCore * nc, char *param)
+{
+ if (nc->greet)
+ free(nc->greet);
+
+ if (param) {
+ char buf[BUFSIZE];
+ char *end = strtok(NULL, "");
+
+ snprintf(buf, sizeof(buf), "%s%s%s", param, (end ? " " : ""),
+ (end ? end : ""));
+
+ nc->greet = sstrdup(buf);
+ notice_lang(s_NickServ, u, NICK_SET_GREET_CHANGED, buf);
+ } else {
+ nc->greet = NULL;
+ notice_lang(s_NickServ, u, NICK_SET_GREET_UNSET);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_kill(User * u, NickCore * nc, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ nc->flags |= NI_KILLPROTECT;
+ nc->flags &= ~(NI_KILL_QUICK | NI_KILL_IMMED);
+ notice_lang(s_NickServ, u, NICK_SET_KILL_ON);
+ } else if (stricmp(param, "QUICK") == 0) {
+ nc->flags |= NI_KILLPROTECT | NI_KILL_QUICK;
+ nc->flags &= ~NI_KILL_IMMED;
+ notice_lang(s_NickServ, u, NICK_SET_KILL_QUICK);
+ } else if (stricmp(param, "IMMED") == 0) {
+ if (NSAllowKillImmed) {
+ nc->flags |= NI_KILLPROTECT | NI_KILL_IMMED;
+ nc->flags &= ~NI_KILL_QUICK;
+ notice_lang(s_NickServ, u, NICK_SET_KILL_IMMED);
+ } else {
+ notice_lang(s_NickServ, u, NICK_SET_KILL_IMMED_DISABLED);
+ }
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags &= ~(NI_KILLPROTECT | NI_KILL_QUICK | NI_KILL_IMMED);
+ notice_lang(s_NickServ, u, NICK_SET_KILL_OFF);
+ } else {
+ syntax_error(s_NickServ, u, "SET KILL",
+ NSAllowKillImmed ? NICK_SET_KILL_IMMED_SYNTAX :
+ NICK_SET_KILL_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_secure(User * u, NickCore * nc, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ nc->flags |= NI_SECURE;
+ notice_lang(s_NickServ, u, NICK_SET_SECURE_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags &= ~NI_SECURE;
+ notice_lang(s_NickServ, u, NICK_SET_SECURE_OFF);
+ } else {
+ syntax_error(s_NickServ, u, "SET SECURE", NICK_SET_SECURE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_private(User * u, NickCore * nc, char *param)
+{
+ if (stricmp(param, "ON") == 0) {
+ nc->flags |= NI_PRIVATE;
+ notice_lang(s_NickServ, u, NICK_SET_PRIVATE_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags &= ~NI_PRIVATE;
+ notice_lang(s_NickServ, u, NICK_SET_PRIVATE_OFF);
+ } else {
+ syntax_error(s_NickServ, u, "SET PRIVATE",
+ NICK_SET_PRIVATE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_msg(User * u, NickCore * nc, char *param)
+{
+ if (!UsePrivmsg) {
+ notice_lang(s_NickServ, u, NICK_SET_OPTION_DISABLED, "MSG");
+ return MOD_CONT;
+ }
+
+ if (stricmp(param, "ON") == 0) {
+ nc->flags |= NI_MSG;
+ notice_lang(s_NickServ, u, NICK_SET_MSG_ON);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags &= ~NI_MSG;
+ notice_lang(s_NickServ, u, NICK_SET_MSG_OFF);
+ } else {
+ syntax_error(s_NickServ, u, "SET MSG", NICK_SET_MSG_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_hide(User * u, NickCore * nc, char *param)
+{
+ int flag, onmsg, offmsg;
+
+ if (stricmp(param, "EMAIL") == 0) {
+ flag = NI_HIDE_EMAIL;
+ onmsg = NICK_SET_HIDE_EMAIL_ON;
+ offmsg = NICK_SET_HIDE_EMAIL_OFF;
+ } else if (stricmp(param, "USERMASK") == 0) {
+ flag = NI_HIDE_MASK;
+ onmsg = NICK_SET_HIDE_MASK_ON;
+ offmsg = NICK_SET_HIDE_MASK_OFF;
+ } else if (stricmp(param, "QUIT") == 0) {
+ flag = NI_HIDE_QUIT;
+ onmsg = NICK_SET_HIDE_QUIT_ON;
+ offmsg = NICK_SET_HIDE_QUIT_OFF;
+ } else {
+ syntax_error(s_NickServ, u, "SET HIDE", NICK_SET_HIDE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ param = strtok(NULL, " ");
+ if (!param) {
+ syntax_error(s_NickServ, u, "SET HIDE", NICK_SET_HIDE_SYNTAX);
+ } else if (stricmp(param, "ON") == 0) {
+ nc->flags |= flag;
+ notice_lang(s_NickServ, u, onmsg, s_NickServ);
+ } else if (stricmp(param, "OFF") == 0) {
+ nc->flags &= ~flag;
+ notice_lang(s_NickServ, u, offmsg, s_NickServ);
+ } else {
+ syntax_error(s_NickServ, u, "SET HIDE", NICK_SET_HIDE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_set_noexpire(User * u, NickAlias * na, char *param)
+{
+ if (!is_services_admin(u)) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+ if (!param) {
+ syntax_error(s_NickServ, u, "SET NOEXPIRE",
+ NICK_SET_NOEXPIRE_SYNTAX);
+ return MOD_CONT;
+ }
+ if (stricmp(param, "ON") == 0) {
+ na->status |= NS_NO_EXPIRE;
+ notice_lang(s_NickServ, u, NICK_SET_NOEXPIRE_ON, na->nick);
+ } else if (stricmp(param, "OFF") == 0) {
+ na->status &= ~NS_NO_EXPIRE;
+ notice_lang(s_NickServ, u, NICK_SET_NOEXPIRE_OFF, na->nick);
+ } else {
+ syntax_error(s_NickServ, u, "SET NOEXPIRE",
+ NICK_SET_NOEXPIRE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_link(User * u)
+{
+ notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "GROUP");
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_unlink(User * u)
+{
+ notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "DROP");
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_listlinks(User * u)
+{
+ notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "GLIST");
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_access(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ char *mask = strtok(NULL, " ");
+ NickAlias *na;
+ int i;
+ char **access;
+
+ if (cmd && stricmp(cmd, "LIST") == 0 && mask && is_services_admin(u)
+ && (na = findnick(mask))) {
+
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ return MOD_CONT;
+ }
+
+ notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X, mask);
+ mask = strtok(NULL, " ");
+ for (access = na->nc->access, i = 0; i < na->nc->accesscount;
+ access++, i++) {
+ if (mask && !match_wild(mask, *access))
+ continue;
+ notice_user(s_NickServ, u, " %s", *access);
+ }
+
+ } else if (!cmd || ((stricmp(cmd, "LIST") == 0) ? !!mask : !mask)) {
+ syntax_error(s_NickServ, u, "ACCESS", NICK_ACCESS_SYNTAX);
+
+ } else if (mask && !strchr(mask, '@')) {
+ notice_lang(s_NickServ, u, BAD_USERHOST_MASK);
+ notice_lang(s_NickServ, u, MORE_INFO, s_NickServ, "ACCESS");
+
+ } else if (!(na = u->na)) {
+ notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
+
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+
+ } else if (!nick_identified(u)) {
+ notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
+
+ } else if (stricmp(cmd, "ADD") == 0) {
+ if (na->nc->accesscount >= NSAccessMax) {
+ notice_lang(s_NickServ, u, NICK_ACCESS_REACHED_LIMIT,
+ NSAccessMax);
+ return MOD_CONT;
+ }
+
+ for (access = na->nc->access, i = 0; i < na->nc->accesscount;
+ access++, i++) {
+ if (strcmp(*access, mask) == 0) {
+ notice_lang(s_NickServ, u, NICK_ACCESS_ALREADY_PRESENT,
+ *access);
+ return MOD_CONT;
+ }
+ }
+
+ na->nc->accesscount++;
+ na->nc->access =
+ srealloc(na->nc->access, sizeof(char *) * na->nc->accesscount);
+ na->nc->access[na->nc->accesscount - 1] = sstrdup(mask);
+ notice_lang(s_NickServ, u, NICK_ACCESS_ADDED, mask);
+
+ } else if (stricmp(cmd, "DEL") == 0) {
+
+ for (access = na->nc->access, i = 0; i < na->nc->accesscount;
+ access++, i++) {
+ if (stricmp(*access, mask) == 0)
+ break;
+ }
+ if (i == na->nc->accesscount) {
+ notice_lang(s_NickServ, u, NICK_ACCESS_NOT_FOUND, mask);
+ return MOD_CONT;
+ }
+
+ notice_lang(s_NickServ, u, NICK_ACCESS_DELETED, *access);
+ free(*access);
+ na->nc->accesscount--;
+ if (i < na->nc->accesscount) /* if it wasn't the last entry... */
+ memmove(access, access + 1,
+ (na->nc->accesscount - i) * sizeof(char *));
+ if (na->nc->accesscount) /* if there are any entries left... */
+ na->nc->access =
+ srealloc(na->nc->access,
+ na->nc->accesscount * sizeof(char *));
+ else {
+ free(na->nc->access);
+ na->nc->access = NULL;
+ }
+ } else if (stricmp(cmd, "LIST") == 0) {
+ notice_lang(s_NickServ, u, NICK_ACCESS_LIST);
+ for (access = na->nc->access, i = 0; i < na->nc->accesscount;
+ access++, i++) {
+ if (mask && !match_wild(mask, *access))
+ continue;
+ notice_user(s_NickServ, u, " %s", *access);
+ }
+ } else {
+ syntax_error(s_NickServ, u, "ACCESS", NICK_ACCESS_SYNTAX);
+
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Show hidden info to nick owners and sadmins when the "ALL" parameter is
+ * supplied. If a nick is online, the "Last seen address" changes to "Is
+ * online from".
+ * Syntax: INFO <nick> {ALL}
+ * -TheShadow (13 Mar 1999)
+ */
+
+static int do_info(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *param = strtok(NULL, " ");
+
+ NickAlias *na;
+ NickRequest *nr = NULL;
+ int is_servadmin = is_services_admin(u);
+
+#ifdef HAS_VHOST
+ char *vHost;
+#endif
+
+ if (!nick) {
+ syntax_error(s_NickServ, u, "INFO", NICK_INFO_SYNTAX);
+ } else if (!(na = findnick(nick))) {
+ if ((nr = findrequestnick(nick))) {
+ notice_lang(s_NickServ, u, NICK_IS_PREREG);
+ if (param && stricmp(param, "ALL") == 0 && is_servadmin) {
+ notice_lang(s_NickServ, u, NICK_INFO_EMAIL, nr->email);
+ } else {
+ if (is_servadmin) {
+ notice_lang(s_NickServ, u, NICK_INFO_FOR_MORE,
+ s_NickServ, nr->nick);
+ }
+ }
+ } else {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ }
+ } else if (na->status & NS_VERBOTEN) {
+ if (is_oper(u) && na->last_usermask)
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN_OPER, nick,
+ na->last_usermask,
+ (na->last_realname ? na->
+ last_realname : getstring(u->na, NO_REASON)));
+ else
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
+ } else {
+ struct tm *tm;
+ char buf[BUFSIZE], *end;
+ const char *commastr = getstring(u->na, COMMA_SPACE);
+ int need_comma = 0;
+ int nick_online = 0;
+ int show_hidden = 0;
+
+ /* Is the real owner of the nick we're looking up online? -TheShadow */
+ if (na->status & (NS_RECOGNIZED | NS_IDENTIFIED))
+ nick_online = 1;
+
+ /* Only show hidden fields to owner and sadmins and only when the ALL
+ * parameter is used. -TheShadow */
+ if (param && stricmp(param, "ALL") == 0 && u->na
+ && ((nick_identified(u) && (na->nc == u->na->nc))
+ || is_servadmin))
+ show_hidden = 1;
+
+ notice_lang(s_NickServ, u, NICK_INFO_REALNAME, na->nick,
+ na->last_realname);
+
+ if (nick_is_services_admin(na->nc)) /* This will also include the services root(s) */
+ notice_lang(s_NickServ, u, NICK_INFO_SERVICES_ADMIN, na->nick);
+ else if (nick_is_services_oper(na->nc))
+ notice_lang(s_NickServ, u, NICK_INFO_SERVICES_OPER, na->nick);
+
+
+ if (nick_online) {
+ if (show_hidden || !(na->nc->flags & NI_HIDE_MASK))
+ notice_lang(s_NickServ, u, NICK_INFO_ADDRESS_ONLINE,
+ na->last_usermask);
+ else
+ notice_lang(s_NickServ, u, NICK_INFO_ADDRESS_ONLINE_NOHOST,
+ na->nick);
+ } else {
+ if (show_hidden || !(na->nc->flags & NI_HIDE_MASK))
+ notice_lang(s_NickServ, u, NICK_INFO_ADDRESS,
+ na->last_usermask);
+ }
+
+ tm = localtime(&na->time_registered);
+ strftime_lang(buf, sizeof(buf), u, STRFTIME_DATE_TIME_FORMAT, tm);
+ notice_lang(s_NickServ, u, NICK_INFO_TIME_REGGED, buf);
+
+ if (!nick_online) {
+ tm = localtime(&na->last_seen);
+ strftime_lang(buf, sizeof(buf), u, STRFTIME_DATE_TIME_FORMAT,
+ tm);
+ notice_lang(s_NickServ, u, NICK_INFO_LAST_SEEN, buf);
+ }
+
+ if (na->last_quit
+ && (show_hidden || !(na->nc->flags & NI_HIDE_QUIT)))
+ notice_lang(s_NickServ, u, NICK_INFO_LAST_QUIT, na->last_quit);
+
+ if (na->nc->url)
+ notice_lang(s_NickServ, u, NICK_INFO_URL, na->nc->url);
+ if (na->nc->email
+ && (show_hidden || !(na->nc->flags & NI_HIDE_EMAIL)))
+ notice_lang(s_NickServ, u, NICK_INFO_EMAIL, na->nc->email);
+ if (na->nc->icq)
+ notice_lang(s_NickServ, u, NICK_INFO_ICQ, na->nc->icq);
+
+ if (show_hidden) {
+#ifdef HAS_VHOST
+ if (s_HostServ) {
+ if (getvHost(na->nick) != NULL) {
+ vHost = smalloc(strlen(getvHost(na->nick)) + 2);
+ bzero(vHost, sizeof(vHost));
+ snprintf(vHost, strlen(getvHost(na->nick)) + 2, "%s",
+ getvHost(na->nick));
+ notice_lang(s_NickServ, u, NICK_INFO_VHOST, vHost);
+ free(vHost);
+ }
+ }
+#endif
+ if (na->nc->greet)
+ notice_lang(s_NickServ, u, NICK_INFO_GREET, na->nc->greet);
+
+ *buf = 0;
+ end = buf;
+
+ if (na->nc->flags & NI_KILLPROTECT) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s",
+ getstring(u->na, NICK_INFO_OPT_KILL));
+ need_comma = 1;
+ }
+ if (na->nc->flags & NI_SECURE) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, NICK_INFO_OPT_SECURE));
+ need_comma = 1;
+ }
+ if (na->nc->flags & NI_PRIVATE) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, NICK_INFO_OPT_PRIVATE));
+ need_comma = 1;
+ }
+ if (na->nc->flags & NI_MSG) {
+ end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
+ need_comma ? commastr : "",
+ getstring(u->na, NICK_INFO_OPT_MSG));
+ need_comma = 1;
+ }
+
+ notice_lang(s_NickServ, u, NICK_INFO_OPTIONS,
+ *buf ? buf : getstring(u->na, NICK_INFO_OPT_NONE));
+
+ if (na->status & NS_NO_EXPIRE)
+ notice_lang(s_NickServ, u, NICK_INFO_NO_EXPIRE);
+ }
+
+ if (!show_hidden
+ && ((u->na && (na->nc == u->na->nc) && nick_identified(u))
+ || is_servadmin))
+ notice_lang(s_NickServ, u, NICK_INFO_FOR_MORE, s_NickServ,
+ na->nick);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* SADMINS can search for nicks based on their NS_VERBOTEN and NS_NO_EXPIRE
+ * status. The keywords FORBIDDEN and NOEXPIRE represent these two states
+ * respectively. These keywords should be included after the search pattern.
+ * Multiple keywords are accepted and should be separated by spaces. Only one
+ * of the keywords needs to match a nick's state for the nick to be displayed.
+ * Forbidden nicks can be identified by "[Forbidden]" appearing in the last
+ * seen address field. Nicks with NOEXPIRE set are preceeded by a "!". Only
+ * SADMINS will be shown forbidden nicks and the "!" indicator.
+ * Syntax for sadmins: LIST pattern [FORBIDDEN] [NOEXPIRE]
+ * -TheShadow
+ */
+
+static int do_list(User * u)
+{
+ char *pattern = strtok(NULL, " ");
+ char *keyword;
+ NickAlias *na;
+ NickCore *mync;
+ int nnicks, i;
+ char buf[BUFSIZE];
+ int is_servadmin = is_services_admin(u);
+ int16 matchflags = 0;
+ NickRequest *nr = NULL;
+ int nronly = 0;
+ char noexpire_char = ' ';
+ int count = 0, from = 0, to = 0;
+ char *tmp = NULL;
+ char *s = NULL;
+
+ if (NSListOpersOnly && !(is_oper(u))) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (!pattern) {
+ syntax_error(s_NickServ, u, "LIST",
+ is_servadmin ? NICK_LIST_SERVADMIN_SYNTAX :
+ NICK_LIST_SYNTAX);
+ } else {
+
+ if (pattern) {
+ if (pattern[0] == '#') {
+ tmp = myStrGetOnlyToken((pattern + 1), '-', 0); /* Read FROM out */
+ if (!tmp) {
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ return MOD_CONT;
+ }
+ }
+ from = atoi(tmp);
+ tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */
+ if (!tmp) {
+ return MOD_CONT;
+ }
+ for (s = tmp; *s; s++) {
+ if (!isdigit(*s)) {
+ return MOD_CONT;
+ }
+ }
+ to = atoi(tmp);
+ pattern = sstrdup("*");
+ }
+ }
+
+ nnicks = 0;
+
+ while (is_servadmin && (keyword = strtok(NULL, " "))) {
+ if (stricmp(keyword, "FORBIDDEN") == 0)
+ matchflags |= NS_VERBOTEN;
+ if (stricmp(keyword, "NOEXPIRE") == 0)
+ matchflags |= NS_NO_EXPIRE;
+ if (stricmp(keyword, "UNCONFIRMED") == 0)
+ nronly = 1;
+ }
+
+ mync = (nick_identified(u) ? u->na->nc : NULL);
+
+ notice_lang(s_NickServ, u, NICK_LIST_HEADER, pattern);
+ if (nronly != 1) {
+ for (i = 0; i < 1024; i++) {
+ for (na = nalists[i]; na; na = na->next) {
+ /* Don't show private and forbidden nicks to non-services admins. */
+ if ((na->status & NS_VERBOTEN) && !is_servadmin)
+ continue;
+ if ((na->nc->flags & NI_PRIVATE) && !is_servadmin
+ && na->nc != mync)
+ continue;
+ if ((matchflags != 0) && !(na->status & matchflags))
+ continue;
+
+ /* We no longer compare the pattern against the output buffer.
+ * Instead we build a nice nick!user@host buffer to compare.
+ * The output is then generated separately. -TheShadow */
+ snprintf(buf, sizeof(buf), "%s!%s", na->nick,
+ (na->last_usermask
+ && !(na->status & NS_VERBOTEN)) ? na->
+ last_usermask : "*@*");
+ if (stricmp(pattern, na->nick) == 0
+ || match_wild_nocase(pattern, buf)) {
+
+ if ((((count + 1 >= from) && (count + 1 <= to))
+ || ((from == 0) && (to == 0)))
+ && (++nnicks <= NSListMax)) {
+ if (is_servadmin
+ && (na->status & NS_NO_EXPIRE))
+ noexpire_char = '!';
+ else {
+ noexpire_char = ' ';
+ }
+ if ((na->nc->flags & NI_HIDE_MASK)
+ && !is_servadmin && na->nc != mync) {
+ snprintf(buf, sizeof(buf),
+ "%-20s [Hostname Hidden]",
+ na->nick);
+ } else if (na->status & NS_VERBOTEN) {
+ snprintf(buf, sizeof(buf),
+ "%-20s [Forbidden]", na->nick);
+ } else {
+ snprintf(buf, sizeof(buf), "%-20s %s",
+ na->nick, na->last_usermask);
+ }
+ notice_user(s_NickServ, u, " %c%s",
+ noexpire_char, buf);
+ }
+ count++;
+ }
+ }
+ }
+ }
+
+ if (nronly == 1 || (is_servadmin && matchflags == 0)) {
+ noexpire_char = ' ';
+ for (i = 0; i < 1024; i++) {
+ for (nr = nrlists[i]; nr; nr = nr->next) {
+ snprintf(buf, sizeof(buf), "%s!*@*", nr->nick);
+ if (stricmp(pattern, nr->nick) == 0
+ || match_wild_nocase(pattern, buf)) {
+ if (++nnicks <= NSListMax) {
+ snprintf(buf, sizeof(buf),
+ "%-20s [UNCONFIRMED]", nr->nick);
+ notice_user(s_NickServ, u, " %c%s",
+ noexpire_char, buf);
+ }
+ }
+ }
+ }
+ }
+ notice_lang(s_NickServ, u, NICK_LIST_RESULTS,
+ nnicks > NSListMax ? NSListMax : nnicks, nnicks);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_glist(User * u)
+{
+ char *nick = strtok(NULL, " ");
+
+ NickAlias *na, *na2;
+ int i;
+
+ if ((nick ? !is_services_admin(u) : !nick_identified(u))) {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ } else if ((!nick ? !(na = u->na) : !(na = findnick(nick)))) {
+ notice_lang(s_NickServ, u,
+ (!nick ? NICK_NOT_REGISTERED : NICK_X_NOT_REGISTERED),
+ nick);
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else {
+ notice_lang(s_NickServ, u,
+ nick ? NICK_GLIST_HEADER_X : NICK_GLIST_HEADER,
+ na->nc->display);
+ for (i = 0; i < na->nc->aliases.count; i++) {
+ na2 = na->nc->aliases.list[i];
+ if (na2->nc == na->nc)
+ notice_user(s_NickServ, u, " %c%s",
+ ((na2->status & NS_NO_EXPIRE) ? '!' : ' '),
+ na2->nick);
+ }
+ notice_lang(s_NickServ, u, NICK_GLIST_FOOTER,
+ na->nc->aliases.count);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/**
+ * List the channels that the given nickname has access on
+ *
+ * /ns ALIST [level]
+ * /ns ALIST [nickname] [level]
+ *
+ * -jester
+ */
+static int do_alist(User * u)
+{
+ char *lev = strtok(NULL, " ");
+
+ NickAlias *na;
+
+ int min_level = 0;
+ int is_servadmin = is_services_admin(u);
+
+ /* Services admins can request ALIST on nicks.
+ * Check if 'lev' (first token) is actually a nick
+ * and, if so, reassign pointers.
+ */
+ if (is_servadmin && lev && (na = findnick(lev))) {
+ lev = strtok(NULL, " ");
+ } else {
+ na = u->na;
+ }
+
+ /* if a level was given, make sure it's an int for later */
+ if (lev) {
+ if (stricmp(lev, "FOUNDER") == 0) {
+ min_level = ACCESS_FOUNDER;
+ } else if (stricmp(lev, "SOP") == 0) {
+ min_level = ACCESS_SOP;
+ } else if (stricmp(lev, "AOP") == 0) {
+ min_level = ACCESS_AOP;
+#ifdef HAS_HALFOP
+ } else if (stricmp(lev, "HOP") == 0) {
+ min_level = ACCESS_HOP;
+#endif
+ } else if (stricmp(lev, "VOP") == 0) {
+ min_level = ACCESS_VOP;
+ } else {
+ min_level = atoi(lev);
+ }
+ }
+
+ if (!nick_identified(u)) {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ } else if (lev && !na) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, na->nick);
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else {
+ int i, level;
+ int chan_count = 0;
+ int match_count = 0;
+ ChannelInfo *ci;
+
+ notice_lang(s_NickServ, u, (is_servadmin ? NICK_ALIST_HEADER_X :
+ NICK_ALIST_HEADER), na->nick);
+
+ for (i = 0; i < 256; i++) {
+ for ((ci = chanlists[i]); ci; (ci = ci->next)) {
+
+ if ((level = get_access_level(ci, na))) {
+ chan_count++;
+
+ if (min_level > level) {
+ continue;
+ }
+
+ match_count++;
+
+ if ((ci->flags & CI_XOP) || (level == ACCESS_FOUNDER)) {
+ char *xop;
+
+ xop = get_xop_level(level);
+
+ notice_lang(s_NickServ, u, NICK_ALIST_XOP_FORMAT,
+ match_count,
+ ((ci->
+ flags & CI_NO_EXPIRE) ? '!' : ' '),
+ ci->name, xop,
+ (ci->desc ? ci->desc : ""));
+ } else {
+ notice_lang(s_NickServ, u,
+ NICK_ALIST_ACCESS_FORMAT, match_count,
+ ((ci->
+ flags & CI_NO_EXPIRE) ? '!' : ' '),
+ ci->name, level,
+ (ci->desc ? ci->desc : ""));
+
+ }
+ }
+ }
+ }
+
+ notice_lang(s_NickServ, u, NICK_ALIST_FOOTER, match_count,
+ chan_count);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_recover(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *pass = strtok(NULL, " ");
+ NickAlias *na;
+ User *u2;
+
+ if (!nick) {
+ syntax_error(s_NickServ, u, "RECOVER", NICK_RECOVER_SYNTAX);
+ } else if (!(u2 = finduser(nick))) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
+ } else if (!(na = u2->na)) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else if (stricmp(nick, u->nick) == 0) {
+ notice_lang(s_NickServ, u, NICK_NO_RECOVER_SELF);
+ } else if (pass) {
+ int res = check_password(pass, na->nc->pass);
+
+ if (res == 1) {
+ notice_lang(s_NickServ, u2, FORCENICKCHANGE_NOW);
+ collide(na, 0);
+ notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick);
+ } else {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ if (res == 0) {
+ alog("%s: RECOVER: invalid password for %s by %s!%s@%s",
+ s_NickServ, nick, u->nick, u->username, GetHost(u));
+ bad_password(u);
+ }
+ }
+ } else {
+ if (group_identified(u, na->nc)
+ || (!(na->nc->flags & NI_SECURE) && is_on_access(u, na->nc))) {
+ notice_lang(s_NickServ, u2, FORCENICKCHANGE_NOW);
+ collide(na, 0);
+ notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick);
+ } else {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_release(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *pass = strtok(NULL, " ");
+ NickAlias *na;
+
+ if (!nick) {
+ syntax_error(s_NickServ, u, "RELEASE", NICK_RELEASE_SYNTAX);
+ } else if (!(na = findnick(nick))) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else if (!(na->status & NS_KILL_HELD)) {
+ notice_lang(s_NickServ, u, NICK_RELEASE_NOT_HELD, nick);
+ } else if (pass) {
+ int res = check_password(pass, na->nc->pass);
+ if (res == 1) {
+ release(na, 0);
+ notice_lang(s_NickServ, u, NICK_RELEASED);
+ } else {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ if (res == 0) {
+ alog("%s: RELEASE: invalid password for %s by %s!%s@%s",
+ s_NickServ, nick, u->nick, u->username, GetHost(u));
+ bad_password(u);
+ }
+ }
+ } else {
+ if (group_identified(u, na->nc)
+ || (!(na->nc->flags & NI_SECURE) && is_on_access(u, na->nc))) {
+ release(na, 0);
+ notice_lang(s_NickServ, u, NICK_RELEASED);
+ } else {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_ghost(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *pass = strtok(NULL, " ");
+ NickAlias *na;
+ User *u2;
+
+ if (!nick) {
+ syntax_error(s_NickServ, u, "GHOST", NICK_GHOST_SYNTAX);
+ } else if (!(u2 = finduser(nick))) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
+ } else if (!(na = u2->na)) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else if (stricmp(nick, u->nick) == 0) {
+ notice_lang(s_NickServ, u, NICK_NO_GHOST_SELF);
+ } else if (pass) {
+ int res = check_password(pass, na->nc->pass);
+ if (res == 1) {
+ char buf[NICKMAX + 32];
+ snprintf(buf, sizeof(buf), "GHOST command used by %s",
+ u->nick);
+#ifdef IRC_BAHAMUT
+ send_cmd(NULL, "SVSKILL %s :%s", nick, buf);
+#else
+ kill_user(s_NickServ, nick, buf);
+#endif
+ notice_lang(s_NickServ, u, NICK_GHOST_KILLED, nick);
+ } else {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ if (res == 0) {
+ alog("%s: GHOST: invalid password for %s by %s!%s@%s",
+ s_NickServ, nick, u->nick, u->username, GetHost(u));
+ bad_password(u);
+ }
+ }
+ } else {
+ if (group_identified(u, na->nc)
+ || (!(na->nc->flags & NI_SECURE) && is_on_access(u, na->nc))) {
+ char buf[NICKMAX + 32];
+ snprintf(buf, sizeof(buf), "GHOST command used by %s",
+ u->nick);
+#ifdef IRC_BAHAMUT
+ send_cmd(NULL, "SVSKILL %s :%s", nick, buf);
+#else
+ kill_user(s_NickServ, nick, buf);
+#endif
+ notice_lang(s_NickServ, u, NICK_GHOST_KILLED, nick);
+ } else {
+ notice_lang(s_NickServ, u, ACCESS_DENIED);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_status(User * u)
+{
+ char *nick;
+ User *u2;
+ int i = 0;
+
+ while ((nick = strtok(NULL, " ")) && (i++ < 16)) {
+ if (!(u2 = finduser(nick)))
+ notice_user(s_NickServ, u, "STATUS %s 0", nick);
+ else if (nick_identified(u2))
+ notice_user(s_NickServ, u, "STATUS %s 3", nick);
+ else if (nick_recognized(u2))
+ notice_user(s_NickServ, u, "STATUS %s 2", nick);
+ else
+ notice_user(s_NickServ, u, "STATUS %s 1", nick);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+/* A simple call to check for all emails that a user may have registered */
+/* with. It returns the nicks that match the email you provide. Wild */
+/* Cards are not excepted. Must use user@email-host. */
+/*************************************************************************/
+static int do_getemail(User * u)
+{
+ char *email = strtok(NULL, " ");
+ int i, j = 0;
+ NickCore *nc;
+
+ if (!email) {
+ syntax_error(s_NickServ, u, "GETMAIL", NICK_GETEMAIL_SYNTAX);
+ return MOD_CONT;
+ }
+ alog("%s: %s!%s@%s used GETEMAIL on %s", s_NickServ, u->nick,
+ u->username, GetHost(u), email);
+ for (i = 0; i < 1024; i++) {
+ for (nc = nclists[i]; nc; nc = nc->next) {
+ if (nc->email) {
+ if (stricmp(nc->email, email) == 0) {
+ j++;
+ notice_lang(s_NickServ, u, NICK_GETEMAIL_EMAILS_ARE,
+ nc->display, email);
+ }
+ }
+ }
+ }
+ if (j <= 0) {
+ notice_lang(s_NickServ, u, NICK_GETEMAIL_NOT_USED, email);
+ return MOD_CONT;
+ }
+ return MOD_CONT;
+}
+
+/**************************************************************************/
+
+static int do_getpass(User * u)
+{
+#ifndef USE_ENCRYPTION
+ char *nick = strtok(NULL, " ");
+ NickAlias *na;
+ NickRequest *nr = NULL;
+#endif
+
+ /* Assumes that permission checking has already been done. */
+#ifdef USE_ENCRYPTION
+ notice_lang(s_NickServ, u, NICK_GETPASS_UNAVAILABLE);
+#else
+ if (!nick) {
+ syntax_error(s_NickServ, u, "GETPASS", NICK_GETPASS_SYNTAX);
+ } else if (!(na = findnick(nick))) {
+ if ((nr = findrequestnick(nick))) {
+ alog("%s: %s!%s@%s used GETPASS on %s", s_NickServ, u->nick,
+ u->username, GetHost(u), nick);
+ if (WallGetpass)
+ wallops(s_NickServ, "\2%s\2 used GETPASS on \2%s\2",
+ u->nick, nick);
+ notice_lang(s_NickServ, u, NICK_GETPASS_PASSCODE_IS, nick,
+ nr->passcode);
+ } else {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ }
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else if (NSSecureAdmins && nick_is_services_admin(na->nc)
+ && !is_services_root(u)) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ } else if (NSRestrictGetPass && !is_services_root(u)) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ } else {
+ alog("%s: %s!%s@%s used GETPASS on %s", s_NickServ, u->nick,
+ u->username, GetHost(u), nick);
+ if (WallGetpass)
+ wallops(s_NickServ, "\2%s\2 used GETPASS on \2%s\2", u->nick,
+ nick);
+ notice_lang(s_NickServ, u, NICK_GETPASS_PASSWORD_IS, nick,
+ na->nc->pass);
+ }
+#endif
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_sendpass(User * u)
+{
+#ifndef USE_ENCRYPTION
+ char *nick = strtok(NULL, " ");
+ NickAlias *na;
+#endif
+
+#ifdef USE_ENCRYPTION
+ notice_lang(s_NickServ, u, NICK_SENDPASS_UNAVAILABLE);
+#else
+ if (!nick) {
+ syntax_error(s_NickServ, u, "SENDPASS", NICK_SENDPASS_SYNTAX);
+ } else if (RestrictMail && !is_oper(u)) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ } else if (!(na = findnick(nick))) {
+ notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
+ } else if (na->status & NS_VERBOTEN) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
+ } else {
+ char buf[BUFSIZE];
+ MailInfo *mail;
+
+ snprintf(buf, sizeof(buf), getstring(na, NICK_SENDPASS_SUBJECT),
+ na->nick);
+ mail = MailBegin(u, na->nc, buf, s_NickServ);
+ if (!mail)
+ return MOD_CONT;
+
+ fprintf(mail->pipe, getstring(na, NICK_SENDPASS_HEAD));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_1), na->nick);
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_2),
+ na->nc->pass);
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_3));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_4));
+ fprintf(mail->pipe, "\n\n");
+ fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_5),
+ NetworkName);
+ fprintf(mail->pipe, "\n.\n");
+
+ MailEnd(mail);
+
+ alog("%s: %s!%s@%s used SENDPASS on %s", s_NickServ, u->nick,
+ u->username, GetHost(u), nick);
+ notice_lang(s_NickServ, u, NICK_SENDPASS_OK, nick);
+ }
+#endif
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_forbid(User * u)
+{
+ NickAlias *na;
+ char *nick = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+
+ /* Assumes that permission checking has already been done. */
+ if (!nick || (ForceForbidReason && !reason)) {
+ syntax_error(s_NickServ, u, "FORBID",
+ (ForceForbidReason ? NICK_FORBID_SYNTAX_REASON :
+ NICK_FORBID_SYNTAX));
+ return MOD_CONT;
+ }
+
+ if (readonly)
+ notice_lang(s_NickServ, u, READ_ONLY_MODE);
+ if ((na = findnick(nick)) != NULL) {
+ if (NSSecureAdmins && nick_is_services_admin(na->nc)
+ && !is_services_root(u)) {
+ notice_lang(s_NickServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+ delnick(na);
+ }
+ na = makenick(nick);
+ if (na) {
+ na->status |= NS_VERBOTEN;
+ na->last_usermask = sstrdup(u->nick);
+ if (reason)
+ na->last_realname = sstrdup(reason);
+
+ na->u = finduser(na->nick);
+ if (na->u)
+ na->u->na = na;
+
+ if (na->u) {
+ notice_lang(s_NickServ, na->u, FORCENICKCHANGE_NOW);
+ collide(na, 0);
+ }
+
+ if (WallForbid)
+ wallops(s_NickServ, "\2%s\2 used FORBID on \2%s\2", u->nick,
+ nick);
+
+ alog("%s: %s set FORBID for nick %s", s_NickServ, u->nick, nick);
+ notice_lang(s_NickServ, u, NICK_FORBID_SUCCEEDED, nick);
+ } else {
+ alog("%s: Valid FORBID for %s by %s failed", s_NickServ, nick,
+ u->nick);
+ notice_lang(s_NickServ, u, NICK_FORBID_FAILED, nick);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+int ns_do_register(User * u)
+{
+ return do_register(u);
+}
diff --git a/operserv.c b/operserv.c
new file mode 100644
index 000000000..c93a94368
--- /dev/null
+++ b/operserv.c
@@ -0,0 +1,5099 @@
+/* OperServ functions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: operserv.c,v 1.89 2004/03/14 22:44:47 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+/*
+ * Disable the modules on OpenBSD (for now)
+ * there is work in progress for this.
+ */
+#ifdef __OpenBSD__
+#ifdef USE_MODULES
+#undef USE_MODULES
+#endif /* USE_MODULES */
+#endif /* __OpenBSD__ */
+
+extern Module *mod_current_module;
+extern int mod_current_op;
+extern User *mod_current_user;
+extern ModuleHash *MODULE_HASH[MAX_CMD_HASH];
+/*************************************************************************/
+
+struct clone {
+ char *host;
+ long time;
+};
+
+/* List of most recent users - statically initialized to zeros */
+static struct clone clonelist[CLONE_DETECT_SIZE];
+
+/* Which hosts have we warned about, and when? This is used to keep us
+ * from sending out notices over and over for clones from the same host. */
+static struct clone warnings[CLONE_DETECT_SIZE];
+
+/* List of Services administrators */
+SList servadmins;
+/* List of Services operators */
+SList servopers;
+/* AKILL, SGLINE, SQLINE and SZLINE lists */
+SList akills, sglines, sqlines, szlines;
+
+/*************************************************************************/
+
+static void get_operserv_stats(long *nrec, long *memuse);
+
+static int compare_adminlist_entries(SList * slist, void *item1,
+ void *item2);
+static int compare_operlist_entries(SList * slist, void *item1,
+ void *item2);
+static void free_adminlist_entry(SList * slist, void *item);
+static void free_operlist_entry(SList * slist, void *item);
+
+static int is_akill_entry_equal(SList * slist, void *item1, void *item2);
+static void free_akill_entry(SList * slist, void *item);
+#ifdef IRC_BAHAMUT
+static int is_sgline_entry_equal(SList * slist, void *item1, void *item2);
+static void free_sgline_entry(SList * slist, void *item);
+#endif
+static int is_sqline_entry_equal(SList * slist, void *item1, void *item2);
+static void free_sqline_entry(SList * slist, void *item);
+#ifdef IRC_BAHAMUT
+static int is_szline_entry_equal(SList * slist, void *item1, void *item2);
+static void free_szline_entry(SList * slist, void *item);
+#endif
+
+static int do_help(User * u);
+static int do_global(User * u);
+static int do_stats(User * u);
+static int do_admin(User * u);
+static int do_oper(User * u);
+static int do_os_mode(User * u);
+static int do_clearmodes(User * u);
+static int do_os_kick(User * u);
+static int do_akill(User * u);
+static int do_sgline(User * u);
+static int do_sqline(User * u);
+static int do_szline(User * u);
+static int do_set(User * u);
+static int do_noop(User * u);
+static int do_jupe(User * u);
+static int do_raw(User * u);
+static int do_update(User * u);
+static int do_reload(User * u);
+static int do_os_quit(User * u);
+static int do_shutdown(User * u);
+static int do_restart(User * u);
+static int do_ignorelist(User * u);
+static int do_clearignore(User * u);
+static int do_killclones(User * u);
+static int do_chanlist(User * u);
+static int do_userlist(User * u);
+static int do_ignoreuser(User * u);
+static int do_staff(User * u);
+static int do_defcon(User * u);
+static int do_chankill(User * u);
+static void defcon_sendlvls(User * u);
+char *defconReverseModes(const char *modes);
+int DefConModesSet = 0;
+time_t DefContimer;
+void runDefCon(void);
+void resetDefCon(int level);
+void oper_global(char *nick, char *fmt, ...);
+
+#ifdef USE_MODULES
+int do_modload(User * u);
+int do_modunload(User * u);
+int do_modlist(User * u);
+int do_modinfo(User * u);
+static int showModuleCmdLoaded(CommandHash * cmdList, char *mod_name,
+ User * u);
+static int showModuleMsgLoaded(MessageHash * msgList, char *mod_name,
+ User * u);
+#endif
+
+
+#ifdef USE_OSSVS
+#ifndef IRC_HYBRID
+static int do_operumodes(User * u);
+#endif
+static int do_svsnick(User * u);
+#endif
+
+#if defined(IRC_UNREAL) && defined(USE_OSSVS)
+static int do_operoline(User * u);
+#endif
+
+#ifdef DEBUG_COMMANDS
+static void send_clone_lists(User * u);
+static int do_matchwild(User * u);
+#endif
+
+/* OperServ restart needs access to this if were gonna avoid sending ourself a signal */
+extern int do_restart_services(void);
+void moduleAddOperServCmds(void);
+/*************************************************************************/
+
+/* Options for the lists */
+SListOpts akopts = { 0, NULL, &is_akill_entry_equal, &free_akill_entry };
+SListOpts saopts = { SLISTF_SORT, &compare_adminlist_entries, NULL,
+ &free_adminlist_entry
+};
+
+#ifdef IRC_BAHAMUT
+SListOpts sgopts = { 0, NULL, &is_sgline_entry_equal, &free_sgline_entry };
+#endif
+SListOpts soopts =
+ { SLISTF_SORT, &compare_operlist_entries, NULL, &free_operlist_entry };
+SListOpts sqopts =
+ { SLISTF_SORT, NULL, &is_sqline_entry_equal, &free_sqline_entry };
+#ifdef IRC_BAHAMUT
+SListOpts szopts = { 0, NULL, &is_szline_entry_equal, &free_szline_entry };
+#endif
+
+/*************************************************************************/
+/* *INDENT-OFF* */
+void moduleAddOperServCmds(void) {
+ Command *c;
+ c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("GLOBAL", do_global, NULL, OPER_HELP_GLOBAL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("STATS", do_stats, NULL, OPER_HELP_STATS, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("UPTIME", do_stats, NULL, OPER_HELP_STATS, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+
+ /* Anyone can use the LIST option to the ADMIN and OPER commands; those
+ * routines check privileges to ensure that only authorized users
+ * modify the list. */
+ c = createCommand("ADMIN", do_admin, NULL, OPER_HELP_ADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("OPER", do_oper, NULL, OPER_HELP_OPER, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("STAFF", do_staff, NULL, OPER_HELP_STAFF, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ /* Similarly, anyone can use *NEWS LIST, but *NEWS {ADD,DEL} are
+ * reserved for Services admins. */
+ c = createCommand("LOGONNEWS", do_logonnews, NULL, NEWS_HELP_LOGON, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("OPERNEWS", do_opernews, NULL, NEWS_HELP_OPER, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("RANDOMNEWS", do_randomnews, NULL, NEWS_HELP_RANDOM, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+
+ /* Commands for Services opers: */
+ c = createCommand("MODE", do_os_mode, is_services_oper,OPER_HELP_MODE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("CLEARMODES", do_clearmodes, is_services_oper,OPER_HELP_CLEARMODES, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("KICK", do_os_kick, is_services_oper,OPER_HELP_KICK, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("KILLCLONES", do_killclones, is_services_oper,OPER_HELP_KILLCLONES, -1,-1,-1, -1); addCoreCommand(OPERSERV,c);
+ c = createCommand("AKILL", do_akill, is_services_oper,OPER_HELP_AKILL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SGLINE", do_sgline, is_services_oper,OPER_HELP_SGLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SQLINE", do_sqline, is_services_oper,OPER_HELP_SQLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SZLINE", do_szline, is_services_oper,OPER_HELP_SZLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+
+ /* Commands for Services admins: */
+ c = createCommand("SET", do_set, is_services_admin,OPER_HELP_SET, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET READONLY", NULL, NULL,OPER_HELP_SET_READONLY, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET LOGCHAN",NULL, NULL,OPER_HELP_SET_LOGCHAN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET DEBUG", NULL, NULL,OPER_HELP_SET_DEBUG, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET NOEXPIRE",NULL, NULL,OPER_HELP_SET_NOEXPIRE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SET SUPERADMIN",NULL, NULL,OPER_HELP_SET_SUPERADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+#ifdef USE_OSSVS
+ c = createCommand("SVSNICK", do_svsnick, is_services_admin,OPER_HELP_SVSNICK, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+#ifndef IRC_HYBRID
+ c = createCommand("UMODE", do_operumodes, is_services_admin,OPER_HELP_UMODE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+#endif
+#endif
+ c = createCommand("NOOP", do_noop, is_services_admin,OPER_HELP_NOOP, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("JUPE", do_jupe, is_services_admin,OPER_HELP_JUPE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("RAW", do_raw, is_services_admin,OPER_HELP_RAW, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("IGNORE", do_ignoreuser, is_services_admin,OPER_HELP_IGNORE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+#if defined(IRC_UNREAL) && defined(USE_OSSVS)
+ c = createCommand("OLINE", do_operoline, is_services_admin,OPER_HELP_OLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+#endif
+ c = createCommand("UPDATE", do_update, is_services_admin,OPER_HELP_UPDATE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("RELOAD", do_reload, is_services_admin,OPER_HELP_RELOAD, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("QUIT", do_os_quit, is_services_admin,OPER_HELP_QUIT, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("SHUTDOWN", do_shutdown, is_services_admin,OPER_HELP_SHUTDOWN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("RESTART", do_restart, is_services_admin,OPER_HELP_RESTART, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+#ifndef STREAMLINED
+ c = createCommand("SESSION", do_session, is_services_admin,OPER_HELP_SESSION, -1,-1,-1, -1); addCoreCommand(OPERSERV,c);
+ c = createCommand("EXCEPTION", do_exception, is_services_admin,OPER_HELP_EXCEPTION, -1,-1,-1, -1); addCoreCommand(OPERSERV,c);
+#endif
+ c = createCommand("CHANLIST", do_chanlist, is_services_admin,OPER_HELP_CHANLIST, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("USERLIST", do_userlist, is_services_admin,OPER_HELP_USERLIST, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("CACHE", do_cache, is_services_admin,OPER_HELP_CACHE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("DEFCON", do_defcon, is_services_admin, OPER_HELP_DEFCON,-1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("CHANKILL", do_chankill, is_services_admin, OPER_HELP_CHANKILL,-1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ /* Commands for Services root: */
+#ifdef USE_MODULES
+ c = createCommand("MODLOAD", do_modload, is_services_root, -1,-1,-1,-1,OPER_HELP_MODLOAD); addCoreCommand(OPERSERV,c);
+ c = createCommand("MODUNLOAD", do_modunload, is_services_root, -1,-1,-1,-1,OPER_HELP_MODUNLOAD); addCoreCommand(OPERSERV,c);
+ c = createCommand("MODLIST", do_modlist, is_services_root, -1,-1,-1,-1,OPER_HELP_MODLIST); addCoreCommand(OPERSERV,c);
+ c = createCommand("MODINFO", do_modinfo, is_services_root, -1,-1,-1,-1,OPER_HELP_MODINFO); addCoreCommand(OPERSERV,c);
+#endif
+#ifdef DEBUG_COMMANDS
+ c = createCommand("LISTTIMERS", send_timeout_list, is_services_root, -1,-1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("MATCHWILD", do_matchwild, is_services_root, -1,-1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+ c = createCommand("LISTCLONES", send_clone_lists, is_services_root, -1,-1,-1,-1,-1); addCoreCommand(OPERSERV,c);
+#endif
+}
+
+/* *INDENT-ON* */
+/*************************************************************************/
+/*************************************************************************/
+
+/* OperServ initialization. */
+
+void os_init(void)
+{
+ Command *cmd;
+ moduleAddOperServCmds();
+ cmd = findCommand(OPERSERV, "GLOBAL");
+ if (cmd)
+ cmd->help_param1 = s_GlobalNoticer;
+ cmd = findCommand(OPERSERV, "ADMIN");
+ if (cmd)
+ cmd->help_param1 = s_NickServ;
+ cmd = findCommand(OPERSERV, "OPER");
+ if (cmd)
+ cmd->help_param1 = s_NickServ;
+
+ /* Initialization of the lists */
+ slist_init(&servadmins);
+ servadmins.opts = &saopts;
+ slist_init(&servopers);
+ servopers.opts = &soopts;
+
+ slist_init(&akills);
+ akills.opts = &akopts;
+ slist_init(&sglines);
+#ifdef IRC_BAHAMUT
+ sglines.opts = &sgopts;
+#endif
+ slist_init(&sqlines);
+ sqlines.opts = &sqopts;
+ slist_init(&szlines);
+#ifdef IRC_BAHAMUT
+ szlines.opts = &szopts;
+#endif
+}
+
+/*************************************************************************/
+
+/* Main OperServ routine. */
+
+void operserv(User * u, char *buf)
+{
+ char *cmd;
+ char *s;
+
+ alog("%s: %s: %s", s_OperServ, u->nick, buf);
+
+ cmd = strtok(buf, " ");
+ if (!cmd) {
+ return;
+ } else if (stricmp(cmd, "\1PING") == 0) {
+ if (!(s = strtok(NULL, "")))
+ s = "\1";
+ notice(s_OperServ, u->nick, "\1PING %s", s);
+ } else {
+ mod_run_cmd(s_OperServ, u, OPERSERV, cmd);
+ }
+}
+
+static void get_operserv_stats(long *nrec, long *memuse)
+{
+ int i;
+ long mem = 0, count = 0, mem2 = 0, count2 = 0;
+ Akill *ak;
+ SXLine *sx;
+
+ if (CheckClones) {
+ mem = sizeof(struct clone) * CLONE_DETECT_SIZE * 2;
+ for (i = 0; i < CLONE_DETECT_SIZE; i++) {
+ if (clonelist[i].host) {
+ count++;
+ mem += strlen(clonelist[i].host) + 1;
+ }
+ if (warnings[i].host) {
+ count++;
+ mem += strlen(warnings[i].host) + 1;
+ }
+ }
+ }
+
+ count += akills.count;
+ mem += akills.capacity * sizeof(void);
+ mem += akills.count * sizeof(Akill);
+
+ for (i = 0; i < akills.count; i++) {
+ ak = akills.list[i];
+ mem += strlen(ak->user) + 1;
+ mem += strlen(ak->host) + 1;
+ mem += strlen(ak->by) + 1;
+ mem += strlen(ak->reason) + 1;
+ }
+
+#ifdef IRC_BAHAMUT
+
+ count += sglines.count;
+ mem += sglines.capacity * sizeof(void);
+ mem += sglines.count * sizeof(SXLine);
+
+ for (i = 0; i < sglines.count; i++) {
+ sx = sglines.list[i];
+ mem += strlen(sx->mask) + 1;
+ mem += strlen(sx->by) + 1;
+ mem += strlen(sx->reason) + 1;
+ }
+
+#endif
+
+ count += sqlines.count;
+ mem += sqlines.capacity * sizeof(void);
+ mem += sqlines.count * sizeof(SXLine);
+
+ for (i = 0; i < sqlines.count; i++) {
+ sx = sqlines.list[i];
+ mem += strlen(sx->mask) + 1;
+ mem += strlen(sx->by) + 1;
+ mem += strlen(sx->reason) + 1;
+ }
+
+#ifdef IRC_BAHAMUT
+
+ count += szlines.count;
+ mem += szlines.capacity * sizeof(void);
+ mem += szlines.count * sizeof(SXLine);
+
+ for (i = 0; i < szlines.count; i++) {
+ sx = szlines.list[i];
+ mem += strlen(sx->mask) + 1;
+ mem += strlen(sx->by) + 1;
+ mem += strlen(sx->reason) + 1;
+ }
+
+#endif
+
+ get_news_stats(&count2, &mem2);
+ count += count2;
+ mem += mem2;
+ get_exception_stats(&count2, &mem2);
+ count += count2;
+ mem += mem2;
+
+ *nrec = count;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+/**************************** Privilege checks ***************************/
+/*************************************************************************/
+
+/* Load old AKILL data. */
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ if (!forceload) \
+ fatal("Read error on %s", AutokillDBName); \
+ break; \
+ } \
+} while (0)
+
+static void load_old_akill(void)
+{
+ dbFILE *f;
+ int i, j;
+ int16 tmp16;
+ int32 tmp32;
+ char buf[NICKMAX], mask2[BUFSIZE], *mask, *s;
+ Akill *ak, *entry;
+
+ if (!
+ (f =
+ open_db("AKILL", AutokillDBName ? AutokillDBName : "akill.db",
+ "r", 9)))
+ return;
+
+ get_file_version(f);
+
+ read_int16(&tmp16, f);
+ slist_setcapacity(&akills, tmp16);
+
+ for (j = 0; j < akills.capacity; j++) {
+ ak = scalloc(sizeof(Akill), 1);
+
+ SAFE(read_string(&mask, f));
+ s = strchr(mask, '@');
+ *s = 0;
+ s++;
+ ak->user = sstrdup(mask);
+ ak->host = sstrdup(s);
+ SAFE(read_string(&ak->reason, f));
+ SAFE(read_buffer(buf, f));
+ if (!*buf)
+ ak->by = sstrdup("<unknown>");
+ else
+ ak->by = sstrdup(buf);
+ SAFE(read_int32(&tmp32, f));
+ ak->seton = tmp32 ? tmp32 : time(NULL);
+ SAFE(read_int32(&tmp32, f));
+ ak->expires = tmp32;
+
+ /* Sanity checks *sigh* */
+
+ /* No nicknames allowed! */
+ if (strchr(ak->user, '!')) {
+ s_rakill(ak->user, ak->host);
+ free(ak);
+ continue;
+ }
+
+ snprintf(mask2, sizeof(mask2), "%s@%s", ak->user, ak->host);
+
+ /* Is the mask already in the AKILL list? */
+ if (slist_indexof(&akills, mask2) != -1) {
+ free(ak);
+ continue;
+ }
+
+ /* Checks whether there is an AKILL that already covers
+ * the one we want to add, and whether there are AKILLs
+ * that would be covered by this one. Expiry time
+ * does *also* matter.
+ */
+
+ if (akills.count > 0) {
+
+ for (i = akills.count - 1; i >= 0; i--) {
+
+ char amask[BUFSIZE];
+
+ entry = akills.list[i];
+
+ if (!entry)
+ continue;
+
+ snprintf(amask, sizeof(amask), "%s@%s", entry->user,
+ entry->host);
+
+ if (match_wild_nocase(amask, mask2)
+ && (entry->expires >= ak->expires
+ || entry->expires == 0)) {
+ s_rakill(ak->user, ak->host);
+ free(ak);
+ ak = NULL;
+ break;
+ }
+
+ if (match_wild_nocase(mask2, amask)
+ && (entry->expires <= ak->expires || ak->expires == 0))
+ slist_delete(&akills, i);
+ }
+
+ }
+
+ if (ak)
+ slist_add(&akills, ak);
+ }
+
+ close_db(f);
+}
+
+#undef SAFE
+
+/* Load OperServ data. */
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ if (!forceload) \
+ fatal("Read error on %s", OperDBName); \
+ failed = 1; \
+ break; \
+ } \
+} while (0)
+
+void load_os_dbase(void)
+{
+ dbFILE *f;
+ int16 i, n, ver, c;
+ HostCache *hc, **hclast, *hcprev;
+ int16 tmp16;
+ int32 tmp32;
+ char *s;
+ int failed = 0;
+
+ if (!(f = open_db(s_OperServ, OperDBName, "r", OPER_VERSION)))
+ return;
+
+ ver = get_file_version(f);
+
+ if (ver <= 9) {
+ NickAlias *na;
+
+ SAFE(read_int16(&n, f));
+ for (i = 0; i < n && !failed; i++) {
+ SAFE(read_string(&s, f));
+ if (s) {
+ na = findnick(s);
+ if (na) {
+ na->nc->flags |= NI_SERVICES_ADMIN;
+ if (slist_indexof(&servadmins, na) == -1)
+ slist_add(&servadmins, na);
+ }
+ free(s);
+ }
+ }
+ if (!failed)
+ SAFE(read_int16(&n, f));
+ for (i = 0; i < n && !failed; i++) {
+ SAFE(read_string(&s, f));
+ if (s) {
+ na = findnick(s);
+ if (na) {
+ na->nc->flags |= NI_SERVICES_OPER;
+ if (slist_indexof(&servopers, na) == -1)
+ slist_add(&servopers, na);
+ }
+ free(s);
+ }
+ }
+ }
+
+ if (ver >= 7) {
+ int32 tmp32;
+ SAFE(read_int32(&maxusercnt, f));
+ SAFE(read_int32(&tmp32, f));
+ maxusertime = tmp32;
+ }
+
+ if (ver <= 10)
+ load_old_akill();
+ else {
+ Akill *ak;
+
+ read_int16(&tmp16, f);
+ slist_setcapacity(&akills, tmp16);
+
+ for (i = 0; i < akills.capacity; i++) {
+ ak = scalloc(sizeof(Akill), 1);
+
+ SAFE(read_string(&ak->user, f));
+ SAFE(read_string(&ak->host, f));
+ SAFE(read_string(&ak->by, f));
+ SAFE(read_string(&ak->reason, f));
+ SAFE(read_int32(&tmp32, f));
+ ak->seton = tmp32;
+ SAFE(read_int32(&tmp32, f));
+ ak->expires = tmp32;
+
+ slist_add(&akills, ak);
+ }
+ }
+
+ if (ver >= 11) {
+ SXLine *sx;
+
+ read_int16(&tmp16, f);
+ slist_setcapacity(&sglines, tmp16);
+
+ for (i = 0; i < sglines.capacity; i++) {
+ sx = scalloc(sizeof(SXLine), 1);
+
+ SAFE(read_string(&sx->mask, f));
+ SAFE(read_string(&sx->by, f));
+ SAFE(read_string(&sx->reason, f));
+ SAFE(read_int32(&tmp32, f));
+ sx->seton = tmp32;
+ SAFE(read_int32(&tmp32, f));
+ sx->expires = tmp32;
+
+ slist_add(&sglines, sx);
+ }
+
+ if (ver >= 13) {
+ read_int16(&tmp16, f);
+ slist_setcapacity(&sqlines, tmp16);
+
+ for (i = 0; i < sqlines.capacity; i++) {
+ sx = scalloc(sizeof(SXLine), 1);
+
+ SAFE(read_string(&sx->mask, f));
+ SAFE(read_string(&sx->by, f));
+ SAFE(read_string(&sx->reason, f));
+ SAFE(read_int32(&tmp32, f));
+ sx->seton = tmp32;
+ SAFE(read_int32(&tmp32, f));
+ sx->expires = tmp32;
+
+ slist_add(&sqlines, sx);
+ }
+ }
+
+ read_int16(&tmp16, f);
+ slist_setcapacity(&szlines, tmp16);
+
+ for (i = 0; i < szlines.capacity; i++) {
+ sx = scalloc(sizeof(SXLine), 1);
+
+ SAFE(read_string(&sx->mask, f));
+ SAFE(read_string(&sx->by, f));
+ SAFE(read_string(&sx->reason, f));
+ SAFE(read_int32(&tmp32, f));
+ sx->seton = tmp32;
+ SAFE(read_int32(&tmp32, f));
+ sx->expires = tmp32;
+
+ slist_add(&szlines, sx);
+ }
+ }
+
+ if (ver >= 12) {
+ for (i = 0; i < 1024 && !failed; i++) {
+ hclast = &hcache[i];
+ hcprev = NULL;
+
+ while ((c = getc_db(f)) != 0) {
+ if (c != 1)
+ fatal("Invalid format in %s", OperDBName);
+
+ hc = scalloc(1, sizeof(HostCache));
+
+ SAFE(read_string(&hc->host, f));
+ SAFE(read_int16(&tmp16, f));
+ hc->status = tmp16;
+ SAFE(read_int32(&tmp32, f));
+ hc->used = tmp32;
+
+ *hclast = hc;
+ hclast = &hc->next;
+ hc->prev = hcprev;
+ hcprev = hc;
+ } /* while (getc_db(f) != 0) */
+
+ *hclast = NULL;
+ } /* for (i) */
+ }
+
+ close_db(f);
+
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+/* Save OperServ data. */
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ restore_db(f); \
+ log_perror("Write error on %s", OperDBName); \
+ if (time(NULL) - lastwarn > WarningTimeout) { \
+ wallops(NULL, "Write error on %s: %s", OperDBName, \
+ strerror(errno)); \
+ lastwarn = time(NULL); \
+ } \
+ return; \
+ } \
+} while (0)
+
+void save_os_dbase(void)
+{
+ int i;
+ dbFILE *f;
+ static time_t lastwarn = 0;
+ Akill *ak;
+ SXLine *sx;
+ HostCache *hc;
+
+ if (!(f = open_db(s_OperServ, OperDBName, "w", OPER_VERSION)))
+ return;
+ SAFE(write_int32(maxusercnt, f));
+ SAFE(write_int32(maxusertime, f));
+
+ SAFE(write_int16(akills.count, f));
+ for (i = 0; i < akills.count; i++) {
+ ak = akills.list[i];
+
+ SAFE(write_string(ak->user, f));
+ SAFE(write_string(ak->host, f));
+ SAFE(write_string(ak->by, f));
+ SAFE(write_string(ak->reason, f));
+ SAFE(write_int32(ak->seton, f));
+ SAFE(write_int32(ak->expires, f));
+ }
+
+ SAFE(write_int16(sglines.count, f));
+ for (i = 0; i < sglines.count; i++) {
+ sx = sglines.list[i];
+
+ SAFE(write_string(sx->mask, f));
+ SAFE(write_string(sx->by, f));
+ SAFE(write_string(sx->reason, f));
+ SAFE(write_int32(sx->seton, f));
+ SAFE(write_int32(sx->expires, f));
+ }
+
+ SAFE(write_int16(sqlines.count, f));
+ for (i = 0; i < sqlines.count; i++) {
+ sx = sqlines.list[i];
+
+ SAFE(write_string(sx->mask, f));
+ SAFE(write_string(sx->by, f));
+ SAFE(write_string(sx->reason, f));
+ SAFE(write_int32(sx->seton, f));
+ SAFE(write_int32(sx->expires, f));
+ }
+
+ SAFE(write_int16(szlines.count, f));
+ for (i = 0; i < szlines.count; i++) {
+ sx = szlines.list[i];
+
+ SAFE(write_string(sx->mask, f));
+ SAFE(write_string(sx->by, f));
+ SAFE(write_string(sx->reason, f));
+ SAFE(write_int32(sx->seton, f));
+ SAFE(write_int32(sx->expires, f));
+ }
+
+ for (i = 0; i < 1024; i++) {
+ for (hc = hcache[i]; hc; hc = hc->next) {
+ /* Don't save in-progress scans */
+ if (hc->status < HC_NORMAL)
+ continue;
+
+ SAFE(write_int8(1, f));
+
+ SAFE(write_string(hc->host, f));
+ SAFE(write_int16(hc->status, f));
+ SAFE(write_int32(hc->used, f));
+
+ } /* for (hc) */
+ SAFE(write_int8(0, f));
+ } /* for (i) */
+
+ close_db(f);
+
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+void save_os_rdb_dbase(void)
+{
+#ifdef USE_RDB
+ if (!rdb_open())
+ return;
+ rdb_save_os_db(maxusercnt, maxusertime, &akills, &sglines, &sqlines,
+ &szlines, hcache[0]);
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+
+/* Removes the nick structure from OperServ lists. */
+
+void os_remove_nick(NickCore * nc)
+{
+ slist_remove(&servadmins, nc);
+ slist_remove(&servopers, nc);
+}
+
+/*************************************************************************/
+
+/* Does the given user have Services root privileges?
+ Now enhanced. */
+
+int is_services_root(User * u)
+{
+ if ((NSStrictPrivileges && !is_oper(u))
+ || (!skeleton && !nick_identified(u)))
+ return 0;
+ if (skeleton || (u->na->nc->flags & NI_SERVICES_ROOT))
+ return 1;
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Does the given user have Services admin privileges? */
+
+int is_services_admin(User * u)
+{
+ if ((NSStrictPrivileges && !is_oper(u))
+ || (!skeleton && !nick_identified(u)))
+ return 0;
+ if (skeleton
+ || (u->na->nc->flags & (NI_SERVICES_ADMIN | NI_SERVICES_ROOT)))
+ return 1;
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Does the given user have Services oper privileges? */
+
+int is_services_oper(User * u)
+{
+ if ((NSStrictPrivileges && !is_oper(u))
+ || (!skeleton && !nick_identified(u)))
+ return 0;
+ if (skeleton
+ || (u->na->nc->
+ flags & (NI_SERVICES_OPER | NI_SERVICES_ADMIN |
+ NI_SERVICES_ROOT)))
+ return 1;
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Is the given nick a Services admin/root nick? */
+
+int nick_is_services_admin(NickCore * nc)
+{
+ if (nc->flags & (NI_SERVICES_ADMIN | NI_SERVICES_ROOT))
+ return 1;
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Is the given nick a Services oper/admin/root nick? */
+
+int nick_is_services_oper(NickCore * nc)
+{
+ if (nc->
+ flags & (NI_SERVICES_OPER | NI_SERVICES_ADMIN | NI_SERVICES_ROOT))
+ return 1;
+
+ return 0;
+}
+
+/*************************************************************************/
+/**************************** Clone detection ****************************/
+/*************************************************************************/
+
+/* We just got a new user; does it look like a clone? If so, send out a
+ * wallops.
+ */
+
+void check_clones(User * user)
+{
+#ifndef STREAMLINED
+ int i, clone_count;
+ long last_time;
+
+ if (!CheckClones)
+ return;
+
+ if (clonelist[0].host)
+ free(clonelist[0].host);
+ i = CLONE_DETECT_SIZE - 1;
+ memmove(clonelist, clonelist + 1, sizeof(struct clone) * i);
+ clonelist[i].host = sstrdup(GetHost(user));
+ last_time = clonelist[i].time = time(NULL);
+ clone_count = 1;
+ while (--i >= 0 && clonelist[i].host) {
+ if (clonelist[i].time < last_time - CloneMaxDelay)
+ break;
+ if (stricmp(clonelist[i].host, GetHost(user)) == 0) {
+ ++clone_count;
+ last_time = clonelist[i].time;
+ if (clone_count >= CloneMinUsers)
+ break;
+ }
+ }
+ if (clone_count >= CloneMinUsers) {
+ /* Okay, we have clones. Check first to see if we already know
+ * about them. */
+ for (i = CLONE_DETECT_SIZE - 1; i >= 0 && warnings[i].host; --i) {
+ if (stricmp(warnings[i].host, GetHost(user)) == 0)
+ break;
+ }
+ if (i < 0
+ || warnings[i].time < user->my_signon - CloneWarningDelay) {
+ /* Send out the warning, and note it. */
+ wallops(s_OperServ,
+ "\2WARNING\2 - possible clones detected from %s",
+ GetHost(user));
+ alog("%s: possible clones detected from %s", s_OperServ,
+ GetHost(user));
+ i = CLONE_DETECT_SIZE - 1;
+ if (warnings[0].host)
+ free(warnings[0].host);
+ memmove(warnings, warnings + 1, sizeof(struct clone) * i);
+ warnings[i].host = sstrdup(GetHost(user));
+ warnings[i].time = clonelist[i].time;
+ if (KillClones)
+ kill_user(s_OperServ, user->nick, "Clone kill");
+ }
+ }
+#endif /* !STREAMLINED */
+}
+
+/*************************************************************************/
+
+#ifdef DEBUG_COMMANDS
+
+/* Send clone arrays to given nick. */
+
+static void send_clone_lists(User * u)
+{
+ int i;
+
+ if (!CheckClones) {
+ notice(s_OperServ, u->nick, "CheckClones not enabled.");
+ return;
+ }
+
+ notice(s_OperServ, u->nick, "clonelist[]");
+ for (i = 0; i < CLONE_DETECT_SIZE; i++) {
+ if (clonelist[i].host)
+ notice(s_OperServ, u->nick, " %10ld %s", clonelist[i].time,
+ clonelist[i].host ? clonelist[i].host : "(null)");
+ }
+ notice(s_OperServ, u->nick, "warnings[]");
+ for (i = 0; i < CLONE_DETECT_SIZE; i++) {
+ if (clonelist[i].host)
+ notice(s_OperServ, u->nick, " %10ld %s", warnings[i].time,
+ warnings[i].host ? warnings[i].host : "(null)");
+ }
+}
+
+#endif /* DEBUG_COMMANDS */
+
+/*************************************************************************/
+/*********************** OperServ command functions **********************/
+/*************************************************************************/
+
+/* HELP command. */
+
+static int do_help(User * u)
+{
+ const char *cmd = strtok(NULL, "");
+
+ if (!cmd) {
+ notice_help(s_OperServ, u, OPER_HELP);
+ if (is_services_oper(u))
+ notice_help(s_OperServ, u, OPER_HELP_OPER_CMD);
+ if (is_services_admin(u))
+ notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD);
+#ifdef USE_MODULES
+ if (is_services_root(u))
+ notice_help(s_OperServ, u, OPER_HELP_ROOT_CMD);
+#endif
+ moduleDisplayHelp(5, u);
+ notice_help(s_OperServ, u, OPER_HELP_LOGGED);
+ } else {
+ mod_help_cmd(s_OperServ, u, OPERSERV, cmd);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Global notice sending via GlobalNoticer. */
+/* Added name tag for globalmsg -Certus */
+
+static int do_global(User * u)
+{
+ char *msg = strtok(NULL, "");
+
+ if (!msg) {
+ syntax_error(s_OperServ, u, "GLOBAL", OPER_GLOBAL_SYNTAX);
+ return MOD_CONT;
+ }
+ if (WallOSGlobal)
+ wallops(s_OperServ, "\2%s\2 just used GLOBAL command.", u->nick);
+ oper_global(u->nick, msg);
+ return MOD_CONT;
+}
+
+void oper_global(char *nick, char *fmt, ...)
+{
+ va_list args;
+ char msg[2048]; /* largest valid message is 512, this should cover any global */
+ int i;
+
+ va_start(args, fmt);
+ vsnprintf(msg, sizeof(msg), fmt, args);
+ va_end(args);
+
+#ifdef IRC_HYBRID
+ if (DomainNumber > 0) {
+ for (i = 0; i < DomainNumber; i++) {
+ if ((nick) && (!AnonymousGlobal)) {
+ send_cmd(s_GlobalNoticer, "NOTICE $$*.%s :[%s] %s",
+ NetworkDomains[i], nick, msg);
+ } else {
+ send_cmd(s_GlobalNoticer, "NOTICE $$*.%s :%s",
+ NetworkDomains[i], msg);
+ }
+ }
+ } else {
+ /* Go through all common top-level domains. If you have others,
+ * add them here.
+ */
+ if ((nick) && (!AnonymousGlobal)) {
+ notice(s_GlobalNoticer, "$$*.com", "[%s] %s", nick, msg);
+ notice(s_GlobalNoticer, "$$*.net", "[%s] %s", nick, msg);
+ notice(s_GlobalNoticer, "$$*.org", "[%s] %s", nick, msg);
+ notice(s_GlobalNoticer, "$$*.edu", "[%s] %s", nick, msg);
+ } else {
+ notice(s_GlobalNoticer, "$$*.com", "%s", msg);
+ notice(s_GlobalNoticer, "$$*.net", "%s", msg);
+ notice(s_GlobalNoticer, "$$*.org", "%s", msg);
+ notice(s_GlobalNoticer, "$$*.edu", "%s", msg);
+ }
+ }
+#else
+ if (DomainNumber > 0) {
+ for (i = 0; i < DomainNumber; i++) {
+ if ((nick) && (!AnonymousGlobal)) {
+ send_cmd(s_GlobalNoticer, "NOTICE $*.%s :[%s] %s",
+ NetworkDomains[i], nick, msg);
+ } else {
+ send_cmd(s_GlobalNoticer, "NOTICE $*.%s :%s",
+ NetworkDomains[i], msg);
+ }
+ }
+ } else {
+ /* Go through all common top-level domains. If you have others,
+ * add them here.
+ */
+ if ((nick) && (!AnonymousGlobal)) {
+ notice(s_GlobalNoticer, "$*.com", "[%s] %s", nick, msg);
+ notice(s_GlobalNoticer, "$*.net", "[%s] %s", nick, msg);
+ notice(s_GlobalNoticer, "$*.org", "[%s] %s", nick, msg);
+ notice(s_GlobalNoticer, "$*.edu", "[%s] %s", nick, msg);
+ } else {
+ notice(s_GlobalNoticer, "$*.com", "%s", msg);
+ notice(s_GlobalNoticer, "$*.net", "%s", msg);
+ notice(s_GlobalNoticer, "$*.org", "%s", msg);
+ notice(s_GlobalNoticer, "$*.edu", "%s", msg);
+ }
+ }
+#endif
+}
+
+/*************************************************************************/
+
+/* STATS command. */
+
+static int do_stats(User * u)
+{
+ time_t uptime = time(NULL) - start_time;
+ char *extra = strtok(NULL, "");
+ int days = uptime / 86400, hours = (uptime / 3600) % 24,
+ mins = (uptime / 60) % 60, secs = uptime % 60;
+ struct tm *tm;
+ char timebuf[64];
+
+ if (extra && stricmp(extra, "ALL") != 0) {
+ if (stricmp(extra, "AKILL") == 0) {
+ int timeout;
+ /* AKILLs */
+ notice_lang(s_OperServ, u, OPER_STATS_AKILL_COUNT,
+ akills.count);
+ timeout = AutokillExpiry + 59;
+ if (timeout >= 172800)
+ notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_DAYS,
+ timeout / 86400);
+ else if (timeout >= 86400)
+ notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_DAY);
+ else if (timeout >= 7200)
+ notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_HOURS,
+ timeout / 3600);
+ else if (timeout >= 3600)
+ notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_HOUR);
+ else if (timeout >= 120)
+ notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_MINS,
+ timeout / 60);
+ else if (timeout >= 60)
+ notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_MIN);
+ else
+ notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_NONE);
+#ifdef IRC_BAHAMUT
+ /* SGLINEs */
+ notice_lang(s_OperServ, u, OPER_STATS_SGLINE_COUNT,
+ sglines.count);
+ timeout = SGLineExpiry + 59;
+ if (timeout >= 172800)
+ notice_lang(s_OperServ, u, OPER_STATS_SGLINE_EXPIRE_DAYS,
+ timeout / 86400);
+ else if (timeout >= 86400)
+ notice_lang(s_OperServ, u, OPER_STATS_SGLINE_EXPIRE_DAY);
+ else if (timeout >= 7200)
+ notice_lang(s_OperServ, u, OPER_STATS_SGLINE_EXPIRE_HOURS,
+ timeout / 3600);
+ else if (timeout >= 3600)
+ notice_lang(s_OperServ, u, OPER_STATS_SGLINE_EXPIRE_HOUR);
+ else if (timeout >= 120)
+ notice_lang(s_OperServ, u, OPER_STATS_SGLINE_EXPIRE_MINS,
+ timeout / 60);
+ else if (timeout >= 60)
+ notice_lang(s_OperServ, u, OPER_STATS_SGLINE_EXPIRE_MIN);
+ else
+ notice_lang(s_OperServ, u, OPER_STATS_SGLINE_EXPIRE_NONE);
+#endif
+ /* SQLINEs */
+ notice_lang(s_OperServ, u, OPER_STATS_SQLINE_COUNT,
+ sqlines.count);
+ timeout = SQLineExpiry + 59;
+ if (timeout >= 172800)
+ notice_lang(s_OperServ, u, OPER_STATS_SQLINE_EXPIRE_DAYS,
+ timeout / 86400);
+ else if (timeout >= 86400)
+ notice_lang(s_OperServ, u, OPER_STATS_SQLINE_EXPIRE_DAY);
+ else if (timeout >= 7200)
+ notice_lang(s_OperServ, u, OPER_STATS_SQLINE_EXPIRE_HOURS,
+ timeout / 3600);
+ else if (timeout >= 3600)
+ notice_lang(s_OperServ, u, OPER_STATS_SQLINE_EXPIRE_HOUR);
+ else if (timeout >= 120)
+ notice_lang(s_OperServ, u, OPER_STATS_SQLINE_EXPIRE_MINS,
+ timeout / 60);
+ else if (timeout >= 60)
+ notice_lang(s_OperServ, u, OPER_STATS_SQLINE_EXPIRE_MIN);
+ else
+ notice_lang(s_OperServ, u, OPER_STATS_SQLINE_EXPIRE_NONE);
+#ifdef IRC_BAHAMUT
+ /* SZLINEs */
+ notice_lang(s_OperServ, u, OPER_STATS_SZLINE_COUNT,
+ szlines.count);
+ timeout = SZLineExpiry + 59;
+ if (timeout >= 172800)
+ notice_lang(s_OperServ, u, OPER_STATS_SZLINE_EXPIRE_DAYS,
+ timeout / 86400);
+ else if (timeout >= 86400)
+ notice_lang(s_OperServ, u, OPER_STATS_SZLINE_EXPIRE_DAY);
+ else if (timeout >= 7200)
+ notice_lang(s_OperServ, u, OPER_STATS_SZLINE_EXPIRE_HOURS,
+ timeout / 3600);
+ else if (timeout >= 3600)
+ notice_lang(s_OperServ, u, OPER_STATS_SZLINE_EXPIRE_HOUR);
+ else if (timeout >= 120)
+ notice_lang(s_OperServ, u, OPER_STATS_SZLINE_EXPIRE_MINS,
+ timeout / 60);
+ else if (timeout >= 60)
+ notice_lang(s_OperServ, u, OPER_STATS_SZLINE_EXPIRE_MIN);
+ else
+ notice_lang(s_OperServ, u, OPER_STATS_SZLINE_EXPIRE_NONE);
+#endif
+ return MOD_CONT;
+ } else if (!stricmp(extra, "RESET")) {
+ if (is_services_admin(u)) {
+ maxusercnt = usercnt;
+ notice_lang(s_OperServ, u, OPER_STATS_RESET);
+ } else {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ }
+ return MOD_CONT;
+ } else {
+ notice_lang(s_OperServ, u, OPER_STATS_UNKNOWN_OPTION, extra);
+ }
+ }
+
+ notice_lang(s_OperServ, u, OPER_STATS_CURRENT_USERS, usercnt, opcnt);
+ tm = localtime(&maxusertime);
+ strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_DATE_TIME_FORMAT,
+ tm);
+ notice_lang(s_OperServ, u, OPER_STATS_MAX_USERS, maxusercnt, timebuf);
+ if (days > 1) {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_DHMS,
+ days, hours, mins, secs);
+ } else if (days == 1) {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1DHMS,
+ days, hours, mins, secs);
+ } else {
+ if (hours > 1) {
+ if (mins != 1) {
+ if (secs != 1) {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_HMS,
+ hours, mins, secs);
+ } else {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_HM1S,
+ hours, mins, secs);
+ }
+ } else {
+ if (secs != 1) {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_H1MS,
+ hours, mins, secs);
+ } else {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_H1M1S,
+ hours, mins, secs);
+ }
+ }
+ } else if (hours == 1) {
+ if (mins != 1) {
+ if (secs != 1) {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1HMS,
+ hours, mins, secs);
+ } else {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1HM1S,
+ hours, mins, secs);
+ }
+ } else {
+ if (secs != 1) {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1H1MS,
+ hours, mins, secs);
+ } else {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1H1M1S,
+ hours, mins, secs);
+ }
+ }
+ } else {
+ if (mins != 1) {
+ if (secs != 1) {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_MS,
+ mins, secs);
+ } else {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_M1S,
+ mins, secs);
+ }
+ } else {
+ if (secs != 1) {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1MS,
+ mins, secs);
+ } else {
+ notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1M1S,
+ mins, secs);
+ }
+ }
+ }
+ }
+
+ if (extra && stricmp(extra, "ALL") == 0 && is_services_admin(u)) {
+ long count, mem;
+
+ notice_lang(s_OperServ, u, OPER_STATS_BYTES_READ,
+ total_read / 1024);
+ notice_lang(s_OperServ, u, OPER_STATS_BYTES_WRITTEN,
+ total_written / 1024);
+
+ get_user_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_USER_MEM, count,
+ (mem + 512) / 1024);
+ get_channel_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_CHANNEL_MEM, count,
+ (mem + 512) / 1024);
+ get_core_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_GROUPS_MEM, count,
+ (mem + 512) / 1024);
+ get_aliases_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_ALIASES_MEM, count,
+ (mem + 512) / 1024);
+ get_chanserv_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_CHANSERV_MEM, count,
+ (mem + 512) / 1024);
+ get_botserv_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_BOTSERV_MEM, count,
+ (mem + 512) / 1024);
+ get_operserv_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_OPERSERV_MEM, count,
+ (mem + 512) / 1024);
+ get_session_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_SESSIONS_MEM, count,
+ (mem + 512) / 1024);
+#ifdef USE_THREADS
+ if (ProxyDetect) {
+ get_proxy_stats(&count, &mem);
+ notice_lang(s_OperServ, u, OPER_STATS_PROXY_MEM, count,
+ (mem + 512) / 1024);
+ }
+#endif
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* make Services ignore users for a certain time */
+
+static int do_ignoreuser(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ int t;
+
+ if (!cmd) {
+ notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (!stricmp(cmd, "ADD")) {
+
+ char *time = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+ char *rest = strtok(NULL, "");
+
+ if (!nick) {
+ notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
+ return MOD_CONT;
+ } else if (!time) {
+ notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
+ return MOD_CONT;
+ } else {
+ t = dotime(time);
+ rest = NULL;
+
+ if (t <= -1) {
+ notice_lang(s_OperServ, u, OPER_IGNORE_VALID_TIME);
+ return MOD_CONT;
+ } else if (t == 0) {
+ t = 157248000; /* if 0 is given, we set time to 157248000 seconds == 5 years (let's hope the next restart will be before that time ;-)) */
+ add_ignore(nick, t);
+ notice_lang(s_OperServ, u, OPER_IGNORE_PERM_DONE, nick);
+ } else {
+ add_ignore(nick, t);
+ notice_lang(s_OperServ, u, OPER_IGNORE_TIME_DONE, nick,
+ time);
+ }
+ }
+ } else if (!stricmp(cmd, "LIST")) {
+ do_ignorelist(u);
+ }
+
+ else if (!stricmp(cmd, "DEL")) {
+ char *nick = strtok(NULL, " ");
+ if (!nick) {
+ notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
+ } else {
+ if (get_ignore(nick) == 0) {
+ notice_lang(s_OperServ, u, OPER_IGNORE_LIST_NOMATCH, nick);
+ return MOD_CONT;
+ } else {
+ delete_ignore(nick);
+ notice_lang(s_OperServ, u, OPER_IGNORE_DEL_DONE, nick);
+ }
+ }
+ } else if (!stricmp(cmd, "CLEAR")) {
+ do_clearignore(u);
+
+ } else
+ notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* deletes a nick from the ignore list */
+
+void delete_ignore(const char *nick)
+{
+ IgnoreData *ign, *prev;
+ IgnoreData **whichlist = &ignore[tolower(nick[0])];
+
+ for (ign = *whichlist, prev = NULL; ign; prev = ign, ign = ign->next) {
+ if (stricmp(ign->who, nick) == 0)
+ break;
+ }
+ if (prev)
+ prev->next = ign->next;
+ else
+ *whichlist = ign->next;
+ free(ign);
+ ign = NULL;
+}
+
+/*************************************************************************/
+
+/* shows the Services ignore list */
+
+static int do_ignorelist(User * u)
+{
+ int sent_header = 0;
+ IgnoreData *id;
+ int i;
+
+ for (i = 0; i < 256; i++) {
+ for (id = ignore[i]; id; id = id->next) {
+ if (!sent_header) {
+ notice_lang(s_OperServ, u, OPER_IGNORE_LIST);
+ sent_header = 1;
+ }
+ notice(s_OperServ, u->nick, "%s", id->who);
+ }
+ }
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_IGNORE_LIST_EMPTY);
+ return MOD_CONT;
+}
+
+/**************************************************************************/
+/* Cleares the Services ignore list */
+
+static int do_clearignore(User * u)
+{
+ IgnoreData *id = NULL, *next = NULL;
+ int i;
+ for (i = 0; i < 256; i++) {
+ for (id = ignore[i]; id; id = next) {
+ next = id->next;
+ free(id);
+ if (!next) {
+ ignore[i] = NULL;
+ }
+ }
+ }
+ notice_lang(s_OperServ, u, OPER_IGNORE_LIST_CLEARED);
+ return MOD_CONT;
+}
+
+/**************************************************************************/
+
+/* Channel mode changing (MODE command). */
+
+static int do_os_mode(User * u)
+{
+ int ac;
+ char **av;
+ char *chan = strtok(NULL, " "), *modes = strtok(NULL, "");
+ Channel *c;
+
+ if (!chan || !modes) {
+ syntax_error(s_OperServ, u, "MODE", OPER_MODE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (!(c = findchan(chan))) {
+ notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (c->bouncy_modes) {
+ notice_lang(s_OperServ, u, OPER_BOUNCY_MODES_U_LINE);
+ return MOD_CONT;
+#ifdef CMODE_A
+ } else if ((!is_services_admin(u)) && (c->mode & CMODE_A)) {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+#endif
+ } else {
+ send_cmd(s_OperServ, "MODE %s %s", chan, modes);
+
+ ac = split_buf(modes, &av, 1);
+ chan_set_modes(s_OperServ, c, ac, av, 0);
+
+ if (WallOSMode)
+ wallops(s_OperServ, "%s used MODE %s on %s", u->nick, modes,
+ chan);
+ }
+ return MOD_CONT;
+}
+
+/**************************************************************************/
+
+/**
+ * Change any user's UMODES
+ *
+ * modified to be part of the SuperAdmin directive -jester
+ * check user flag for SuperAdmin -rob
+ */
+#ifdef USE_OSSVS
+#ifndef IRC_HYBRID
+static int do_operumodes(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *modes = strtok(NULL, "");
+
+ User *u2;
+
+ /* Only allow this if SuperAdmin is enabled */
+ if (!u->isSuperAdmin) {
+ notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ONLY);
+ return MOD_CONT;
+ }
+
+ if (!nick || !modes) {
+ syntax_error(s_OperServ, u, "UMODE", OPER_UMODE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ /**
+ * Only accept a +/- mode string
+ *-rob
+ **/
+ if ((modes[0] != '+') && (modes[0] != '-')) {
+ syntax_error(s_OperServ, u, "UMODE", OPER_UMODE_SYNTAX);
+ return MOD_CONT;
+ }
+ if (!(u2 = finduser(nick))) {
+ notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick);
+ } else {
+ send_cmd(s_OperServ, "MODE %s %s", nick, modes);
+
+ change_user_mode(u2, modes, NULL);
+
+ notice_lang(s_OperServ, u, OPER_UMODE_SUCCESS, nick);
+ notice_lang(s_OperServ, u2, OPER_UMODE_CHANGED, u->nick);
+
+ if (WallOSMode)
+ wallops(s_OperServ, "\2%s\2 used UMODE on %s", u->nick, nick);
+ }
+ return MOD_CONT;
+}
+#endif
+#endif
+/**************************************************************************/
+
+/**
+ * give Operflags to any user
+ *
+ * modified to be part of the SuperAdmin directive -jester
+ * check u-> for SuperAdmin -rob
+ */
+#if defined (IRC_UNREAL) && defined (USE_OSSVS)
+
+static int do_operoline(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *flags = strtok(NULL, "");
+ User *u2 = NULL;
+
+ /* Only allow this if SuperAdmin is enabled */
+ if (!u->isSuperAdmin) {
+ notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ONLY);
+ return MOD_CONT;
+ }
+
+ if (!nick || !flags) {
+ syntax_error(s_OperServ, u, "OLINE", OPER_OLINE_SYNTAX);
+ return MOD_CONT;
+ } else {
+ u2 = finduser(nick);
+
+/* let's check whether the user is online */
+
+ if (!finduser(nick)) {
+ notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick);
+ } else if (u2 && flags[0] == '+') {
+ send_cmd(s_OperServ, "SVSO %s %s", nick, flags);
+ send_cmd(s_OperServ, "MODE %s +o", nick);
+ change_user_mode(u2, "+o", NULL);
+ notice_lang(s_OperServ, u2, OPER_OLINE_IRCOP);
+ notice_lang(s_OperServ, u, OPER_OLINE_SUCCESS, flags, nick);
+ wallops(s_OperServ, "\2%s\2 used OLINE for %s", u->nick, nick);
+ } else if (u2 && flags[0] == '-') {
+ send_cmd(s_OperServ, "SVSO %s %s", nick, flags);
+ notice_lang(s_OperServ, u, OPER_OLINE_SUCCESS, flags, nick);
+ wallops(s_OperServ, "\2%s\2 used OLINE for %s", u->nick, nick);
+ } else
+ syntax_error(s_OperServ, u, "OLINE", OPER_OLINE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+#endif
+/*************************************************************************/
+
+/* Clear all modes from a channel. */
+
+static int do_clearmodes(User * u)
+{
+ char *s;
+ int i;
+ char *argv[2];
+ char *chan = strtok(NULL, " ");
+ Channel *c;
+ int all = 0;
+ int count; /* For saving ban info */
+ char **bans; /* For saving ban info */
+#if defined (IRC_ULTIMATE) || defined (IRC_UNREAL) || defined (IRC_ULTIMATE3) ||defined (IRC_VIAGRA)
+ int exceptcount; /* For saving except info */
+ char **excepts; /* For saving except info */
+#endif
+ struct c_userlist *cu, *next;
+
+ if (!chan) {
+ syntax_error(s_OperServ, u, "CLEARMODES", OPER_CLEARMODES_SYNTAX);
+ } else if (!(c = findchan(chan))) {
+ notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (c->bouncy_modes) {
+ notice_lang(s_OperServ, u, OPER_BOUNCY_MODES_U_LINE);
+ return MOD_CONT;
+ } else {
+ s = strtok(NULL, " ");
+ if (s) {
+ if (stricmp(s, "ALL") == 0) {
+ all = 1;
+ } else {
+ syntax_error(s_OperServ, u, "CLEARMODES",
+ OPER_CLEARMODES_SYNTAX);
+ return MOD_CONT;
+ }
+ }
+
+ if (WallOSClearmodes)
+ wallops(s_OperServ, "%s used CLEARMODES%s on %s", u->nick,
+ all ? " ALL" : "", chan);
+
+ if (all) {
+ /* Clear mode +o */
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+
+ if (!chan_has_user_status(c, cu->user, CUS_OP))
+ continue;
+
+ argv[0] = sstrdup("-o");
+ argv[1] = cu->user->nick;
+
+ send_cmd(s_OperServ, "MODE %s -o %s", c->name,
+ cu->user->nick);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+
+ free(argv[0]);
+ }
+
+ /* Clear mode +v */
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+
+ if (!chan_has_user_status(c, cu->user, CUS_VOICE))
+ continue;
+
+ argv[0] = sstrdup("-v");
+ argv[1] = sstrdup(cu->user->nick);
+
+ send_cmd(s_OperServ, "MODE %s -v %s", c->name,
+ cu->user->nick);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+
+ free(argv[0]);
+ }
+#ifdef HAS_HALFOP
+ /* Clear mode +h */
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+
+ if (!chan_has_user_status(c, cu->user, CUS_HALFOP))
+ continue;
+
+ argv[0] = sstrdup("-h");
+ argv[1] = sstrdup(cu->user->nick);
+
+ send_cmd(s_OperServ, "MODE %s -h %s", c->name,
+ cu->user->nick);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+
+ free(argv[0]);
+ }
+#endif
+ }
+
+ /* Clear modes */
+ send_cmd(s_OperServ, "MODE %s %s %s", c->name, MODESTOREMOVE,
+ c->key ? c->key : "");
+ argv[0] = sstrdup(MODESTOREMOVE);
+ argv[1] = c->key ? c->key : NULL;
+ chan_set_modes(s_OperServ, c, c->key ? 2 : 1, argv, 0);
+ free(argv[0]);
+
+ /* Clear bans */
+ count = c->bancount;
+ bans = scalloc(sizeof(char *) * count, 1);
+
+ for (i = 0; i < count; i++)
+ bans[i] = sstrdup(c->bans[i]);
+
+ for (i = 0; i < count; i++) {
+ argv[0] = sstrdup("-b");
+ argv[1] = bans[i];
+ send_cmd(s_OperServ, "MODE %s -b %s", c->name, argv[1]);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[1]);
+ free(argv[0]);
+ }
+
+ free(bans);
+
+#if defined (IRC_ULTIMATE) || defined (IRC_UNREAL) || defined (IRC_ULTIMATE3) || defined (IRC_VIAGRA)
+ /* Clear excepts */
+ exceptcount = c->exceptcount;
+ excepts = scalloc(sizeof(char *) * exceptcount, 1);
+
+ for (i = 0; i < exceptcount; i++)
+ excepts[i] = sstrdup(c->excepts[i]);
+
+ for (i = 0; i < exceptcount; i++) {
+ argv[0] = sstrdup("-e");
+ argv[1] = excepts[i];
+ send_cmd(s_OperServ, "MODE %s -e %s", c->name, argv[1]);
+ chan_set_modes(s_OperServ, c, 2, argv, 0);
+ free(argv[1]);
+ free(argv[0]);
+ }
+
+ free(excepts);
+#endif
+ }
+
+ notice_lang(s_OperServ, u, OPER_CLEARMODES_ALL_DONE, chan);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Kick a user from a channel (KICK command). */
+
+static int do_os_kick(User * u)
+{
+ char *argv[3];
+ char *chan, *nick, *s;
+ Channel *c;
+
+ chan = strtok(NULL, " ");
+ nick = strtok(NULL, " ");
+ s = strtok(NULL, "");
+ if (!chan || !nick || !s) {
+ syntax_error(s_OperServ, u, "KICK", OPER_KICK_SYNTAX);
+ return MOD_CONT;
+ }
+ if (!(c = findchan(chan))) {
+ notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, chan);
+ } else if (c->bouncy_modes) {
+ notice_lang(s_OperServ, u, OPER_BOUNCY_MODES_U_LINE);
+ return MOD_CONT;
+ }
+ send_cmd(s_OperServ, "KICK %s %s :%s (%s)", chan, nick, u->nick, s);
+ if (WallOSKick)
+ wallops(s_OperServ, "%s used KICK on %s/%s", u->nick, nick, chan);
+ argv[0] = sstrdup(chan);
+ argv[1] = sstrdup(nick);
+ argv[2] = sstrdup(s);
+ do_kick(s_OperServ, 3, argv);
+ free(argv[2]);
+ free(argv[1]);
+ free(argv[0]);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Forcefully change a user's nickname */
+#ifdef USE_OSSVS
+
+static int do_svsnick(User * u)
+{
+ char *nick = strtok(NULL, " ");
+ char *newnick = strtok(NULL, " ");
+
+ NickAlias *na;
+ char *c;
+
+ /* Only allow this if SuperAdmin is enabled */
+ if (!u->isSuperAdmin) {
+ notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ONLY);
+ return MOD_CONT;
+ }
+
+ if (!nick || !newnick) {
+ syntax_error(s_OperServ, u, "SVSNICK", OPER_SVSNICK_SYNTAX);
+ return MOD_CONT;
+ }
+
+ /* Truncate long nicknames to NICKMAX-2 characters */
+ if (strlen(newnick) > (NICKMAX - 2)) {
+ notice_lang(s_NickServ, u, NICK_X_TRUNCATED,
+ newnick, NICKMAX - 2, newnick);
+ newnick[NICKMAX - 2] = '\0';
+ }
+
+ /* Check for valid characters */
+ if (*newnick == '-' || isdigit(*newnick)) {
+ notice_lang(s_OperServ, u, NICK_X_ILLEGAL, newnick);
+ return MOD_CONT;
+ }
+#define isvalid(c) (((c) >= 'A' && (c) <= '~') || isdigit(c) || (c) == '-')
+ for (c = newnick; *c && (c - newnick) < NICKMAX; c++) {
+ if (!isvalid(*c) || isspace(*c)) {
+ notice_lang(s_OperServ, u, NICK_X_ILLEGAL, nick);
+ return MOD_CONT;
+ }
+ }
+
+ /* Check for a nick in use or a forbidden/suspended nick */
+ if (!finduser(nick)) {
+ notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick);
+ } else if (finduser(newnick)) {
+ notice_lang(s_NickServ, u, NICK_X_IN_USE, newnick);
+ } else if ((na = findnick(newnick)) && (na->status & NS_VERBOTEN)) {
+ notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, newnick);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SVSNICK_NEWNICK, nick, newnick);
+ wallops(s_OperServ, "%s used SVSNICK to change %s to %s",
+ u->nick, nick, newnick);
+ send_cmd(NULL, "SVSNICK %s %s :%ld", nick, newnick, time(NULL));
+ }
+ return MOD_CONT;
+}
+#endif
+/*************************************************************************/
+
+/* Adds an AKILL to the list. Returns >= 0 on success, -1 if it fails, -2
+ * if only the expiry time was changed.
+ * The success result is the number of AKILLs that were deleted to successfully add one.
+ */
+
+int add_akill(User * u, char *mask, const char *by, const time_t expires,
+ const char *reason)
+{
+ int deleted = 0, i;
+ char *user, *mask2, *host;
+ Akill *entry;
+
+ /* Checks whether there is an AKILL that already covers
+ * the one we want to add, and whether there are AKILLs
+ * that would be covered by this one. The masks AND the
+ * expiry times are used to determine this, because some
+ * AKILLs may become useful when another one expires.
+ * If so, warn the user in the first case and cleanup
+ * the useless AKILLs in the second.
+ */
+
+ if (akills.count > 0) {
+
+ for (i = akills.count - 1; i >= 0; i--) {
+ char amask[BUFSIZE];
+
+ entry = akills.list[i];
+
+ if (!entry)
+ continue;
+
+ snprintf(amask, sizeof(amask), "%s@%s", entry->user,
+ entry->host);
+
+ if (!stricmp(amask, mask)) {
+ /* We change the AKILL expiry time if its current one is less than the new.
+ * This is preferable to be sure we don't change an important AKILL
+ * accidentely.
+ */
+ if (entry->expires >= expires || entry->expires == 0) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_AKILL_EXISTS,
+ mask);
+ return -1;
+ } else {
+ entry->expires = expires;
+ if (u)
+ notice_lang(s_OperServ, u, OPER_AKILL_CHANGED,
+ amask);
+ return -2;
+ }
+ }
+
+ if (match_wild_nocase(amask, mask)
+ && (entry->expires >= expires || entry->expires == 0)) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_AKILL_ALREADY_COVERED,
+ mask, amask);
+ return -1;
+ }
+
+ if (match_wild_nocase(mask, amask)
+ && (entry->expires <= expires || expires == 0)) {
+ slist_delete(&akills, i);
+ deleted++;
+ }
+ }
+
+ }
+
+ /* We can now check whether the list is full or not. */
+ if (slist_full(&akills)) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_AKILL_REACHED_LIMIT,
+ akills.limit);
+ return -1;
+ }
+
+ /* We can now (really) add the AKILL. */
+ mask2 = sstrdup(mask);
+ host = strchr(mask2, '@');
+ if (!host)
+ return -1;
+ user = mask2;
+ *host = 0;
+ host++;
+
+ entry = scalloc(sizeof(Akill), 1);
+ if (!entry)
+ return -1;
+
+ entry->user = sstrdup(user);
+ entry->host = sstrdup(host);
+ entry->by = sstrdup(by);
+ entry->reason = sstrdup(reason);
+ entry->seton = time(NULL);
+ entry->expires = expires;
+
+ slist_add(&akills, entry);
+
+ if (AkillOnAdd)
+ s_akill(entry->user, entry->host, entry->by, entry->seton,
+ entry->expires, entry->reason);
+
+ free(mask2);
+
+ return deleted;
+}
+
+/* Does the user match any AKILLs? */
+
+int check_akill(const char *nick, const char *username, const char *host,
+ const char *vhost, const char *ip)
+{
+ int i;
+ Akill *ak;
+
+ /**
+ * If DefCon is set to NO new users - kill the user ;).
+ **/
+ if (checkDefCon(DEFCON_NO_NEW_CLIENTS)) {
+ kill_user(s_OperServ, nick, DefConAkillReason);
+ return 1;
+ }
+
+ if (akills.count == 0)
+ return 0;
+
+ for (i = 0; i < akills.count; i++) {
+ ak = akills.list[i];
+ if (!ak)
+ continue;
+ if (match_wild_nocase(ak->user, username)
+ && (match_wild_nocase(ak->host, host)
+ || (vhost && match_wild_nocase(ak->host, vhost)))) {
+ s_akill(ak->user, ak->host, ak->by, ak->seton, ak->expires,
+ ak->reason);
+ return 1;
+ }
+#ifdef HAS_NICKIP
+ if (ip)
+ if (match_wild_nocase(ak->user, username)
+ && match_wild_nocase(ak->host, ip)) {
+ s_akill(ak->user, ak->host, ak->by, ak->seton, ak->expires,
+ ak->reason);
+ return 1;
+ }
+#endif
+
+ }
+
+ return 0;
+}
+
+/* Delete any expired autokills. */
+
+void expire_akills(void)
+{
+ int i;
+ time_t now = time(NULL);
+ Akill *ak;
+
+ for (i = akills.count - 1; i >= 0; i--) {
+ ak = akills.list[i];
+
+ if (!ak->expires || ak->expires > now)
+ continue;
+
+ if (WallAkillExpire)
+ wallops(s_OperServ, "AKILL on %s@%s has expired", ak->user,
+ ak->host);
+ slist_delete(&akills, i);
+ }
+}
+
+static void free_akill_entry(SList * slist, void *item)
+{
+ Akill *ak = item;
+
+ /* Remove the AKILLs from all the servers */
+ s_rakill(ak->user, ak->host);
+
+ /* Free the structure */
+ free(ak->user);
+ free(ak->host);
+ free(ak->by);
+ free(ak->reason);
+ free(ak);
+}
+
+/* item1 is not an Akill pointer, but a char
+ */
+
+static int is_akill_entry_equal(SList * slist, void *item1, void *item2)
+{
+ char *ak1 = item1, buf[BUFSIZE];
+ Akill *ak2 = item2;
+
+ if (!ak1 || !ak2)
+ return 0;
+
+ snprintf(buf, sizeof(buf), "%s@%s", ak2->user, ak2->host);
+
+ if (!stricmp(ak1, buf))
+ return 1;
+ else
+ return 0;
+}
+
+/* Lists an AKILL entry, prefixing it with the header if needed */
+
+static int akill_list(int number, Akill * ak, User * u, int *sent_header)
+{
+ char mask[BUFSIZE];
+
+ if (!ak)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_AKILL_LIST_HEADER);
+ *sent_header = 1;
+ }
+
+ snprintf(mask, sizeof(mask), "%s@%s", ak->user, ak->host);
+ notice_lang(s_OperServ, u, OPER_AKILL_LIST_FORMAT, number, mask,
+ ak->reason);
+
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int akill_list_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return akill_list(number, item, u, sent_header);
+}
+
+/* Lists an AKILL entry, prefixing it with the header if needed */
+
+static int akill_view(int number, Akill * ak, User * u, int *sent_header)
+{
+ char mask[BUFSIZE];
+ char timebuf[32], expirebuf[256];
+ struct tm tm;
+
+ if (!ak)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_AKILL_VIEW_HEADER);
+ *sent_header = 1;
+ }
+
+ snprintf(mask, sizeof(mask), "%s@%s", ak->user, ak->host);
+ tm = *localtime(&ak->seton);
+ strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT,
+ &tm);
+ expire_left(u->na, expirebuf, sizeof(expirebuf), ak->expires);
+ notice_lang(s_OperServ, u, OPER_AKILL_VIEW_FORMAT, number, mask,
+ ak->by, timebuf, expirebuf, ak->reason);
+
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int akill_view_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return akill_view(number, item, u, sent_header);
+}
+
+/* Manage the AKILL list. */
+
+static int do_akill(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ char breason[BUFSIZE];
+
+ if (!cmd)
+ cmd = "";
+
+ if (!stricmp(cmd, "ADD")) {
+ int deleted = 0;
+ char *expiry, *mask, *reason;
+ time_t expires;
+
+ mask = strtok(NULL, " ");
+ if (mask && *mask == '+') {
+ expiry = mask;
+ mask = strtok(NULL, " ");
+ } else {
+ expiry = NULL;
+ }
+
+ expires = expiry ? dotime(expiry) : AutokillExpiry;
+ /* If the expiry given does not contain a final letter, it's in days,
+ * said the doc. Ah well.
+ */
+ if (expiry && isdigit(expiry[strlen(expiry) - 1]))
+ expires *= 86400;
+ /* Do not allow less than a minute expiry time */
+ if (expires != 0 && expires < 60) {
+ notice_lang(s_OperServ, u, BAD_EXPIRY_TIME);
+ return MOD_CONT;
+ } else if (expires > 0) {
+ expires += time(NULL);
+ }
+
+ if (mask && (reason = strtok(NULL, ""))) {
+ /* We first do some sanity check on the proposed mask. */
+ if (strchr(mask, '!')) {
+ notice_lang(s_OperServ, u, OPER_AKILL_NO_NICK);
+ return MOD_CONT;
+ }
+
+ if (!strchr(mask, '@')) {
+ notice_lang(s_OperServ, u, BAD_USERHOST_MASK);
+ return MOD_CONT;
+ }
+
+ if (mask && strspn(mask, "~@.*?") == strlen(mask)) {
+ notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask);
+ return MOD_CONT;
+ }
+
+ /**
+ * Changed sprintf() to snprintf()and increased the size of
+ * breason to match bufsize
+ * -Rob
+ **/
+ if (AddAkiller) {
+ snprintf(breason, sizeof(breason), "[%s] %s", u->nick,
+ reason);
+ reason = sstrdup(breason);
+ }
+
+ deleted = add_akill(u, mask, u->nick, expires, reason);
+ if (deleted < 0)
+ return MOD_CONT;
+ else if (deleted)
+ notice_lang(s_OperServ, u, OPER_AKILL_DELETED_SEVERAL,
+ deleted);
+ notice_lang(s_OperServ, u, OPER_AKILL_ADDED, mask);
+
+ if (WallOSAkill) {
+ char buf[128];
+
+ if (!expires) {
+ strcpy(buf, "does not expire");
+ } else {
+ int wall_expiry = expires - time(NULL);
+ char *s = NULL;
+
+ if (wall_expiry >= 86400) {
+ wall_expiry /= 86400;
+ s = "day";
+ } else if (wall_expiry >= 3600) {
+ wall_expiry /= 3600;
+ s = "hour";
+ } else if (wall_expiry >= 60) {
+ wall_expiry /= 60;
+ s = "minute";
+ }
+
+ snprintf(buf, sizeof(buf), "expires in %d %s%s",
+ wall_expiry, s,
+ (wall_expiry == 1) ? "" : "s");
+ }
+
+ wallops(s_OperServ, "%s added an AKILL for %s (%s) (%s)",
+ u->nick, mask, reason, buf);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+
+ } else {
+ syntax_error(s_OperServ, u, "AKILL", OPER_AKILL_SYNTAX);
+ }
+
+ } else if (!stricmp(cmd, "DEL")) {
+
+ char *mask;
+ int res = 0;
+
+ mask = strtok(NULL, " ");
+
+ if (!mask) {
+ syntax_error(s_OperServ, u, "AKILL", OPER_AKILL_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (akills.count == 0) {
+ notice_lang(s_OperServ, u, OPER_AKILL_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) {
+ /* Deleting a range */
+ res = slist_delete_range(&akills, mask, NULL);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH);
+ return MOD_CONT;
+ } else if (res == 1) {
+ notice_lang(s_OperServ, u, OPER_AKILL_DELETED_ONE);
+ } else {
+ notice_lang(s_OperServ, u, OPER_AKILL_DELETED_SEVERAL,
+ res);
+ }
+ } else {
+ if ((res = slist_indexof(&akills, mask)) == -1) {
+ notice_lang(s_OperServ, u, OPER_AKILL_NOT_FOUND, mask);
+ return MOD_CONT;
+ }
+
+ slist_delete(&akills, res);
+ notice_lang(s_OperServ, u, OPER_AKILL_DELETED, mask);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+
+ } else if (!stricmp(cmd, "LIST")) {
+ char *mask;
+ int res, sent_header = 0;
+
+ if (akills.count == 0) {
+ notice_lang(s_OperServ, u, OPER_AKILL_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ mask = strtok(NULL, " ");
+
+ if (!mask || (isdigit(*mask)
+ && strspn(mask, "1234567890,-") == strlen(mask))) {
+ res =
+ slist_enum(&akills, mask, &akill_list_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH);
+ return MOD_CONT;
+ } else {
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Akill");
+ }
+ } else {
+ int i;
+ char amask[BUFSIZE];
+
+ for (i = 0; i < akills.count; i++) {
+ snprintf(amask, sizeof(amask), "%s@%s",
+ ((Akill *) akills.list[i])->user,
+ ((Akill *) akills.list[i])->host);
+ if (!stricmp(mask, amask)
+ || match_wild_nocase(mask, amask))
+ akill_list(i + 1, akills.list[i], u, &sent_header);
+ }
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH);
+ else {
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Akill");
+ }
+ }
+ } else if (!stricmp(cmd, "VIEW")) {
+ char *mask;
+ int res, sent_header = 0;
+
+ if (akills.count == 0) {
+ notice_lang(s_OperServ, u, OPER_AKILL_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ mask = strtok(NULL, " ");
+
+ if (!mask || (isdigit(*mask)
+ && strspn(mask, "1234567890,-") == strlen(mask))) {
+ res =
+ slist_enum(&akills, mask, &akill_view_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH);
+ return MOD_CONT;
+ }
+ } else {
+ int i;
+ char amask[BUFSIZE];
+
+ for (i = 0; i < akills.count; i++) {
+ snprintf(amask, sizeof(amask), "%s@%s",
+ ((Akill *) akills.list[i])->user,
+ ((Akill *) akills.list[i])->host);
+ if (!stricmp(mask, amask)
+ || match_wild_nocase(mask, amask))
+ akill_view(i + 1, akills.list[i], u, &sent_header);
+ }
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH);
+ }
+ } else if (!stricmp(cmd, "CLEAR")) {
+ slist_clear(&akills, 1);
+ notice_lang(s_OperServ, u, OPER_AKILL_CLEAR);
+ } else {
+ syntax_error(s_OperServ, u, "AKILL", OPER_AKILL_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+#ifdef IRC_BAHAMUT
+
+/* Adds an SGLINE to the list. Returns >= 0 on success, -1 if it failed, -2 if
+ * only the expiry time changed.
+ * The success result is the number of SGLINEs that were deleted to successfully add one.
+ */
+
+int add_sgline(User * u, char *mask, const char *by, const time_t expires,
+ const char *reason)
+{
+ int deleted = 0, i;
+ SXLine *entry;
+
+ /* Checks whether there is an SGLINE that already covers
+ * the one we want to add, and whether there are SGLINEs
+ * that would be covered by this one.
+ * If so, warn the user in the first case and cleanup
+ * the useless SGLINEs in the second.
+ */
+
+ if (sglines.count > 0) {
+
+ for (i = sglines.count - 1; i >= 0; i--) {
+ entry = sglines.list[i];
+
+ if (!entry)
+ continue;
+
+ if (!stricmp(entry->mask, mask)) {
+ if (entry->expires >= expires || entry->expires == 0) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SGLINE_EXISTS,
+ mask);
+ return -1;
+ } else {
+ entry->expires = expires;
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SGLINE_CHANGED,
+ entry->mask);
+ return -2;
+ }
+ }
+
+ if (match_wild_nocase(entry->mask, mask)
+ && (entry->expires >= expires || entry->expires == 0)) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SGLINE_ALREADY_COVERED,
+ mask, entry->mask);
+ return -1;
+ }
+
+ if (match_wild_nocase(mask, entry->mask)
+ && (entry->expires <= expires || expires == 0)) {
+ slist_delete(&sglines, i);
+ deleted++;
+ }
+ }
+
+ }
+
+ /* We can now check whether the list is full or not. */
+ if (slist_full(&sglines)) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SGLINE_REACHED_LIMIT,
+ sglines.limit);
+ return -1;
+ }
+
+ /* We can now (really) add the SGLINE. */
+ entry = scalloc(sizeof(SXLine), 1);
+ if (!entry)
+ return -1;
+
+ entry->mask = sstrdup(mask);
+ entry->by = sstrdup(by);
+ entry->reason = sstrdup(reason);
+ entry->seton = time(NULL);
+ entry->expires = expires;
+
+ slist_add(&sglines, entry);
+
+ s_sgline(entry->mask, entry->reason);
+
+ return deleted;
+}
+
+/* Does the user match any SGLINEs? */
+
+int check_sgline(const char *nick, const char *realname)
+{
+ int i;
+ SXLine *sx;
+
+ if (sglines.count == 0)
+ return 0;
+
+ for (i = 0; i < sglines.count; i++) {
+ sx = sglines.list[i];
+ if (!sx)
+ continue;
+
+ if (match_wild_nocase(sx->mask, realname)) {
+ s_sgline(sx->mask, sx->reason);
+ /* We kill nick since s_sgline can't */
+ send_cmd(ServerName, "SVSKILL %s :G-Lined: %s", nick,
+ sx->reason);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/* Delete any expired SGLINEs. */
+
+void expire_sglines(void)
+{
+ int i;
+ time_t now = time(NULL);
+ SXLine *sx;
+
+ for (i = sglines.count - 1; i >= 0; i--) {
+ sx = sglines.list[i];
+
+ if (!sx->expires || sx->expires > now)
+ continue;
+
+ if (WallSGLineExpire)
+ wallops(s_OperServ, "SGLINE on \2%s\2 has expired", sx->mask);
+ slist_delete(&sglines, i);
+ }
+}
+
+static void free_sgline_entry(SList * slist, void *item)
+{
+ SXLine *sx = item;
+
+ /* Remove the SGLINE from all the servers */
+ s_unsgline(sx->mask);
+
+ /* Free the structure */
+ free(sx->mask);
+ free(sx->by);
+ free(sx->reason);
+ free(sx);
+}
+
+/* item1 is not an SXLine pointer, but a char */
+
+static int is_sgline_entry_equal(SList * slist, void *item1, void *item2)
+{
+ char *sx1 = item1;
+ SXLine *sx2 = item2;
+
+ if (!sx1 || !sx2)
+ return 0;
+
+ if (!stricmp(sx1, sx2->mask))
+ return 1;
+ else
+ return 0;
+}
+
+/* Lists an SGLINE entry, prefixing it with the header if needed */
+
+static int sgline_list(int number, SXLine * sx, User * u, int *sent_header)
+{
+ if (!sx)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_LIST_HEADER);
+ *sent_header = 1;
+ }
+
+ notice_lang(s_OperServ, u, OPER_SGLINE_LIST_FORMAT, number, sx->mask,
+ sx->reason);
+
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int sgline_list_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return sgline_list(number, item, u, sent_header);
+}
+
+/* Lists an SGLINE entry, prefixing it with the header if needed */
+
+static int sgline_view(int number, SXLine * sx, User * u, int *sent_header)
+{
+ char timebuf[32], expirebuf[256];
+ struct tm tm;
+
+ if (!sx)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_VIEW_HEADER);
+ *sent_header = 1;
+ }
+
+ tm = *localtime(&sx->seton);
+ strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT,
+ &tm);
+ expire_left(u->na, expirebuf, sizeof(expirebuf), sx->expires);
+ notice_lang(s_OperServ, u, OPER_SGLINE_VIEW_FORMAT, number, sx->mask,
+ sx->by, timebuf, expirebuf, sx->reason);
+
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int sgline_view_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return sgline_view(number, item, u, sent_header);
+}
+
+#endif
+
+/* Manage the SGLINE list. */
+
+static int do_sgline(User * u)
+{
+#ifdef IRC_BAHAMUT
+ char *cmd = strtok(NULL, " ");
+
+ if (!cmd)
+ cmd = "";
+
+ if (!stricmp(cmd, "ADD")) {
+ int deleted = 0;
+ char *expiry, *mask, *reason;
+ time_t expires;
+
+ mask = strtok(NULL, ":");
+ if (mask && *mask == '+') {
+ expiry = mask;
+ mask = strchr(expiry, ' ');
+ if (mask) {
+ *mask = 0;
+ mask++;
+ }
+ } else {
+ expiry = NULL;
+ }
+
+ expires = expiry ? dotime(expiry) : SGLineExpiry;
+ /* If the expiry given does not contain a final letter, it's in days,
+ * said the doc. Ah well.
+ */
+ if (expiry && isdigit(expiry[strlen(expiry) - 1]))
+ expires *= 86400;
+ /* Do not allow less than a minute expiry time */
+ if (expires != 0 && expires < 60) {
+ notice_lang(s_OperServ, u, BAD_EXPIRY_TIME);
+ return MOD_CONT;
+ } else if (expires > 0) {
+ expires += time(NULL);
+ }
+
+ if (mask && (reason = strtok(NULL, ""))) {
+ /* We first do some sanity check on the proposed mask. */
+
+ if (mask && strspn(mask, "*?") == strlen(mask)) {
+ notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask);
+ return MOD_CONT;
+ }
+
+ deleted = add_sgline(u, mask, u->nick, expires, reason);
+ if (deleted < 0)
+ return MOD_CONT;
+ else if (deleted)
+ notice_lang(s_OperServ, u, OPER_SGLINE_DELETED_SEVERAL,
+ deleted);
+ notice_lang(s_OperServ, u, OPER_SGLINE_ADDED, mask);
+
+ if (WallOSSGLine) {
+ char buf[128];
+
+ if (!expires) {
+ strcpy(buf, "does not expire");
+ } else {
+ int wall_expiry = expires - time(NULL);
+ char *s = NULL;
+
+ if (wall_expiry >= 86400) {
+ wall_expiry /= 86400;
+ s = "day";
+ } else if (wall_expiry >= 3600) {
+ wall_expiry /= 3600;
+ s = "hour";
+ } else if (wall_expiry >= 60) {
+ wall_expiry /= 60;
+ s = "minute";
+ }
+
+ snprintf(buf, sizeof(buf), "expires in %d %s%s",
+ wall_expiry, s,
+ (wall_expiry == 1) ? "" : "s");
+ }
+
+ wallops(s_OperServ, "%s added an SGLINE for %s (%s)",
+ u->nick, mask, buf);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+
+ } else {
+ syntax_error(s_OperServ, u, "SGLINE", OPER_SGLINE_SYNTAX);
+ }
+
+ } else if (!stricmp(cmd, "DEL")) {
+
+ char *mask;
+ int res = 0;
+
+ mask = strtok(NULL, "");
+
+ if (!mask) {
+ syntax_error(s_OperServ, u, "SGLINE", OPER_SGLINE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (sglines.count == 0) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) {
+ /* Deleting a range */
+ res = slist_delete_range(&sglines, mask, NULL);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH);
+ return MOD_CONT;
+ } else if (res == 1) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_DELETED_ONE);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SGLINE_DELETED_SEVERAL,
+ res);
+ }
+ } else {
+ if ((res = slist_indexof(&sglines, mask)) == -1) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_NOT_FOUND, mask);
+ return MOD_CONT;
+ }
+
+ slist_delete(&sglines, res);
+ notice_lang(s_OperServ, u, OPER_SGLINE_DELETED, mask);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+
+ } else if (!stricmp(cmd, "LIST")) {
+ char *mask;
+ int res, sent_header = 0;
+
+ if (sglines.count == 0) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ mask = strtok(NULL, "");
+
+ if (!mask || (isdigit(*mask)
+ && strspn(mask, "1234567890,-") == strlen(mask))) {
+ res =
+ slist_enum(&sglines, mask, &sgline_list_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH);
+ return MOD_CONT;
+ }
+ } else {
+ int i;
+ char *amask;
+
+ for (i = 0; i < sglines.count; i++) {
+ amask = ((SXLine *) sglines.list[i])->mask;
+ if (!stricmp(mask, amask)
+ || match_wild_nocase(mask, amask))
+ sgline_list(i + 1, sglines.list[i], u, &sent_header);
+ }
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH);
+ else {
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "SGLine");
+ }
+ }
+ } else if (!stricmp(cmd, "VIEW")) {
+ char *mask;
+ int res, sent_header = 0;
+
+ if (sglines.count == 0) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ mask = strtok(NULL, "");
+
+ if (!mask || (isdigit(*mask)
+ && strspn(mask, "1234567890,-") == strlen(mask))) {
+ res =
+ slist_enum(&sglines, mask, &sgline_view_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH);
+ return MOD_CONT;
+ }
+ } else {
+ int i;
+ char *amask;
+
+ for (i = 0; i < sglines.count; i++) {
+ amask = ((SXLine *) sglines.list[i])->mask;
+ if (!stricmp(mask, amask)
+ || match_wild_nocase(mask, amask))
+ sgline_view(i + 1, sglines.list[i], u, &sent_header);
+ }
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH);
+ }
+ } else if (!stricmp(cmd, "CLEAR")) {
+ slist_clear(&sglines, 1);
+ notice_lang(s_OperServ, u, OPER_SGLINE_CLEAR);
+ } else {
+ syntax_error(s_OperServ, u, "SGLINE", OPER_SGLINE_SYNTAX);
+ }
+#else
+ notice_lang(s_OperServ, u, OPER_SGLINE_UNSUPPORTED);
+#endif
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Adds an SQLINE to the list. Returns >= 0 on success, -1 if it failed, -2 if
+ * only the expiry time changed.
+ * The success result is the number of SQLINEs that were deleted to successfully add one.
+ */
+
+int add_sqline(User * u, char *mask, const char *by, const time_t expires,
+ const char *reason)
+{
+ int deleted = 0, i;
+ SXLine *entry;
+
+ /* Checks whether there is an SQLINE that already covers
+ * the one we want to add, and whether there are SQLINEs
+ * that would be covered by this one.
+ * If so, warn the user in the first case and cleanup
+ * the useless SQLINEs in the second.
+ */
+
+ if (sqlines.count > 0) {
+
+ for (i = sqlines.count - 1; i >= 0; i--) {
+ entry = sqlines.list[i];
+
+ if (!entry)
+ continue;
+
+ if ((*mask == '#' && *entry->mask != '#') ||
+ (*mask != '#' && *entry->mask == '#'))
+ continue;
+
+ if (!stricmp(entry->mask, mask)) {
+ if (entry->expires >= expires || entry->expires == 0) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SQLINE_EXISTS,
+ mask);
+ return -1;
+ } else {
+ entry->expires = expires;
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SQLINE_CHANGED,
+ entry->mask);
+ return -2;
+ }
+ }
+
+ if (match_wild_nocase(entry->mask, mask)
+ && (entry->expires >= expires || entry->expires == 0)) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SQLINE_ALREADY_COVERED,
+ mask, entry->mask);
+ return -1;
+ }
+
+ if (match_wild_nocase(mask, entry->mask)
+ && (entry->expires <= expires || expires == 0)) {
+ slist_delete(&sqlines, i);
+ deleted++;
+ }
+ }
+
+ }
+
+ /* We can now check whether the list is full or not. */
+ if (slist_full(&sqlines)) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SQLINE_REACHED_LIMIT,
+ sqlines.limit);
+ return -1;
+ }
+
+ /* We can now (really) add the SQLINE. */
+ entry = scalloc(sizeof(SXLine), 1);
+ if (!entry)
+ return -1;
+
+ entry->mask = sstrdup(mask);
+ entry->by = sstrdup(by);
+ entry->reason = sstrdup(reason);
+ entry->seton = time(NULL);
+ entry->expires = expires;
+
+ slist_add(&sqlines, entry);
+
+ s_sqline(entry->mask, entry->reason);
+
+ return deleted;
+}
+
+/* Does the user match any SQLINEs? */
+
+int check_sqline(const char *nick, int nick_change)
+{
+ int i;
+ SXLine *sx;
+
+ if (sqlines.count == 0)
+ return 0;
+
+ for (i = 0; i < sqlines.count; i++) {
+ sx = sqlines.list[i];
+ if (!sx)
+ continue;
+
+#ifdef IRC_BAHAMUT
+ if (*sx->mask == '#')
+ continue;
+#endif
+
+ if (match_wild_nocase(sx->mask, nick)) {
+ s_sqline(sx->mask, sx->reason);
+ /* We kill nick since s_sqline can't */
+#ifdef IRC_BAHAMUT
+ send_cmd(ServerName, "SVSKILL %s :Q-Lined: %s", nick,
+ sx->reason);
+#else
+ if (!nick_change) {
+ send_cmd(s_OperServ, "KILL %s :Q-Lined: %s", nick,
+ sx->reason);
+ } else {
+ char reason[300];
+ snprintf(reason, sizeof(reason), "Q-Lined: %s",
+ sx->reason);
+ kill_user(s_OperServ, nick, reason);
+ }
+#endif
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+#ifdef IRC_BAHAMUT
+int check_chan_sqline(const char *chan)
+{
+ int i;
+ SXLine *sx;
+
+ if (sqlines.count == 0)
+ return 0;
+
+ for (i = 0; i < sqlines.count; i++) {
+ sx = sqlines.list[i];
+ if (!sx)
+ continue;
+
+ if (*sx->mask != '#')
+ continue;
+
+ if (match_wild_nocase(sx->mask, chan)) {
+ s_sqline(sx->mask, sx->reason);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+#endif
+
+/* Delete any expired SQLINEs. */
+
+void expire_sqlines(void)
+{
+ int i;
+ time_t now = time(NULL);
+ SXLine *sx;
+
+ for (i = sqlines.count - 1; i >= 0; i--) {
+ sx = sqlines.list[i];
+
+ if (!sx->expires || sx->expires > now)
+ continue;
+
+ if (WallSQLineExpire)
+ wallops(s_OperServ, "SQLINE on \2%s\2 has expired", sx->mask);
+
+ slist_delete(&sqlines, i);
+ }
+}
+
+static void free_sqline_entry(SList * slist, void *item)
+{
+ SXLine *sx = item;
+
+ /* Remove the SQLINE from all the servers */
+ s_unsqline(sx->mask);
+
+ /* Free the structure */
+ free(sx->mask);
+ free(sx->by);
+ free(sx->reason);
+ free(sx);
+}
+
+/* item1 is not an SXLine pointer, but a char */
+
+static int is_sqline_entry_equal(SList * slist, void *item1, void *item2)
+{
+ char *sx1 = item1;
+ SXLine *sx2 = item2;
+
+ if (!sx1 || !sx2)
+ return 0;
+
+ if (!stricmp(sx1, sx2->mask))
+ return 1;
+ else
+ return 0;
+}
+
+/* Lists an SQLINE entry, prefixing it with the header if needed */
+
+static int sqline_list(int number, SXLine * sx, User * u, int *sent_header)
+{
+ if (!sx)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_LIST_HEADER);
+ *sent_header = 1;
+ }
+
+ notice_lang(s_OperServ, u, OPER_SQLINE_LIST_FORMAT, number, sx->mask,
+ sx->reason);
+
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int sqline_list_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return sqline_list(number, item, u, sent_header);
+}
+
+/* Lists an SQLINE entry, prefixing it with the header if needed */
+
+static int sqline_view(int number, SXLine * sx, User * u, int *sent_header)
+{
+ char timebuf[32], expirebuf[256];
+ struct tm tm;
+
+ if (!sx)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_VIEW_HEADER);
+ *sent_header = 1;
+ }
+
+ tm = *localtime(&sx->seton);
+ strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT,
+ &tm);
+ expire_left(u->na, expirebuf, sizeof(expirebuf), sx->expires);
+ notice_lang(s_OperServ, u, OPER_SQLINE_VIEW_FORMAT, number, sx->mask,
+ sx->by, timebuf, expirebuf, sx->reason);
+
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int sqline_view_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return sqline_view(number, item, u, sent_header);
+}
+
+/* Manage the SQLINE list. */
+
+static int do_sqline(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+
+ if (!cmd)
+ cmd = "";
+
+ if (!stricmp(cmd, "ADD")) {
+ int deleted = 0;
+ char *expiry, *mask, *reason;
+ time_t expires;
+
+ mask = strtok(NULL, " ");
+ if (mask && *mask == '+') {
+ expiry = mask;
+ mask = strtok(NULL, " ");
+ } else {
+ expiry = NULL;
+ }
+
+ expires = expiry ? dotime(expiry) : SQLineExpiry;
+ /* If the expiry given does not contain a final letter, it's in days,
+ * said the doc. Ah well.
+ */
+ if (expiry && isdigit(expiry[strlen(expiry) - 1]))
+ expires *= 86400;
+ /* Do not allow less than a minute expiry time */
+ if (expires != 0 && expires < 60) {
+ notice_lang(s_OperServ, u, BAD_EXPIRY_TIME);
+ return MOD_CONT;
+ } else if (expires > 0) {
+ expires += time(NULL);
+ }
+
+ if (mask && (reason = strtok(NULL, ""))) {
+
+ /* We first do some sanity check on the proposed mask. */
+ if (strspn(mask, "*?") == strlen(mask)) {
+ notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask);
+ return MOD_CONT;
+ }
+#ifndef IRC_BAHAMUT
+ /* Channel SQLINEs are only supported on Bahamut servers */
+ if (*mask == '#') {
+ notice_lang(s_OperServ, u,
+ OPER_SQLINE_CHANNELS_UNSUPPORTED);
+ return MOD_CONT;
+ }
+#endif
+
+ deleted = add_sqline(u, mask, u->nick, expires, reason);
+ if (deleted < 0)
+ return MOD_CONT;
+ else if (deleted)
+ notice_lang(s_OperServ, u, OPER_SQLINE_DELETED_SEVERAL,
+ deleted);
+ notice_lang(s_OperServ, u, OPER_SQLINE_ADDED, mask);
+
+ if (WallOSSQLine) {
+ char buf[128];
+
+ if (!expires) {
+ strcpy(buf, "does not expire");
+ } else {
+ int wall_expiry = expires - time(NULL);
+ char *s = NULL;
+
+ if (wall_expiry >= 86400) {
+ wall_expiry /= 86400;
+ s = "day";
+ } else if (wall_expiry >= 3600) {
+ wall_expiry /= 3600;
+ s = "hour";
+ } else if (wall_expiry >= 60) {
+ wall_expiry /= 60;
+ s = "minute";
+ }
+
+ snprintf(buf, sizeof(buf), "expires in %d %s%s",
+ wall_expiry, s,
+ (wall_expiry == 1) ? "" : "s");
+ }
+
+ wallops(s_OperServ, "%s added an SQLINE for %s (%s)",
+ u->nick, mask, buf);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+
+ } else {
+ syntax_error(s_OperServ, u, "SQLINE", OPER_SQLINE_SYNTAX);
+ }
+
+ } else if (!stricmp(cmd, "DEL")) {
+
+ char *mask;
+ int res = 0;
+
+ mask = strtok(NULL, "");
+
+ if (!mask) {
+ syntax_error(s_OperServ, u, "SQLINE", OPER_SQLINE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (sqlines.count == 0) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) {
+ /* Deleting a range */
+ res = slist_delete_range(&sqlines, mask, NULL);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH);
+ return MOD_CONT;
+ } else if (res == 1) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_DELETED_ONE);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SQLINE_DELETED_SEVERAL,
+ res);
+ }
+ } else {
+ if ((res = slist_indexof(&sqlines, mask)) == -1) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_NOT_FOUND, mask);
+ return MOD_CONT;
+ }
+
+ slist_delete(&sqlines, res);
+ notice_lang(s_OperServ, u, OPER_SQLINE_DELETED, mask);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+
+ } else if (!stricmp(cmd, "LIST")) {
+ char *mask;
+ int res, sent_header = 0;
+
+ if (sqlines.count == 0) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ mask = strtok(NULL, "");
+
+ if (!mask || (isdigit(*mask)
+ && strspn(mask, "1234567890,-") == strlen(mask))) {
+ res =
+ slist_enum(&sqlines, mask, &sqline_list_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH);
+ return MOD_CONT;
+ }
+ } else {
+ int i;
+ char *amask;
+
+ for (i = 0; i < sqlines.count; i++) {
+ amask = ((SXLine *) sqlines.list[i])->mask;
+ if (!stricmp(mask, amask)
+ || match_wild_nocase(mask, amask))
+ sqline_list(i + 1, sqlines.list[i], u, &sent_header);
+ }
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH);
+ else {
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "SQLine");
+ }
+ }
+ } else if (!stricmp(cmd, "VIEW")) {
+ char *mask;
+ int res, sent_header = 0;
+
+ if (sqlines.count == 0) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ mask = strtok(NULL, "");
+
+ if (!mask || (isdigit(*mask)
+ && strspn(mask, "1234567890,-") == strlen(mask))) {
+ res =
+ slist_enum(&sqlines, mask, &sqline_view_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH);
+ return MOD_CONT;
+ }
+ } else {
+ int i;
+ char *amask;
+
+ for (i = 0; i < sqlines.count; i++) {
+ amask = ((SXLine *) sqlines.list[i])->mask;
+ if (!stricmp(mask, amask)
+ || match_wild_nocase(mask, amask))
+ sqline_view(i + 1, sqlines.list[i], u, &sent_header);
+ }
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH);
+ }
+ } else if (!stricmp(cmd, "CLEAR")) {
+ slist_clear(&sqlines, 1);
+ notice_lang(s_OperServ, u, OPER_SQLINE_CLEAR);
+ } else {
+ syntax_error(s_OperServ, u, "SQLINE", OPER_SQLINE_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+#ifdef IRC_BAHAMUT
+
+/* Adds an SZLINE to the list. Returns >= 0 on success, -1 on error, -2 if
+ * only the expiry time changed.
+ * The success result is the number of SZLINEs that were deleted to successfully add one.
+ */
+
+int add_szline(User * u, char *mask, const char *by, const time_t expires,
+ const char *reason)
+{
+ int deleted = 0, i;
+ SXLine *entry;
+
+ /* Checks whether there is an SZLINE that already covers
+ * the one we want to add, and whether there are SZLINEs
+ * that would be covered by this one.
+ * If so, warn the user in the first case and cleanup
+ * the useless SZLINEs in the second.
+ */
+
+ if (szlines.count > 0) {
+
+ for (i = szlines.count - 1; i >= 0; i--) {
+ entry = szlines.list[i];
+
+ if (!entry)
+ continue;
+
+ if (!stricmp(entry->mask, mask)) {
+ if (entry->expires >= expires || entry->expires == 0) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SZLINE_EXISTS,
+ mask);
+ return -1;
+ } else {
+ entry->expires = expires;
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SZLINE_EXISTS,
+ mask);
+ return -2;
+ }
+ }
+
+ if (match_wild_nocase(entry->mask, mask)) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SZLINE_ALREADY_COVERED,
+ mask, entry->mask);
+ return -1;
+ }
+
+ if (match_wild_nocase(mask, entry->mask)) {
+ slist_delete(&szlines, i);
+ deleted++;
+ }
+ }
+
+ }
+
+ /* We can now check whether the list is full or not. */
+ if (slist_full(&szlines)) {
+ if (u)
+ notice_lang(s_OperServ, u, OPER_SZLINE_REACHED_LIMIT,
+ szlines.limit);
+ return -1;
+ }
+
+ /* We can now (really) add the SZLINE. */
+ entry = scalloc(sizeof(SXLine), 1);
+ if (!entry)
+ return -1;
+
+ entry->mask = sstrdup(mask);
+ entry->by = sstrdup(by);
+ entry->reason = sstrdup(reason);
+ entry->seton = time(NULL);
+ entry->expires = expires;
+
+ slist_add(&szlines, entry);
+ s_szline(entry->mask, entry->reason);
+
+ return deleted;
+}
+
+/* Delete any expired SZLINEs. */
+
+void expire_szlines(void)
+{
+ int i;
+ time_t now = time(NULL);
+ SXLine *sx;
+
+ for (i = szlines.count - 1; i >= 0; i--) {
+ sx = szlines.list[i];
+
+ if (!sx->expires || sx->expires > now)
+ continue;
+
+ if (WallSZLineExpire)
+ wallops(s_OperServ, "SZLINE on \2%s\2 has expired", sx->mask);
+ slist_delete(&szlines, i);
+ }
+}
+
+static void free_szline_entry(SList * slist, void *item)
+{
+ SXLine *sx = item;
+
+ /* Remove the SZLINE from all the servers */
+ s_unszline(sx->mask);
+
+ /* Free the structure */
+ free(sx->mask);
+ free(sx->by);
+ free(sx->reason);
+ free(sx);
+}
+
+/* item1 is not an SXLine pointer, but a char
+ */
+
+static int is_szline_entry_equal(SList * slist, void *item1, void *item2)
+{
+ char *sx1 = item1;
+ SXLine *sx2 = item2;
+
+ if (!sx1 || !sx2)
+ return 0;
+
+ if (!stricmp(sx1, sx2->mask))
+ return 1;
+ else
+ return 0;
+}
+
+/* Lists an SZLINE entry, prefixing it with the header if needed */
+
+static int szline_list(int number, SXLine * sx, User * u, int *sent_header)
+{
+ if (!sx)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_LIST_HEADER);
+ *sent_header = 1;
+ }
+
+ notice_lang(s_OperServ, u, OPER_SZLINE_LIST_FORMAT, number, sx->mask,
+ sx->reason);
+
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int szline_list_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return szline_list(number, item, u, sent_header);
+}
+
+/* Lists an SZLINE entry, prefixing it with the header if needed */
+
+static int szline_view(int number, SXLine * sx, User * u, int *sent_header)
+{
+ char timebuf[32], expirebuf[256];
+ struct tm tm;
+
+ if (!sx)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_VIEW_HEADER);
+ *sent_header = 1;
+ }
+
+ tm = *localtime(&sx->seton);
+ strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT,
+ &tm);
+ expire_left(u->na, expirebuf, sizeof(expirebuf), sx->expires);
+ notice_lang(s_OperServ, u, OPER_SZLINE_VIEW_FORMAT, number, sx->mask,
+ sx->by, timebuf, expirebuf, sx->reason);
+
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int szline_view_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return szline_view(number, item, u, sent_header);
+}
+
+#endif
+
+/* Manage the SZLINE list. */
+
+static int do_szline(User * u)
+{
+#ifdef IRC_BAHAMUT
+ char *cmd = strtok(NULL, " ");
+
+ if (!cmd)
+ cmd = "";
+
+ if (!stricmp(cmd, "ADD")) {
+ int deleted = 0;
+ char *expiry, *mask, *reason;
+ time_t expires;
+
+ mask = strtok(NULL, " ");
+ if (mask && *mask == '+') {
+ expiry = mask;
+ mask = strtok(NULL, " ");
+ } else {
+ expiry = NULL;
+ }
+
+ expires = expiry ? dotime(expiry) : SZLineExpiry;
+ /* If the expiry given does not contain a final letter, it's in days,
+ * said the doc. Ah well.
+ */
+ if (expiry && isdigit(expiry[strlen(expiry) - 1]))
+ expires *= 86400;
+ /* Do not allow less than a minute expiry time */
+ if (expires != 0 && expires < 60) {
+ notice_lang(s_OperServ, u, BAD_EXPIRY_TIME);
+ return MOD_CONT;
+ } else if (expires > 0) {
+ expires += time(NULL);
+ }
+
+ if (mask && (reason = strtok(NULL, ""))) {
+ /* We first do some sanity check on the proposed mask. */
+
+ if (strchr(mask, '!') || strchr(mask, '@')) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_ONLY_IPS);
+ return MOD_CONT;
+ }
+
+ if (strspn(mask, "*?") == strlen(mask)) {
+ notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask);
+ return MOD_CONT;
+ }
+
+ deleted = add_szline(u, mask, u->nick, expires, reason);
+ if (deleted < 0)
+ return MOD_CONT;
+ else if (deleted)
+ notice_lang(s_OperServ, u, OPER_SZLINE_DELETED_SEVERAL,
+ deleted);
+ notice_lang(s_OperServ, u, OPER_SZLINE_ADDED, mask);
+
+ if (WallOSSZLine) {
+ char buf[128];
+
+ if (!expires) {
+ strcpy(buf, "does not expire");
+ } else {
+ int wall_expiry = expires - time(NULL);
+ char *s = NULL;
+
+ if (wall_expiry >= 86400) {
+ wall_expiry /= 86400;
+ s = "day";
+ } else if (wall_expiry >= 3600) {
+ wall_expiry /= 3600;
+ s = "hour";
+ } else if (wall_expiry >= 60) {
+ wall_expiry /= 60;
+ s = "minute";
+ }
+
+ snprintf(buf, sizeof(buf), "expires in %d %s%s",
+ wall_expiry, s,
+ (wall_expiry == 1) ? "" : "s");
+ }
+
+ wallops(s_OperServ, "%s added an SZLINE for %s (%s)",
+ u->nick, mask, buf);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+
+ } else {
+ syntax_error(s_OperServ, u, "SZLINE", OPER_SZLINE_SYNTAX);
+ }
+
+ } else if (!stricmp(cmd, "DEL")) {
+
+ char *mask;
+ int res = 0;
+
+ mask = strtok(NULL, " ");
+
+ if (!mask) {
+ syntax_error(s_OperServ, u, "SZLINE", OPER_SZLINE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (szlines.count == 0) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) {
+ /* Deleting a range */
+ res = slist_delete_range(&szlines, mask, NULL);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH);
+ return MOD_CONT;
+ } else if (res == 1) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_DELETED_ONE);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SZLINE_DELETED_SEVERAL,
+ res);
+ }
+ } else {
+ if ((res = slist_indexof(&szlines, mask)) == -1) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_NOT_FOUND, mask);
+ return MOD_CONT;
+ }
+
+ slist_delete(&szlines, res);
+ notice_lang(s_OperServ, u, OPER_SZLINE_DELETED, mask);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+
+ } else if (!stricmp(cmd, "LIST")) {
+ char *mask;
+ int res, sent_header = 0;
+
+ if (szlines.count == 0) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ mask = strtok(NULL, " ");
+
+ if (!mask || (isdigit(*mask)
+ && strspn(mask, "1234567890,-") == strlen(mask))) {
+ res =
+ slist_enum(&szlines, mask, &szline_list_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH);
+ return MOD_CONT;
+ }
+ } else {
+ int i;
+ char *amask;
+
+ for (i = 0; i < szlines.count; i++) {
+ amask = ((SXLine *) szlines.list[i])->mask;
+ if (!stricmp(mask, amask)
+ || match_wild_nocase(mask, amask))
+ szline_list(i + 1, szlines.list[i], u, &sent_header);
+ }
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH);
+ }
+ } else if (!stricmp(cmd, "VIEW")) {
+ char *mask;
+ int res, sent_header = 0;
+
+ if (szlines.count == 0) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ mask = strtok(NULL, " ");
+
+ if (!mask || (isdigit(*mask)
+ && strspn(mask, "1234567890,-") == strlen(mask))) {
+ res =
+ slist_enum(&szlines, mask, &szline_view_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH);
+ return MOD_CONT;
+ }
+ } else {
+ int i;
+ char *amask;
+
+ for (i = 0; i < szlines.count; i++) {
+ amask = ((SXLine *) szlines.list[i])->mask;
+ if (!stricmp(mask, amask)
+ || match_wild_nocase(mask, amask))
+ szline_view(i + 1, szlines.list[i], u, &sent_header);
+ }
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH);
+ }
+ } else if (!stricmp(cmd, "CLEAR")) {
+ slist_clear(&szlines, 1);
+ notice_lang(s_OperServ, u, OPER_SZLINE_CLEAR);
+ } else {
+ syntax_error(s_OperServ, u, "SZLINE", OPER_SZLINE_SYNTAX);
+ }
+#else
+ notice_lang(s_OperServ, u, OPER_SZLINE_UNSUPPORTED);
+#endif
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_chanlist(User * u)
+{
+ char *pattern = strtok(NULL, " ");
+ char *opt = strtok(NULL, " ");
+
+ int modes = 0;
+ User *u2;
+
+ if (opt && !stricmp(opt, "SECRET"))
+ modes |= (CMODE_s | CMODE_p);
+
+ if (pattern && (u2 = finduser(pattern))) {
+ struct u_chanlist *uc;
+
+ notice_lang(s_OperServ, u, OPER_CHANLIST_HEADER_USER, u2->nick);
+
+ for (uc = u2->chans; uc; uc = uc->next) {
+ if (modes && !(uc->chan->mode & modes))
+ continue;
+ notice_lang(s_OperServ, u, OPER_CHANLIST_RECORD,
+ uc->chan->name, uc->chan->usercount,
+ chan_get_modes(uc->chan, 1, 1),
+ (uc->chan->topic ? uc->chan->topic : ""));
+ }
+ } else {
+ int i;
+ Channel *c;
+
+ notice_lang(s_OperServ, u, OPER_CHANLIST_HEADER);
+
+ for (i = 0; i < 1024; i++) {
+ for (c = chanlist[i]; c; c = c->next) {
+ if (pattern && !match_wild_nocase(pattern, c->name))
+ continue;
+ if (modes && !(c->mode & modes))
+ continue;
+ notice_lang(s_OperServ, u, OPER_CHANLIST_RECORD, c->name,
+ c->usercount, chan_get_modes(c, 1, 1),
+ (c->topic ? c->topic : ""));
+ }
+ }
+ }
+
+ notice_lang(s_OperServ, u, OPER_CHANLIST_END);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_userlist(User * u)
+{
+ char *pattern = strtok(NULL, " ");
+ char *opt = strtok(NULL, " ");
+
+ Channel *c;
+ int modes = 0;
+
+ if (opt && !stricmp(opt, "INVISIBLE"))
+ modes |= UMODE_i;
+
+ if (pattern && (c = findchan(pattern))) {
+ struct c_userlist *cu;
+
+ notice_lang(s_OperServ, u, OPER_USERLIST_HEADER_CHAN, pattern);
+
+ for (cu = c->users; cu; cu = cu->next) {
+ if (modes && !(cu->user->mode & modes))
+ continue;
+ notice_lang(s_OperServ, u, OPER_USERLIST_RECORD,
+ cu->user->nick, GetIdent(cu->user),
+ GetHost(cu->user));
+ }
+ } else {
+ char mask[BUFSIZE];
+ int i;
+ User *u2;
+
+ notice_lang(s_OperServ, u, OPER_USERLIST_HEADER);
+
+ for (i = 0; i < 1024; i++) {
+ for (u2 = userlist[i]; u2; u2 = u2->next) {
+ if (pattern) {
+ snprintf(mask, sizeof(mask), "%s!%s@%s", u2->nick,
+ GetIdent(u2), GetHost(u2));
+ if (!match_wild_nocase(pattern, mask))
+ continue;
+ if (modes && !(u2->mode & modes))
+ continue;
+ }
+ notice_lang(s_OperServ, u, OPER_USERLIST_RECORD, u2->nick,
+ GetIdent(u2), GetHost(u2));
+ }
+ }
+ }
+
+ notice_lang(s_OperServ, u, OPER_USERLIST_END);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Callback function used to sort the admin list */
+
+static int compare_adminlist_entries(SList * slist, void *item1,
+ void *item2)
+{
+ NickCore *nc1 = item1, *nc2 = item2;
+ if (!nc1 || !nc2)
+ return -1; /* To tell to continue */
+ return stricmp(nc1->display, nc2->display);
+}
+
+/* Callback function used when an admin list entry is deleted */
+
+static void free_adminlist_entry(SList * slist, void *item)
+{
+ NickCore *nc = item;
+ nc->flags &= ~NI_SERVICES_ADMIN;
+}
+
+/* Lists an admin entry, prefixing it with the header if needed */
+
+static int admin_list(int number, NickCore * nc, User * u,
+ int *sent_header)
+{
+ if (!nc)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_LIST_HEADER);
+ *sent_header = 1;
+ }
+
+ notice_lang(s_OperServ, u, OPER_ADMIN_LIST_FORMAT, number,
+ nc->display);
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int admin_list_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return admin_list(number, item, u, sent_header);
+}
+
+/* Services admin list viewing/modification. */
+
+static int do_admin(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+ NickAlias *na;
+ int res = 0;
+
+ if (skeleton) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_SKELETON);
+ return MOD_CONT;
+ }
+
+ if (!cmd || (!nick && stricmp(cmd, "LIST") && stricmp(cmd, "CLEAR"))) {
+ syntax_error(s_OperServ, u, "ADMIN", OPER_ADMIN_SYNTAX);
+ } else if (!stricmp(cmd, "ADD")) {
+ if (!is_services_root(u)) {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (!(na = findnick(nick))) {
+ notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick);
+ return MOD_CONT;
+ }
+
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick);
+ return MOD_CONT;
+ }
+
+ if (na->nc->flags & NI_SERVICES_ADMIN
+ || slist_indexof(&servadmins, na->nc) != -1) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_EXISTS, nick);
+ return MOD_CONT;
+ }
+
+ res = slist_add(&servadmins, na->nc);
+ if (res == -2) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_REACHED_LIMIT, nick);
+ return MOD_CONT;
+ } else {
+ na->nc->flags |= NI_SERVICES_ADMIN;
+ notice_lang(s_OperServ, u, OPER_ADMIN_ADDED, nick);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ } else if (!stricmp(cmd, "DEL")) {
+ if (!is_services_root(u)) {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (servadmins.count == 0) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) {
+ /* Deleting a range */
+ res = slist_delete_range(&servadmins, nick, NULL);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_NO_MATCH);
+ return MOD_CONT;
+ } else if (res == 1) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_DELETED_ONE);
+ } else {
+ notice_lang(s_OperServ, u, OPER_ADMIN_DELETED_SEVERAL,
+ res);
+ }
+ } else {
+ if (!(na = findnick(nick))) {
+ notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick);
+ return MOD_CONT;
+ }
+
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick);
+ return MOD_CONT;
+ }
+
+ if (!(na->nc->flags & NI_SERVICES_ADMIN)
+ || (res = slist_indexof(&servadmins, na->nc)) == -1) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_NOT_FOUND, nick);
+ return MOD_CONT;
+ }
+
+ slist_delete(&servadmins, res);
+ notice_lang(s_OperServ, u, OPER_ADMIN_DELETED, nick);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ } else if (!stricmp(cmd, "LIST")) {
+ int sent_header = 0;
+
+ if (servadmins.count == 0) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ if (!nick || (isdigit(*nick)
+ && strspn(nick, "1234567890,-") == strlen(nick))) {
+ res =
+ slist_enum(&servadmins, nick, &admin_list_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_NO_MATCH);
+ return MOD_CONT;
+ } else {
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Admin");
+ }
+ } else {
+ int i;
+
+ for (i = 0; i < servadmins.count; i++)
+ if (!stricmp
+ (nick, ((NickCore *) servadmins.list[i])->display)
+ || match_wild_nocase(nick,
+ ((NickCore *) servadmins.
+ list[i])->display))
+ admin_list(i + 1, servadmins.list[i], u, &sent_header);
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_ADMIN_NO_MATCH);
+ else {
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Admin");
+ }
+ }
+ } else if (!stricmp(cmd, "CLEAR")) {
+ if (!is_services_root(u)) {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (servadmins.count == 0) {
+ notice_lang(s_OperServ, u, OPER_ADMIN_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ slist_clear(&servadmins, 1);
+ notice_lang(s_OperServ, u, OPER_ADMIN_CLEAR);
+ } else {
+ syntax_error(s_OperServ, u, "ADMIN", OPER_ADMIN_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Callback function used to sort the oper list */
+
+static int compare_operlist_entries(SList * slist, void *item1,
+ void *item2)
+{
+ NickCore *nc1 = item1, *nc2 = item2;
+ if (!nc1 || !nc2)
+ return -1; /* To tell to continue */
+ return stricmp(nc1->display, nc2->display);
+}
+
+/* Callback function used when an oper list entry is deleted */
+
+static void free_operlist_entry(SList * slist, void *item)
+{
+ NickCore *nc = item;
+ nc->flags &= ~NI_SERVICES_OPER;
+}
+
+/* Lists an oper entry, prefixing it with the header if needed */
+
+static int oper_list(int number, NickCore * nc, User * u, int *sent_header)
+{
+ if (!nc)
+ return 0;
+
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_OPER_LIST_HEADER);
+ *sent_header = 1;
+ }
+
+ notice_lang(s_OperServ, u, OPER_OPER_LIST_FORMAT, number, nc->display);
+ return 1;
+}
+
+/* Callback for enumeration purposes */
+
+static int oper_list_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ int *sent_header = va_arg(args, int *);
+
+ return oper_list(number, item, u, sent_header);
+}
+
+/**
+ * Display an Opers list Entry
+ **/
+static int opers_list(int number, NickCore * nc, User * u, char *level)
+{
+ User *au = NULL;
+ NickAlias *na;
+ int found;
+ int i;
+
+ if (!nc)
+ return 0;
+
+ found = 0;
+ if ((au = finduser(nc->display))) { /* see if user is online */
+ found = 1;
+ notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, '*', level,
+ nc->display);
+ } else {
+ for (i = 0; i < nc->aliases.count; i++) { /* check all aliases */
+ na = nc->aliases.list[i];
+ if ((au = finduser(na->nick))) { /* see if user is online */
+ found = 1;
+ notice_lang(s_OperServ, u, OPER_STAFF_AFORMAT, '*', level,
+ nc->display, na->nick);
+ }
+ }
+ }
+
+ if (!found)
+ notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, ' ', level,
+ nc->display);
+
+ return 1;
+}
+
+/**
+ * Function for the enumerator to call
+ **/
+static int opers_list_callback(SList * slist, int number, void *item,
+ va_list args)
+{
+ User *u = va_arg(args, User *);
+ char *level = va_arg(args, char *);
+
+ return opers_list(number, item, u, level);
+}
+
+/**
+ * Display all Services Opers/Admins with Level + Online Status
+ * /msg OperServ opers
+ **/
+static int do_staff(User * u)
+{
+ int idx = 0;
+ User *au = NULL;
+ NickCore *nc;
+ NickAlias *na;
+ int found;
+ int i;
+
+ notice_lang(s_OperServ, u, OPER_STAFF_LIST_HEADER);
+ slist_enum(&servopers, NULL, &opers_list_callback, u, "OPER");
+ slist_enum(&servadmins, NULL, &opers_list_callback, u, "ADMN");
+
+ for (idx = 0; idx < RootNumber; idx++) {
+ found = 0;
+ if ((au = finduser(ServicesRoots[idx]))) { /* see if user is online */
+ found = 1;
+ notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, '*', "ROOT",
+ ServicesRoots[idx]);
+ } else if ((nc = findcore(ServicesRoots[idx]))) {
+ for (i = 0; i < nc->aliases.count; i++) { /* check all aliases */
+ na = nc->aliases.list[i];
+ if ((au = finduser(na->nick))) { /* see if user is online */
+ found = 1;
+ notice_lang(s_OperServ, u, OPER_STAFF_AFORMAT,
+ '*', "ROOT", ServicesRoots[idx], na->nick);
+ }
+ }
+ }
+
+ if (!found)
+ notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, ' ', "ROOT",
+ ServicesRoots[idx]);
+
+ }
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Staff");
+ return MOD_CONT;
+}
+
+/* Services operator list viewing/modification. */
+
+static int do_oper(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ char *nick = strtok(NULL, " ");
+ NickAlias *na;
+ int res = 0;
+
+ if (skeleton) {
+ notice_lang(s_OperServ, u, OPER_OPER_SKELETON);
+ return MOD_CONT;
+ }
+
+ if (!cmd || (!nick && stricmp(cmd, "LIST") && stricmp(cmd, "CLEAR"))) {
+ syntax_error(s_OperServ, u, "OPER", OPER_OPER_SYNTAX);
+ } else if (!stricmp(cmd, "ADD")) {
+ if (!is_services_admin(u)) {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (!(na = findnick(nick))) {
+ notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick);
+ return MOD_CONT;
+ }
+
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick);
+ return MOD_CONT;
+ }
+
+ if (na->nc->flags & NI_SERVICES_OPER
+ || slist_indexof(&servopers, na->nc) != -1) {
+ notice_lang(s_OperServ, u, OPER_OPER_EXISTS, nick);
+ return MOD_CONT;
+ }
+
+ res = slist_add(&servopers, na->nc);
+ if (res == -2) {
+ notice_lang(s_OperServ, u, OPER_OPER_REACHED_LIMIT, nick);
+ return MOD_CONT;
+ } else {
+ na->nc->flags |= NI_SERVICES_OPER;
+ notice_lang(s_OperServ, u, OPER_OPER_ADDED, nick);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ } else if (!stricmp(cmd, "DEL")) {
+ if (!is_services_admin(u)) {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) {
+ /* Deleting a range */
+ res = slist_delete_range(&servopers, nick, NULL);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH);
+ return MOD_CONT;
+ } else if (res == 1) {
+ notice_lang(s_OperServ, u, OPER_OPER_DELETED_ONE);
+ } else {
+ notice_lang(s_OperServ, u, OPER_OPER_DELETED_SEVERAL, res);
+ }
+ } else {
+ if (!(na = findnick(nick))) {
+ notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick);
+ return MOD_CONT;
+ }
+
+ if (na->status & NS_VERBOTEN) {
+ notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick);
+ return MOD_CONT;
+ }
+
+ if (!(na->nc->flags & NI_SERVICES_OPER)
+ || (res = slist_indexof(&servopers, na->nc)) == -1) {
+ notice_lang(s_OperServ, u, OPER_OPER_NOT_FOUND, nick);
+ return MOD_CONT;
+ }
+
+ slist_delete(&servopers, res);
+ notice_lang(s_OperServ, u, OPER_OPER_DELETED, nick);
+ }
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ } else if (!stricmp(cmd, "LIST")) {
+ int sent_header = 0;
+
+ if (servopers.count == 0) {
+ notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ if (!nick || (isdigit(*nick)
+ && strspn(nick, "1234567890,-") == strlen(nick))) {
+ res =
+ slist_enum(&servopers, nick, &oper_list_callback, u,
+ &sent_header);
+ if (res == 0) {
+ notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH);
+ return MOD_CONT;
+ } else {
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper");
+ }
+ } else {
+ int i;
+
+ for (i = 0; i < servopers.count; i++)
+ if (!stricmp
+ (nick, ((NickCore *) servopers.list[i])->display)
+ || match_wild_nocase(nick,
+ ((NickCore *) servopers.list[i])->
+ display))
+ oper_list(i + 1, servopers.list[i], u, &sent_header);
+
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH);
+ else {
+ notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper");
+ }
+ }
+ } else if (!stricmp(cmd, "CLEAR")) {
+ if (!is_services_admin(u)) {
+ notice_lang(s_OperServ, u, PERMISSION_DENIED);
+ return MOD_CONT;
+ }
+
+ if (servopers.count == 0) {
+ notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY);
+ return MOD_CONT;
+ }
+
+ slist_clear(&servopers, 1);
+ notice_lang(s_OperServ, u, OPER_OPER_CLEAR);
+ } else {
+ syntax_error(s_OperServ, u, "OPER", OPER_OPER_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+/* Set various Services runtime options. */
+
+static int do_set(User * u)
+{
+ char *option = strtok(NULL, " ");
+ char *setting = strtok(NULL, " ");
+
+ if (!option || !setting) {
+ syntax_error(s_OperServ, u, "SET", OPER_SET_SYNTAX);
+
+ } else if (stricmp(option, "IGNORE") == 0) {
+ if (stricmp(setting, "on") == 0) {
+ allow_ignore = 1;
+ notice_lang(s_OperServ, u, OPER_SET_IGNORE_ON);
+ } else if (stricmp(setting, "off") == 0) {
+ allow_ignore = 0;
+ notice_lang(s_OperServ, u, OPER_SET_IGNORE_OFF);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_IGNORE_ERROR);
+ }
+
+ } else if (stricmp(option, "READONLY") == 0) {
+ if (stricmp(setting, "on") == 0) {
+ readonly = 1;
+ alog("Read-only mode activated");
+ close_log();
+ notice_lang(s_OperServ, u, OPER_SET_READONLY_ON);
+ } else if (stricmp(setting, "off") == 0) {
+ readonly = 0;
+ open_log();
+ alog("Read-only mode deactivated");
+ notice_lang(s_OperServ, u, OPER_SET_READONLY_OFF);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_READONLY_ERROR);
+ }
+
+ } else if (stricmp(option, "LOGCHAN") == 0) {
+ /* Unlike the other SET commands where only stricmp is necessary,
+ * we also have to ensure that LogChannel is defined or we can't
+ * send to it.
+ *
+ * -jester
+ */
+ if (LogChannel && (stricmp(setting, "on") == 0)) {
+#ifdef IRC_HYBRID
+ send_cmd(NULL, "SJOIN %ld %s + :%s", time(NULL), LogChannel,
+ s_GlobalNoticer);
+#endif
+ logchan = 1;
+ alog("Now sending log messages to %s", LogChannel);
+ notice_lang(s_OperServ, u, OPER_SET_LOGCHAN_ON, LogChannel);
+ } else if (LogChannel && (stricmp(setting, "off") == 0)) {
+#ifdef IRC_HYBRID
+ send_cmd(s_GlobalNoticer, "PART %s :Parting", LogChannel);
+#endif
+ logchan = 0;
+ alog("No longer sending log messages to a channel");
+ notice_lang(s_OperServ, u, OPER_SET_LOGCHAN_OFF);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_LOGCHAN_ERROR);
+ }
+ /**
+ * Allow the user to turn super admin on/off
+ *
+ * Rob
+ **/
+ } else if (stricmp(option, "SUPERADMIN") == 0) {
+ if (SuperAdmin && (stricmp(setting, "on") == 0)) {
+ u->isSuperAdmin = 1;
+ notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ON);
+ alog("%s: %s is a SuperAdmin ", s_OperServ, u->nick);
+ wallops(s_OperServ, getstring2(NULL, OPER_SUPER_ADMIN_WALL_ON),
+ u->nick);
+ } else if (SuperAdmin && (stricmp(setting, "off") == 0)) {
+ u->isSuperAdmin = 0;
+ notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_OFF);
+ alog("%s: %s is no longer a SuperAdmin", s_OperServ, u->nick);
+ wallops(s_OperServ,
+ getstring2(NULL, OPER_SUPER_ADMIN_WALL_OFF), u->nick);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_SYNTAX);
+ }
+ } else if (stricmp(option, "DEBUG") == 0) {
+ if (stricmp(setting, "on") == 0) {
+ debug = 1;
+ alog("Debug mode activated");
+ notice_lang(s_OperServ, u, OPER_SET_DEBUG_ON);
+ } else if (stricmp(setting, "off") == 0 ||
+ (*setting == '0' && atoi(setting) == 0)) {
+ alog("Debug mode deactivated");
+ debug = 0;
+ notice_lang(s_OperServ, u, OPER_SET_DEBUG_OFF);
+ } else if (isdigit(*setting) && atoi(setting) > 0) {
+ debug = atoi(setting);
+ alog("Debug mode activated (level %d)", debug);
+ notice_lang(s_OperServ, u, OPER_SET_DEBUG_LEVEL, debug);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_DEBUG_ERROR);
+ }
+
+ } else if (stricmp(option, "NOEXPIRE") == 0) {
+ if (stricmp(setting, "ON") == 0) {
+ noexpire = 1;
+ alog("No expire mode activated");
+ notice_lang(s_OperServ, u, OPER_SET_NOEXPIRE_ON);
+ } else if (stricmp(setting, "OFF") == 0) {
+ noexpire = 0;
+ alog("No expire mode deactivated");
+ notice_lang(s_OperServ, u, OPER_SET_NOEXPIRE_OFF);
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_NOEXPIRE_ERROR);
+ }
+
+ } else {
+ notice_lang(s_OperServ, u, OPER_SET_UNKNOWN_OPTION, option);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_noop(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ char *server = strtok(NULL, " ");
+
+ if (!cmd || !server) {
+ syntax_error(s_OperServ, u, "NOOP", OPER_NOOP_SYNTAX);
+ } else if (!stricmp(cmd, "SET")) {
+ User *u2;
+ User *u3 = NULL;
+ char reason[NICKMAX + 32];
+
+ /* Remove the O:lines */
+ s_svsnoop(server, 1);
+
+ snprintf(reason, sizeof(reason), "NOOP command used by %s",
+ u->nick);
+ if (WallOSNoOp)
+ wallops(s_OperServ, "\2%s\2 used NOOP on \2%s\2", u->nick,
+ server);
+ notice_lang(s_OperServ, u, OPER_NOOP_SET, server);
+
+ /* Kill all the IRCops of the server */
+ for (u2 = firstuser(); u2; u2 = u3) {
+ u3 = nextuser();
+ if ((u2) && is_oper(u2) && (u2->server)
+ && !stricmp(u2->server, server)) {
+#ifdef IRC_BAHAMUT
+ send_cmd(ServerName, "SVSKILL %s :%s", u2->nick, reason);
+#else
+ kill_user(s_OperServ, u2->nick, reason);
+#endif
+ }
+ }
+ } else if (!stricmp(cmd, "REVOKE")) {
+ s_svsnoop(server, 0);
+ notice_lang(s_OperServ, u, OPER_NOOP_REVOKE, server);
+ } else {
+ syntax_error(s_OperServ, u, "NOOP", OPER_NOOP_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_jupe(User * u)
+{
+ char *jserver = strtok(NULL, " ");
+ char *reason = strtok(NULL, "");
+ char rbuf[256];
+
+ if (!jserver) {
+ syntax_error(s_OperServ, u, "JUPE", OPER_JUPE_SYNTAX);
+ } else {
+ if (!isValidHost(jserver, 3)) {
+ notice_lang(s_OperServ, u, OPER_JUPE_HOST_ERROR);
+ } else {
+ snprintf(rbuf, sizeof(rbuf), "Juped by %s%s%s", u->nick,
+ reason ? ": " : "", reason ? reason : "");
+
+ send_cmd(NULL, "SQUIT %s :%s", jserver, rbuf);
+#ifdef IRC_PTLINK
+ send_cmd(NULL, "SERVER %s 1 Anope.Services%s :%s",
+ jserver, version_number, rbuf);
+#else
+ send_cmd(NULL, "SERVER %s 2 :%s", jserver, rbuf);
+#endif
+
+ if (WallOSJupe)
+ wallops(s_OperServ, "\2%s\2 used JUPE on \2%s\2", u->nick,
+ jserver);
+ }
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_raw(User * u)
+{
+
+ if (!DisableRaw) {
+
+ char *text = strtok(NULL, "");
+
+ if (!text)
+ syntax_error(s_OperServ, u, "RAW", OPER_RAW_SYNTAX);
+ else {
+ send_cmd(NULL, "%s", text);
+ if (WallOSRaw) {
+ char *kw = strtok(text, " ");
+ while (kw && *kw == ':')
+ kw = strtok(NULL, " ");
+ wallops(s_OperServ, "\2%s\2 used RAW command for \2%s\2",
+ u->nick,
+ (kw ? kw : "\2non RFC compliant message\2"));
+ }
+ alog("%s used RAW command for %s", u->nick, text);
+ }
+ } else {
+ notice_lang(s_OperServ, u, RAW_DISABLED);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_update(User * u)
+{
+ notice_lang(s_OperServ, u, OPER_UPDATING);
+ save_data = 1;
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_reload(User * u)
+{
+ if (!read_config(1)) {
+ quitmsg = calloc(28 + strlen(u->nick), 1);
+ if (!quitmsg)
+ quitmsg =
+ "Error during the reload of the configuration file, but out of memory!";
+ else
+ sprintf(quitmsg,
+ "Error during the reload of the configuration file!");
+ quitting = 1;
+ }
+
+ notice_lang(s_OperServ, u, OPER_RELOAD);
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_os_quit(User * u)
+{
+ quitmsg = calloc(28 + strlen(u->nick), 1);
+ if (!quitmsg)
+ quitmsg = "QUIT command received, but out of memory!";
+ else
+ sprintf(quitmsg, "QUIT command received from %s", u->nick);
+
+ if (GlobalOnCycle) {
+ oper_global(NULL, GlobalOnCycleMessage);
+ }
+ quitting = 1;
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_shutdown(User * u)
+{
+ quitmsg = calloc(32 + strlen(u->nick), 1);
+ if (!quitmsg)
+ quitmsg = "SHUTDOWN command received, but out of memory!";
+ else
+ sprintf(quitmsg, "SHUTDOWN command received from %s", u->nick);
+
+ if (GlobalOnCycle) {
+ oper_global(NULL, GlobalOnCycleMessage);
+ }
+ save_data = 1;
+ delayed_quit = 1;
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+static int do_restart(User * u)
+{
+#ifdef SERVICES_BIN
+ quitmsg = calloc(31 + strlen(u->nick), 1);
+ if (!quitmsg)
+ quitmsg = "RESTART command received, but out of memory!";
+ else
+ sprintf(quitmsg, "RESTART command received from %s", u->nick);
+
+ if (GlobalOnCycle) {
+ oper_global(NULL, GlobalOnCycleMessage);
+ }
+ /* raise(SIGHUP); */
+ do_restart_services();
+#else
+ notice_lang(s_OperServ, u, OPER_CANNOT_RESTART);
+#endif
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+
+#ifdef DEBUG_COMMANDS
+
+static int do_matchwild(User * u)
+{
+ char *pat = strtok(NULL, " ");
+ char *str = strtok(NULL, " ");
+ if (pat && str)
+ notice(s_OperServ, u->nick, "%d", match_wild(pat, str));
+ else
+ notice(s_OperServ, u->nick, "Syntax error.");
+ return MOD_CONT;
+}
+
+#endif /* DEBUG_COMMANDS */
+
+/*************************************************************************/
+
+/* Kill all users matching a certain host. The host is obtained from the
+ * supplied nick. The raw hostmsk is not supplied with the command in an effort
+ * to prevent abuse and mistakes from being made - which might cause *.com to
+ * be killed. It also makes it very quick and simple to use - which is usually
+ * what you want when someone starts loading numerous clones. In addition to
+ * killing the clones, we add a temporary AKILL to prevent them from
+ * immediately reconnecting.
+ * Syntax: KILLCLONES nick
+ * -TheShadow (29 Mar 1999)
+ */
+
+static int do_killclones(User * u)
+{
+ char *clonenick = strtok(NULL, " ");
+ int count = 0;
+ User *cloneuser, *user, *tempuser;
+ char *clonemask, *akillmask;
+ char killreason[NICKMAX + 32];
+ char akillreason[] = "Temporary KILLCLONES akill.";
+
+ if (!clonenick) {
+ notice_lang(s_OperServ, u, OPER_KILLCLONES_SYNTAX);
+
+ } else if (!(cloneuser = finduser(clonenick))) {
+ notice_lang(s_OperServ, u, OPER_KILLCLONES_UNKNOWN_NICK,
+ clonenick);
+
+ } else {
+ clonemask = smalloc(strlen(cloneuser->host) + 5);
+ sprintf(clonemask, "*!*@%s", cloneuser->host);
+
+ akillmask = smalloc(strlen(cloneuser->host) + 3);
+ sprintf(akillmask, "*@%s", cloneuser->host);
+
+ user = firstuser();
+ while (user) {
+ if (match_usermask(clonemask, user) != 0) {
+ tempuser = nextuser();
+ count++;
+ snprintf(killreason, sizeof(killreason),
+ "Cloning [%d]", count);
+ kill_user(NULL, user->nick, killreason);
+ user = tempuser;
+ } else {
+ user = nextuser();
+ }
+ }
+
+ add_akill(u, akillmask, u->nick,
+ time(NULL) + KillClonesAkillExpire, akillreason);
+
+ wallops(s_OperServ, "\2%s\2 used KILLCLONES for \2%s\2 killing "
+ "\2%d\2 clones. A temporary AKILL has been added "
+ "for \2%s\2.", u->nick, clonemask, count, akillmask);
+
+ alog("%s: KILLCLONES: %d clone(s) matching %s killed.",
+ s_OperServ, count, clonemask);
+
+ free(akillmask);
+ free(clonemask);
+ }
+ return MOD_CONT;
+}
+
+/**
+ * Defcon - A method of impelemting various stages of securty, the hope is this will help serives
+ * protect a network during an attack, allowing admins to choose the precautions taken at each
+ * level.
+ *
+ * /msg OperServ DefCon [level]
+ *
+ **/
+
+static int do_defcon(User * u)
+{
+ char *lvl = strtok(NULL, " ");
+ int newLevel = 0;
+ char *langglobal;
+ langglobal = getstring(NULL, DEFCON_GLOBAL);
+
+ if (!DefConLevel) { /* If we dont have a .conf setting! */
+ notice_lang(s_OperServ, u, OPER_DEFCON_NO_CONF);
+ return MOD_CONT;
+ }
+
+ if (!lvl) {
+ notice_lang(s_OperServ, u, OPER_DEFCON_CHANGED, DefConLevel);
+ defcon_sendlvls(u);
+ return MOD_CONT;
+ }
+ newLevel = atoi(lvl);
+ if (newLevel < 1 || newLevel > 5) {
+ notice_lang(s_OperServ, u, OPER_DEFCON_SYNTAX);
+ return MOD_CONT;
+ }
+
+ DefConLevel = newLevel;
+ DefContimer = time(NULL);
+ notice_lang(s_OperServ, u, OPER_DEFCON_CHANGED, DefConLevel);
+ defcon_sendlvls(u);
+ alog("Defcon level changed to %d by Oper %s", newLevel, u->nick);
+ wallops(s_OperServ, getstring2(NULL, OPER_DEFCON_WALL), u->nick,
+ newLevel);
+ /* Global notice the user what is happening. Also any Message that
+ the Admin would like to add. Set in config file. */
+ if (GlobalOnDefcon) {
+ if ((DefConLevel == 5) && (DefConOffMessage)) {
+ oper_global(NULL, DefConOffMessage);
+ } else {
+ oper_global(NULL, langglobal, DefConLevel);
+ }
+ }
+ if (GlobalOnDefconMore) {
+ if ((DefConOffMessage) && DefConLevel == 5) {
+ } else {
+ oper_global(NULL, DefconMessage);
+ }
+ }
+ /* Run any defcon functions, e.g. FORCE CHAN MODE */
+ runDefCon();
+ return MOD_CONT;
+}
+
+/**
+ * Reverse the mode string, used for remove DEFCON chan modes.
+ **/
+char *defconReverseModes(const char *modes)
+{
+ char *newmodes = NULL;
+ int i = 0;
+ if (!modes) {
+ return NULL;
+ }
+ if (!(newmodes = malloc(sizeof(char) * strlen(modes) + 1))) {
+ return NULL;
+ }
+ for (i = 0; i < strlen(modes); i++) {
+ if (modes[i] == '+')
+ newmodes[i] = '-';
+ else if (modes[i] == '-')
+ newmodes[i] = '+';
+ else
+ newmodes[i] = modes[i];
+ }
+ newmodes[i] = '\0';
+ return newmodes;
+}
+
+/**
+ * Returns 1 if the passed level is part of the CURRENT defcon, else 0 is returned
+ **/
+int checkDefCon(int level)
+{
+ return DefCon[DefConLevel] & level;
+}
+
+/**
+ * Run DefCon level specific Functions.
+ **/
+void runDefCon(void)
+{
+ char *newmodes;
+ if (checkDefCon(DEFCON_FORCE_CHAN_MODES)) {
+ if (DefConChanModes && !DefConModesSet) {
+ if (DefConChanModes[0] == '+' || DefConChanModes[0] == '-') {
+ alog("DEFCON: setting %s on all chan's", DefConChanModes);
+ do_mass_mode(DefConChanModes);
+ DefConModesSet = 1;
+ }
+ }
+ } else {
+ if (DefConChanModes && (DefConModesSet != 0)) {
+ if (DefConChanModes[0] == '+' || DefConChanModes[0] == '-') {
+ if ((newmodes = defconReverseModes(DefConChanModes))) {
+ alog("DEFCON: setting %s on all chan's", newmodes);
+ do_mass_mode(newmodes);
+ }
+ DefConModesSet = 0;
+ }
+ }
+ }
+}
+
+/**
+ * Automaticaly re-set the DefCon level if the time limit has expired.
+ **/
+void resetDefCon(int level)
+{
+ if (DefConLevel != level) {
+ if ((DefContimer)
+ && (time(NULL) - DefContimer >= dotime(DefConTimeOut))) {
+ DefConLevel = level;
+ alog("Defcon level timeout, returning to lvl %d", level);
+ wallops(s_OperServ, getstring2(NULL, OPER_DEFCON_WALL),
+ s_OperServ, level);
+ if (GlobalOnDefcon) {
+ if (DefConOffMessage) {
+ oper_global(NULL, DefConOffMessage);
+ } else {
+ oper_global(NULL, getstring(NULL, DEFCON_GLOBAL),
+ DefConLevel);
+ }
+ }
+ if (GlobalOnDefconMore && !DefConOffMessage) {
+ oper_global(NULL, DefconMessage);
+ }
+ runDefCon();
+ }
+ }
+}
+
+/**
+ * Send a message to the oper about which precautions are "active" for this level
+ **/
+static void defcon_sendlvls(User * u)
+{
+ if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_CHANNELS);
+ }
+ if (checkDefCon(DEFCON_NO_NEW_NICKS)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_NICKS);
+ }
+ if (checkDefCon(DEFCON_NO_MLOCK_CHANGE)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_MLOCK_CHANGE);
+ }
+ if (checkDefCon(DEFCON_FORCE_CHAN_MODES) && (DefConChanModes)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_FORCE_CHAN_MODES,
+ DefConChanModes);
+ }
+ if (checkDefCon(DEFCON_REDUCE_SESSION)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_REDUCE_SESSION,
+ DefConSessionLimit);
+ }
+ if (checkDefCon(DEFCON_NO_NEW_CLIENTS)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_CLIENTS);
+ }
+ if (checkDefCon(DEFCON_OPER_ONLY)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_OPER_ONLY);
+ }
+ if (checkDefCon(DEFCON_SILENT_OPER_ONLY)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_SILENT_OPER_ONLY);
+ }
+ if (checkDefCon(DEFCON_AKILL_NEW_CLIENTS)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_AKILL_NEW_CLIENTS);
+ }
+ if (checkDefCon(DEFCON_NO_NEW_MEMOS)) {
+ notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_MEMOS);
+ }
+}
+
+/**
+ * ChanKill - Akill an entire channel (got botnet?)
+ *
+ * /msg OperServ ChanKill +expire #channel reason
+ *
+ **/
+
+static int do_chankill(User * u)
+{
+ char *expiry, *channel, *reason;
+ time_t expires;
+ char breason[BUFSIZE];
+ char mask[USERMAX + HOSTMAX + 2];
+ struct c_userlist *cu, *next;
+ Channel *c;
+
+ channel = strtok(NULL, " ");
+ if (channel && *channel == '+') {
+ expiry = channel;
+ channel = strtok(NULL, " ");
+ } else {
+ expiry = NULL;
+ }
+
+ expires = expiry ? dotime(expiry) : ChankillExpiry;
+ if (expiry && isdigit(expiry[strlen(expiry) - 1]))
+ expires *= 86400;
+ if (expires != 0 && expires < 60) {
+ notice_lang(s_OperServ, u, BAD_EXPIRY_TIME);
+ return MOD_CONT;
+ } else if (expires > 0) {
+ expires += time(NULL);
+ }
+
+ if (channel && (reason = strtok(NULL, ""))) {
+
+ if (AddAkiller) {
+ snprintf(breason, sizeof(breason), "[%s] %s", u->nick, reason);
+ reason = sstrdup(breason);
+ }
+
+ if ((c = findchan(channel))) {
+ for (cu = c->users; cu; cu = next) {
+ next = cu->next;
+ if (is_oper(cu->user)) {
+ continue;
+ }
+ strncpy(mask, "*@", 3); /* Use *@" for the akill's, */
+ strncat(mask, cu->user->host, HOSTMAX);
+ add_akill(NULL, mask, s_OperServ, expires, reason);
+ check_akill(cu->user->nick, cu->user->username,
+ cu->user->host, NULL, NULL);
+ }
+ if (WallOSAkill) {
+ wallops(s_OperServ, "%s used CHANKILL on %s (%s)", u->nick,
+ channel, reason);
+ }
+ } else {
+ notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, channel);
+ }
+ } else {
+ syntax_error(s_OperServ, u, "CHANKILL", OPER_CHANKILL_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+#ifdef USE_MODULES
+
+int do_modload(User * u)
+{
+ char *name;
+ Module *m;
+
+ name = strtok(NULL, "");
+ if (!name) {
+ syntax_error(s_OperServ, u, "MODLOAD", OPER_MODULE_LOAD_SYNTAX);
+ return MOD_CONT;
+ }
+ m = findModule(name);
+ if (!m) {
+ m = createModule(name);
+ mod_current_module = m;
+ mod_current_user = u;
+ mod_current_op = 1;
+ } else {
+ notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, name);
+ }
+ return MOD_CONT;
+}
+
+int do_modunload(User * u)
+{
+ char *name;
+ Module *m;
+
+ name = strtok(NULL, "");
+ if (!name) {
+ syntax_error(s_OperServ, u, "MODUNLOAD",
+ OPER_MODULE_UNLOAD_SYNTAX);
+ return MOD_CONT;
+ }
+ m = findModule(name);
+ if (m) {
+ mod_current_user = u;
+ mod_current_module = m;
+ mod_current_op = 2;
+ } else {
+ notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, name);
+ }
+ return MOD_CONT;
+}
+
+int do_modlist(User * u)
+{
+ int idx;
+ int count = 0;
+ struct tm tm;
+ char timebuf[64];
+ ModuleHash *current = NULL;
+
+ for (idx = 0; idx != MAX_CMD_HASH; idx++) {
+ for (current = MODULE_HASH[idx]; current; current = current->next) {
+ tm = *localtime(&current->m->time);
+
+ strftime_lang(timebuf, sizeof(timebuf), u,
+ STRFTIME_DATE_TIME_FORMAT, &tm);
+ notice_lang(s_OperServ, u, OPER_MODULE_LIST, current->name);
+ count++;
+ }
+ }
+ if (count == 0) {
+ notice_lang(s_OperServ, u, OPER_MODULE_NO_LIST);
+ }
+
+ return MOD_CONT;
+}
+
+int do_modinfo(User * u)
+{
+ char *file;
+ struct tm tm;
+ char timebuf[64];
+ Module *m;
+ int idx = 0;
+ int display = 0;
+
+ file = strtok(NULL, "");
+ if (!file) {
+ syntax_error(s_OperServ, u, "MODINFO", OPER_MODULE_INFO_SYNTAX);
+ return MOD_CONT;
+ }
+ m = findModule(file);
+ if (m) {
+ tm = *localtime(&m->time);
+ strftime_lang(timebuf, sizeof(timebuf), u,
+ STRFTIME_DATE_TIME_FORMAT, &tm);
+ notice_lang(s_OperServ, u, OPER_MODULE_INFO_LIST, m->name,
+ m->version ? m->version : "?",
+ m->author ? m->author : "?", timebuf);
+ for (idx = 0; idx < MAX_CMD_HASH; idx++) {
+ display += showModuleCmdLoaded(HOSTSERV[idx], m->name, u);
+ display += showModuleCmdLoaded(OPERSERV[idx], m->name, u);
+ display += showModuleCmdLoaded(NICKSERV[idx], m->name, u);
+ display += showModuleCmdLoaded(CHANSERV[idx], m->name, u);
+ display += showModuleCmdLoaded(BOTSERV[idx], m->name, u);
+ display += showModuleCmdLoaded(MEMOSERV[idx], m->name, u);
+ display += showModuleCmdLoaded(HELPSERV[idx], m->name, u);
+ display += showModuleMsgLoaded(IRCD[idx], m->name, u);
+
+ }
+ }
+ if (display == 0) {
+ notice_lang(s_OperServ, u, OPER_MODULE_NO_INFO, file);
+ }
+ return MOD_CONT;
+}
+
+static int showModuleCmdLoaded(CommandHash * cmdList, char *mod_name,
+ User * u)
+{
+ Command *c;
+ CommandHash *current;
+ int display = 0;
+
+ for (current = cmdList; current; current = current->next) {
+ for (c = current->c; c; c = c->next) {
+ if ((c->mod_name) && (stricmp(c->mod_name, mod_name) == 0)) {
+ notice_lang(s_OperServ, u, OPER_MODULE_CMD_LIST,
+ c->service, c->name);
+ display++;
+ }
+ }
+ }
+ return display;
+}
+
+static int showModuleMsgLoaded(MessageHash * msgList, char *mod_name,
+ User * u)
+{
+ Message *msg;
+ MessageHash *mcurrent;
+ int display = 0;
+ for (mcurrent = msgList; mcurrent; mcurrent = mcurrent->next) {
+ for (msg = mcurrent->m; msg; msg = msg->next) {
+ if ((msg->mod_name) && (stricmp(msg->mod_name, mod_name) == 0)) {
+ notice_lang(s_OperServ, u, OPER_MODULE_MSG_LIST,
+ msg->name);
+ display++;
+ }
+ }
+ }
+ return display;
+}
+
+#endif
+
+/*************************************************************************/
diff --git a/process.c b/process.c
new file mode 100644
index 000000000..84388d813
--- /dev/null
+++ b/process.c
@@ -0,0 +1,268 @@
+/* Main processing code for Services.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: process.c,v 1.18 2004/01/31 18:57:18 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "messages.h"
+#include "modules.h"
+extern Module *mod_current_module;
+extern char *mod_current_module_name;
+extern User *mod_current_user;
+extern int mod_current_op;
+extern char *mod_current_buffer;
+/*************************************************************************/
+/*************************************************************************/
+
+/* Use ignore code? */
+int allow_ignore = 1;
+
+/* People to ignore (hashed by first character of nick). */
+IgnoreData *ignore[256];
+
+/*************************************************************************/
+
+/* add_ignore: Add someone to the ignorance list for the next `delta'
+ * seconds.
+ */
+
+void add_ignore(const char *nick, time_t delta)
+{
+ IgnoreData *ign;
+ char who[NICKMAX];
+ time_t now = time(NULL);
+ IgnoreData **whichlist = &ignore[tolower(nick[0])];
+
+ strscpy(who, nick, NICKMAX);
+ for (ign = *whichlist; ign; ign = ign->next) {
+ if (stricmp(ign->who, who) == 0)
+ break;
+ }
+ if (ign) {
+ if (ign->time > now)
+ ign->time += delta;
+ else
+ ign->time = now + delta;
+ } else {
+ ign = scalloc(sizeof(*ign), 1);
+ strscpy(ign->who, who, sizeof(ign->who));
+ ign->time = now + delta;
+ ign->next = *whichlist;
+ *whichlist = ign;
+ }
+}
+
+/*************************************************************************/
+
+/* get_ignore: Retrieve an ignorance record for a nick. If the nick isn't
+ * being ignored, return NULL and flush the record from the
+ * in-core list if it exists (i.e. ignore timed out).
+ */
+
+IgnoreData *get_ignore(const char *nick)
+{
+ IgnoreData *ign, *prev;
+ time_t now = time(NULL);
+ IgnoreData **whichlist = &ignore[tolower(nick[0])];
+ User *u = finduser(nick);
+ IgnoreData **whichlist2 = NULL;
+ // Bleah, this doesn't work. I need a way to get the first char of u->username.
+ //if (u) whichlist2 = &ignore[tolower(u->username[0])];
+ IgnoreData **whichlistast = &ignore[42]; /* * */
+ IgnoreData **whichlistqst = &ignore[63]; /* ? */
+ int finished = 0;
+ for (ign = *whichlist, prev = NULL; ign; prev = ign, ign = ign->next) {
+ if (stricmp(ign->who, nick) == 0) {
+ finished = 1;
+ break;
+ }
+ }
+ if (!finished && whichlist2) {
+ for (ign = *whichlist2, prev = NULL; ign;
+ prev = ign, ign = ign->next) {
+ if (match_usermask(ign->who, u)) {
+ finished = 1;
+ break;
+ }
+ }
+ }
+ if (!finished) {
+ for (ign = *whichlistast, prev = NULL; ign;
+ prev = ign, ign = ign->next) {
+ if (match_usermask(ign->who, u)) {
+ finished = 1;
+ break;
+ }
+ }
+ }
+ if (!finished) {
+ for (ign = *whichlistqst, prev = NULL; ign;
+ prev = ign, ign = ign->next) {
+ if (match_usermask(ign->who, u)) {
+ finished = 1;
+ break;
+ }
+ }
+ }
+ if (ign && ign->time <= now) {
+ if (prev)
+ prev->next = ign->next;
+ else
+ *whichlist = ign->next;
+ free(ign);
+ ign = NULL;
+ }
+ return ign;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* split_buf: Split a buffer into arguments and store the arguments in an
+ * argument vector pointed to by argv (which will be malloc'd
+ * as necessary); return the argument count. If colon_special
+ * is non-zero, then treat a parameter with a leading ':' as
+ * the last parameter of the line, per the IRC RFC. Destroys
+ * the buffer by side effect.
+ */
+
+int split_buf(char *buf, char ***argv, int colon_special)
+{
+ int argvsize = 8;
+ int argc;
+ char *s;
+
+ *argv = scalloc(sizeof(char *) * argvsize, 1);
+ argc = 0;
+ while (*buf) {
+ if (argc == argvsize) {
+ argvsize += 8;
+ *argv = srealloc(*argv, sizeof(char *) * argvsize);
+ }
+ if (*buf == ':') {
+ (*argv)[argc++] = buf + 1;
+ buf = "";
+ } else {
+ s = strpbrk(buf, " ");
+ if (s) {
+ *s++ = 0;
+ while (*s == ' ')
+ s++;
+ } else {
+ s = buf + strlen(buf);
+ }
+ (*argv)[argc++] = buf;
+ buf = s;
+ }
+ }
+ return argc;
+}
+
+/*************************************************************************/
+
+/* process: Main processing routine. Takes the string in inbuf (global
+ * variable) and does something appropriate with it. */
+
+void process()
+{
+ int retVal = 0;
+ Message *current = NULL;
+ char source[64];
+ char cmd[64];
+ char buf[512]; /* Longest legal IRC command line */
+ char *s;
+ int ac; /* Parameters for the command */
+ char **av;
+ Message *m;
+
+
+ /* If debugging, log the buffer */
+ if (debug)
+ alog("debug: Received: %s", inbuf);
+
+ /* First make a copy of the buffer so we have the original in case we
+ * crash - in that case, we want to know what we crashed on. */
+ strscpy(buf, inbuf, sizeof(buf));
+
+ doCleanBuffer((char *) buf);
+
+ /* Split the buffer into pieces. */
+ if (*buf == ':') {
+ s = strpbrk(buf, " ");
+ if (!s)
+ return;
+ *s = 0;
+ while (isspace(*++s));
+ strscpy(source, buf + 1, sizeof(source));
+ memmove(buf, s, strlen(s) + 1);
+ } else {
+ *source = 0;
+ }
+ if (!*buf)
+ return;
+ s = strpbrk(buf, " ");
+ if (s) {
+ *s = 0;
+ while (isspace(*++s));
+ } else
+ s = buf + strlen(buf);
+ strscpy(cmd, buf, sizeof(cmd));
+ ac = split_buf(s, &av, 1);
+ if (mod_current_buffer) {
+ free(mod_current_buffer);
+ }
+ if (av[1]) {
+ mod_current_buffer = sstrdup(av[1]);
+ } else {
+ mod_current_buffer = NULL;
+ }
+ /* Do something with the message. */
+ m = find_message(cmd);
+ if (m) {
+ if (m->func) {
+ mod_current_module_name = m->mod_name;
+ retVal = m->func(source, ac, av);
+ mod_current_module_name = NULL;
+ if (retVal == MOD_CONT) {
+ current = m->next;
+ while (current && current->func && retVal == MOD_CONT) {
+ mod_current_module_name = m->mod_name;
+ retVal = current->func(source, ac, av);
+ mod_current_module_name = NULL;
+ current = current->next;
+ }
+ }
+ }
+ } else {
+ if (debug)
+ alog("unknown message from server (%s)", inbuf);
+ }
+ if (mod_current_op == 1) {
+ alog("trying to load [%s]", mod_current_module->name);
+ alog("status: [%d]",
+ loadModule(mod_current_module, mod_current_user));
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+ mod_current_op = 0;
+ } else if (mod_current_op == 2) {
+ alog("trying to unload [%s]", mod_current_module->name);
+ alog("status: [%d]",
+ unloadModule(mod_current_module, mod_current_user));
+ mod_current_module = NULL;
+ mod_current_user = NULL;
+ mod_current_op = 0;
+ }
+ /* Free argument list we created */
+ free(av);
+}
+
+/*************************************************************************/
diff --git a/protocol.c b/protocol.c
new file mode 100644
index 000000000..58bdb21f1
--- /dev/null
+++ b/protocol.c
@@ -0,0 +1,182 @@
+/* Simple interfaces to various protocols.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: protocol.c,v 1.11 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+/* Makes an permanent ban from all the servers. Assumes that the matching clients are killed. */
+
+void s_akill(char *user, char *host, char *who, time_t when,
+ time_t expires, char *reason)
+{
+#if defined(IRC_BAHAMUT)
+ /* send_cmd(NULL, "AKILL %s %s %d %s %ld :%s", host, user, 86400*2, who, when, reason); */
+ send_cmd(NULL, "AKILL %s %s %d %s %ld :%s", host, user,
+ 86400 * 2, who, time(NULL), reason);
+
+#elif defined(IRC_UNREAL)
+ send_cmd(NULL, "TKL + G %s %s %s %ld %ld :%s", user, host, who, time(NULL) + 86400 * 2, /* Avoids filling the akill list of servers too much */
+ when, reason);
+#elif defined(IRC_DREAMFORGE)
+ send_cmd(NULL, "AKILL %s %s :%s", host, user, reason);
+#elif defined(IRC_PTLINK)
+ send_cmd(ServerName, "GLINE %s@%s %i %s :%s", user, host, 86400 * 2,
+ who, reason);
+#elif defined(IRC_HYBRID)
+ send_cmd(s_OperServ, "KLINE * %ld %s %s :%s",
+ (expires - (long) time(NULL)), user, host, reason);
+#endif
+}
+
+/*************************************************************************/
+
+/* Removes a permanent ban from all the servers. */
+
+void s_rakill(char *user, char *host)
+{
+#if defined(IRC_PTLINK)
+ send_cmd(NULL, "UNGLINE %s@%s", user, host);
+#elif defined(IRC_UNREAL)
+ send_cmd(NULL, "TKL - G %s %s %s", user, host, s_OperServ);
+#elif !defined(IRC_HYBRID)
+ send_cmd(NULL, "RAKILL %s %s", host, user);
+#endif
+}
+
+/*************************************************************************/
+
+void s_sgline(char *mask, char *reason)
+{
+#ifdef IRC_BAHAMUT
+ /* User *u; */
+
+ send_cmd(NULL, "SGLINE %d :%s:%s", strlen(mask), mask, reason);
+
+ /* Do things properly: kill all corresponding users as this is
+ unfortunately not done by the IRCds :/ */
+ /* Breaks things currently! */
+ /* for (u = firstuser(); u; u = nextuser())
+ if (match_wild_nocase(mask, u->realname))
+ send_cmd(NULL, "SVSKILL %s :G-Lined: %s", u->nick, reason); */
+#endif
+}
+
+/*************************************************************************/
+
+void s_sqline(char *mask, char *reason)
+{
+#ifdef IRC_BAHAMUT
+ if (*mask == '#') {
+ int i;
+ Channel *c, *next;
+
+ char *av[3];
+ struct c_userlist *cu, *cunext;
+
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+
+ for (i = 0; i < 1024; i++) {
+ for (c = chanlist[i]; c; c = next) {
+ next = c->next;
+
+ if (!match_wild_nocase(mask, c->name))
+ continue;
+
+ for (cu = c->users; cu; cu = cunext) {
+ cunext = cu->next;
+
+ if (is_oper(cu->user))
+ continue;
+
+ av[0] = c->name;
+ av[1] = cu->user->nick;
+ av[2] = reason;
+ send_cmd(s_OperServ, "KICK %s %s :Q-Lined: %s", av[0],
+ av[1], av[2]);
+ do_kick(s_ChanServ, 3, av);
+ }
+ }
+ }
+ } else {
+#endif
+ /* int i;
+ User *u, *next; */
+
+ send_cmd(NULL, "SQLINE %s :%s", mask, reason);
+
+ /* for (i = 0; i < 1024; i++) {
+ for (u = userlist[i]; u; u = next) {
+ next = u->next;
+ if (match_wild_nocase(mask, u->nick))
+ #ifdef IRC_BAHAMUT
+ send_cmd(NULL, "SVSKILL %s :%s", u->nick, reason);
+ #else
+ kill_user(s_OperServ, u->nick, reason);
+ #endif
+ }
+ } */
+#ifdef IRC_BAHAMUT
+ }
+#endif
+}
+
+/*************************************************************************/
+
+void s_svsnoop(char *server, int set)
+{
+#ifndef IRC_HYBRID
+#ifdef IRC_PTLINK
+ send_cmd(NULL, "SVSADMIN %s :%s", server, set ? "noopers" : "rehash");
+#else
+ send_cmd(NULL, "SVSNOOP %s %s", server, (set ? "+" : "-"));
+#endif
+#endif
+}
+
+/*************************************************************************/
+
+void s_szline(char *mask, char *reason)
+{
+#ifdef IRC_BAHAMUT
+ send_cmd(NULL, "SZLINE %s :%s", mask, reason);
+#endif
+}
+
+/*************************************************************************/
+
+void s_unsgline(char *mask)
+{
+#ifdef IRC_BAHAMUT
+ send_cmd(NULL, "UNSGLINE 0 :%s", mask);
+#endif
+}
+
+/*************************************************************************/
+
+void s_unsqline(char *mask)
+{
+#ifdef IRC_BAHAMUT
+ send_cmd(NULL, "UNSQLINE 0 %s", mask);
+#else
+ send_cmd(NULL, "UNSQLINE %s", mask);
+#endif
+}
+
+/*************************************************************************/
+
+void s_unszline(char *mask)
+{
+#ifdef IRC_BAHAMUT
+ send_cmd(NULL, "UNSZLINE 0 %s", mask);
+#endif
+}
diff --git a/proxy.c b/proxy.c
new file mode 100644
index 000000000..e9c88238f
--- /dev/null
+++ b/proxy.c
@@ -0,0 +1,793 @@
+/* Proxy detector.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: proxy.c,v 1.11 2004/02/14 21:22:55 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+#include <fcntl.h>
+
+/* Hashed list of HostCache; threads must not use it! */
+HostCache *hcache[1024];
+
+/*************************************************************************/
+
+/* Equivalent to inet_ntoa */
+
+void ntoa(struct in_addr addr, char *ipaddr, int len)
+{
+ unsigned char *bytes = (unsigned char *) &addr.s_addr;
+ snprintf(ipaddr, len, "%u.%u.%u.%u", bytes[0], bytes[1], bytes[2],
+ bytes[3]);
+}
+
+/*************************************************************************/
+
+#ifdef USE_THREADS
+
+/*************************************************************************/
+
+#define HASH(host) ((tolower((host)[0])&31)<<5 | (tolower((host)[1])&31))
+
+/* Proxy queue; access controlled by queuemut */
+SList pxqueue;
+
+pthread_mutex_t queuemut = PTHREAD_MUTEX_INITIALIZER;
+pthread_cond_t queuecond = PTHREAD_COND_INITIALIZER;
+
+#if !defined(HAS_NICKIP) && !defined(HAVE_GETHOSTBYNAME_R6) && !defined(HAVE_GETHOSTBYNAME_R5) && !defined(HAVE_GETHOSTBYNAME_R3)
+pthread_mutex_t resmut = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+static uint32 aton(char *ipaddr);
+static void proxy_akill(char *host);
+static HostCache *proxy_cache_add(char *host);
+static void proxy_cache_del(HostCache * hc);
+static HostCache *proxy_cache_find(char *host);
+static int proxy_connect(unsigned long ip, unsigned short port);
+static void proxy_queue_cleanup_unlock(void *arg);
+static void proxy_queue_lock(void);
+static void proxy_queue_signal(void);
+static void proxy_queue_unlock(void);
+static void proxy_queue_wait(void);
+static int proxy_read(int s, char *buf, size_t buflen);
+#ifndef HAS_NICKIP
+static uint32 proxy_resolve(char *host);
+#endif
+static int proxy_scan(uint32 ip);
+static void *proxy_thread_main(void *arg);
+
+/*************************************************************************/
+
+/* Equivalent to inet_addr */
+
+static uint32 aton(char *ipaddr)
+{
+ int i;
+ long lv;
+ char *endptr;
+ uint32 res;
+ unsigned char *bytes = (unsigned char *) &res;
+
+ for (i = 0; i < 4; i++) {
+ if (!*ipaddr)
+ return INADDR_NONE;
+
+ lv = strtol(ipaddr, &endptr, 10);
+ if (lv < 0 || lv > 255 || (*endptr != 0 && *endptr != '.'))
+ return INADDR_NONE;
+
+ bytes[i] = (unsigned char) lv;
+ ipaddr = (!*endptr ? endptr : ++endptr);
+ }
+
+ if (*endptr)
+ return INADDR_NONE;
+
+ return res;
+}
+
+/*************************************************************************/
+
+void get_proxy_stats(long *nrec, long *memuse)
+{
+ int i;
+ long mem = 0, count = 0;
+ HostCache *hc;
+
+ for (i = 0; i < 1024; i++) {
+ for (hc = hcache[i]; hc; hc = hc->next) {
+ count += 1;
+ mem += sizeof(HostCache);
+ mem += strlen(hc->host) + 1;
+ }
+ }
+
+ *nrec = count;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+
+/* Akills the given host, and issues a GLOBOPS if configured so */
+
+static void proxy_akill(char *host)
+{
+ s_akill("*", host, s_OperServ, time(NULL),
+ time(NULL) + (ProxyExpire ? ProxyExpire : 86400 * 2),
+ ProxyAkillReason);
+ if (WallProxy)
+ wallops(s_OperServ, "Insecure proxy \2%s\2 has been AKILLed.",
+ host);
+}
+
+/*************************************************************************/
+
+/* Adds a cache entry after having it allocated */
+
+static HostCache *proxy_cache_add(char *host)
+{
+ HostCache *hc;
+ int index = HASH(host);
+
+ hc = scalloc(1, sizeof(HostCache));
+ hc->host = sstrdup(host);
+ hc->used = time(NULL);
+
+ hc->prev = NULL;
+ hc->next = hcache[index];
+ if (hc->next)
+ hc->next->prev = hc;
+ hcache[index] = hc;
+
+ if (debug)
+ alog("debug: Added %s to host cache", host);
+
+ return hc;
+}
+
+/*************************************************************************/
+
+/* Deletes and frees a proxy cache entry */
+
+static void proxy_cache_del(HostCache * hc)
+{
+ /* Just to be sure */
+ if (hc->status < 0)
+ return;
+
+ if (debug)
+ alog("debug: Deleting %s from host cache", hc->host);
+
+ if (hc->status > HC_NORMAL)
+ s_rakill("*", hc->host);
+
+ if (hc->next)
+ hc->next->prev = hc->prev;
+ if (hc->prev)
+ hc->prev->next = hc->next;
+ else
+ hcache[HASH(hc->host)] = hc->next;
+
+ if (hc->host)
+ free(hc->host);
+
+ free(hc);
+}
+
+/*************************************************************************/
+
+/* Finds a proxy cache entry */
+
+static HostCache *proxy_cache_find(char *host)
+{
+ HostCache *hc;
+
+ for (hc = hcache[HASH(host)]; hc; hc = hc->next) {
+ if (stricmp(hc->host, host) == 0)
+ return hc;
+ }
+
+ return NULL;
+}
+
+/*************************************************************************/
+
+/* Checks whether the specified host is in the cache.
+ * If so:
+ * * if it's a proxy, take the appropriate actions, including killing nick
+ * * if it's not a proxy, do nothing
+ * If not:
+ * * add the host to the cache
+ * * add the host to the queue
+ * * send a signal to a waiting thread (if any)
+ *
+ * Returns 0 if nick is to be added to internal list, 1 else
+ */
+
+int proxy_check(char *nick, char *host, uint32 ip)
+{
+ int i;
+ char **message;
+ HostCache *hc;
+
+ if ((hc = proxy_cache_find(host))) {
+ hc->used = time(NULL);
+
+ if (hc->status <= HC_NORMAL)
+ return 0;
+
+ proxy_akill(host);
+ return 0;
+ }
+
+ for (message = ProxyMessage, i = 0; i < 8 && *message && **message;
+ message++, i++)
+ notice(s_GlobalNoticer, nick, *message);
+
+ hc = proxy_cache_add(host);
+#ifdef HAS_NICKIP
+ hc->ip = htonl(ip);
+#endif
+ hc->status = HC_QUEUED;
+
+ proxy_queue_lock();
+ slist_add(&pxqueue, hc);
+ if (debug)
+ alog("debug: Added %s to proxy queue", hc->host);
+ proxy_queue_signal();
+ proxy_queue_unlock();
+
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Initiates a non-blocking connection */
+
+static int proxy_connect(unsigned long ip, unsigned short port)
+{
+ struct sockaddr_in sin;
+ int s;
+
+ fd_set fds;
+ struct timeval tv;
+ int error, errlen;
+
+ if ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1)
+ return -1;
+
+ if (fcntl(s, F_SETFL, O_NONBLOCK) == -1) {
+ close(s);
+ return -1;
+ }
+
+ memset(&sin, 0, sizeof(struct sockaddr_in));
+
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = ip;
+ sin.sin_port = htons(port);
+
+ if (connect(s, (struct sockaddr *) &sin, sizeof(struct sockaddr_in)) ==
+ -1 && errno != EINPROGRESS) {
+ close(s);
+ return -1;
+ }
+
+ FD_ZERO(&fds);
+ FD_SET(s, &fds);
+
+ tv.tv_sec = ProxyTimeout;
+ tv.tv_usec = 0;
+
+ if (select(s + 1, NULL, &fds, NULL, &tv) <= 0) {
+ close(s);
+ return -1;
+ }
+
+ errlen = sizeof(int);
+ if (getsockopt(s, SOL_SOCKET, SO_ERROR, &error, &errlen) == -1
+ || error != 0) {
+ close(s);
+ return -1;
+ }
+
+ return s;
+}
+
+/*************************************************************************/
+
+/* Deletes expired cache entries */
+
+void proxy_expire()
+{
+ int i;
+ HostCache *hc, *next;
+ time_t t = time(NULL);
+
+ for (i = 0; i < 1024; i++) {
+ for (hc = hcache[i]; hc; hc = next) {
+ next = hc->next;
+
+ /* Don't expire not scanned yet entries */
+ if (hc->status < HC_NORMAL)
+ continue;
+
+ if (hc->status == HC_NORMAL
+ && t - hc->used >= ProxyCacheExpire) {
+ proxy_cache_del(hc);
+ continue;
+ }
+
+ if (ProxyExpire && hc->status > HC_NORMAL
+ && t - hc->used >= ProxyExpire) {
+ alog("proxy: Expiring proxy %s", hc->host);
+ proxy_cache_del(hc);
+ }
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* Initializes the proxy detector. Returns 1 on success, 0 on error. */
+
+int proxy_init(void)
+{
+ int i;
+ pthread_t th;
+
+ slist_init(&pxqueue);
+
+ for (i = 1; i <= ProxyThreads; i++) {
+ if (pthread_create(&th, NULL, proxy_thread_main, NULL))
+ return 0;
+ if (pthread_detach(th))
+ return 0;
+ if (debug)
+ alog("debug: Creating proxy thread %ld (%d of %d)", (long) th,
+ i, ProxyThreads);
+ }
+
+ alog("Proxy detector initialized");
+
+ return 1;
+}
+
+/*************************************************************************/
+
+static void proxy_queue_cleanup_unlock(void *arg)
+{
+ proxy_queue_unlock();
+}
+
+/*************************************************************************/
+
+static void proxy_queue_lock(void)
+{
+ if (debug)
+ alog("debug: Thread %ld: Locking proxy queue mutex",
+ (long) pthread_self());
+ pthread_mutex_lock(&queuemut);
+}
+
+/*************************************************************************/
+
+static void proxy_queue_signal(void)
+{
+ if (debug)
+ alog("debug: Thread %ld: Signaling proxy queue condition",
+ (long) pthread_self());
+ pthread_cond_signal(&queuecond);
+}
+
+/*************************************************************************/
+
+static void proxy_queue_unlock(void)
+{
+ if (debug)
+ alog("debug: Thread %ld: Unlocking proxy queue mutex",
+ (long) pthread_self());
+ pthread_mutex_unlock(&queuemut);
+}
+
+/*************************************************************************/
+
+static void proxy_queue_wait(void)
+{
+ if (debug)
+ alog("debug: Thread %ld: waiting proxy queue condition",
+ (long) pthread_self());
+ pthread_cond_wait(&queuecond, &queuemut);
+}
+
+/*************************************************************************/
+
+/* Reads from the socket, in a non-blocking manner */
+
+static int proxy_read(int s, char *buf, size_t buflen)
+{
+ fd_set fds;
+ struct timeval tv;
+
+ FD_ZERO(&fds);
+ FD_SET(s, &fds);
+
+ tv.tv_sec = ProxyTimeout;
+ tv.tv_usec = 0;
+
+ if (select(s + 1, &fds, NULL, NULL, &tv) <= 0)
+ return -1;
+
+ return recv(s, buf, buflen, 0);
+}
+
+/*************************************************************************/
+
+/* Resolves hostnames in a thread safe manner */
+
+#ifndef HAS_NICKIP
+
+static uint32 proxy_resolve(char *host)
+{
+ struct hostent *hentp = NULL;
+ uint32 ip = INADDR_NONE;
+#if defined(HAVE_GETHOSTBYNAME_R6)
+ struct hostent hent;
+ char hbuf[8192];
+ int herrno;
+
+ if (gethostbyname_r(host, &hent, hbuf, sizeof(hbuf), &hentp, &herrno) <
+ 0)
+ hentp = NULL;
+#elif defined(HAVE_GETHOSTBYNAME_R5)
+ struct hostent hent char hbuf[8192];
+ int herrno;
+ hentp = gethostbyname_r(host, &hent, hbuf, sizeof(hbuf), &herrno);
+#elif defined(HAVE_GETHOSTBYNAME_R3)
+ struct hostent hent;
+ struct hostent_data data;
+ hentp = gethostbyname_r(host, &hent, &data);
+#else
+ /* Make it safe that way */
+ pthread_mutex_lock(&resmut);
+ hentp = gethostbyname(host);
+#endif
+
+ if (hentp) {
+ memcpy(&ip, hentp->h_addr, sizeof(hentp->h_length));
+ if (debug) {
+ char ipbuf[16];
+ struct in_addr addr;
+ addr.s_addr = ip;
+ ntoa(addr, ipbuf, sizeof(ipbuf));
+ alog("debug: Thread %ld: resolved %s to %s",
+ (long) pthread_self(), host, ipbuf);
+ }
+ }
+#if !defined(HAVE_GETHOSTBYNAME_R6) && !defined(HAVE_GETHOSTBYNAME_R5) && !defined(HAVE_GETHOSTBYNAME_R3)
+ pthread_mutex_unlock(&resmut);
+#endif
+
+ return ip;
+}
+
+#endif
+
+/*************************************************************************/
+
+/* Scans the given host for proxy */
+
+static int proxy_scan(uint32 ip)
+{
+ int s; /* Socket */
+ int i;
+
+ if (ip == INADDR_NONE)
+ return HC_NORMAL;
+
+ /* Scan for SOCKS (4/5) */
+
+ for (i = 0; i < 2; i++) {
+ if ((s = proxy_connect(ip, 1080)) == -1)
+ break;
+
+ if (ProxyCheckSocks4 && i == 0) {
+ /* SOCKS4 */
+
+ char buf[9];
+ uint32 sip;
+
+ sip = aton(ProxyTestServer);
+ sip = htonl(sip);
+
+ buf[0] = 4;
+ buf[1] = 1;
+ buf[2] = (((unsigned short) ProxyTestPort) >> 8) & 0xFF;
+ buf[3] = ((unsigned short) ProxyTestPort) & 0xFF;
+ buf[4] = (sip >> 24) & 0xFF;
+ buf[5] = (sip >> 16) & 0xFF;
+ buf[6] = (sip >> 8) & 0xFF;
+ buf[7] = sip & 0xFF;
+ buf[8] = 0;
+
+ if (send(s, buf, 9, 0) != 9) {
+ close(s);
+ return HC_NORMAL;
+ }
+
+ if (proxy_read(s, buf, 2) != 2) {
+ close(s);
+ continue;
+ }
+
+ if (buf[1] == 90) {
+ close(s);
+ return HC_SOCKS4;
+ }
+
+ } else if (ProxyCheckSocks5 && i == 1) {
+ /* SOCKS5 */
+
+ char buf[10];
+ uint32 sip;
+
+ if (send(s, "\5\1\0", 3, 0) != 3) {
+ close(s);
+ continue;
+ }
+
+ memset(buf, 0, sizeof(buf));
+
+ if (proxy_read(s, buf, 2) != 2) {
+ close(s);
+ continue;
+ }
+
+ if (buf[0] != 5 || buf[1] != 0) {
+ close(s);
+ continue;
+ }
+
+ sip = aton(ProxyTestServer);
+ sip = htonl(sip);
+
+ buf[0] = 5;
+ buf[1] = 1;
+ buf[2] = 0;
+ buf[3] = 1;
+ buf[4] = (sip >> 24) & 0xFF;
+ buf[5] = (sip >> 16) & 0xFF;
+ buf[6] = (sip >> 8) & 0xFF;
+ buf[7] = sip & 0xFF;
+ buf[8] = (((unsigned short) ProxyTestPort) >> 8) & 0xFF;
+ buf[9] = ((unsigned short) ProxyTestPort) & 0xFF;
+
+ if (send(s, buf, 10, 0) != 10) {
+ close(s);
+ continue;
+ }
+
+ memset(buf, 0, sizeof(buf));
+
+ if (proxy_read(s, buf, 2) != 2) {
+ close(s);
+ continue;
+ }
+
+ if (buf[0] == 5 && buf[1] == 0) {
+ close(s);
+ return HC_SOCKS5;
+ }
+ }
+
+ close(s);
+ }
+
+ /* Scan for HTTP proxy */
+ for (i = 0; i < 3; i++) {
+ if ((i ==
+ 0 ? ProxyCheckHTTP2 : (i ==
+ 1 ? ProxyCheckHTTP1 : ProxyCheckHTTP3))
+ && (s =
+ proxy_connect(ip,
+ (i == 0 ? 8080 : (i == 1 ? 3128 : 80)))) !=
+ -1) {
+ int bread;
+ char buf[64];
+
+ snprintf(buf, sizeof(buf), "CONNECT %s:%d HTTP/1.0\n\n",
+ ProxyTestServer, ProxyTestPort);
+ if (send(s, buf, strlen(buf), 0) == strlen(buf)) {
+ if ((bread = proxy_read(s, buf, 15)) >= 12) {
+ buf[bread] = 0;
+
+ if (!strnicmp(buf, "HTTP/1.0 200", 12) || !stricmp(buf, "HTTP/1.1 200 Co")) { /* Apache may return 200 OK
+ even if it's not processing
+ the CONNECT request. :/ */
+ close(s);
+ return HC_HTTP;
+ }
+ }
+ }
+ close(s);
+ }
+ }
+
+ /* Scan for Wingate */
+ if (ProxyCheckWingate && (s = proxy_connect(ip, 23)) != -1) {
+ char buf[9];
+
+ if (proxy_read(s, buf, 8) == 8) {
+ buf[8] = '\0';
+ if (!stricmp(buf, "Wingate>") || !stricmp(buf, "Too many")) {
+ close(s);
+ return HC_WINGATE;
+ }
+ }
+ close(s);
+ }
+
+ return HC_NORMAL;
+}
+
+/*************************************************************************/
+
+/* Proxy detector threads entry point */
+
+static void *proxy_thread_main(void *arg)
+{
+ while (1) {
+ pthread_cleanup_push(&proxy_queue_cleanup_unlock, NULL);
+ proxy_queue_lock();
+ proxy_queue_wait();
+ pthread_cleanup_pop(1);
+
+ /* We loop until there is no more host to check in the list */
+ while (1) {
+ HostCache *hc = NULL;
+ int status;
+
+ pthread_cleanup_push(&proxy_queue_cleanup_unlock, NULL);
+ proxy_queue_lock();
+ if (pxqueue.count > 0) {
+ hc = pxqueue.list[0];
+ hc->status = HC_PROGRESS;
+ slist_delete(&pxqueue, 0);
+ }
+ pthread_cleanup_pop(1);
+
+ if (!hc)
+ break;
+
+ if (debug) {
+ if (hc->ip) {
+ char ipbuf[16];
+ struct in_addr in;
+ in.s_addr = hc->ip;
+ ntoa(in, ipbuf, sizeof(ipbuf));
+ alog("debug: Scanning host %s [%s] for proxy",
+ hc->host, ipbuf);
+ } else {
+ alog("debug: Scanning host %s for proxy", hc->host);
+ }
+ }
+#ifndef HAS_NICKIP
+ /* Test if it's an IP, and if not try to resolve the hostname */
+ if ((hc->ip = aton(hc->host)) == INADDR_NONE)
+ hc->ip = proxy_resolve(hc->host);
+#endif
+ status = proxy_scan(hc->ip);
+
+ if (debug) {
+ char ipbuf[16];
+ struct in_addr in;
+ in.s_addr = hc->ip;
+ ntoa(in, ipbuf, sizeof(ipbuf));
+ alog("debug: Scan for %s [%s] complete, result: %d",
+ hc->host, ipbuf, status);
+ }
+
+ if (status > HC_NORMAL)
+ proxy_akill(hc->host);
+
+ hc->status = status;
+ }
+ }
+
+ return NULL;
+}
+
+/*************************************************************************/
+
+#endif
+
+/*************************************************************************/
+
+/* OperServ CACHE */
+
+int do_cache(User * u)
+{
+#ifdef USE_THREADS
+ char *cmd = strtok(NULL, " ");
+ char *pattern = strtok(NULL, " ");
+
+ if (!ProxyDetect) {
+ notice_lang(s_OperServ, u, OPER_CACHE_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (!cmd || !pattern) {
+ syntax_error(s_OperServ, u, "CACHE", OPER_CACHE_SYNTAX);
+ } else if (!stricmp(cmd, "DEL")) {
+ HostCache *hc;
+
+ if (!(hc = proxy_cache_find(pattern))) {
+ notice_lang(s_OperServ, u, OPER_CACHE_NOT_FOUND, pattern);
+ return MOD_CONT;
+ }
+
+ proxy_cache_del(hc);
+ notice_lang(s_OperServ, u, OPER_CACHE_REMOVED, pattern);
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ } else if (!stricmp(cmd, "LIST")) {
+ char *option = strtok(NULL, " ");
+ int i, restrict = 0, count = 0, total = 0;
+ HostCache *hc;
+
+ static int statusdesc[7] = {
+ OPER_CACHE_QUEUED,
+ OPER_CACHE_PROGRESS,
+ OPER_CACHE_NORMAL,
+ OPER_CACHE_WINGATE,
+ OPER_CACHE_SOCKS4,
+ OPER_CACHE_SOCKS5,
+ OPER_CACHE_HTTP
+ };
+
+ if (option && !stricmp(option, "QUEUED"))
+ restrict = 1;
+ else if (option && !stricmp(option, "ALL"))
+ restrict = 2;
+
+ notice_lang(s_OperServ, u, OPER_CACHE_HEADER);
+
+ for (i = 0; i < 1024; i++) {
+ for (hc = hcache[i]; hc; hc = hc->next) {
+ if (!match_wild_nocase(pattern, hc->host))
+ continue;
+ if ((restrict == 0 && hc->status <= HC_NORMAL)
+ || (restrict == 1 && hc->status >= HC_NORMAL))
+ continue;
+ total++;
+ if (count >= ProxyMax)
+ continue;
+ notice_lang(s_OperServ, u, OPER_CACHE_LIST, hc->host,
+ getstring(u->na, statusdesc[hc->status + 2]));
+ count++;
+ }
+ }
+
+ notice_lang(s_OperServ, u, OPER_CACHE_FOOTER, count, total);
+
+ } else {
+ syntax_error(s_OperServ, u, "CACHE", OPER_CACHE_SYNTAX);
+ }
+#else
+ notice_lang(s_OperServ, u, OPER_CACHE_DISABLED);
+#endif
+ return MOD_CONT;
+}
+
+/*************************************************************************/
diff --git a/pseudo.h b/pseudo.h
new file mode 100644
index 000000000..2df5f3275
--- /dev/null
+++ b/pseudo.h
@@ -0,0 +1,20 @@
+/* Include extra includes needed by most/all pseudo-clients.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: pseudo.h,v 1.4 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#include "commands.h"
+#include "language.h"
+#include "timeout.h"
+#include "encrypt.h"
+#include "datafiles.h"
+#include "slist.h"
diff --git a/rdb.c b/rdb.c
new file mode 100644
index 000000000..6a2eda29f
--- /dev/null
+++ b/rdb.c
@@ -0,0 +1,347 @@
+/* RDB functions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: rdb.c,v 1.11 2003/08/04 01:09:43 dane Exp $
+ *
+ */
+#include "services.h"
+
+/*************************************************************************/
+
+int rdb_init()
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_init();
+#endif
+
+}
+
+/*************************************************************************/
+
+int rdb_open()
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_open();
+#endif
+
+}
+
+/*************************************************************************/
+
+int rdb_close()
+{
+
+#ifdef USE_MYSQL
+ return db_mysql_close();
+#endif
+
+}
+
+/*************************************************************************/
+
+int rdb_tag_table(char *table)
+{
+ static char buf[1024];
+
+#ifdef USE_MYSQL
+ snprintf(buf, sizeof(buf), "UPDATE %s SET active='0'", table);
+ return db_mysql_query(buf);
+#endif
+
+ return 0;
+
+}
+
+/*************************************************************************/
+
+int rdb_clear_table(char *table)
+{
+ static char buf[1024];
+
+#ifdef USE_MYSQL
+ snprintf(buf, sizeof(buf), "TRUNCATE TABLE %s", table);
+ return db_mysql_query(buf);
+#endif
+
+ return 0;
+
+}
+
+/*************************************************************************/
+
+int rdb_scrub_table(char *table, char *clause)
+{
+
+ static char buf[1024];
+
+#ifdef USE_MYSQL
+ snprintf(buf, sizeof(buf), "DELETE FROM %s WHERE %s", table, clause);
+ return db_mysql_query(buf);
+#endif
+
+ return 0;
+
+}
+
+/*************************************************************************/
+
+int rdb_direct_query(char *query)
+{
+
+#ifdef USE_MYSQL
+ alog("Direct Query: %s", query);
+ return db_mysql_query(query);
+#endif
+
+ return 0;
+
+}
+
+/*************************************************************************/
+
+/* I still don't really like doing it this way, it should really be done
+ * inside mysql.c and not here. So I'll revisit this later
+ */
+int rdb_ns_set_display(char *newnick, char *oldnick)
+{
+ static char buf[1024];
+
+#ifdef USE_MYSQL
+ /* Change the display on NS_CORE */
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_ns_core SET display='%s' WHERE display='%s'",
+ newnick, oldnick);
+ db_mysql_query(buf);
+
+ /* Change the display on NS_ALIAS for all grouped nicks */
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_ns_alias SET display='%s' WHERE display='%s'",
+ newnick, oldnick);
+ db_mysql_query(buf);
+
+ /* Change the display on ChanServ ACCESS list */
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_cs_access SET display='%s' WHERE display='%s'",
+ newnick, oldnick);
+ db_mysql_query(buf);
+
+ /* Change the display on ChanServ AKICK list */
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_cs_access SET creator='%s' WHERE creator='%s'",
+ newnick, oldnick);
+ db_mysql_query(buf);
+
+ /* Change the display on MemoServ sent memos */
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_ms_info SET sender='%s' WHERE sender='%s'",
+ newnick, oldnick);
+ db_mysql_query(buf);
+
+ /* Change the display on MemoServ received memos */
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_ms_info SET receiver='%s' WHERE receiver='%s'",
+ newnick, oldnick);
+ db_mysql_query(buf);
+
+ /* Need to do bwords and akills */
+
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_cs_deluser(char *nick)
+{
+ static char buf[1024];
+
+#ifdef USE_MYSQL
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_cs_info SET successor=NULL WHERE successor='%s'",
+ nick);
+ db_mysql_query(buf);
+
+ snprintf(buf, sizeof(buf), "display='%s'", nick);
+ rdb_scrub_table("anope_cs_access", buf);
+ snprintf(buf, sizeof(buf), "creator='%s'", nick);
+ rdb_scrub_table("anope_cs_akicks", buf);
+
+ return 1;
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_cs_delchan(ChannelInfo * ci)
+{
+ static char buf[1024];
+ char *channel = ci->name;
+
+#ifdef USE_MYSQL
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_cs_info SET successor=NULL WHERE name='%s'",
+ channel);
+ db_mysql_query(buf);
+
+ snprintf(buf, sizeof(buf), "name='%s'", channel);
+ rdb_scrub_table("anope_cs_info", buf);
+ snprintf(buf, sizeof(buf), "receiver='%s' AND serv='CHAN'", channel);
+ rdb_scrub_table("anope_ms_info", buf);
+ snprintf(buf, sizeof(buf), "channel='%s'", channel);
+ rdb_scrub_table("anope_cs_access", buf);
+ rdb_scrub_table("anope_cs_akicks", buf);
+ rdb_scrub_table("anope_cs_levels", buf);
+ rdb_scrub_table("anope_cs_badwords", buf);
+ if (ci->founder) {
+ snprintf(buf, sizeof(buf),
+ "update anope_ns_core set channelcount=channelcount-1 where display='%s'",
+ ci->founder->display);
+ db_mysql_query(buf);
+ }
+
+ return 1;
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+int rdb_cs_set_founder(char *channel, char *founder)
+{
+ static char buf[1024];
+
+#ifdef USE_MYSQL
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_cs_info SET founder='%s', successor=NULL WHERE name='%s'",
+ founder, channel);
+ db_mysql_query(buf);
+
+ snprintf(buf, sizeof(buf),
+ "UPDATE anope_ns_core SET channelcount=channelcount+1 WHERE display='%s'",
+ founder);
+ db_mysql_query(buf);
+
+ /* Do i need to scrub the access list for this channel ? */
+ snprintf(buf, sizeof(buf), "display='%s' AND channel='%s'", founder,
+ channel);
+ rdb_scrub_table("anope_cs_access", buf);
+
+ return 1;
+#endif
+
+ return 0;
+}
+
+/*************************************************************************/
+
+void rdb_save_ns_core(NickCore * nc)
+{
+
+#ifdef USE_MYSQL
+ db_mysql_save_ns_core(nc);
+#endif
+
+}
+
+/*************************************************************************/
+
+void rdb_save_ns_alias(NickAlias * na)
+{
+
+#ifdef USE_MYSQL
+ db_mysql_save_ns_alias(na);
+#endif
+
+}
+
+/*************************************************************************/
+
+void rdb_save_ns_req(NickRequest * nr)
+{
+
+#ifdef USE_MYSQL
+ db_mysql_save_ns_req(nr);
+#endif
+
+}
+
+/*************************************************************************/
+
+void rdb_save_cs_info(ChannelInfo * ci)
+{
+
+#ifdef USE_MYSQL
+ db_mysql_save_cs_info(ci);
+#endif
+
+}
+
+/*************************************************************************/
+
+void rdb_save_bs_core(BotInfo * bi)
+{
+
+#ifdef USE_MYSQL
+ db_mysql_save_bs_core(bi);
+#endif
+
+}
+
+/*************************************************************************/
+
+void rdb_save_hs_core(HostCore * hc)
+{
+
+#ifdef USE_MYSQL
+ db_mysql_save_hs_core(hc);
+#endif
+
+}
+
+/*************************************************************************/
+
+void rdb_save_os_db(unsigned int maxucnt, unsigned int maxutime,
+ SList * ak, SList * sgl, SList * sql, SList * szl,
+ HostCache * hc)
+{
+
+#ifdef USE_MYSQL
+ db_mysql_save_os_db(maxusercnt, maxusertime, ak, sgl, sql, szl, hc);
+#endif
+
+}
+
+/*************************************************************************/
+
+void rdb_save_news(NewsItem * ni)
+{
+
+#ifdef USE_MYSQL
+ db_mysql_save_news(ni);
+#endif
+
+}
+
+/*************************************************************************/
+
+void rdb_save_exceptions(Exception * e)
+{
+
+#ifdef USE_MYSQL
+ db_mysql_save_exceptions(e);
+#endif
+
+}
diff --git a/send.c b/send.c
new file mode 100644
index 000000000..778b8662d
--- /dev/null
+++ b/send.c
@@ -0,0 +1,202 @@
+/* Routines for sending stuff to the network.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: send.c,v 1.11 2004/01/18 05:10:47 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+
+/* Send a command to the server. The two forms here are like
+ * printf()/vprintf() and friends. */
+
+void send_cmd(const char *source, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ vsend_cmd(source, fmt, args);
+ va_end(args);
+}
+
+void vsend_cmd(const char *source, const char *fmt, va_list args)
+{
+ char buf[BUFSIZE];
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ if (source) {
+ sockprintf(servsock, ":%s %s\r\n", source, buf);
+ if (debug)
+ alog("debug: Sent: :%s %s", source, buf);
+ } else {
+ sockprintf(servsock, "%s\r\n", buf);
+ if (debug)
+ alog("debug: Sent: %s", buf);
+ }
+}
+
+/*************************************************************************/
+
+/* Send out a WALLOPS (a GLOBOPS on ircd.dal). */
+
+void wallops(const char *source, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+#ifdef IRC_HYBRID
+ send_cmd(source ? source : ServerName, "WALLOPS :%s", buf);
+#else
+ send_cmd(source ? source : ServerName, "GLOBOPS :%s", buf);
+#endif
+}
+
+/*************************************************************************/
+
+/* Send a NOTICE from the given source to the given nick. */
+void notice(const char *source, const char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ send_cmd(source, "%s %s :%s", (UsePrivmsg ? "PRIVMSG" : "NOTICE"),
+ dest, buf);
+}
+
+/*************************************************************************/
+
+void notice_user(const char *source, User * u, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ send_cmd(source, "%s %s :%s",
+ (UsePrivmsg && (!u->na || (u->na->nc->flags & NI_MSG)) ?
+ "PRIVMSG" : "NOTICE"), u->nick, buf);
+}
+
+/*************************************************************************/
+
+/* Send a NULL-terminated array of text as NOTICEs. */
+void notice_list(const char *source, const char *dest, const char **text)
+{
+ while (*text) {
+ /* Have to kludge around an ircII bug here: if a notice includes
+ * no text, it is ignored, so we replace blank lines by lines
+ * with a single space.
+ */
+ if (**text)
+ notice(source, dest, *text);
+ else
+ notice(source, dest, " ");
+ text++;
+ }
+}
+
+/*************************************************************************/
+
+/* Send a message in the user's selected language to the user using NOTICE. */
+void notice_lang(const char *source, User * dest, int message, ...)
+{
+ va_list args;
+ char buf[4096]; /* because messages can be really big */
+ char *s, *t;
+ const char *fmt;
+ if (!dest)
+ return;
+ va_start(args, message);
+ fmt = getstring(dest->na, message);
+ if (!fmt)
+ return;
+ memset(buf, 0, 4096);
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ s = buf;
+ while (*s) {
+ t = s;
+ s += strcspn(s, "\n");
+ if (*s)
+ *s++ = 0;
+ send_cmd(source, "%s %s :%s", (UsePrivmsg
+ && (!dest->na || (dest->na->nc->
+ flags &
+ NI_MSG)) ?
+ "PRIVMSG" : "NOTICE"),
+ dest->nick, *t ? t : " ");
+ }
+}
+
+/*************************************************************************/
+
+/* Like notice_lang(), but replace %S by the source. This is an ugly hack
+ * to simplify letting help messages display the name of the pseudoclient
+ * that's sending them.
+ */
+void notice_help(const char *source, User * dest, int message, ...)
+{
+ va_list args;
+ char buf[4096], buf2[4096], outbuf[BUFSIZE];
+ char *s, *t;
+ const char *fmt;
+
+ if (!dest)
+ return;
+ va_start(args, message);
+ fmt = getstring(dest->na, message);
+ if (!fmt)
+ return;
+ /* Some sprintf()'s eat %S or turn it into just S, so change all %S's
+ * into \1\1... we assume this doesn't occur anywhere else in the
+ * string. */
+ strscpy(buf2, fmt, sizeof(buf2));
+ strnrepl(buf2, sizeof(buf2), "%S", "\1\1");
+ vsnprintf(buf, sizeof(buf), buf2, args);
+ s = buf;
+ while (*s) {
+ t = s;
+ s += strcspn(s, "\n");
+ if (*s)
+ *s++ = 0;
+ strscpy(outbuf, t, sizeof(outbuf));
+ strnrepl(outbuf, sizeof(outbuf), "\1\1", source);
+ send_cmd(source, "%s %s :%s",
+ (UsePrivmsg
+ && (!dest->na
+ || (dest->na->nc->
+ flags & NI_MSG)) ? "PRIVMSG" : "NOTICE"),
+ dest->nick, *outbuf ? outbuf : " ");
+ }
+}
+
+/*************************************************************************/
+
+/* Send a PRIVMSG from the given source to the given nick. */
+void privmsg(const char *source, const char *dest, const char *fmt, ...)
+{
+ va_list args;
+ char buf[BUFSIZE];
+
+ va_start(args, fmt);
+
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ send_cmd(source, "PRIVMSG %s :%s", dest, buf);
+}
+
+/*************************************************************************/
diff --git a/services.h b/services.h
new file mode 100644
index 000000000..adc51a651
--- /dev/null
+++ b/services.h
@@ -0,0 +1,1198 @@
+/*
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ *
+ */
+
+#ifndef SERVICES_H
+#define SERVICES_H
+
+/*************************************************************************/
+
+#include "sysconf.h"
+#include "config.h"
+
+/* Some Linux boxes (or maybe glibc includes) require this for the
+ * prototype of strsignal(). */
+#define _GNU_SOURCE
+
+/* Some AIX boxes define int16 and int32 on their own. Blarph. */
+#if INTTYPE_WORKAROUND
+# define int16 builtin_int16
+# define int32 builtin_int32
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <errno.h>
+#include <grp.h>
+#include <limits.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <sys/stat.h> /* for umask() on some systems */
+#include <sys/types.h>
+#include <sys/time.h>
+
+#ifdef USE_RDB
+# define MAX_SQL_BUF 4096
+#endif
+
+#ifdef USE_MYSQL
+# define MYSQL_WARNING 2
+# define MYSQL_ERROR 4
+#ifdef HAVE_MYSQL_MYSQL_H
+# include <mysql.h>
+# include <errmsg.h>
+#else
+# include <mysql/mysql.h>
+# include <mysql/errmsg.h>
+#endif
+#endif
+
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+
+#if HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+#ifdef USE_THREADS
+# include <pthread.h>
+#endif
+
+#ifdef _AIX
+/* Some AIX boxes seem to have bogus includes that don't have these
+ * prototypes. */
+extern int strcasecmp(const char *, const char *);
+extern int strncasecmp(const char *, const char *, size_t);
+# if 0 /* These break on some AIX boxes (4.3.1 reported). */
+extern int gettimeofday(struct timeval *, struct timezone *);
+extern int socket(int, int, int);
+extern int bind(int, struct sockaddr *, int);
+extern int connect(int, struct sockaddr *, int);
+extern int shutdown(int, int);
+# endif
+# undef FD_ZERO
+# define FD_ZERO(p) memset((p), 0, sizeof(*(p)))
+#endif /* _AIX */
+
+/* Alias stricmp/strnicmp to strcasecmp/strncasecmp if we have the latter
+ * but not the former. */
+#if !HAVE_STRICMP && HAVE_STRCASECMP
+# define stricmp strcasecmp
+# define strnicmp strncasecmp
+#endif
+
+/* We have our own versions of toupper()/tolower(). */
+#include <ctype.h>
+#undef tolower
+#undef toupper
+#define tolower tolower_
+#define toupper toupper_
+extern int toupper(char), tolower(char);
+
+/* We also have our own encrypt(). */
+#define encrypt encrypt_
+
+
+#if INTTYPE_WORKAROUND
+# undef int16
+# undef int32
+#endif
+
+
+/* Miscellaneous definitions. */
+#include "defs.h"
+#include "slist.h"
+
+/*************************************************************************/
+
+typedef struct user_ User;
+typedef struct channel_ Channel;
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Protocol tweaks */
+#ifdef IRC_HYBRID
+# define HAS_HALFOP
+#endif
+
+#ifdef IRC_VIAGRA
+# define HAS_HALFOP
+# define HAS_VHOST
+# define HAS_VIDENT
+#endif
+
+#ifdef IRC_BAHAMUT
+# define HAS_NICKIP
+#endif
+
+#ifdef IRC_PTLINK
+# define HAS_NICKVHOST
+# define HAS_VHOST
+# define HAS_FMODE
+#endif
+
+#ifdef IRC_ULTIMATE
+# define HAS_FMODE /* Has +f chan mode */
+# define HAS_HALFOP
+# define HAS_LMODE /* Has +L chan mode */
+# define HAS_VHOST
+# define HAS_VIDENT /* Can the IRCD Change Idents on the fly */
+#endif
+
+#ifdef IRC_UNREAL
+# define HAS_FMODE /* Has +f chan mode */
+# define HAS_HALFOP
+# define HAS_LMODE /* Has +L chan mode */
+# define HAS_NICKVHOST
+# define HAS_VHOST
+# define HAS_VIDENT /* Can the IRCD Change Idents on the fly */
+#endif
+
+#ifdef IRC_ULTIMATE3
+# define HAS_HALFOP
+# define HAS_VHOST
+# define HAS_NICKVHOST
+# define HAS_VIDENT /* Can the IRCD Change Idents on the fly */
+#endif
+
+/*************************************************************************/
+
+/* File version for each database. Was one version for all before but was
+ changed so they are now easier to maintain. =) */
+
+#define BOT_VERSION 10
+#define CHAN_VERSION 16
+#define EXCEPTION_VERSION 9
+#define NEWS_VERSION 9
+#define NICK_VERSION 13
+#define PRE_NICK_VERSION 1
+#define OPER_VERSION 13
+
+typedef enum { false, true } boolean;
+
+/*************************************************************************/
+
+/* Memo info structures. Since both nicknames and channels can have memos,
+ * we encapsulate memo data in a MemoList to make it easier to handle. */
+
+typedef struct memo_ Memo;
+struct memo_ {
+ uint32 number; /* Index number -- not necessarily array position! */
+ int16 flags;
+ time_t time; /* When it was sent */
+ char sender[NICKMAX];
+ char *text;
+};
+
+#define MF_UNREAD 0x0001 /* Memo has not yet been read */
+
+typedef struct {
+ int16 memocount, memomax;
+ Memo *memos;
+} MemoInfo;
+
+/*************************************************************************/
+
+/* NickServ nickname structures. */
+typedef struct nickrequest_ NickRequest;
+typedef struct nickalias_ NickAlias;
+typedef struct nickcore_ NickCore;
+
+struct nickrequest_ {
+ NickRequest *next, *prev;
+ char *nick;
+ char *passcode;
+ char *password;
+ char *email;
+ time_t requested;
+
+ time_t lastmail; /* Unsaved */
+};
+
+struct nickalias_ {
+ NickAlias *next, *prev;
+
+ char *nick; /* Nickname */
+
+ char *last_quit; /* Last quit message */
+ char *last_realname; /* Last realname */
+ char *last_usermask; /* Last usermask */
+
+ time_t time_registered; /* When the nick was registered */
+ time_t last_seen; /* When it was seen online for the last time */
+
+ int16 status; /* See NS_* below */
+
+ NickCore *nc; /* I'm an alias of this */
+
+ /* Not saved */
+ User *u; /* Current online user that has me */
+};
+
+struct nickcore_ {
+ NickCore *next, *prev;
+
+ char *display; /* How the nick is displayed */
+ char *pass; /* Password of the nicks */
+
+ char *email; /* E-mail associated to the nick */
+ char *greet; /* Greet associated to the nick */
+ uint32 icq; /* ICQ # associated to the nick */
+ char *url; /* URL associated to the nick */
+
+ int32 flags; /* See NI_* below */
+ uint16 language; /* Language selected by nickname owner (LANG_*) */
+
+ int16 accesscount; /* # of entries */
+ char **access; /* Array of strings */
+
+ MemoInfo memos;
+
+ uint16 channelcount; /* Number of channels currently registered */
+ uint16 channelmax; /* Maximum number of channels allowed */
+
+ /* Unsaved data */
+
+ time_t lastmail; /* Last time this nick record got a mail */
+ SList aliases; /* List of aliases */
+};
+
+/* Nickname status flags: */
+#define NS_VERBOTEN 0x0002 /* Nick may not be registered or used */
+#define NS_NO_EXPIRE 0x0004 /* Nick never expires */
+#define NS_IDENTIFIED 0x8000 /* User has IDENTIFY'd */
+#define NS_RECOGNIZED 0x4000 /* ON_ACCESS true && SECURE flag not set */
+#define NS_ON_ACCESS 0x2000 /* User comes from a known address */
+#define NS_KILL_HELD 0x1000 /* Nick is being held after a kill */
+#define NS_GUESTED 0x0100 /* SVSNICK has been sent but nick has not
+ * yet changed. An enforcer will be
+ * introduced when it does change. */
+#define NS_MASTER 0x0200 /* Was a master nick; used to import old databases */
+#define NS_TRANSGROUP 0xC000 /* Status flags that can be passed to a nick of the
+ same group during nick change */
+#define NS_TEMPORARY 0xFF00 /* All temporary status flags */
+/* These two are not used anymore */
+#define NS_OLD_ENCRYPTEDPW 0x0001 /* Nickname password is encrypted */
+
+/* Nickname setting flags: */
+#define NI_KILLPROTECT 0x00000001 /* Kill others who take this nick */
+#define NI_SECURE 0x00000002 /* Don't recognize unless IDENTIFY'd */
+#define NI_MSG 0x00000004 /* Use PRIVMSGs instead of NOTICEs */
+#define NI_MEMO_HARDMAX 0x00000008 /* Don't allow user to change memo limit */
+#define NI_MEMO_SIGNON 0x00000010 /* Notify of memos at signon and un-away */
+#define NI_MEMO_RECEIVE 0x00000020 /* Notify of new memos when sent */
+#define NI_PRIVATE 0x00000040 /* Don't show in LIST to non-servadmins */
+#define NI_HIDE_EMAIL 0x00000080 /* Don't show E-mail in INFO */
+#define NI_HIDE_MASK 0x00000100 /* Don't show last seen address in INFO */
+#define NI_HIDE_QUIT 0x00000200 /* Don't show last quit message in INFO */
+#define NI_KILL_QUICK 0x00000400 /* Kill in 20 seconds instead of 60 */
+#define NI_KILL_IMMED 0x00000800 /* Kill immediately instead of in 60 sec */
+#define NI_SERVICES_OPER 0x00001000 /* User is a Services operator */
+#define NI_SERVICES_ADMIN 0x00002000 /* User is a Services admin */
+#define NI_ENCRYPTEDPW 0x00004000 /* Nickname password is encrypted */
+#define NI_SERVICES_ROOT 0x00008000 /* User is a Services root */
+
+/* Languages. Never insert anything in the middle of this list, or
+ * everybody will start getting the wrong language! If you want to change
+ * the order the languages are displayed in for NickServ HELP SET LANGUAGE,
+ * do it in language.c.
+ */
+#define LANG_EN_US 0 /* United States English */
+#define LANG_JA_JIS 1 /* Japanese (JIS encoding) */
+#define LANG_JA_EUC 2 /* Japanese (EUC encoding) */
+#define LANG_JA_SJIS 3 /* Japanese (SJIS encoding) */
+#define LANG_ES 4 /* Spanish */
+#define LANG_PT 5 /* Portugese */
+#define LANG_FR 6 /* French */
+#define LANG_TR 7 /* Turkish */
+#define LANG_IT 8 /* Italian */
+#define LANG_DE 9 /* German */
+#define LANG_CAT 10 /* Catalan */
+#define LANG_GR 11 /* Greek */
+#define LANG_NL 12 /* Dutch */
+#define LANG_RU 13 /* Russian */
+
+#define NUM_LANGS 14 /* Number of languages */
+#define USED_LANGS 11 /* Number of languages provided */
+
+#define DEF_LANGUAGE LANG_EN_US
+
+/*************************************************************************/
+
+/* Bot info structures. Note that since there won't be many bots,
+ * they're not in a hash list.
+ * --lara
+ */
+
+typedef struct botinfo_ BotInfo;
+
+struct botinfo_ {
+
+ BotInfo *next, *prev;
+
+ char *nick; /* Nickname of the bot */
+ char *user; /* Its user name */
+ char *host; /* Its hostname */
+ char *real; /* Its real name */
+
+ int16 flags; /* Bot flags -- see BI_* below */
+
+ time_t created; /* Birth date ;) */
+ int16 chancount; /* Number of channels that use the bot. */
+
+ /* Dynamic data */
+ time_t lastmsg; /* Last time we said something */
+};
+
+#define BI_PRIVATE 0x0001
+
+/* Channel info structures. Stored similarly to the nicks, except that
+ * the second character of the channel name, not the first, is used to
+ * determine the list. (Hashing based on the first character of the name
+ * wouldn't get very far. ;) ) */
+
+/* Access levels for users. */
+typedef struct {
+ int16 in_use; /* 1 if this entry is in use, else 0 */
+ int16 level;
+ NickCore *nc; /* Guaranteed to be non-NULL if in use, NULL if not */
+ time_t last_seen;
+} ChanAccess;
+
+/* Note that these two levels also serve as exclusive boundaries for valid
+ * access levels. ACCESS_FOUNDER may be assumed to be strictly greater
+ * than any valid access level, and ACCESS_INVALID may be assumed to be
+ * strictly less than any valid access level.
+ */
+#define ACCESS_FOUNDER 10000 /* Numeric level indicating founder access */
+#define ACCESS_INVALID -10000 /* Used in levels[] for disabled settings */
+
+/* Levels for xOP */
+
+#define ACCESS_VOP 3
+#ifdef HAS_HALFOP
+# define ACCESS_HOP 4
+#endif
+#define ACCESS_AOP 5
+#define ACCESS_SOP 10
+
+/* AutoKick data. */
+typedef struct {
+ int16 in_use; /* Always 0 if not in use */
+ int16 is_nick; /* 1 if a regged nickname, 0 if a nick!user@host mask */
+
+ int16 flags;
+
+ union {
+ char *mask; /* Guaranteed to be non-NULL if in use, NULL if not */
+ NickCore *nc; /* Same */
+ } u;
+ char *reason;
+
+ char *creator;
+ time_t addtime;
+} AutoKick;
+
+#define AK_USED 0x0001
+#define AK_ISNICK 0x0002
+#define AK_STUCK 0x0004
+
+/* Structure used to contain bad words. */
+
+typedef struct badword_ BadWord;
+
+struct badword_ {
+ int16 in_use;
+
+ char *word;
+ int16 type; /* BW_* below */
+};
+
+#define BW_ANY 0
+#define BW_SINGLE 1
+#define BW_START 2
+#define BW_END 3
+
+typedef struct chaninfo_ ChannelInfo;
+struct chaninfo_ {
+ ChannelInfo *next, *prev;
+ char name[CHANMAX];
+ NickCore *founder;
+ NickCore *successor; /* Who gets the channel if the founder
+ * nick is dropped or expires */
+ char founderpass[PASSMAX];
+ char *desc;
+ char *url;
+ char *email;
+
+ time_t time_registered;
+ time_t last_used;
+ char *last_topic; /* Last topic on the channel */
+ char last_topic_setter[NICKMAX]; /* Who set the last topic */
+ time_t last_topic_time; /* When the last topic was set */
+
+ uint32 flags; /* See below */
+ char *forbidby;
+ char *forbidreason;
+
+ int16 bantype;
+
+ int16 *levels; /* Access levels for commands */
+
+ int16 accesscount;
+ ChanAccess *access; /* List of authorized users */
+ int16 akickcount;
+ AutoKick *akick; /* List of users to kickban */
+
+ uint32 mlock_on, mlock_off; /* See channel modes below */
+ uint32 mlock_limit; /* 0 if no limit */
+ char *mlock_key; /* NULL if no key */
+#ifdef HAS_FMODE
+ char *mlock_flood; /* NULL if no +f */
+#endif
+#ifdef HAS_LMODE
+ char *mlock_redirect; /* NULL if no +L */
+#endif
+
+ char *entry_message; /* Notice sent on entering channel */
+
+ MemoInfo memos;
+
+ struct channel_ *c; /* Pointer to channel record (if *
+ * channel is currently in use) */
+
+ /* For BotServ */
+
+ BotInfo *bi; /* Bot used on this channel */
+ uint32 botflags; /* BS_* below */
+ int16 *ttb; /* Times to ban for each kicker */
+
+ int16 bwcount;
+ BadWord *badwords; /* For BADWORDS kicker */
+ int16 capsmin, capspercent; /* For CAPS kicker */
+ int16 floodlines, floodsecs; /* For FLOOD kicker */
+ int16 repeattimes; /* For REPEAT kicker */
+};
+
+/* Retain topic even after last person leaves channel */
+#define CI_KEEPTOPIC 0x00000001
+/* Don't allow non-authorized users to be opped */
+#define CI_SECUREOPS 0x00000002
+/* Hide channel from ChanServ LIST command */
+#define CI_PRIVATE 0x00000004
+/* Topic can only be changed by SET TOPIC */
+#define CI_TOPICLOCK 0x00000008
+/* Those not allowed ops are kickbanned */
+#define CI_RESTRICTED 0x00000010
+/* Don't allow ChanServ and BotServ commands to do bad things to bigger levels */
+#define CI_PEACE 0x00000020
+/* Don't allow any privileges unless a user is IDENTIFY'd with NickServ */
+#define CI_SECURE 0x00000040
+/* Don't allow the channel to be registered or used */
+#define CI_VERBOTEN 0x00000080
+/* Channel password is encrypted */
+#define CI_ENCRYPTEDPW 0x00000100
+/* Channel does not expire */
+#define CI_NO_EXPIRE 0x00000200
+/* Channel memo limit may not be changed */
+#define CI_MEMO_HARDMAX 0x00000400
+/* Send notice to channel on use of OP/DEOP */
+#define CI_OPNOTICE 0x00000800
+/* Stricter control of channel founder status */
+#define CI_SECUREFOUNDER 0x00001000
+/* Always sign kicks */
+#define CI_SIGNKICK 0x00002000
+/* Sign kicks if level is < than the one defined by the SIGNKICK level */
+#define CI_SIGNKICK_LEVEL 0x00004000
+/* Use the xOP lists */
+#define CI_XOP 0x00008000
+/* Channel is suspended */
+#define CI_SUSPENDED 0x00010000
+
+/* TEMPORARY - ChanServ is on the channel. */
+#define CI_INHABIT 0x80000000
+
+/* Indices for cmd_access[]: */
+#define CA_INVITE 0
+#define CA_AKICK 1
+#define CA_SET 2 /* but not FOUNDER or PASSWORD */
+#define CA_UNBAN 3
+#define CA_AUTOOP 4
+#define CA_AUTODEOP 5 /* Maximum, not minimum */
+#define CA_AUTOVOICE 6
+#define CA_OPDEOP 7 /* ChanServ commands OP and DEOP */
+#define CA_ACCESS_LIST 8
+#define CA_CLEAR 9
+#define CA_NOJOIN 10 /* Maximum */
+#define CA_ACCESS_CHANGE 11
+#define CA_MEMO 12
+#define CA_ASSIGN 13 /* BotServ ASSIGN command */
+#define CA_BADWORDS 14 /* BotServ BADWORDS command */
+#define CA_NOKICK 15 /* Not kicked by the bot */
+#define CA_FANTASIA 16
+#define CA_SAY 17
+#define CA_GREET 18
+#define CA_VOICEME 19
+#define CA_VOICE 20
+#define CA_GETKEY 21
+#define CA_AUTOHALFOP 22
+#define CA_AUTOPROTECT 23
+#define CA_OPDEOPME 24
+#define CA_HALFOPME 25
+#define CA_HALFOP 26
+#define CA_PROTECTME 27
+#define CA_PROTECT 28
+#define CA_KICKME 29
+#define CA_KICK 30
+#define CA_SIGNKICK 31
+/* #define CA_AUTOADMIN 32
+#define CA_ADMINME 33
+#define CA_ADMIN 34 */
+#define CA_BANME 32
+#define CA_BAN 33
+#define CA_TOPIC 34
+#define CA_INFO 35
+
+#define CA_SIZE 36
+
+/* BotServ SET flags */
+#define BS_DONTKICKOPS 0x00000001
+#define BS_DONTKICKVOICES 0x00000002
+#define BS_FANTASY 0x00000004
+#define BS_SYMBIOSIS 0x00000008
+#define BS_GREET 0x00000010
+#define BS_NOBOT 0x00000020
+
+/* BotServ Kickers flags */
+#define BS_KICK_BOLDS 0x80000000
+#define BS_KICK_COLORS 0x40000000
+#define BS_KICK_REVERSES 0x20000000
+#define BS_KICK_UNDERLINES 0x10000000
+#define BS_KICK_BADWORDS 0x08000000
+#define BS_KICK_CAPS 0x04000000
+#define BS_KICK_FLOOD 0x02000000
+#define BS_KICK_REPEAT 0x01000000
+
+/* Indices for TTB (Times To Ban) */
+#define TTB_BOLDS 0
+#define TTB_COLORS 1
+#define TTB_REVERSES 2
+#define TTB_UNDERLINES 3
+#define TTB_BADWORDS 4
+#define TTB_CAPS 5
+#define TTB_FLOOD 6
+#define TTB_REPEAT 7
+
+#define TTB_SIZE 8
+
+/*************************************************************************/
+
+/* ChanServ mode utilities commands */
+
+typedef struct csmodeutil_ CSModeUtil;
+
+struct csmodeutil_ {
+ char *name; /* Name of the ChanServ command */
+ char *bsname; /* Name of the BotServ fantasy command */
+
+ char *mode; /* Mode (ie. +o) */
+ int32 notice; /* Notice flag (for the damn OPNOTICE) */
+
+ int level; /* Level required to use the command */
+ int levelself; /* Level required to use the command for himself */
+};
+
+#define MUT_DEOP 0
+#define MUT_OP 1
+#define MUT_DEVOICE 2
+#define MUT_VOICE 3
+#ifdef HAS_HALFOP
+#define MUT_DEHALFOP 4
+#define MUT_HALFOP 5
+#endif
+#ifdef IRC_UNREAL
+#define MUT_DEPROTECT 6
+#define MUT_PROTECT 7
+#endif
+#ifdef IRC_ULTIMATE3
+#define MUT_DEPROTECT 6
+#define MUT_PROTECT 7
+#endif
+#ifdef IRC_VIAGRA
+#define MUT_DEPROTECT 6
+#define MUT_PROTECT 7
+#endif
+/*************************************************************************/
+
+/* Online user and channel data. */
+
+struct user_ {
+ User *next, *prev;
+
+ char nick[NICKMAX];
+
+ char *username;
+ char *host; /* User's real hostname */
+#ifdef HAS_VHOST
+ char *vhost; /* User's virtual hostname */
+#endif
+#ifdef HAS_VIDENT
+ char *vident; /* User's virtual ident */
+#endif
+ char *realname;
+ char *server; /* Name of server user is on */
+
+ time_t timestamp; /* Timestamp of the nick */
+ time_t my_signon; /* When did _we_ see the user? */
+ uint32 svid; /* Services ID */
+ uint32 mode; /* See below */
+
+ NickAlias *na;
+
+ int isSuperAdmin; /* is SuperAdmin on or off? */
+
+ struct u_chanlist {
+ struct u_chanlist *next, *prev;
+ Channel *chan;
+ int16 status; /* Associated flags; see CSTATUS_* below. */
+ } *chans; /* Channels user has joined */
+
+ struct u_chaninfolist {
+ struct u_chaninfolist *next, *prev;
+ ChannelInfo *chan;
+ } *founder_chans; /* Channels user has identified for */
+
+ short invalid_pw_count; /* # of invalid password attempts */
+ time_t invalid_pw_time; /* Time of last invalid password */
+
+ time_t lastmemosend; /* Last time MS SEND command used */
+ time_t lastnickreg; /* Last time NS REGISTER cmd used */
+ time_t lastmail; /* Last time this user sent a mail */
+};
+
+#define UMODE_a 0x00000001
+#define UMODE_h 0x00000002
+#define UMODE_i 0x00000004
+#define UMODE_o 0x00000008
+#define UMODE_r 0x00000010
+#define UMODE_w 0x00000020
+#define UMODE_A 0x00000040
+
+#ifdef IRC_ULTIMATE
+#define UMODE_p 0x04000000
+#define UMODE_R 0x08000000
+#define UMODE_P 0x20000000
+#endif
+
+#ifdef IRC_ULTIMATE3
+#define UMODE_p 0x04000000
+#define UMODE_Z 0x08000000
+#define UMODE_P 0x20000000
+#endif
+
+#ifdef IRC_DREAMFORGE
+# define UMODE_g 0x80000000
+#endif
+
+#ifdef IRC_BAHAMUT
+# define UMODE_R 0x80000000
+#endif
+
+#ifdef IRC_VIAGRA
+#define UMODE_p 0x04000000
+#endif
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA)
+# define UMODE_x 0x40000000
+#endif
+
+/* Returns *current* user hostname */
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA)
+# define GetHost(x) ((x)->mode & UMODE_x ? (x)->vhost : (x)->host)
+#elif defined(IRC_PTLINK)
+# define GetHost(x) ((x)->mode & UMODE_o ? (x)->vhost ? (x)->vhost : (x)->host : (x)->host)
+#else
+# define GetHost(x) ((x)->host)
+#endif
+
+/* Returns *current* user ident */
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA)
+# define GetIdent(x) ((x)->mode & UMODE_x ? (x)->vident ? (x)->vident : (x)->username : (x)->username)
+#else
+# define GetIdent(x) ((x)->username)
+#endif
+
+/* This will introduce a pseudo client with the given nick, username, hostname,
+ realname and modes. It will also make a Q line for the nick on demand.
+ --lara */
+#if defined(IRC_HYBRID)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ kill_user(NULL, (nick), "Nick used by Services"); \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s :%s", (nick), time(NULL), (modes), \
+ (user), (host), ServerName, (real)); \
+ } while (0)
+#elif defined(IRC_ULTIMATE3)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "CLIENT %s 1 %ld %s + %s %s * %s 0 0 :%s", (nick), time(NULL), (modes), \
+ (user), (host), ServerName, (real)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_BAHAMUT) && !defined(IRC_ULTIMATE3)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s %s 0 0 :%s", (nick), time(NULL), (modes), \
+ (user), (host), ServerName, (real)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_UNREAL)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 %s * :%s", (nick), time(NULL), \
+ (user), (host), ServerName, (modes), (real)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_DREAMFORGE)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %ld %s %s %s 0 :%s", (nick), time(NULL), \
+ (user), (host), ServerName, (real)); \
+ if (strcmp(modes, "+")) send_cmd((nick), "MODE %s %s", (nick), (modes)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#elif defined(IRC_PTLINK)
+# define NEWNICK(nick,user,host,real,modes,qline) \
+ do { \
+ send_cmd(NULL, "NICK %s 1 %lu %s %s %s %s %s :%s", (nick), time(NULL), \
+ (modes), (user), (host), (host), ServerName, (real)); \
+ if ((qline)) send_cmd(NULL, "SQLINE %s :Reserved for services", (nick)); \
+ } while (0)
+#endif
+
+typedef struct cbmode_ CBMode;
+typedef struct cbmodeinfo_ CBModeInfo;
+typedef struct cmmode_ CMMode;
+typedef struct csmode_ CSMode;
+typedef struct cumode_ CUMode;
+
+struct cbmode_ {
+ uint32 flag; /* Long value that represents the mode */
+ uint16 flags; /* Flags applying to this mode (CBM_* below) */
+
+ /* Function to associate a value with the mode */
+ void (*setvalue) (Channel *chan, char *value);
+ void (*cssetvalue) (ChannelInfo *ci, char *value);
+};
+
+#define CBM_MINUS_NO_ARG 0x0001 /* No argument for unset */
+#define CBM_NO_MLOCK 0x0002 /* Can't be MLOCKed */
+#define CBM_NO_USER_MLOCK 0x0004 /* Can't be MLOCKed by non-opers */
+
+struct cbmodeinfo_ {
+ char mode; /* The mode */
+ uint32 flag; /* Long value that represents the mode */
+ uint16 flags; /* CBM_* above */
+
+ /* Function to retrieve the value associated to the mode (optional) */
+ char * (*getvalue) (Channel *chan);
+ char * (*csgetvalue) (ChannelInfo *ci);
+};
+
+struct cmmode_ {
+ void (*addmask) (Channel *chan, char *mask);
+ void (*delmask) (Channel *chan, char *mask);
+};
+
+struct cumode_ {
+ int16 status; /* CUS_* below */
+ int16 flags; /* CUF_* below */
+
+ int (*is_valid) (User *user, Channel *chan, int servermode);
+};
+
+/* User flags on channel */
+#define CUS_OP 0x0001
+#define CUS_VOICE 0x0002
+
+#ifdef HAS_HALFOP
+#define CUS_HALFOP 0x0004 /* Halfop (+h) */
+#endif
+
+/* Used by Unreal */
+#ifdef IRC_UNREAL
+#define CUS_OWNER 0x0008 /* Owner/Founder (+q) */
+#define CUS_PROTECT 0x0010 /* Protected users (+a) */
+#endif
+
+/* Used by Viagra */
+#ifdef IRC_VIAGRA
+#define CUS_OWNER 0x0008 /* Owner/Founder (+q) */
+#define CUS_PROTECT 0x0010 /* Protected users (+a) */
+#endif
+
+#ifdef IRC_ULTIMATE3
+#define CUS_PROTECT 0x0010 /* Protected users (+a) */
+#endif
+
+/* Used by PTlink */
+#ifdef IRC_PTLINK
+#define CUS_PROTECT 0x0016 /* Protected users (+a) */
+#endif
+
+/* Channel user mode flags */
+
+#define CUF_PROTECT_BOTSERV 0x0001
+
+/* Useful value */
+
+#if defined(IRC_ULTIMATE)
+# define CHAN_MAX_SYMBOLS 3
+#elif defined(IRC_ULTIMATE3)
+# define CHAN_MAX_SYMBOLS 5
+#elif defined(IRC_UNREAL)
+# define CHAN_MAX_SYMBOLS 5
+#else
+# define CHAN_MAX_SYMBOLS 2
+#endif
+
+/* Binary modes that need to be cleared */
+
+#if defined(IRC_BAHAMUT)
+#define MODESTOREMOVE "-ciklmnpstOR"
+#elif defined(IRC_ULTIMATE)
+#define MODESTOREMOVE "-kiflmnpstxAIKLORS"
+#elif defined(IRC_ULTIMATE3)
+#define MODESTOREMOVE "-iklmnpstRKAO"
+#elif defined(IRC_UNREAL)
+#define MODESTOREMOVE "-ckiflmnpstuzACGHKLNOQRSV"
+#elif defined(IRC_PTLINK)
+#define MODESTOREMOVE "-cdfiklmnpqstRS"
+#else
+#define MODESTOREMOVE "-iklmnpstR"
+#endif
+
+typedef struct bandata_ BanData;
+typedef struct userdata_ UserData;
+
+/* This structure stocks ban data since it must not be removed when
+ * user is kicked.
+ */
+
+struct bandata_ {
+ BanData *next, *prev;
+
+ char *mask; /* Since a nick is unsure and a User structure
+ is unsafe */
+ time_t last_use; /* Since time is the only way to check
+ whether it's still useful */
+ int16 ttb[TTB_SIZE];
+};
+
+/* This structure stocks information on every user that will be used by
+ * BotServ. */
+
+struct userdata_ {
+ /* Data validity */
+ time_t last_use;
+
+ /* for flood kicker */
+ int16 lines;
+ time_t last_start;
+
+ /* for repeat kicker */
+ char *lastline;
+ int16 times;
+};
+
+struct channel_ {
+ Channel *next, *prev;
+ char name[CHANMAX];
+ ChannelInfo *ci; /* Corresponding ChannelInfo */
+ time_t creation_time; /* When channel was created */
+
+ char *topic;
+ char topic_setter[NICKMAX]; /* Who set the topic */
+ time_t topic_time; /* When topic was set */
+
+ uint32 mode; /* Binary modes only */
+ uint32 limit; /* 0 if none */
+ char *key; /* NULL if none */
+#ifdef HAS_LMODE
+ char *redirect; /* +L; NULL if none */
+#endif
+#ifdef HAS_FMODE
+ char *flood; /* +f; NULL if none */
+#endif
+
+ int32 bancount, bansize;
+ char **bans;
+
+ int32 exceptcount, exceptsize;
+ char **excepts;
+
+ struct c_userlist {
+ struct c_userlist *next, *prev;
+ User *user;
+ UserData *ud;
+ } *users;
+ int16 usercount;
+
+ BanData *bd;
+
+ time_t server_modetime; /* Time of last server MODE */
+ time_t chanserv_modetime; /* Time of last check_modes() */
+ int16 server_modecount; /* Number of server MODEs this second */
+ int16 chanserv_modecount; /* Number of check_mode()'s this sec */
+ int16 bouncy_modes; /* Did we fail to set modes here? */
+};
+
+#define CMODE_i 0x00000001
+#define CMODE_m 0x00000002
+#define CMODE_n 0x00000004
+#define CMODE_p 0x00000008
+#define CMODE_s 0x00000010
+#define CMODE_t 0x00000020
+#define CMODE_k 0x00000040 /* These two used only by ChanServ */
+#define CMODE_l 0x00000080
+
+/* The two modes below are for IRC_DREAMFORGE servers only. */
+#ifndef IRC_HYBRID
+#define CMODE_R 0x00000100 /* Only identified users can join */
+#define CMODE_r 0x00000200 /* Set for all registered channels */
+#endif
+
+/* This mode is for IRC_BAHAMUT servers only. */
+#ifdef IRC_BAHAMUT
+#define CMODE_c 0x00000400 /* Colors can't be used */
+#define CMODE_M 0x00000800 /* Non-regged nicks can't send messages */
+#define CMODE_O 0x00008000 /* Only opers can join */
+#endif
+
+/* This mode is for IRC_HYBRID servers only. */
+#ifdef IRC_HYBRID
+#define CMODE_a 0x00000400
+#endif
+
+/* These modes are for IRC_ULTIMATE servers only. */
+#ifdef IRC_ULTIMATE
+#define CMODE_f 0x00000400
+#define CMODE_x 0x00000800
+#define CMODE_A 0x00001000
+#define CMODE_I 0x00002000
+#define CMODE_K 0x00004000
+#define CMODE_L 0x00008000
+#define CMODE_O 0x00010000
+#define CMODE_S 0x00020000
+#endif
+
+/* These modes are for IRC_UNREAL servers only. */
+#ifdef IRC_UNREAL
+#define CMODE_c 0x00000400
+#define CMODE_A 0x00000800
+#define CMODE_H 0x00001000
+#define CMODE_K 0x00002000
+#define CMODE_L 0x00004000
+#define CMODE_O 0x00008000
+#define CMODE_Q 0x00010000
+#define CMODE_S 0x00020000
+#define CMODE_V 0x00040000
+#define CMODE_f 0x00080000
+#define CMODE_G 0x00100000
+#define CMODE_C 0x00200000
+#define CMODE_u 0x00400000
+#define CMODE_z 0x00800000
+#define CMODE_N 0x01000000
+#endif
+
+/* These modes are for IRC_ULTIMATE3 servers only */
+#ifdef IRC_ULTIMATE3
+#define CMODE_A 0x00000800
+#define CMODE_N 0x00001000
+#define CMODE_S 0x00002000
+#define CMODE_K 0x00004000
+#endif
+
+/* These modes are for IRC_PTLINK servers only. */
+#ifdef IRC_PTLINK
+#define CMODE_A 0x00000400
+#define CMODE_B 0x00000800
+#define CMODE_c 0x00001000
+#define CMODE_d 0x00002000
+#define CMODE_f 0x00004000
+#define CMODE_K 0x00008000
+#define CMODE_O 0x00010000
+#define CMODE_q 0x00020000
+#define CMODE_S 0x00040000
+#define CMODE_N 0x00080000
+#endif
+
+
+/*************************************************************************/
+
+/* Constants for news types. */
+
+#define NEWS_LOGON 0
+#define NEWS_OPER 1
+#define NEWS_RANDOM 2
+
+/*************************************************************************/
+
+/* Ignorance list data. */
+
+typedef struct ignore_data {
+ struct ignore_data *next;
+ char who[NICKMAX];
+ time_t time; /* When do we stop ignoring them? */
+} IgnoreData;
+
+/*************************************************************************/
+
+/* Mail data */
+
+typedef struct mailinfo_ MailInfo;
+
+struct mailinfo_ {
+ FILE *pipe;
+ User *sender;
+ NickCore *recipient;
+ NickRequest *recip;
+};
+
+/*************************************************************************/
+
+typedef struct akill_ Akill;
+
+struct akill_ {
+ char *user; /* User part of the AKILL */
+ char *host; /* Host part of the AKILL */
+
+ char *by; /* Who set the akill */
+ char *reason; /* Why they got akilled */
+
+ time_t seton; /* When it was set */
+ time_t expires; /* When it expires */
+};
+
+/*************************************************************************/
+
+/* Structure for OperServ SGLINE and SZLINE commands */
+
+typedef struct sxline_ SXLine;
+
+struct sxline_ {
+ char *mask;
+ char *by;
+ char *reason;
+ time_t seton;
+ time_t expires;
+};
+
+/*************************************************************************/
+
+/* Host serv structures */
+
+typedef struct hostcore_ HostCore;
+
+struct hostcore_ {
+ HostCore *next;
+ char *nick; /* Owner of the vHost */
+ char *vIdent; /* vIdent for the user */
+ char *vHost; /* Vhost for this user */
+ char *creator; /* Oper Nick of the oper who set the vhost */
+ time_t time; /* Date/Time vHost was set */
+};
+
+/*************************************************************************/
+
+typedef struct newsitem_ NewsItem;
+
+struct newsitem_ {
+ int16 type;
+ int32 num; /* Numbering is separate for login and oper news */
+ char *text;
+ char who[NICKMAX];
+ time_t time;
+};
+
+/*************************************************************************/
+
+typedef struct exception_ Exception;
+struct exception_ {
+ char *mask; /* Hosts to which this exception applies */
+ int limit; /* Session limit for exception */
+ char who[NICKMAX]; /* Nick of person who added the exception */
+ char *reason; /* Reason for exception's addition */
+ time_t time; /* When this exception was added */
+ time_t expires; /* Time when it expires. 0 == no expiry */
+ int num; /* Position in exception list; used to track
+ * positions when deleting entries. It is
+ * symbolic and used internally. It is
+ * calculated at load time and never saved. */
+};
+
+/*************************************************************************/
+
+/* Proxy stuff */
+
+typedef struct hostcache_ HostCache;
+
+struct hostcache_ {
+ HostCache *prev, *next;
+
+ char *host; /* The hostname */
+ uint32 ip; /* The IP address */
+
+ int16 status; /* HC_* below */
+ time_t used; /* When was this entry last used? */
+};
+
+/* We assume that values < 0 are in-progress values, and values > 0 are
+ * proxy value. 0 is the normal value.
+ */
+
+#define HC_QUEUED -2 /* Waiting to be scanned */
+#define HC_PROGRESS -1 /* Currently being scanned */
+#define HC_NORMAL 0 /* No proxy found on this host */
+#define HC_WINGATE 1 /* Wingate found */
+#define HC_SOCKS4 2 /* Socks4 found */
+#define HC_SOCKS5 3 /* Socks5 found */
+#define HC_HTTP 4 /* HTTP proxy found */
+
+/**
+ * DEFCON Defines
+ **/
+#define DEFCON_NO_NEW_CHANNELS 1 /* No New Channel Registrations */
+#define DEFCON_NO_NEW_NICKS 2 /* No New Nick Registrations */
+#define DEFCON_NO_MLOCK_CHANGE 4 /* No MLOCK changes */
+#define DEFCON_FORCE_CHAN_MODES 8 /* Force Chan Mode */
+#define DEFCON_REDUCE_SESSION 16 /* Reduce Session Limit */
+#define DEFCON_NO_NEW_CLIENTS 32 /* Kill any NEW clients */
+#define DEFCON_OPER_ONLY 64 /* Restrict services to oper's only */
+#define DEFCON_SILENT_OPER_ONLY 128 /* Silently ignore non-opers */
+#define DEFCON_AKILL_NEW_CLIENTS 256 /* AKILL any new clients */
+#define DEFCON_NO_NEW_MEMOS 512 /* No New Memos Sent */
+/*************************************************************************/
+
+#include "extern.h"
+
+/*************************************************************************/
+
+#endif /* SERVICES_H */
diff --git a/sessions.c b/sessions.c
new file mode 100644
index 000000000..dfa0f3773
--- /dev/null
+++ b/sessions.c
@@ -0,0 +1,834 @@
+/* Session Limiting functions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: sessions.c,v 1.10 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "pseudo.h"
+
+/*************************************************************************/
+
+/* SESSION LIMITING
+ *
+ * The basic idea of session limiting is to prevent one host from having more
+ * than a specified number of sessions (client connections/clones) on the
+ * network at any one time. To do this we have a list of sessions and
+ * exceptions. Each session structure records information about a single host,
+ * including how many clients (sessions) that host has on the network. When a
+ * host reaches it's session limit, no more clients from that host will be
+ * allowed to connect.
+ *
+ * When a client connects to the network, we check to see if their host has
+ * reached the default session limit per host, and thus whether it is allowed
+ * any more. If it has reached the limit, we kill the connecting client; all
+ * the other clients are left alone. Otherwise we simply increment the counter
+ * within the session structure. When a client disconnects, we decrement the
+ * counter. When the counter reaches 0, we free the session.
+ *
+ * Exceptions allow one to specify custom session limits for a specific host
+ * or a range thereof. The first exception that the host matches is the one
+ * used.
+ *
+ * "Session Limiting" is likely to slow down services when there are frequent
+ * client connects and disconnects. The size of the exception list can also
+ * play a large role in this performance decrease. It is therefore recommened
+ * that you keep the number of exceptions to a minimum. A very simple hashing
+ * method is currently used to store the list of sessions. I'm sure there is
+ * room for improvement and optimisation of this, along with the storage of
+ * exceptions. Comments and suggestions are more than welcome!
+ *
+ * -TheShadow (02 April 1999)
+ */
+
+/*************************************************************************/
+
+typedef struct session_ Session;
+struct session_ {
+ Session *prev, *next;
+ char *host;
+ int count; /* Number of clients with this host */
+ int hits; /* Number of subsequent kills for a host */
+};
+
+/* I'm sure there is a better way to hash the list of hosts for which we are
+ * storing session information. This should be sufficient for the mean time.
+ * -TheShadow */
+
+#define HASH(host) (((host)[0]&31)<<5 | ((host)[1]&31))
+
+static Session *sessionlist[1024];
+static int32 nsessions = 0;
+
+static Exception *exceptions = NULL;
+static int16 nexceptions = 0;
+
+/*************************************************************************/
+
+static Session *findsession(const char *host);
+
+static Exception *find_host_exception(const char *host);
+static int exception_add(const char *mask, const int limit,
+ const char *reason, const char *who,
+ const time_t expires);
+
+/*************************************************************************/
+/****************************** Statistics *******************************/
+/*************************************************************************/
+
+void get_session_stats(long *nrec, long *memuse)
+{
+ Session *session;
+ long mem;
+ int i;
+
+ mem = sizeof(Session) * nsessions;
+ for (i = 0; i < 1024; i++) {
+ for (session = sessionlist[i]; session; session = session->next) {
+ mem += strlen(session->host) + 1;
+ }
+ }
+
+ *nrec = nsessions;
+ *memuse = mem;
+}
+
+void get_exception_stats(long *nrec, long *memuse)
+{
+ long mem;
+ int i;
+
+ mem = sizeof(Exception) * nexceptions;
+ for (i = 0; i < nexceptions; i++) {
+ mem += strlen(exceptions[i].mask) + 1;
+ mem += strlen(exceptions[i].reason) + 1;
+ }
+ *nrec = nexceptions;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+/************************* Session List Display **************************/
+/*************************************************************************/
+
+/* Syntax: SESSION LIST threshold
+ * Lists all sessions with atleast threshold clients.
+ * The threshold value must be greater than 1. This is to prevent
+ * accidental listing of the large number of single client sessions.
+ *
+ * Syntax: SESSION VIEW host
+ * Displays detailed session information about the supplied host.
+ */
+
+int do_session(User * u)
+{
+ Session *session;
+ Exception *exception;
+ char *cmd = strtok(NULL, " ");
+ char *param1 = strtok(NULL, " ");
+ int mincount;
+ int i;
+
+ if (!LimitSessions) {
+ notice_lang(s_OperServ, u, OPER_SESSION_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (!cmd)
+ cmd = "";
+
+ if (stricmp(cmd, "LIST") == 0) {
+ if (!param1) {
+ syntax_error(s_OperServ, u, "SESSION",
+ OPER_SESSION_LIST_SYNTAX);
+
+ } else if ((mincount = atoi(param1)) <= 1) {
+ notice_lang(s_OperServ, u, OPER_SESSION_INVALID_THRESHOLD);
+
+ } else {
+ notice_lang(s_OperServ, u, OPER_SESSION_LIST_HEADER, mincount);
+ notice_lang(s_OperServ, u, OPER_SESSION_LIST_COLHEAD);
+ for (i = 0; i < 1024; i++) {
+ for (session = sessionlist[i]; session;
+ session = session->next) {
+ if (session->count >= mincount)
+ notice_lang(s_OperServ, u,
+ OPER_SESSION_LIST_FORMAT,
+ session->count, session->host);
+ }
+ }
+ }
+ } else if (stricmp(cmd, "VIEW") == 0) {
+ if (!param1) {
+ syntax_error(s_OperServ, u, "SESSION",
+ OPER_SESSION_VIEW_SYNTAX);
+
+ } else {
+ session = findsession(param1);
+ if (!session) {
+ notice_lang(s_OperServ, u, OPER_SESSION_NOT_FOUND, param1);
+ } else {
+ exception = find_host_exception(param1);
+
+ notice_lang(s_OperServ, u, OPER_SESSION_VIEW_FORMAT,
+ param1, session->count,
+ exception ? exception->
+ limit : DefSessionLimit);
+ }
+ }
+
+ } else {
+ syntax_error(s_OperServ, u, "SESSION", OPER_SESSION_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
+/********************* Internal Session Functions ************************/
+/*************************************************************************/
+
+static Session *findsession(const char *host)
+{
+ Session *session;
+ int i;
+
+ if (!host)
+ return NULL;
+
+ for (i = 0; i < 1024; i++) {
+ for (session = sessionlist[i]; session; session = session->next) {
+ if (stricmp(host, session->host) == 0) {
+ return session;
+ }
+ }
+ }
+
+ return NULL;
+}
+
+/* Attempt to add a host to the session list. If the addition of the new host
+ * causes the the session limit to be exceeded, kill the connecting user.
+ * Returns 1 if the host was added or 0 if the user was killed.
+ */
+
+int add_session(const char *nick, const char *host)
+{
+ Session *session, **list;
+ Exception *exception;
+ int sessionlimit = 0;
+
+ session = findsession(host);
+
+ if (session) {
+ exception = find_host_exception(host);
+ if (checkDefCon(DEFCON_REDUCE_SESSION)) {
+ sessionlimit =
+ exception ? exception->limit : DefConSessionLimit;
+ } else {
+ sessionlimit = exception ? exception->limit : DefSessionLimit;
+ }
+
+ if (sessionlimit != 0 && session->count >= sessionlimit) {
+ if (SessionLimitExceeded)
+ notice(s_OperServ, nick, SessionLimitExceeded, host);
+ if (SessionLimitDetailsLoc)
+ notice(s_OperServ, nick, SessionLimitDetailsLoc);
+
+ /* We don't use kill_user() because a user stucture has not yet
+ * been created. Simply kill the user. -TheShadow
+ */
+#ifdef IRC_BAHAMUT
+ send_cmd(NULL, "SVSKILL %s :Session limit exceeded", nick);
+#else
+ send_cmd(s_OperServ, "KILL %s :%s (Session limit exceeded)",
+ nick, s_OperServ);
+#endif
+ session->hits++;
+ if (MaxSessionKill && session->hits >= MaxSessionKill) {
+ char akillmask[BUFSIZE];
+ snprintf(akillmask, sizeof(akillmask), "*@%s", host);
+ add_akill(NULL, akillmask, s_OperServ,
+ time(NULL) + SessionAutoKillExpiry,
+ "Session limit exceeded");
+ wallops(s_OperServ,
+ "Added a temporary AKILL for \2%s\2 due to excessive connections",
+ akillmask);
+ }
+ return 0;
+ } else {
+ session->count++;
+ return 1;
+ }
+ }
+
+ nsessions++;
+ session = scalloc(sizeof(Session), 1);
+ session->host = sstrdup(host);
+ list = &sessionlist[HASH(session->host)];
+ session->next = *list;
+ if (*list)
+ (*list)->prev = session;
+ *list = session;
+ session->count = 1;
+
+ return 1;
+}
+
+void del_session(const char *host)
+{
+ Session *session;
+
+ if (debug >= 2)
+ alog("debug: del_session() called");
+
+ session = findsession(host);
+
+ if (!session) {
+ wallops(s_OperServ,
+ "WARNING: Tried to delete non-existant session: \2%s",
+ host);
+ alog("session: Tried to delete non-existant session: %s", host);
+ return;
+ }
+
+ if (session->count > 1) {
+ session->count--;
+ return;
+ }
+
+ if (session->prev)
+ session->prev->next = session->next;
+ else
+ sessionlist[HASH(session->host)] = session->next;
+ if (session->next)
+ session->next->prev = session->prev;
+
+ if (debug >= 2)
+ alog("debug: del_session(): free session structure");
+
+ free(session->host);
+ free(session);
+
+ nsessions--;
+
+ if (debug >= 2)
+ alog("debug: del_session() done");
+}
+
+
+/*************************************************************************/
+/********************** Internal Exception Functions *********************/
+/*************************************************************************/
+
+void expire_exceptions(void)
+{
+ int i;
+ time_t now = time(NULL);
+
+ for (i = 0; i < nexceptions; i++) {
+ if (exceptions[i].expires == 0 || exceptions[i].expires > now)
+ continue;
+ if (WallExceptionExpire)
+ wallops(s_OperServ,
+ "Session limit exception for %s has expired.",
+ exceptions[i].mask);
+ free(exceptions[i].mask);
+ free(exceptions[i].reason);
+ nexceptions--;
+ memmove(exceptions + i, exceptions + i + 1,
+ sizeof(Exception) * (nexceptions - i));
+ exceptions = srealloc(exceptions, sizeof(Exception) * nexceptions);
+ i--;
+ }
+}
+
+/* Find the first exception this host matches and return it. */
+
+Exception *find_host_exception(const char *host)
+{
+ int i;
+
+ for (i = 0; i < nexceptions; i++) {
+ if (match_wild_nocase(exceptions[i].mask, host)) {
+ return &exceptions[i];
+ }
+ }
+
+ return NULL;
+}
+
+/*************************************************************************/
+/*********************** Exception Load/Save *****************************/
+/*************************************************************************/
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ if (!forceload) \
+ fatal("Read error on %s", ExceptionDBName); \
+ nexceptions = i; \
+ break; \
+ } \
+} while (0)
+
+void load_exceptions()
+{
+ dbFILE *f;
+ int i;
+ int16 n;
+ int16 tmp16;
+ int32 tmp32;
+
+ if (!
+ (f = open_db(s_OperServ, ExceptionDBName, "r", EXCEPTION_VERSION)))
+ return;
+ switch (i = get_file_version(f)) {
+ case 9:
+ case 8:
+ case 7:
+ SAFE(read_int16(&n, f));
+ nexceptions = n;
+ exceptions = scalloc(sizeof(Exception) * nexceptions, 1);
+ if (!nexceptions) {
+ close_db(f);
+ return;
+ }
+ for (i = 0; i < nexceptions; i++) {
+ SAFE(read_string(&exceptions[i].mask, f));
+ SAFE(read_int16(&tmp16, f));
+ exceptions[i].limit = tmp16;
+ SAFE(read_buffer(exceptions[i].who, f));
+ SAFE(read_string(&exceptions[i].reason, f));
+ SAFE(read_int32(&tmp32, f));
+ exceptions[i].time = tmp32;
+ SAFE(read_int32(&tmp32, f));
+ exceptions[i].expires = tmp32;
+ }
+ break;
+
+ default:
+ fatal("Unsupported version (%d) on %s", i, ExceptionDBName);
+ } /* switch (ver) */
+
+ close_db(f);
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+#define SAFE(x) do { \
+ if ((x) < 0) { \
+ restore_db(f); \
+ log_perror("Write error on %s", ExceptionDBName); \
+ if (time(NULL) - lastwarn > WarningTimeout) { \
+ wallops(NULL, "Write error on %s: %s", ExceptionDBName, \
+ strerror(errno)); \
+ lastwarn = time(NULL); \
+ } \
+ return; \
+ } \
+} while (0)
+
+void save_exceptions()
+{
+ dbFILE *f;
+ int i;
+ static time_t lastwarn = 0;
+
+ if (!
+ (f = open_db(s_OperServ, ExceptionDBName, "w", EXCEPTION_VERSION)))
+ return;
+ SAFE(write_int16(nexceptions, f));
+ for (i = 0; i < nexceptions; i++) {
+ SAFE(write_string(exceptions[i].mask, f));
+ SAFE(write_int16(exceptions[i].limit, f));
+ SAFE(write_buffer(exceptions[i].who, f));
+ SAFE(write_string(exceptions[i].reason, f));
+ SAFE(write_int32(exceptions[i].time, f));
+ SAFE(write_int32(exceptions[i].expires, f));
+ }
+ close_db(f);
+}
+
+#undef SAFE
+
+/*************************************************************************/
+
+void save_rdb_exceptions()
+{
+#ifdef USE_RDB
+ int i;
+ Exception *e;
+
+ if (!rdb_open())
+ return;
+ rdb_clear_table("anope_os_exceptions");
+ for (i = 0; i < nexceptions; i++) {
+ e = &exceptions[i];
+ rdb_save_exceptions(e);
+ }
+ rdb_close();
+#endif
+}
+
+/*************************************************************************/
+/************************ Exception Manipulation *************************/
+/*************************************************************************/
+
+static int exception_add(const char *mask, const int limit,
+ const char *reason, const char *who,
+ const time_t expires)
+{
+ int i;
+
+ /* Check if an exception already exists for this mask */
+ for (i = 0; i < nexceptions; i++)
+ if (stricmp(mask, exceptions[i].mask) == 0)
+ return 0;
+
+ nexceptions++;
+ exceptions = srealloc(exceptions, sizeof(Exception) * nexceptions);
+
+ exceptions[nexceptions - 1].mask = sstrdup(mask);
+ exceptions[nexceptions - 1].limit = limit;
+ exceptions[nexceptions - 1].reason = sstrdup(reason);
+ exceptions[nexceptions - 1].time = time(NULL);
+ strscpy(exceptions[nexceptions - 1].who, who, NICKMAX);
+ exceptions[nexceptions - 1].expires = expires;
+ exceptions[nexceptions - 1].num = nexceptions - 1;
+
+ return 1;
+}
+
+/*************************************************************************/
+
+static int exception_del(const int index)
+{
+ if (index < 0 || index >= nexceptions)
+ return 0;
+
+ free(exceptions[index].mask);
+ free(exceptions[index].reason);
+ nexceptions--;
+ memmove(exceptions + index, exceptions + index + 1,
+ sizeof(Exception) * (nexceptions - index));
+ exceptions = srealloc(exceptions, sizeof(Exception) * nexceptions);
+
+ return 1;
+}
+
+/* We use the "num" property to keep track of the position of each exception
+ * when deleting using ranges. This is because an exception's position changes
+ * as others are deleted. The positions will be recalculated once the process
+ * is complete. -TheShadow
+ */
+
+static int exception_del_callback(User * u, int num, va_list args)
+{
+ int i;
+ int *last = va_arg(args, int *);
+
+ *last = num;
+ for (i = 0; i < nexceptions; i++) {
+ if (num - 1 == exceptions[i].num)
+ break;
+ }
+ if (i < nexceptions)
+ return exception_del(i);
+ else
+ return 0;
+}
+
+static int exception_list(User * u, const int index, int *sent_header)
+{
+ if (index < 0 || index >= nexceptions)
+ return 0;
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_LIST_HEADER);
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_LIST_COLHEAD);
+ *sent_header = 1;
+ }
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_LIST_FORMAT, index + 1,
+ exceptions[index].limit, exceptions[index].mask);
+ return 1;
+}
+
+static int exception_list_callback(User * u, int num, va_list args)
+{
+ int *sent_header = va_arg(args, int *);
+
+ return exception_list(u, num - 1, sent_header);
+}
+
+static int exception_view(User * u, const int index, int *sent_header)
+{
+ char timebuf[32], expirebuf[256];
+ struct tm tm;
+ time_t t = time(NULL);
+
+ if (index < 0 || index >= nexceptions)
+ return 0;
+ if (!*sent_header) {
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_LIST_HEADER);
+ *sent_header = 1;
+ }
+
+ tm = *localtime(exceptions[index].time ? &exceptions[index].time : &t);
+ strftime_lang(timebuf, sizeof(timebuf),
+ u, STRFTIME_SHORT_DATE_FORMAT, &tm);
+
+ expire_left(u->na, expirebuf, sizeof(expirebuf),
+ exceptions[index].expires);
+
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_VIEW_FORMAT,
+ index + 1, exceptions[index].mask,
+ *exceptions[index].who ?
+ exceptions[index].who : "<unknown>",
+ timebuf, expirebuf, exceptions[index].limit,
+ exceptions[index].reason);
+ return 1;
+}
+
+static int exception_view_callback(User * u, int num, va_list args)
+{
+ int *sent_header = va_arg(args, int *);
+
+ return exception_view(u, num - 1, sent_header);
+}
+
+/*************************************************************************/
+
+/* Syntax: EXCEPTION ADD [+expiry] mask limit reason
+ * Adds mask to the exception list with limit as the maximum session
+ * limit and +expiry as an optional expiry time.
+ *
+ * Syntax: EXCEPTION DEL mask
+ * Deletes the first exception that matches mask exactly.
+ *
+ * Syntax: EXCEPTION LIST [mask]
+ * Lists all exceptions or those matching mask.
+ *
+ * Syntax: EXCEPTION VIEW [mask]
+ * Displays detailed information about each exception or those matching
+ * mask.
+ *
+ * Syntax: EXCEPTION MOVE num position
+ * Moves the exception at position num to position.
+ */
+
+int do_exception(User * u)
+{
+ char *cmd = strtok(NULL, " ");
+ char *mask, *reason, *expiry, *limitstr;
+ int limit, expires;
+ int i;
+
+ if (!LimitSessions) {
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_DISABLED);
+ return MOD_CONT;
+ }
+
+ if (!cmd)
+ cmd = "";
+
+ if (stricmp(cmd, "ADD") == 0) {
+ if (nexceptions >= 32767) {
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_TOO_MANY);
+ return MOD_CONT;
+ }
+
+ mask = strtok(NULL, " ");
+ if (mask && *mask == '+') {
+ expiry = mask;
+ mask = strtok(NULL, " ");
+ } else {
+ expiry = NULL;
+ }
+ limitstr = strtok(NULL, " ");
+ reason = strtok(NULL, "");
+
+ if (!reason) {
+ syntax_error(s_OperServ, u, "EXCEPTION",
+ OPER_EXCEPTION_ADD_SYNTAX);
+ return MOD_CONT;
+ }
+
+ expires = expiry ? dotime(expiry) : ExceptionExpiry;
+ if (expires < 0) {
+ notice_lang(s_OperServ, u, BAD_EXPIRY_TIME);
+ return MOD_CONT;
+ } else if (expires > 0) {
+ expires += time(NULL);
+ }
+
+ limit = (limitstr && isdigit(*limitstr)) ? atoi(limitstr) : -1;
+
+ if (limit < 0 || limit > MaxSessionLimit) {
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_INVALID_LIMIT,
+ MaxSessionLimit);
+ return MOD_CONT;
+
+ } else {
+ if (strchr(mask, '!') || strchr(mask, '@')) {
+ notice_lang(s_OperServ, u,
+ OPER_EXCEPTION_INVALID_HOSTMASK);
+ return MOD_CONT;
+ }
+
+ if (exception_add(mask, limit, reason, u->nick, expires))
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_ADDED, mask,
+ limit);
+ else
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_ALREADY_PRESENT,
+ mask, limit);
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ }
+ } else if (stricmp(cmd, "DEL") == 0) {
+ mask = strtok(NULL, " ");
+
+ if (!mask) {
+ syntax_error(s_OperServ, u, "EXCEPTION",
+ OPER_EXCEPTION_DEL_SYNTAX);
+ return MOD_CONT;
+ }
+
+ if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) {
+ int count, deleted, last = -1;
+ deleted =
+ process_numlist(mask, &count, exception_del_callback, u,
+ &last);
+ if (!deleted) {
+ if (count == 1) {
+ notice_lang(s_OperServ, u,
+ OPER_EXCEPTION_NO_SUCH_ENTRY, last);
+ } else {
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_NO_MATCH);
+ }
+ } else if (deleted == 1) {
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_DELETED_ONE);
+ } else {
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_DELETED_SEVERAL,
+ deleted);
+ }
+ } else {
+ int deleted = 0;
+
+ for (i = 0; i < nexceptions; i++) {
+ if (stricmp(mask, exceptions[i].mask) == 0) {
+ exception_del(i);
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_DELETED,
+ mask);
+ deleted = 1;
+ break;
+ }
+ }
+ if (!deleted && i == nexceptions)
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_NOT_FOUND, mask);
+ }
+
+ /* Renumber the exception list. I don't believe in having holes in
+ * lists - it makes code more complex, harder to debug and we end up
+ * with huge index numbers. Imho, fixed numbering is only beneficial
+ * when one doesn't have range capable manipulation. -TheShadow */
+
+ for (i = 0; i < nexceptions; i++)
+ exceptions[i].num = i;
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+
+ } else if (stricmp(cmd, "MOVE") == 0) {
+ Exception *exception;
+ char *n1str = strtok(NULL, " "); /* From position */
+ char *n2str = strtok(NULL, " "); /* To position */
+ int n1, n2;
+
+ if (!n2str) {
+ syntax_error(s_OperServ, u, "EXCEPTION",
+ OPER_EXCEPTION_MOVE_SYNTAX);
+ return MOD_CONT;
+ }
+
+ n1 = atoi(n1str) - 1;
+ n2 = atoi(n2str) - 1;
+
+ if ((n1 >= 0 && n1 < nexceptions) && (n2 >= 0 && n2 < nexceptions)
+ && (n1 != n2)) {
+ exception = scalloc(sizeof(Exception), 1);
+ memcpy(exception, &exceptions[n1], sizeof(Exception));
+
+ if (n1 < n2) {
+ /* Shift upwards */
+ memmove(&exceptions[n1], &exceptions[n1 + 1],
+ sizeof(Exception) * (n2 - n1));
+ memmove(&exceptions[n2], exception, sizeof(Exception));
+ } else {
+ /* Shift downwards */
+ memmove(&exceptions[n2 + 1], &exceptions[n2],
+ sizeof(Exception) * (n1 - n2));
+ memmove(&exceptions[n2], exception, sizeof(Exception));
+ }
+
+ free(exception);
+
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_MOVED,
+ exceptions[n1].mask, n1 + 1, n2 + 1);
+
+ /* Renumber the exception list. See the DEL block above for why. */
+ for (i = 0; i < nexceptions; i++)
+ exceptions[i].num = i;
+
+ if (readonly)
+ notice_lang(s_OperServ, u, READ_ONLY_MODE);
+ } else {
+ syntax_error(s_OperServ, u, "EXCEPTION",
+ OPER_EXCEPTION_MOVE_SYNTAX);
+ }
+ } else if (stricmp(cmd, "LIST") == 0) {
+ int sent_header = 0;
+ expire_exceptions();
+ mask = strtok(NULL, " ");
+ if (mask && strspn(mask, "1234567890,-") == strlen(mask)) {
+ process_numlist(mask, NULL, exception_list_callback, u,
+ &sent_header);
+ } else {
+ for (i = 0; i < nexceptions; i++) {
+ if (!mask || match_wild_nocase(mask, exceptions[i].mask))
+ exception_list(u, i, &sent_header);
+ }
+ }
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_NO_MATCH);
+
+ } else if (stricmp(cmd, "VIEW") == 0) {
+ int sent_header = 0;
+ expire_exceptions();
+ mask = strtok(NULL, " ");
+ if (mask && strspn(mask, "1234567890,-") == strlen(mask)) {
+ process_numlist(mask, NULL, exception_view_callback, u,
+ &sent_header);
+ } else {
+ for (i = 0; i < nexceptions; i++) {
+ if (!mask || match_wild_nocase(mask, exceptions[i].mask))
+ exception_view(u, i, &sent_header);
+ }
+ }
+ if (!sent_header)
+ notice_lang(s_OperServ, u, OPER_EXCEPTION_NO_MATCH);
+
+ } else {
+ syntax_error(s_OperServ, u, "EXCEPTION", OPER_EXCEPTION_SYNTAX);
+ }
+ return MOD_CONT;
+}
+
+/*************************************************************************/
diff --git a/slist.c b/slist.c
new file mode 100644
index 000000000..7d41a0d71
--- /dev/null
+++ b/slist.c
@@ -0,0 +1,325 @@
+/* Services list handler implementation.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: slist.c,v 1.6 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "slist.h"
+
+static SListOpts slist_defopts = { 0, NULL, NULL, NULL };
+
+/*************************************************************************/
+
+/* Adds a pointer to the list. Returns the index of the new item.
+ Returns -2 if there are too many items in the list, -3 if the
+ item already exists when the flags of the list contain SLISTF_NODUP. */
+
+int slist_add(SList * slist, void *item)
+{
+ if (slist->limit != 0 && slist->count >= slist->limit)
+ return -2;
+ if (slist->opts && (slist->opts->flags & SLISTF_NODUP)
+ && slist_indexof(slist, item) != -1)
+ return -3;
+ if (slist->capacity == slist->count)
+ slist_setcapacity(slist, slist->capacity + 1);
+
+ if (slist->opts && (slist->opts->flags & SLISTF_SORT)
+ && slist->opts->compareitem) {
+ int i;
+
+ for (i = 0; i < slist->count; i++) {
+ if (slist->opts->compareitem(slist, item, slist->list[i]) <= 0) {
+ memmove(&slist->list[i + 1], &slist->list[i],
+ sizeof(void *) * (slist->count - i));
+ slist->list[i] = item;
+ break;
+ }
+ }
+
+ if (i == slist->count)
+ slist->list[slist->count] = item;
+ } else {
+ slist->list[slist->count] = item;
+ }
+
+ return slist->count++;
+}
+
+/*************************************************************************/
+
+/* Clears the list. If free is 1, the freeitem function will be called
+ * for each item before clearing.
+ */
+
+void slist_clear(SList * slist, int mustfree)
+{
+ if (mustfree && slist->opts && slist->opts->freeitem && slist->count) {
+ int i;
+
+ for (i = 0; i < slist->count; i++)
+ if (slist->list[i])
+ slist->opts->freeitem(slist, slist->list[i]);
+ }
+
+ if (slist->list) {
+ free(slist->list);
+ slist->list = NULL;
+ }
+ slist->capacity = 0;
+ slist->count = 0;
+}
+
+/*************************************************************************/
+
+/* Deletes an item from the list, by index. Returns 1 if successful,
+ 0 otherwise. */
+
+int slist_delete(SList * slist, int index)
+{
+ /* Range check */
+ if (index >= slist->count)
+ return 0;
+
+ if (slist->list[index] && slist->opts && slist->opts->freeitem)
+ slist->opts->freeitem(slist, slist->list[index]);
+
+ slist->list[index] = NULL;
+ slist->count--;
+
+ if (index < slist->count)
+ memmove(&slist->list[index], &slist->list[index + 1],
+ sizeof(void *) * (slist->count - index));
+
+ slist_setcapacity(slist, slist->capacity - 1);
+
+ return 1;
+}
+
+/*************************************************************************/
+
+/* Deletes a range of entries. Return -1 if the permission was denied,
+ * 0 if no records were deleted, or the number of records deleted
+ */
+
+int slist_delete_range(SList * slist, char *range, slist_delcheckcb_t cb,
+ ...)
+{
+ int count = 0, i, n1, n2;
+ va_list args;
+
+ va_start(args, cb);
+
+ for (;;) {
+ n1 = n2 = strtol(range, (char **) &range, 10);
+ range += strcspn(range, "0123456789,-");
+
+ if (*range == '-') {
+ range++;
+ range += strcspn(range, "0123456789,");
+ if (isdigit(*range)) {
+ n2 = strtol(range, (char **) &range, 10);
+ range += strcspn(range, "0123456789,-");
+ }
+ }
+
+ for (i = n1; i <= n2 && i > 0 && i <= slist->count; i++) {
+ if (!slist->list[i - 1])
+ continue;
+ if (cb && !cb(slist, slist->list[i - 1], args))
+ return -1;
+
+ if (slist->opts && slist->opts->freeitem)
+ slist->opts->freeitem(slist, slist->list[i - 1]);
+ slist->list[i - 1] = NULL;
+
+ count++;
+ }
+
+ range += strcspn(range, ",");
+ if (*range)
+ range++;
+ else
+ break;
+ }
+
+ /* We only really delete the items from the list after having processed
+ * everything because it would change the position of the items in the
+ * list otherwise.
+ */
+ slist_pack(slist);
+
+ va_end(args);
+ return count;
+}
+
+/*************************************************************************/
+
+/* Enumerates all entries of the list. If range is not NULL, will only
+ * enumerate entries that are in the range. Returns the total number
+ * of entries enumerated.
+ */
+
+int slist_enum(SList * slist, char *range, slist_enumcb_t cb, ...)
+{
+ int count = 0, i, res;
+ va_list args;
+
+ va_start(args, cb);
+
+ if (!range) {
+ for (i = 0; i < slist->count; i++) {
+ if (!slist->list[i]) {
+ alog("SList: warning: NULL pointer in the list (?)");
+ continue;
+ }
+
+ res = cb(slist, i + 1, slist->list[i], args);
+ if (res < 0)
+ break;
+ count += res;
+ }
+ } else {
+ int n1, n2;
+
+ for (;;) {
+ res = 0;
+ n1 = n2 = strtol(range, (char **) &range, 10);
+ range += strcspn(range, "0123456789,-");
+ if (*range == '-') {
+ range++;
+ range += strcspn(range, "0123456789,");
+ if (isdigit(*range)) {
+ n2 = strtol(range, (char **) &range, 10);
+ range += strcspn(range, "0123456789,-");
+ }
+ }
+ for (i = n1; i <= n2 && i > 0 && i <= slist->count; i++) {
+ if (!slist->list[i - 1]) {
+ alog("SList: warning: NULL pointer in the list (?)");
+ continue;
+ }
+
+ res = cb(slist, i, slist->list[i - 1], args);
+ if (res < 0)
+ break;
+ count += res;
+ }
+ if (res < -1)
+ break;
+ range += strcspn(range, ",");
+ if (*range)
+ range++;
+ else
+ break;
+ }
+ }
+
+ va_end(args);
+
+ return count;
+}
+
+/*************************************************************************/
+
+/* Determines whether the list is full. */
+
+int slist_full(SList * slist)
+{
+ if (slist->limit != 0 && slist->count >= slist->limit)
+ return 1;
+ else
+ return 0;
+}
+
+/*************************************************************************/
+
+/* Initialization of the list. */
+
+void slist_init(SList * slist)
+{
+ memset(slist, 0, sizeof(SList));
+ slist->limit = SLIST_DEFAULT_LIMIT;
+ slist->opts = &slist_defopts;
+}
+
+/*************************************************************************/
+
+/* Returns the index of an item in the list, -1 if inexistant. */
+
+int slist_indexof(SList * slist, void *item)
+{
+ int16 i;
+ void *entry;
+
+ if (slist->count == 0)
+ return -1;
+
+ for (i = 0, entry = slist->list[0]; i < slist->count;
+ i++, entry = slist->list[i]) {
+ if ((slist->opts
+ && slist->opts->isequal) ? (slist->opts->isequal(slist, item,
+ entry))
+ : (item == entry))
+ return i;
+ }
+
+ return -1;
+}
+
+/*************************************************************************/
+
+/* Removes all NULL pointers from the list. */
+
+void slist_pack(SList * slist)
+{
+ int i;
+
+ for (i = slist->count - 1; i >= 0; i--)
+ if (!slist->list[i])
+ slist_delete(slist, i);
+}
+
+/*************************************************************************/
+
+/* Removes a specific item from the list. Returns the old index of the
+ deleted item, or -1 if the item was not found. */
+
+int slist_remove(SList * slist, void *item)
+{
+ int index = slist_indexof(slist, item);
+ if (index == -1)
+ return -1;
+ slist_delete(slist, index);
+ return index;
+}
+
+/*************************************************************************/
+
+/* Sets the maximum capacity of the list */
+
+int slist_setcapacity(SList * slist, int16 capacity)
+{
+ if (slist->capacity == capacity)
+ return 1;
+ slist->capacity = capacity;
+ if (slist->capacity)
+ slist->list =
+ srealloc(slist->list, sizeof(void *) * slist->capacity);
+ else {
+ free(slist->list);
+ slist->list = NULL;
+ }
+ if (slist->capacity < slist->count)
+ slist->count = slist->capacity;
+ return 1;
+}
diff --git a/slist.h b/slist.h
new file mode 100644
index 000000000..a4e3001e2
--- /dev/null
+++ b/slist.h
@@ -0,0 +1,63 @@
+/* Header for Services list handler.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: slist.h,v 1.4 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#ifndef SLIST_H
+#define SLIST_H
+
+typedef struct slist_ SList;
+typedef struct slistopts_ SListOpts;
+
+struct slist_ {
+ void **list;
+
+ int16 count; /* Total entries of the list */
+ int16 capacity; /* Capacity of the list */
+ int16 limit; /* Maximum possible entries on the list */
+
+ SListOpts *opts;
+};
+
+struct slistopts_ {
+ int32 flags; /* Flags for the list. See below. */
+
+ int (*compareitem) (SList *slist, void *item1, void *item2); /* Called to compare two items */
+ int (*isequal) (SList *slist, void *item1, void *item2); /* Called by slist_indexof. item1 can be an arbitrary pointer. */
+ void (*freeitem) (SList *slist, void *item); /* Called when an item is removed */
+};
+
+#define SLIST_DEFAULT_LIMIT 32767
+
+#define SLISTF_NODUP 0x00000001 /* No duplicates in the list. */
+#define SLISTF_SORT 0x00000002 /* Automatically sort the list. Used with compareitem member. */
+
+/* Note that number is the index in the array + 1 */
+typedef int (*slist_enumcb_t) (SList *slist, int number, void *item, va_list args);
+/* Callback to know whether we can delete the entry. */
+typedef int (*slist_delcheckcb_t) (SList *slist, void *item, va_list args);
+
+/* Functions for global use */
+extern int slist_add(SList *slist, void *item);
+extern void slist_clear(SList *slist, int free);
+extern int slist_delete(SList *slist, int index);
+extern int slist_delete_range(SList *slist, char *range, slist_delcheckcb_t cb, ...);
+extern int slist_enum(SList *slist, char *range, slist_enumcb_t cb, ...);
+extern int slist_full(SList *slist);
+extern int slist_indexof(SList *slist, void *item);
+extern void slist_init(SList *slist);
+extern void slist_pack(SList *slist);
+extern int slist_remove(SList *slist, void *item);
+extern int slist_setcapacity(SList *slist, int16 capacity);
+
+#endif /* SLIST_H */
+
diff --git a/sockutil.c b/sockutil.c
new file mode 100644
index 000000000..4f41eee82
--- /dev/null
+++ b/sockutil.c
@@ -0,0 +1,549 @@
+/* Socket utility routines.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: sockutil.c,v 1.7 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Read from a socket with buffering. */
+
+static char read_netbuf[NET_BUFSIZE];
+static char *read_curpos = read_netbuf; /* Next byte to return */
+static char *read_bufend = read_netbuf; /* Next position for data from socket */
+static char *const read_buftop = read_netbuf + NET_BUFSIZE;
+int32 total_read = 0;
+
+
+/* Return amount of data in read buffer. */
+
+int32 read_buffer_len()
+{
+ if (read_bufend >= read_curpos)
+ return read_bufend - read_curpos;
+ else
+ return (read_bufend + NET_BUFSIZE) - read_curpos;
+}
+
+
+/* Read data. */
+
+static int buffered_read(int fd, char *buf, int len)
+{
+ int nread, left = len;
+ fd_set fds;
+ struct timeval tv = { 0, 0 };
+ int errno_save = errno;
+
+ if (fd < 0) {
+ errno = EBADF;
+ return -1;
+ }
+ while (left > 0) {
+ struct timeval *tvptr = (read_bufend == read_curpos ? NULL : &tv);
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ while (read_bufend != read_curpos - 1
+ && !(read_curpos == read_netbuf
+ && read_bufend == read_buftop - 1)
+ && select(fd + 1, &fds, 0, 0, tvptr) == 1) {
+ int maxread;
+ tvptr = &tv; /* don't wait next time */
+ if (read_bufend < read_curpos) /* wrapped around? */
+ maxread = (read_curpos - 1) - read_bufend;
+ else if (read_curpos == read_netbuf)
+ maxread = read_buftop - read_bufend - 1;
+ else
+ maxread = read_buftop - read_bufend;
+ nread = read(fd, read_bufend, maxread);
+ errno_save = errno;
+ if (debug >= 3)
+ alog("debug: buffered_read wanted %d, got %d", maxread,
+ nread);
+ if (nread <= 0)
+ break;
+ read_bufend += nread;
+ if (read_bufend == read_buftop)
+ read_bufend = read_netbuf;
+ }
+ if (read_curpos == read_bufend) /* No more data on socket */
+ break;
+ /* See if we can gobble up the rest of the buffer. */
+ if (read_curpos + left >= read_buftop && read_bufend < read_curpos) {
+ nread = read_buftop - read_curpos;
+ memcpy(buf, read_curpos, nread);
+ buf += nread;
+ left -= nread;
+ read_curpos = read_netbuf;
+ }
+ /* Now everything we need is in a single chunk at read_curpos. */
+ if (read_bufend > read_curpos && read_bufend - read_curpos < left)
+ nread = read_bufend - read_curpos;
+ else
+ nread = left;
+ if (nread) {
+ memcpy(buf, read_curpos, nread);
+ buf += nread;
+ left -= nread;
+ read_curpos += nread;
+ }
+ }
+ total_read += len - left;
+ if (debug >= 4) {
+ alog("debug: buffered_read(%d,%p,%d) returning %d",
+ fd, buf, len, len - left);
+ }
+ errno = errno_save;
+ return len - left;
+}
+
+/* Optimized version of the above for reading a single character; returns
+ * the character in an int or EOF, like fgetc(). */
+
+static int buffered_read_one(int fd)
+{
+ int nread;
+ fd_set fds;
+ struct timeval tv = { 0, 0 };
+ char c;
+ struct timeval *tvptr = (read_bufend == read_curpos ? NULL : &tv);
+ int errno_save = errno;
+
+ if (fd < 0) {
+ errno = EBADF;
+ return -1;
+ }
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ while (read_bufend != read_curpos - 1
+ && !(read_curpos == read_netbuf
+ && read_bufend == read_buftop - 1)
+ && select(fd + 1, &fds, 0, 0, tvptr) == 1) {
+ int maxread;
+ tvptr = &tv; /* don't wait next time */
+ if (read_bufend < read_curpos) /* wrapped around? */
+ maxread = (read_curpos - 1) - read_bufend;
+ else if (read_curpos == read_netbuf)
+ maxread = read_buftop - read_bufend - 1;
+ else
+ maxread = read_buftop - read_bufend;
+ nread = read(fd, read_bufend, maxread);
+ errno_save = errno;
+ if (debug >= 3)
+ alog("debug: buffered_read_one wanted %d, got %d", maxread,
+ nread);
+ if (nread <= 0)
+ break;
+ read_bufend += nread;
+ if (read_bufend == read_buftop)
+ read_bufend = read_netbuf;
+ }
+ if (read_curpos == read_bufend) { /* No more data on socket */
+ if (debug >= 4)
+ alog("debug: buffered_read_one(%d) returning %d", fd, EOF);
+ errno = errno_save;
+ return EOF;
+ }
+ c = *read_curpos++;
+ if (read_curpos == read_buftop)
+ read_curpos = read_netbuf;
+ total_read++;
+ if (debug >= 4)
+ alog("debug: buffered_read_one(%d) returning %d", fd, c);
+ return (int) c & 0xFF;
+}
+
+/*************************************************************************/
+
+/* Write to a socket with buffering. Note that this assumes only one
+ * socket. */
+
+static char write_netbuf[NET_BUFSIZE];
+static char *write_curpos = write_netbuf; /* Next byte to write to socket */
+static char *write_bufend = write_netbuf; /* Next position for data to socket */
+static char *const write_buftop = write_netbuf + NET_BUFSIZE;
+static int write_fd = -1;
+int32 total_written;
+
+
+/* Return amount of data in write buffer. */
+
+int32 write_buffer_len()
+{
+ if (write_bufend >= write_curpos)
+ return write_bufend - write_curpos;
+ else
+ return (write_bufend + NET_BUFSIZE) - write_curpos;
+}
+
+
+/* Helper routine to try and write up to one chunk of data from the buffer
+ * to the socket. Return how much was written. */
+
+static int flush_write_buffer(int wait)
+{
+ fd_set fds;
+ struct timeval tv = { 0, 0 };
+ int errno_save = errno;
+
+ if (write_bufend == write_curpos || write_fd == -1)
+ return 0;
+ FD_ZERO(&fds);
+ FD_SET(write_fd, &fds);
+ if (select(write_fd + 1, 0, &fds, 0, wait ? NULL : &tv) == 1) {
+ int maxwrite, nwritten;
+ if (write_curpos > write_bufend) /* wrapped around? */
+ maxwrite = write_buftop - write_curpos;
+ else if (write_bufend == write_netbuf)
+ maxwrite = write_buftop - write_curpos - 1;
+ else
+ maxwrite = write_bufend - write_curpos;
+ nwritten = write(write_fd, write_curpos, maxwrite);
+ errno_save = errno;
+ if (debug >= 3)
+ alog("debug: flush_write_buffer wanted %d, got %d", maxwrite,
+ nwritten);
+ if (nwritten > 0) {
+ write_curpos += nwritten;
+ if (write_curpos == write_buftop)
+ write_curpos = write_netbuf;
+ total_written += nwritten;
+ return nwritten;
+ }
+ }
+ errno = errno_save;
+ return 0;
+}
+
+
+/* Write data. */
+
+static int buffered_write(int fd, char *buf, int len)
+{
+ int nwritten, left = len;
+ int errno_save = errno;
+
+ if (fd < 0) {
+ errno = EBADF;
+ return -1;
+ }
+ write_fd = fd;
+
+ while (left > 0) {
+
+ /* Don't try putting anything in the buffer if it's full. */
+ if (write_curpos != write_bufend + 1 &&
+ (write_curpos != write_netbuf
+ || write_bufend != write_buftop - 1)) {
+ /* See if we need to write up to the end of the buffer. */
+ if (write_bufend + left >= write_buftop
+ && write_curpos <= write_bufend) {
+ nwritten = write_buftop - write_bufend;
+ memcpy(write_bufend, buf, nwritten);
+ buf += nwritten;
+ left -= nwritten;
+ write_bufend = write_netbuf;
+ }
+ /* Now we can copy a single chunk to write_bufend. */
+ if (write_curpos > write_bufend
+ && write_curpos - write_bufend - 1 < left)
+ nwritten = write_curpos - write_bufend - 1;
+ else
+ nwritten = left;
+ if (nwritten) {
+ memcpy(write_bufend, buf, nwritten);
+ buf += nwritten;
+ left -= nwritten;
+ write_bufend += nwritten;
+ }
+ }
+
+ /* Now write to the socket as much as we can. */
+ if (write_curpos == write_bufend + 1 ||
+ (write_curpos == write_netbuf
+ && write_bufend == write_buftop - 1))
+ flush_write_buffer(1);
+ else
+ flush_write_buffer(0);
+ errno_save = errno;
+ if (write_curpos == write_bufend + 1 ||
+ (write_curpos == write_netbuf
+ && write_bufend == write_buftop - 1)) {
+ /* Write failed on full buffer */
+ break;
+ }
+ }
+
+ if (debug >= 4) {
+ alog("debug: buffered_write(%d,%p,%d) returning %d",
+ fd, buf, len, len - left);
+ }
+ errno = errno_save;
+ return len - left;
+}
+
+/* Optimized version of the above for writing a single character; returns
+ * the character in an int or EOF, like fputc(). Commented out because it
+ * isn't currently used. */
+
+#if 0
+static int buffered_write_one(int c, int fd)
+{
+ struct timeval tv = { 0, 0 };
+
+ if (fd < 0) {
+ errno = EBADF;
+ return -1;
+ }
+ write_fd = fd;
+
+ /* Try to flush the buffer if it's full. */
+ if (write_curpos == write_bufend + 1 ||
+ (write_curpos == write_netbuf
+ && write_bufend == write_buftop - 1)) {
+ flush_write_buffer(1);
+ if (write_curpos == write_bufend + 1 ||
+ (write_curpos == write_netbuf
+ && write_bufend == write_buftop - 1)) {
+ /* Write failed */
+ if (debug >= 4)
+ alog("debug: buffered_write_one(%d) returning %d", fd,
+ EOF);
+ return EOF;
+ }
+ }
+
+ /* Write the character. */
+ *write_bufend++ = c;
+ if (write_bufend == write_buftop)
+ write_bufend = write_netbuf;
+
+ /* Move it to the socket if we can. */
+ flush_write_buffer(0);
+
+ if (debug >= 4)
+ alog("debug: buffered_write_one(%d) returning %d", fd, c);
+ return (int) c & 0xFF;
+}
+#endif /* 0 */
+
+/*************************************************************************/
+/*************************************************************************/
+
+static int lastchar = EOF;
+
+int sgetc(int s)
+{
+ int c;
+
+ if (lastchar != EOF) {
+ c = lastchar;
+ lastchar = EOF;
+ return c;
+ }
+ return buffered_read_one(s);
+}
+
+int sungetc(int c, int s)
+{
+ return lastchar = c;
+}
+
+/*************************************************************************/
+
+/* If connection was broken, return NULL. If the read timed out, return
+ * (char *)-1.
+ */
+
+char *sgets(char *buf, int len, int s)
+{
+ int c = 0;
+ struct timeval tv;
+ fd_set fds;
+ char *ptr = buf;
+
+ if (len == 0)
+ return NULL;
+ FD_SET(s, &fds);
+ tv.tv_sec = ReadTimeout;
+ tv.tv_usec = 0;
+ while (read_buffer_len() == 0 &&
+ (c = select(s + 1, &fds, NULL, NULL, &tv)) < 0) {
+ if (errno != EINTR)
+ break;
+ }
+ if (read_buffer_len() == 0 && c == 0)
+ return (char *) -1;
+ c = sgetc(s);
+ while (--len && (*ptr++ = c) != '\n' && (c = sgetc(s)) >= 0);
+ if (c < 0)
+ return NULL;
+ *ptr = 0;
+ return buf;
+}
+
+/*************************************************************************/
+
+/* sgets2: Read a line of text from a socket, and strip newline and
+ * carriage return characters from the end of the line.
+ */
+
+char *sgets2(char *buf, int len, int s)
+{
+ char *str = sgets(buf, len, s);
+
+ if (!str || str == (char *) -1)
+ return str;
+ str = buf + strlen(buf) - 1;
+ if (*str == '\n')
+ *str-- = 0;
+ if (*str == '\r')
+ *str = 0;
+ return buf;
+}
+
+/*************************************************************************/
+
+/* Read from a socket. (Use this instead of read() because it has
+ * buffering.) */
+
+int sread(int s, char *buf, int len)
+{
+ return buffered_read(s, buf, len);
+}
+
+/*************************************************************************/
+
+int sputs(char *str, int s)
+{
+ return buffered_write(s, str, strlen(str));
+}
+
+/*************************************************************************/
+
+int sockprintf(int s, char *fmt, ...)
+{
+ va_list args;
+ char buf[16384]; /* Really huge, to try and avoid truncation */
+
+ va_start(args, fmt);
+ return buffered_write(s, buf, vsnprintf(buf, sizeof(buf), fmt, args));
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+#if !HAVE_GETHOSTBYNAME
+
+/* Translate an IP dotted-quad address to a 4-byte character string.
+ * Return NULL if the given string is not in dotted-quad format.
+ */
+
+static char *pack_ip(const char *ipaddr)
+{
+ static char ipbuf[4];
+ int tmp[4], i;
+
+ if (sscanf(ipaddr, "%d.%d.%d.%d", &tmp[0], &tmp[1], &tmp[2], &tmp[3])
+ != 4)
+ return NULL;
+ for (i = 0; i < 4; i++) {
+ if (tmp[i] < 0 || tmp[i] > 255)
+ return NULL;
+ ipbuf[i] = tmp[i];
+ }
+ return ipbuf;
+}
+
+#endif
+
+/*************************************************************************/
+
+/* lhost/lport specify the local side of the connection. If they are not
+ * given (lhost==NULL, lport==0), then they are left free to vary.
+ */
+
+int conn(const char *host, int port, const char *lhost, int lport)
+{
+#if HAVE_GETHOSTBYNAME
+ struct hostent *hp;
+#else
+ char *addr;
+#endif
+ struct sockaddr_in sa, lsa;
+ int sock;
+
+ memset(&lsa, 0, sizeof(lsa));
+ if (lhost) {
+#if HAVE_GETHOSTBYNAME
+ if ((hp = gethostbyname(lhost)) != NULL) {
+ memcpy((char *) &lsa.sin_addr, hp->h_addr, hp->h_length);
+ lsa.sin_family = hp->h_addrtype;
+#else
+ if (addr = pack_ip(lhost)) {
+ memcpy((char *) &lsa.sin_addr, addr, 4);
+ lsa.sin_family = AF_INET;
+#endif
+ } else {
+ lhost = NULL;
+ }
+ }
+ if (lport)
+ lsa.sin_port = htons((unsigned short) lport);
+
+ memset(&sa, 0, sizeof(sa));
+#if HAVE_GETHOSTBYNAME
+ if (!(hp = gethostbyname(host)))
+ return -1;
+ memcpy((char *) &sa.sin_addr, hp->h_addr, hp->h_length);
+ sa.sin_family = hp->h_addrtype;
+#else
+ if (!(addr = pack_ip(host))) {
+ alog("conn(): `%s' is not a valid IP address", host);
+ errno = EINVAL;
+ return -1;
+ }
+ memcpy((char *) &sa.sin_addr, addr, 4);
+ sa.sin_family = AF_INET;
+#endif
+ sa.sin_port = htons((unsigned short) port);
+
+ if ((sock = socket(sa.sin_family, SOCK_STREAM, 0)) < 0)
+ return -1;
+
+ if ((lhost || lport)
+ && bind(sock, (struct sockaddr *) &lsa, sizeof(lsa)) < 0) {
+ int errno_save = errno;
+ close(sock);
+ errno = errno_save;
+ return -1;
+ }
+
+ if (connect(sock, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
+ int errno_save = errno;
+ close(sock);
+ errno = errno_save;
+ return -1;
+ }
+
+ return sock;
+}
+
+/*************************************************************************/
+
+void disconn(int s)
+{
+ shutdown(s, 2);
+ close(s);
+}
diff --git a/threads.c b/threads.c
new file mode 100644
index 000000000..69c9b8fa2
--- /dev/null
+++ b/threads.c
@@ -0,0 +1,82 @@
+/* Threads handling.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: threads.c,v 1.5 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#include "services.h"
+
+#ifdef USE_THREADS
+
+/*************************************************************************/
+
+static Thread *threads;
+
+static int thread_cancel(Thread * thr);
+
+/*************************************************************************/
+
+static int thread_cancel(Thread * thr)
+{
+ if (pthread_cancel(thr->th))
+ return 0;
+
+ if (thr->next)
+ thr->next->prev = thr->prev;
+ if (thr->prev)
+ thr->prev->next = thr->next;
+ else
+ threads = thr->next;
+
+ return 1;
+}
+
+/*************************************************************************/
+
+int thread_create(pthread_t * th, void *(*start_routine) (void *),
+ void *arg)
+{
+ Thread *thr;
+
+ if (pthread_create(th, NULL, start_routine, arg))
+ return 0;
+ if (pthread_detach(*th))
+ return 0;
+
+ /* Add the thread to our internal list */
+ thr = scalloc(sizeof(Thread), 1);
+ thr->th = *th;
+ thr->next = threads;
+ if (thr->next)
+ thr->next->prev = thr;
+ threads = thr;
+
+ return 1;
+}
+
+/*************************************************************************/
+
+int thread_killall(void)
+{
+ Thread *thr, *next;
+
+ for (thr = threads; thr; thr = next) {
+ next = thr;
+ if (!thread_cancel(thr))
+ return 0;
+ }
+
+ return 1;
+}
+
+/*************************************************************************/
+
+#endif
diff --git a/timeout.c b/timeout.c
new file mode 100644
index 000000000..629cc009f
--- /dev/null
+++ b/timeout.c
@@ -0,0 +1,130 @@
+/* Routines for time-delayed actions.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: timeout.c,v 1.7 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#include "services.h"
+#include "timeout.h"
+
+static Timeout *timeouts = NULL;
+
+/*************************************************************************/
+
+#ifdef DEBUG_COMMANDS
+
+/* Send the timeout list to the given user. */
+
+void send_timeout_list(User * u)
+{
+ Timeout *to, *last;
+
+ notice(s_OperServ, u->nick, "Now: %ld", time(NULL));
+ for (to = timeouts, last = NULL; to; last = to, to = to->next) {
+ notice(s_OperServ, u->nick, "%p: %ld: %p (%p)",
+ to, to->timeout, to->code, to->data);
+ if (to->prev != last)
+ notice(s_OperServ, u->nick,
+ " to->prev incorrect! expected=%p seen=%p",
+ last, to->prev);
+ }
+}
+
+#endif /* DEBUG_COMMANDS */
+
+/*************************************************************************/
+
+/* Check the timeout list for any pending actions. */
+
+void check_timeouts(void)
+{
+ Timeout *to, *to2;
+ time_t t = time(NULL);
+
+ if (debug >= 2)
+ alog("debug: Checking timeouts at %ld", t);
+
+ to = timeouts;
+ while (to) {
+ if (t < to->timeout) {
+ to = to->next;
+ continue;
+ }
+ if (debug >= 4) {
+ alog("debug: Running timeout %p (code=%p repeat=%d)",
+ to, to->code, to->repeat);
+ }
+ to->code(to);
+ if (to->repeat) {
+ to = to->next;
+ continue;
+ }
+ to2 = to->next;
+ if (to->next)
+ to->next->prev = to->prev;
+ if (to->prev)
+ to->prev->next = to->next;
+ else
+ timeouts = to->next;
+ free(to);
+ to = to2;
+ }
+ if (debug >= 2)
+ alog("debug: Finished timeout list");
+}
+
+/*************************************************************************/
+
+/* Add a timeout to the list to be triggered in `delay' seconds. If
+ * `repeat' is nonzero, do not delete the timeout after it is triggered.
+ * This must maintain the property that timeouts added from within a
+ * timeout routine do not get checked during that run of the timeout list.
+ */
+
+Timeout *add_timeout(int delay, void (*code) (Timeout *), int repeat)
+{
+ Timeout *t = scalloc(sizeof(Timeout), 1);
+ t->settime = time(NULL);
+ t->timeout = t->settime + delay;
+ t->code = code;
+ t->repeat = repeat;
+ t->next = timeouts;
+ t->prev = NULL;
+ if (timeouts)
+ timeouts->prev = t;
+ timeouts = t;
+ return t;
+}
+
+/*************************************************************************/
+
+/* Remove a timeout from the list (if it's there). */
+
+void del_timeout(Timeout * t)
+{
+ Timeout *ptr;
+
+ for (ptr = timeouts; ptr; ptr = ptr->next) {
+ if (ptr == t)
+ break;
+ }
+ if (!ptr)
+ return;
+ if (t->prev)
+ t->prev->next = t->next;
+ else
+ timeouts = t->next;
+ if (t->next)
+ t->next->prev = t->prev;
+ free(t);
+}
+
+/*************************************************************************/
diff --git a/timeout.h b/timeout.h
new file mode 100644
index 000000000..045e13801
--- /dev/null
+++ b/timeout.h
@@ -0,0 +1,50 @@
+/* Time-delay routine include stuff.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: timeout.h,v 1.4 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#ifndef TIMEOUT_H
+#define TIMEOUT_H
+
+#include <time.h>
+
+
+/* Definitions for timeouts: */
+typedef struct timeout_ Timeout;
+struct timeout_ {
+ Timeout *next, *prev;
+ time_t settime, timeout;
+ int repeat; /* Does this timeout repeat indefinitely? */
+ void (*code)(Timeout *); /* This structure is passed to the code */
+ void *data; /* Can be anything */
+};
+
+
+/* Check the timeout list for any pending actions. */
+extern void check_timeouts(void);
+
+/* Add a timeout to the list to be triggered in `delay' seconds. Any
+ * timeout added from within a timeout routine will not be checked during
+ * that run through the timeout list.
+ */
+extern Timeout *add_timeout(int delay, void (*code)(Timeout *), int repeat);
+
+/* Remove a timeout from the list (if it's there). */
+extern void del_timeout(Timeout *t);
+
+#ifdef DEBUG_COMMANDS
+/* Send the list of timeouts to the given user. */
+extern void send_timeout_list(User *u);
+#endif
+
+
+#endif /* TIMEOUT_H */
diff --git a/users.c b/users.c
new file mode 100644
index 000000000..31810c8c4
--- /dev/null
+++ b/users.c
@@ -0,0 +1,1136 @@
+/* Routines to maintain a list of online users.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: users.c,v 1.37 2004/02/18 19:00:33 rob Exp $
+ *
+ */
+
+#include "services.h"
+
+#define HASH(nick) (((nick)[0]&31)<<5 | ((nick)[1]&31))
+User *userlist[1024];
+
+int32 usercnt = 0, opcnt = 0, maxusercnt = 0;
+time_t maxusertime;
+
+static unsigned long umodes[128] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, UMODE_A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ UMODE_P,
+#else
+ 0,
+#endif
+ 0,
+#if defined(IRC_BAHAMUT) || defined(IRC_ULTIMATE)
+ UMODE_R,
+#else
+ 0,
+#endif
+ 0, 0, 0, 0, 0, 0, 0,
+#ifdef IRC_ULTIMATE3
+ UMODE_Z,
+#else
+ 0,
+#endif
+ 0, 0, 0, 0, 0,
+ 0, UMODE_a, 0, 0, 0, 0, 0,
+#ifdef IRC_DREAMFORGE
+ UMODE_g,
+#else
+ 0,
+#endif
+ UMODE_h, UMODE_i, 0, 0, 0, 0, 0, UMODE_o,
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ UMODE_p,
+#else
+ 0,
+#endif
+ 0, UMODE_r, 0, 0, 0, 0, UMODE_w,
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA)
+ UMODE_x,
+#else
+ 0,
+#endif
+ 0, 0, 0, 0, 0, 0, 0
+};
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Allocate a new User structure, fill in basic values, link it to the
+ * overall list, and return it. Always successful.
+ */
+
+static User *new_user(const char *nick)
+{
+ User *user, **list;
+
+ user = scalloc(sizeof(User), 1);
+ if (!nick)
+ nick = "";
+ strscpy(user->nick, nick, NICKMAX);
+ list = &userlist[HASH(user->nick)];
+ user->next = *list;
+ if (*list)
+ (*list)->prev = user;
+ *list = user;
+ user->na = findnick(nick);
+ if (user->na)
+ user->na->u = user;
+ usercnt++;
+ if (usercnt > maxusercnt) {
+ maxusercnt = usercnt;
+ maxusertime = time(NULL);
+ if (LogMaxUsers)
+ alog("user: New maximum user count: %d", maxusercnt);
+ }
+ user->isSuperAdmin = 0; /* always set SuperAdmin to 0 for new users */
+ return user;
+}
+
+/*************************************************************************/
+
+/* Change the nickname of a user, and move pointers as necessary. */
+
+static void change_user_nick(User * user, const char *nick)
+{
+ User **list;
+ int is_same = (!stricmp(user->nick, nick) ? 1 : 0);
+
+ if (user->prev)
+ user->prev->next = user->next;
+ else
+ userlist[HASH(user->nick)] = user->next;
+ if (user->next)
+ user->next->prev = user->prev;
+ user->nick[1] = 0; /* paranoia for zero-length nicks */
+ strscpy(user->nick, nick, NICKMAX);
+ list = &userlist[HASH(user->nick)];
+ user->next = *list;
+ user->prev = NULL;
+ if (*list)
+ (*list)->prev = user;
+ *list = user;
+
+ /* Only if old and new nick aren't the same; no need to waste time */
+ if (!is_same) {
+ if (user->na)
+ user->na->u = NULL;
+ user->na = findnick(nick);
+ if (user->na)
+ user->na->u = user;
+ }
+}
+
+/*************************************************************************/
+
+#ifdef HAS_VHOST
+
+static void update_host(User * user)
+{
+ if (user->na && (nick_identified(user)
+ || (!(user->na->nc->flags & NI_SECURE)
+ && nick_recognized(user)))) {
+ if (user->na->last_usermask)
+ free(user->na->last_usermask);
+
+ user->na->last_usermask =
+ smalloc(strlen(GetIdent(user)) + strlen(GetHost(user)) + 2);
+ sprintf(user->na->last_usermask, "%s@%s", GetIdent(user),
+ GetHost(user));
+ }
+
+ if (debug)
+ alog("debug: %s changes its host to %s", user->nick,
+ GetHost(user));
+}
+
+#endif
+
+/*************************************************************************/
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA) || defined(IRC_PTLINK)
+
+/* Change the (virtual) hostname of a user. */
+
+void change_user_host(User * user, const char *host)
+{
+ if (user->vhost)
+ free(user->vhost);
+ user->vhost = sstrdup(host);
+
+ if (debug)
+ alog("debug: %s changes its vhost to %s", user->nick, host);
+
+
+
+ update_host(user);
+}
+
+#endif
+/*************************************************************************/
+
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_PTLINK)
+/* Change the realname of a user. */
+
+void change_user_realname(User * user, const char *realname)
+{
+ if (user->realname)
+ free(user->realname);
+ user->realname = sstrdup(realname);
+
+ if (user->na && (nick_identified(user)
+ || (!(user->na->nc->flags & NI_SECURE)
+ && nick_recognized(user)))) {
+ if (user->na->last_realname)
+ free(user->na->last_realname);
+ user->na->last_realname = sstrdup(realname);
+ }
+
+ if (debug)
+ alog("debug: %s changes its realname to %s", user->nick, realname);
+}
+
+
+/*************************************************************************/
+
+/* Change the username of a user. */
+
+void change_user_username(User * user, const char *username)
+{
+ if (user->username)
+ free(user->username);
+ user->username = sstrdup(username);
+ if (user->na && (nick_identified(user)
+ || (!(user->na->nc->flags & NI_SECURE)
+ && nick_recognized(user)))) {
+ if (user->na->last_usermask)
+ free(user->na->last_usermask);
+
+ user->na->last_usermask =
+ smalloc(strlen(GetIdent(user)) + strlen(GetHost(user)) + 2);
+ sprintf(user->na->last_usermask, "%s@%s", GetIdent(user),
+ GetHost(user));
+ }
+ if (debug)
+ alog("debug: %s changes its username to %s", user->nick, username);
+}
+
+#endif
+
+/*************************************************************************/
+
+void set_umode(User * user, int ac, char **av)
+{
+ int add = 1; /* 1 if adding modes, 0 if deleting */
+ char *modes = av[0];
+
+ ac--;
+
+ if (debug)
+ alog("debug: Changing mode for %s to %s", user->nick, modes);
+
+ while (*modes) {
+
+ add ? (user->mode |= umodes[(int) *modes]) : (user->mode &=
+ ~umodes[(int)
+ *modes]);
+
+ switch (*modes++) {
+ case '+':
+ add = 1;
+ break;
+ case '-':
+ add = 0;
+ break;
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ case 'a':
+ if (add && !is_services_oper(user)) {
+ send_cmd(ServerName, "SVSMODE %s -a", user->nick);
+ user->mode &= ~UMODE_a;
+ }
+ break;
+ case 'P':
+ if (add && !is_services_admin(user)) {
+ send_cmd(ServerName, "SVSMODE %s -P", user->nick);
+ user->mode &= ~UMODE_P;
+ }
+ break;
+#endif
+#if defined(IRC_ULTIMATE)
+ case 'R':
+ if (add && !is_services_root(user)) {
+ send_cmd(ServerName, "SVSMODE %s -R", user->nick);
+ user->mode &= ~UMODE_R;
+ }
+ break;
+#endif
+#if defined(IRC_ULTIMATE3)
+ case 'Z':
+ if (add && !is_services_root(user)) {
+ send_cmd(ServerName, "SVSMODE %s -Z", user->nick);
+ user->mode &= ~UMODE_Z;
+ }
+ break;
+#endif
+ case 'd':
+ if (ac == 0) {
+#if !defined(IRC_ULTIMATE) && !defined(IRC_UNREAL)
+ alog("user: umode +d with no parameter (?) for user %s",
+ user->nick);
+#endif
+ break;
+ }
+
+ ac--;
+ av++;
+ user->svid = strtoul(*av, NULL, 0);
+ break;
+ case 'o':
+ if (add) {
+ opcnt++;
+
+ if (WallOper)
+ wallops(s_OperServ, "\2%s\2 is now an IRC operator.",
+ user->nick);
+ display_news(user, NEWS_OPER);
+#if defined(IRC_PTLINK)
+ if (is_services_admin(user)) {
+ send_cmd(ServerName, "SVSMODE %s +a", user->nick);
+ user->mode |= UMODE_a;
+ }
+#endif
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+ if (is_services_oper(user)) {
+ send_cmd(ServerName, "SVSMODE %s +a", user->nick);
+ user->mode |= UMODE_a;
+ }
+
+ if (is_services_admin(user)) {
+ send_cmd(ServerName, "SVSMODE %s +P", user->nick);
+ user->mode |= UMODE_P;
+ }
+#endif
+
+#ifdef IRC_ULTIMATE
+ if (is_services_root(user)) {
+ send_cmd(ServerName, "SVSMODE %s +R", user->nick);
+ user->mode |= UMODE_R;
+ }
+#endif
+#ifdef IRC_ULTIMATE3
+ if (is_services_root(user)) {
+ send_cmd(ServerName, "SVSMODE %s +Z", user->nick);
+ user->mode |= UMODE_Z;
+ }
+#endif
+ } else {
+ opcnt--;
+ }
+ break;
+ case 'r':
+ if (add && !nick_identified(user)) {
+ send_cmd(ServerName, "SVSMODE %s -r", user->nick);
+ user->mode &= ~UMODE_r;
+ }
+ break;
+#if defined(IRC_ULTIMATE) || defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) || defined(IRC_VIAGRA)
+ case 'x':
+ update_host(user);
+ break;
+#endif
+ }
+ }
+}
+
+/*************************************************************************/
+
+/* Remove and free a User structure. */
+
+static void delete_user(User * user)
+{
+ struct u_chanlist *c, *c2;
+ struct u_chaninfolist *ci, *ci2;
+
+ if (LogUsers) {
+#ifdef HAS_VHOST
+ alog("LOGUSERS: %s (%s@%s => %s) (%s) left the network (%s).",
+ user->nick, user->username, user->host,
+ (user->vhost ? user->vhost : "(none)"), user->realname,
+ user->server);
+#else
+ alog("LOGUSERS: %s (%s@%s) (%s) left the network (%s).",
+ user->nick, user->username, user->host,
+ user->realname, user->server);
+#endif
+ }
+
+ if (debug >= 2)
+ alog("debug: delete_user() called");
+ usercnt--;
+ if (is_oper(user))
+ opcnt--;
+ if (debug >= 2)
+ alog("debug: delete_user(): free user data");
+ free(user->username);
+ free(user->host);
+#ifdef HAS_VHOST
+ if (user->vhost)
+ free(user->vhost);
+#endif
+ free(user->realname);
+ free(user->server);
+ if (debug >= 2)
+ alog("debug: delete_user(): remove from channels");
+ c = user->chans;
+ while (c) {
+ c2 = c->next;
+ chan_deluser(user, c->chan);
+ free(c);
+ c = c2;
+ }
+ /* This called only here now */
+ cancel_user(user);
+ if (user->na)
+ user->na->u = NULL;
+ if (debug >= 2)
+ alog("debug: delete_user(): free founder data");
+ ci = user->founder_chans;
+ while (ci) {
+ ci2 = ci->next;
+ free(ci);
+ ci = ci2;
+ }
+ if (debug >= 2)
+ alog("debug: delete_user(): delete from list");
+ if (user->prev)
+ user->prev->next = user->next;
+ else
+ userlist[HASH(user->nick)] = user->next;
+ if (user->next)
+ user->next->prev = user->prev;
+ if (debug >= 2)
+ alog("debug: delete_user(): free user structure");
+ free(user);
+ if (debug >= 2)
+ alog("debug: delete_user() done");
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Return statistics. Pointers are assumed to be valid. */
+
+void get_user_stats(long *nusers, long *memuse)
+{
+ long count = 0, mem = 0;
+ int i;
+ User *user;
+ struct u_chanlist *uc;
+ struct u_chaninfolist *uci;
+
+ for (i = 0; i < 1024; i++) {
+ for (user = userlist[i]; user; user = user->next) {
+ count++;
+ mem += sizeof(*user);
+ if (user->username)
+ mem += strlen(user->username) + 1;
+ if (user->host)
+ mem += strlen(user->host) + 1;
+#ifdef HAS_VHOST
+ if (user->vhost)
+ mem += strlen(user->vhost) + 1;
+#endif
+ if (user->realname)
+ mem += strlen(user->realname) + 1;
+ if (user->server)
+ mem += strlen(user->server) + 1;
+ for (uc = user->chans; uc; uc = uc->next)
+ mem += sizeof(*uc);
+ for (uci = user->founder_chans; uci; uci = uci->next)
+ mem += sizeof(*uci);
+ }
+ }
+ *nusers = count;
+ *memuse = mem;
+}
+
+/*************************************************************************/
+
+/* Find a user by nick. Return NULL if user could not be found. */
+
+User *finduser(const char *nick)
+{
+ User *user;
+
+ if (debug >= 3)
+ alog("debug: finduser(%p)", nick);
+ user = userlist[HASH(nick)];
+ while (user && stricmp(user->nick, nick) != 0)
+ user = user->next;
+ if (debug >= 3)
+ alog("debug: finduser(%s) -> %p", nick, user);
+ return user;
+}
+
+/*************************************************************************/
+
+/* Iterate over all users in the user list. Return NULL at end of list. */
+
+static User *current;
+static int next_index;
+
+User *firstuser(void)
+{
+ next_index = 0;
+ while (next_index < 1024 && current == NULL)
+ current = userlist[next_index++];
+ if (debug)
+ alog("debug: firstuser() returning %s",
+ current ? current->nick : "NULL (end of list)");
+ return current;
+}
+
+User *nextuser(void)
+{
+ if (current)
+ current = current->next;
+ if (!current && next_index < 1024) {
+ while (next_index < 1024 && current == NULL)
+ current = userlist[next_index++];
+ }
+ if (debug)
+ alog("debug: nextuser() returning %s",
+ current ? current->nick : "NULL (end of list)");
+ return current;
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+/* Handle a server NICK command. */
+
+User *do_nick(const char *source, char *nick, char *username, char *host,
+ char *server, char *realname, time_t ts, uint32 svid, ...)
+{
+ User *user;
+
+ char *tmp = NULL;
+ NickAlias *old_na; /* Old nick rec */
+ int nc_changed = 1; /* Did nick core change? */
+ int status = 0; /* Status to apply */
+ char mask[USERMAX + HOSTMAX + 2];
+
+ if (!*source) {
+#ifdef HAS_NICKIP
+ char ipbuf[16];
+ struct in_addr addr;
+ uint32 ip;
+#endif
+#ifdef HAS_VHOST
+ char *vhost = NULL;
+#endif
+#if defined(HAS_NICKIP) || defined(HAS_NICKVHOST)
+ va_list args;
+ va_start(args, svid);
+#endif
+
+#ifdef HAS_NICKIP
+ ip = va_arg(args, uint32);
+#endif
+
+#ifdef HAS_NICKVHOST
+ vhost = va_arg(args, char *);
+ if (!strcmp(vhost, "*")) {
+ vhost = NULL;
+ if (debug)
+ alog("debug: new user with no vhost in NICK command: %s",
+ nick);
+ }
+#endif
+
+ /* This is a new user; create a User structure for it. */
+ if (debug)
+ alog("debug: new user: %s", nick);
+
+ if (LogUsers) {
+ /**
+ * Ugly swap routine for Flop's bug :)
+ **/
+ tmp = strchr(realname, '%');
+ while (tmp) {
+ *tmp = '-';
+ tmp = strchr(realname, '%');
+ }
+ /**
+ * End of ugly swap
+ **/
+
+#ifdef HAS_NICKIP
+ addr.s_addr = htonl(ip);
+ ntoa(addr, ipbuf, sizeof(ipbuf));
+#endif
+
+#ifdef HAS_NICKVHOST
+# ifdef HAS_NICKIP
+ alog("LOGUSERS: %s (%s@%s => %s) (%s) [%s] connected to the network (%s).", nick, username, host, vhost, realname, ipbuf, server);
+# else
+ alog("LOGUSERS: %s (%s@%s => %s) (%s) connected to the network (%s).", nick, username, host, vhost, realname, server);
+# endif
+#else
+# ifdef HAS_NICKIP
+ alog("LOGUSERS: %s (%s@%s) (%s) [%s] connected to the network (%s).", nick, username, host, realname, ipbuf, server);
+# else
+ alog("LOGUSERS: %s (%s@%s) (%s) connected to the network (%s).", nick, username, host, realname, server);
+# endif
+#endif
+ }
+
+ /* We used to ignore the ~ which a lot of ircd's use to indicate no
+ * identd response. That caused channel bans to break, so now we
+ * just take what the server gives us. People are still encouraged
+ * to read the RFCs and stop doing anything to usernames depending
+ * on the result of an identd lookup.
+ */
+
+ /* First check for AKILLs. */
+ /* DONT just return null if its an akill match anymore - yes its more efficent to, however, now that ircd's are
+ * starting to use things like E/F lines, we cant be 100% sure the client will be removed from the network :/
+ * as such, create a user_struct, and if the client is removed, we'll delete it again when the QUIT notice
+ * comes in from the ircd.
+ **/
+ if (check_akill(nick, username, host,
+#ifdef HAS_NICKVHOST
+ vhost,
+#else
+ NULL,
+#endif
+#ifdef HAS_NICKIP
+ ipbuf)) {
+#else
+ NULL)) {
+#endif
+/* return NULL; */
+ }
+
+/**
+ * DefCon AKILL system, if we want to akill all connecting user's here's where to do it
+ * then force check_akill again on them...
+ **/
+ if (checkDefCon(DEFCON_AKILL_NEW_CLIENTS)) {
+ strncpy(mask, "*@", 3);
+ strncat(mask, host, HOSTMAX);
+ alog("DEFCON: adding akill for %s", mask);
+ add_akill(NULL, mask, s_OperServ,
+ time(NULL) + dotime(DefConAKILL),
+ DefConAkillReason ? DefConAkillReason :
+ "DEFCON AKILL");
+ if (check_akill(nick, username, host,
+#ifdef HAS_NICKVHOST
+ vhost,
+#else
+ NULL,
+#endif
+#ifdef HAS_NICKIP
+ ipbuf)) {
+#else
+ NULL)) {
+#endif
+/* return NULL; */
+ }
+ }
+#ifdef IRC_BAHAMUT
+ /* Next for SGLINEs */
+ if (check_sgline(nick, realname))
+ return NULL;
+#endif
+
+ /* And for SQLINEs */
+ if (check_sqline(nick, 0))
+ return NULL;
+
+#ifndef STREAMLINED
+ /* Now check for session limits */
+ if (LimitSessions && !add_session(nick, host))
+ return NULL;
+#endif
+
+ /* And finally, for proxy ;) */
+#ifdef USE_THREADS
+# ifdef HAS_NICKIP
+ if (ProxyDetect && proxy_check(nick, host, ip))
+# else
+ if (ProxyDetect && proxy_check(nick, host, 0))
+# endif
+ return NULL;
+#endif
+
+ /* Allocate User structure and fill it in. */
+ user = new_user(nick);
+ user->username = sstrdup(username);
+ user->host = sstrdup(host);
+ user->server = sstrdup(server);
+ user->realname = sstrdup(realname);
+ user->timestamp = ts;
+ user->my_signon = time(NULL);
+
+#ifdef HAS_VHOST
+ user->vhost = vhost ? sstrdup(vhost) : sstrdup(host);
+#endif
+
+ if (CheckClones) {
+ /* Check to see if it looks like clones. */
+ check_clones(user);
+ }
+
+ if (svid == 0) {
+ display_news(user, NEWS_LOGON);
+ display_news(user, NEWS_RANDOM);
+ }
+
+ if (svid == ts && user->na) {
+ /* Timestamp and svid match, and nick is registered; automagically identify the nick */
+ user->svid = svid;
+ user->na->status |= NS_IDENTIFIED;
+ check_memos(user);
+ nc_changed = 0;
+ } else if (svid != 1) {
+ /* Resets the svid because it doesn't match */
+ user->svid = 1;
+#ifdef IRC_BAHAMUT
+ send_cmd(ServerName, "SVSMODE %s %lu +d 1", user->nick,
+ user->timestamp);
+#else
+#ifndef IRC_PTLINK
+ send_cmd(ServerName, "SVSMODE %s +d 1", user->nick);
+#endif
+#endif
+ } else {
+ user->svid = 1;
+ }
+
+ } else {
+ /* An old user changing nicks. */
+ user = finduser(source);
+ if (!user) {
+ alog("user: NICK from nonexistent nick %s", source);
+ return NULL;
+ }
+ user->isSuperAdmin = 0; /* Dont let people nick change and stay SuperAdmins */
+ if (debug)
+ alog("debug: %s changes nick to %s", source, nick);
+
+ if (LogUsers) {
+#ifdef HAS_VHOST
+ alog("LOGUSERS: %s (%s@%s => %s) (%s) changed his nick to %s (%s).", user->nick, user->username, user->host, (user->vhost ? user->vhost : "(none)"), user->realname, nick, user->server);
+#else
+ alog("LOGUSERS: %s (%s@%s) (%s) changed his nick to %s (%s).",
+ user->nick, user->username, user->host,
+ user->realname, nick, user->server);
+#endif
+ }
+
+ user->timestamp = ts;
+
+ if (stricmp(nick, user->nick) == 0) {
+ /* No need to redo things */
+ change_user_nick(user, nick);
+ nc_changed = 0;
+ } else {
+ /* Update this only if nicks aren't the same */
+ user->my_signon = time(NULL);
+
+ old_na = user->na;
+ if (old_na) {
+ if (nick_recognized(user))
+ user->na->last_seen = time(NULL);
+ status = old_na->status & NS_TRANSGROUP;
+ cancel_user(user);
+ }
+
+ change_user_nick(user, nick);
+
+ if ((old_na ? old_na->nc : NULL) ==
+ (user->na ? user->na->nc : NULL))
+ nc_changed = 0;
+
+ if (!nc_changed && (user->na))
+ user->na->status |= status;
+ else {
+#if !defined(IRC_BAHAMUT) && !defined(IRC_PTLINK)
+ /* Because on Bahamut it would be already -r */
+ change_user_mode(user, "-r+d", "1");
+#else
+ change_user_mode(user, "+d", "1");
+#endif
+ }
+ }
+
+ if (!is_oper(user) && check_sqline(user->nick, 1))
+ return NULL;
+
+ } /* if (!*source) */
+
+ if (nc_changed || !nick_recognized(user)) {
+ if (validate_user(user))
+ check_memos(user);
+ } else {
+ if (nick_identified(user)) {
+ user->na->last_seen = time(NULL);
+
+ if (user->na->last_usermask)
+ free(user->na->last_usermask);
+ user->na->last_usermask =
+ smalloc(strlen(GetIdent(user)) + strlen(GetHost(user)) +
+ 2);
+ sprintf(user->na->last_usermask, "%s@%s", GetIdent(user),
+ GetHost(user));
+
+#ifdef IRC_PTLINK
+ change_user_mode(user, "+r", NULL);
+#endif
+
+#if !defined(IRC_BAHAMUT) && !defined(IRC_PTLINK)
+ if (user->svid != user->timestamp) {
+ char tsbuf[16];
+ snprintf(tsbuf, sizeof(tsbuf), "%lu", user->timestamp);
+ change_user_mode(user, "+rd", tsbuf);
+ } else {
+ change_user_mode(user, "+r", NULL);
+ }
+#endif
+
+
+ alog("%s: %s!%s@%s automatically identified for nick %s",
+ s_NickServ, user->nick, user->username, GetHost(user),
+ user->nick);
+ }
+ }
+
+/* Bahamut sets -r on every nick changes, so we must test it even if nc_changed == 0 */
+#ifdef IRC_BAHAMUT
+ if (nick_identified(user)) {
+ if (user->svid != user->timestamp) {
+ char tsbuf[16];
+ snprintf(tsbuf, sizeof(tsbuf), "%lu", user->timestamp);
+ change_user_mode(user, "+rd", tsbuf);
+ } else {
+ change_user_mode(user, "+r", NULL);
+ }
+ }
+#endif
+
+ return user;
+}
+
+/*************************************************************************/
+
+/* Handle a MODE command for a user.
+ * av[0] = nick to change mode for
+ * av[1] = modes
+ */
+
+void do_umode(const char *source, int ac, char **av)
+{
+ User *user;
+
+ if (stricmp(source, av[0]) != 0) {
+ alog("user: MODE %s %s from different nick %s!", av[0], av[1],
+ source);
+ wallops(NULL, "%s attempted to change mode %s for %s", source,
+ av[1], av[0]);
+ return;
+ }
+
+ user = finduser(source);
+ if (!user) {
+ alog("user: MODE %s for nonexistent nick %s: %s", av[1], source,
+ merge_args(ac, av));
+ return;
+ }
+
+ set_umode(user, ac - 1, &av[1]);
+}
+
+/*************************************************************************/
+
+/* Handle a QUIT command.
+ * av[0] = reason
+ */
+
+void do_quit(const char *source, int ac, char **av)
+{
+ User *user;
+ NickAlias *na;
+
+ user = finduser(source);
+ if (!user) {
+ alog("user: QUIT from nonexistent user %s: %s", source,
+ merge_args(ac, av));
+ return;
+ }
+ if (debug)
+ alog("debug: %s quits", source);
+ if ((na = user->na) && (!(na->status & NS_VERBOTEN))
+ && (na->status & (NS_IDENTIFIED | NS_RECOGNIZED))) {
+ na->last_seen = time(NULL);
+ if (na->last_quit)
+ free(na->last_quit);
+ na->last_quit = *av[0] ? sstrdup(av[0]) : NULL;
+ }
+#ifndef STREAMLINED
+ if (LimitSessions)
+ del_session(user->host);
+#endif
+ delete_user(user);
+}
+
+/*************************************************************************/
+
+/* Handle a KILL command.
+ * av[0] = nick being killed
+ * av[1] = reason
+ */
+
+void do_kill(const char *source, int ac, char **av)
+{
+ User *user;
+ NickAlias *na;
+
+ user = finduser(av[0]);
+ if (!user)
+ return;
+ if (debug)
+ alog("debug: %s killed", av[0]);
+ if ((na = user->na) && (!(na->status & NS_VERBOTEN))
+ && (na->status & (NS_IDENTIFIED | NS_RECOGNIZED))) {
+ na->last_seen = time(NULL);
+ if (na->last_quit)
+ free(na->last_quit);
+ na->last_quit = *av[1] ? sstrdup(av[1]) : NULL;
+
+ }
+#ifndef STREAMLINED
+ if (LimitSessions)
+ del_session(user->host);
+#endif
+ delete_user(user);
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+#if defined(IRC_ULTIMATE) || defined(IRC_ULTIMATE3)
+
+/* Is the given user protected from kicks and negative mode changes? */
+
+int is_protected(User * user)
+{
+ return (user->mode & UMODE_p);
+}
+#endif
+
+/*************************************************************************/
+
+/* Is the given nick an oper? */
+
+int is_oper(User * user)
+{
+ return (user->mode & UMODE_o);
+}
+
+/*************************************************************************/
+/*************************************************************************/
+
+#if defined (IRC_ULTIMATE) || defined(IRC_ULTIMATE3) || defined(IRC_UNREAL) || defined(IRC_VIAGRA) || defined(IRC_HYBRID)
+/* Is the given user ban-excepted? */
+int is_excepted(ChannelInfo * ci, User * user)
+{
+ int count, i;
+ int isexcepted = 0;
+ char **excepts;
+
+ if (!ci->c)
+ return 0;
+
+ count = ci->c->exceptcount;
+ excepts = scalloc(sizeof(char *) * count, 1);
+ memcpy(excepts, ci->c->excepts, sizeof(char *) * count);
+
+ for (i = 0; i < count; i++) {
+ if (match_usermask(excepts[i], user)) {
+ isexcepted = 1;
+ }
+ }
+ free(excepts);
+ return isexcepted;
+}
+
+/*************************************************************************/
+
+/* Is the given MASK ban-excepted? */
+int is_excepted_mask(ChannelInfo * ci, char *mask)
+{
+ int count, i;
+ int isexcepted = 0;
+ char **excepts;
+
+ if (!ci->c)
+ return 0;
+
+ count = ci->c->exceptcount;
+ excepts = scalloc(sizeof(char *) * count, 1);
+ memcpy(excepts, ci->c->excepts, sizeof(char *) * count);
+
+ for (i = 0; i < count; i++) {
+ if (match_wild_nocase(excepts[i], mask)) {
+ isexcepted = 1;
+ }
+ }
+ free(excepts);
+ return isexcepted;
+}
+
+#endif
+/*************************************************************************/
+
+/* Does the user's usermask match the given mask (either nick!user@host or
+ * just user@host)?
+ */
+
+int match_usermask(const char *mask, User * user)
+{
+ char *mask2 = sstrdup(mask);
+ char *nick, *username, *host;
+ int result;
+
+ if (strchr(mask2, '!')) {
+ nick = strtok(mask2, "!");
+ username = strtok(NULL, "@");
+ } else {
+ nick = NULL;
+ username = strtok(mask2, "@");
+ }
+ host = strtok(NULL, "");
+ if (!username || !host) {
+ free(mask2);
+ return 0;
+ }
+
+ if (nick) {
+ result = match_wild_nocase(nick, user->nick)
+ && match_wild_nocase(username, user->username)
+ && (match_wild_nocase(host, user->host)
+#ifdef HAS_VHOST
+ || match_wild_nocase(host, user->vhost)
+#endif
+ );
+ } else {
+ result = match_wild_nocase(username, user->username)
+ && (match_wild_nocase(host, user->host)
+#ifdef HAS_VHOST
+ || match_wild_nocase(host, user->vhost)
+#endif
+ );
+ }
+
+ free(mask2);
+ return result;
+}
+
+/*************************************************************************/
+
+/* Split a usermask up into its constitutent parts. Returned strings are
+ * malloc()'d, and should be free()'d when done with. Returns "*" for
+ * missing parts.
+ */
+
+void split_usermask(const char *mask, char **nick, char **user,
+ char **host)
+{
+ char *mask2 = sstrdup(mask);
+
+ *nick = strtok(mask2, "!");
+ *user = strtok(NULL, "@");
+ *host = strtok(NULL, "");
+ /* Handle special case: mask == user@host */
+ if (*nick && !*user && strchr(*nick, '@')) {
+ *nick = NULL;
+ *user = strtok(mask2, "@");
+ *host = strtok(NULL, "");
+ }
+ if (!*nick)
+ *nick = "*";
+ if (!*user)
+ *user = "*";
+ if (!*host)
+ *host = "*";
+ *nick = sstrdup(*nick);
+ *user = sstrdup(*user);
+ *host = sstrdup(*host);
+ free(mask2);
+}
+
+/*************************************************************************/
+
+/* Given a user, return a mask that will most likely match any address the
+ * user will have from that location. For IP addresses, wildcards the
+ * appropriate subnet mask (e.g. 35.1.1.1 -> 35.*; 128.2.1.1 -> 128.2.*);
+ * for named addresses, wildcards the leftmost part of the name unless the
+ * name only contains two parts. If the username begins with a ~, delete
+ * it. The returned character string is malloc'd and should be free'd
+ * when done with.
+ */
+
+char *create_mask(User * u)
+{
+ char *mask, *s, *end;
+ int ulen = strlen(GetIdent(u));
+
+ /* Get us a buffer the size of the username plus hostname. The result
+ * will never be longer than this (and will often be shorter), thus we
+ * can use strcpy() and sprintf() safely.
+ */
+ end = mask = smalloc(ulen + strlen(GetHost(u)) + 3);
+ end += sprintf(end, "%s%s@",
+ (ulen <
+ (*(GetIdent(u)) ==
+ '~' ? USERMAX + 1 : USERMAX) ? "*" : ""),
+ (*(GetIdent(u)) ==
+ '~' ? GetIdent(u) + 1 : GetIdent(u)));
+
+ if (strspn(GetHost(u), "0123456789.") == strlen(GetHost(u))
+ && (s = strchr(GetHost(u), '.'))
+ && (s = strchr(s + 1, '.'))
+ && (s = strchr(s + 1, '.'))
+ && (!strchr(s + 1, '.'))) { /* IP addr */
+ s = sstrdup(GetHost(u));
+ *strrchr(s, '.') = 0;
+
+ sprintf(end, "%s.*", s);
+ free(s);
+ } else {
+ if ((s = strchr(GetHost(u), '.')) && strchr(s + 1, '.')) {
+ s = sstrdup(strchr(GetHost(u), '.') - 1);
+ *s = '*';
+ strcpy(end, s);
+ free(s);
+ } else {
+ strcpy(end, GetHost(u));
+ }
+ }
+ return mask;
+}
+
+/*************************************************************************/
diff --git a/version.log b/version.log
new file mode 100644
index 000000000..d5c302b8b
--- /dev/null
+++ b/version.log
@@ -0,0 +1,1055 @@
+# (C) 2003 Anope
+# Contact us at info@anope.org
+#
+# Please read COPYING and README for furhter details.
+#
+# $Id: version.log,v 1.102 2004/03/26 03:53:57 dane Exp $
+
+VERSION_MAJOR="1"
+VERSION_MINOR="6"
+VERSION_PATCH="0"
+VERSION_BUILD="0"
+VERSION_EXTRA=""
+
+# $Log: version.log,v $
+# Revision 1.102 2004/03/26 03:53:57 dane
+# Anope-1.6.0 Release
+#
+# Revision 1.101 2004/03/25 21:03:04 dane
+# BUILD : 1.5.15.15
+# BUGS : none
+# NOTES : Typos on docs and new es.l (from DrStein)
+# VTAG : cvs checkout -D "2004-03-25 16:03" anope-dev
+#
+# Revision 1.100 2004/03/23 02:57:52 dane
+# BUILD : 1.5.15.14
+# BUGS : none
+# NOTES : Better tables.sql format
+# VTAG : cvs checkout -D "2004-03-22 21:57" anope-dev
+#
+# Revision 1.99 2004/03/23 02:53:28 dane
+# BUILD : 1.5.15.13
+# BUGS : none
+# NOTES : Added bin/dbgen to help MySQL db schema.
+# VTAG : cvs checkout -D "2004-03-22 21:53" anope-dev
+#
+# Revision 1.98 2004/03/22 18:52:47 dane
+# BUILD : 1.5.15.12
+# BUGS : 347
+# NOTES : Proposed fix for crash on channel memo
+# VTAG : cvs checkout -D "2004-03-22 13:52" anope-dev
+#
+# Revision 1.97 2004/03/21 21:20:32 dane
+# BUILD : 1.5.15.11
+# BUGS : none
+# NOTES : More documentation updates!
+# VTAG : cvs checkout -D "2004-03-21 16:20" anope-dev
+#
+# Revision 1.96 2004/03/21 16:46:06 rob
+# BUILD : 1.5.15.10
+# BUGS : N/A
+# NOTES : (g)make in modules dir will now use -Wall by default
+# VTAG : cvs checkout -D "2004-03-21 16:58" anope-dev
+#
+# Revision 1.95 2004/03/21 16:30:15 dane
+# BUILD : 1.5.15.9
+# BUGS : none
+# NOTES : Added docs/DEFCON documentation.
+# VTAG : cvs checkout -D "2004-03-21 11:30" anope-dev
+#
+# Revision 1.94 2004/03/21 15:30:31 dane
+# BUILD : 1.5.15.8
+# BUGS : none
+# NOTES : Added "Support" section to docs/MODULES
+# VTAG : cvs checkout -D "2004-03-21 10:30" anope-dev
+#
+# Revision 1.93 2004/03/21 15:13:25 dane
+# BUILD : 1.5.15.7
+# BUGS : none
+# NOTES : Added docs/MODULES
+# VTAG : cvs checkout -D "2004-03-21 10:13" anope-dev
+#
+# Revision 1.92 2004/03/21 14:08:53 rob
+# BUILD : 1.5.15.6
+# BUGS : N/A
+# NOTES : Made startup check for NSGuestNickPrefix as servcies will seg without it, it has always been marked as [REQUIERED] in the .conf, but.... :)
+# VTAG : cvs checkout -D "2004-03-21 14:21" anope-dev
+#
+# Revision 1.91 2004/03/21 13:41:55 rob
+# BUILD : 1.5.15.5
+# BUGS : 0000467
+# NOTES : Anope will only check the existance of defcon config settings, if any of the pre-set defcon levels actaully need them, e.g. if session limit is never used in a defcon level, then DefConSessionLimit does not need to be defined.
+# VTAG : cvs checkout -D "2004-03-21 13:54" anope-dev
+#
+# Revision 1.90 2004/03/21 13:05:05 ribosome
+# BUILD : 1.5.15.4
+# BUGS : 0000468
+# NOTES : Changed mkdir to mkdir -p in ./configure to create parent dirs
+# VTAG : cvs checkout -D "2004-03-21 13:00" anope-dev
+#
+# Revision 1.89 2004/03/17 20:08:49 ribosome
+# BUILD : 1.5.15.3
+# BUGS :
+# NOTES : Incorrect comment style (# rather than /* */) was resulting in compile warning
+# VTAG : cvs checkout -D "2004-03-17 20:04" anope-dev
+#
+# Revision 1.88 2004/03/17 12:18:15 dane
+# BUILD : 1.5.15.2
+# BUGS : none
+# NOTES : Fix attempt for chan drop.
+# VTAG : cvs checkout -D "2004-03-17 07:18" anope-dev
+#
+# Revision 1.87 2004/03/14 22:44:47 dane
+# BUILD : 1.5.15.1
+# BUGS : none
+# NOTES : 1.5.15 devel setup
+# VTAG : cvs checkout -D "2004-03-14 17:44" anope-dev
+#
+# Revision 1.86 2004/03/14 21:39:18 dane
+# 1.5.15 prep
+#
+# Revision 1.85 2004/03/14 17:36:58 rob
+# BUILD : 1.5.14.12
+# BUGS : 0000465
+# NOTES : Fixed _tiny_ typo-bug in fr.l
+# VTAG : cvs checkout -D "2004-03-14 17:48" anope-dev
+#
+# Revision 1.84 2004/03/14 17:24:52 keeper
+# BUILD : 1.5.14.10
+# BUGS : 0000462
+# NOTES : Fixed bug channelmode +r not being removed when nick is dropped.
+#
+# Revision 1.83 2004/03/14 14:15:34 certus
+# BUILD : 1.5.14.9
+# BUGS : 437
+# NOTES : Fixed bug with logchan and logbot
+# VTAG : cvs checkout -D "2004-03-14 09:15" anope-dev
+#
+# Revision 1.82 2004/03/14 13:02:53 rob
+# BUILD : 1.5.14.8
+# BUGS : 0000450
+# NOTES : Fixed cvs (null) values
+# VTAG : cvs checkout -D "2004-03-14 13:14" anope-dev
+#
+# Revision 1.81 2004/03/13 13:55:59 dane
+# BUILD : 1.5.14.7
+# BUGS : none
+# NOTES : Added missing channel fields to MySQL table schema. Also
+# forced a db save just after the initial db load to populate
+# databases.
+# VTAG : cvs checkout -D "2004-03-13 08:55" anope-dev
+#
+# Revision 1.80 2004/03/13 13:26:23 dane
+# BUILD : 1.5.14.6
+# BUGS : none
+# NOTES : Added a check for do_mysql on mysql_open() to return 0 if
+# MySQL is disabled on the config file.
+# VTAG : cvs checkout -D "2004-03-13 08:26" anope-dev
+#
+# Revision 1.79 2004/03/13 03:36:18 dane
+# BUILD : 1.5.14.5
+# BUGS : 434
+# NOTES : Changed most varchars to text.
+# VTAG : cvs checkout -D "2004-03-12 22:36" anope-dev
+#
+# Revision 1.78 2004/03/13 03:25:59 dane
+# BUILD : 1.5.14.4
+# BUGS : 0000440
+# NOTES : Typo fixed.
+# VTAG : cvs checkout -D "2004-03-12 22:25" anope-dev
+#
+# Revision 1.77 2004/03/11 17:37:31 rob
+# BUILD : 1.5.14.3
+# BUGS : N/A
+# NOTES : Fixed my goof with Changes file, and added CLIST to the spanish
+# language file ( curtusy of DrStein )
+#
+# VTAG : cvs checkout -D "2004-03-11 17:48" anope-dev
+#
+# Revision 1.76 2004/03/11 16:50:01 rob
+# BUILD : 1.5.14.2
+# BUGS : 0000431 | 0000432
+# NOTES : Fixed a couple of module bugs, and incoperated dengel's patch for the malformed +b crash - YAY @ cvs being back :P
+#
+# VTAG : cvs checkout -D "2004-03-11 17:01" anope-dev
+#
+# Revision 1.75 2004/02/19 19:35:30 dane
+# BUILD : 1.5.14.1
+# BUGS : none
+# NOTES : Framework for development
+# VTAG : cvs checkout -D "2004-02-19 14:35" anope-dev
+#
+# Revision 1.74 2004/02/19 18:51:04 dane
+# Release 1.5.14-rc3
+#
+# Revision 1.73 2004/02/19 16:46:29 ribosome
+# BUILD : 1.5.13.18
+# BUGS : 0000406
+# NOTES : Fixed nickserv list bug where unconfirmed nicknames appear in the wrong place
+# and changed [Hidden] to [Hostname Hidden] to make things a little clearer!
+# VTAG : cvs checkout -D "2004-02-19 16:45" anope-dev
+#
+# Revision 1.72 2004/02/18 19:00:33 rob
+# BUILD : 1.5.13.17
+# BUGS : 0000338
+# NOTES : user.c now has a UGLY hack to swap any %s in the real name to -s - this only effects anope when LOGUSERS is enabled in the .conf
+# VTAG : cvs checkout -D "2004-02-18 19:10" anope-dev
+#
+# Revision 1.71 2004/02/17 22:16:40 joris
+# BUILD : 1.5.13.16
+# BUGS :
+# NOTES : Completely disable the modules on OpenBSD until we fixed them.
+# VTAG : cvs checkout -D "2004-02-17 23:17" anope-dev
+#
+# Revision 1.70 2004/02/17 02:51:24 dane
+# BUILD : 1.5.13.15
+# BUGS : none
+# NOTES : Language context typo (thanx to alex323)
+# VTAG : cvs checkout -D "2004-02-16 21:51" anope-dev
+#
+# Revision 1.69 2004/02/15 22:40:46 dane
+# BUILD : 1.5.13.14
+# BUGS : 412
+# NOTES : Now is_host_setter() also validates aliases in a group.
+# VTAG : cvs checkout -D "2004-02-15 17:40" anope-dev
+#
+# Revision 1.68 2004/02/15 18:34:40 dane
+# BUILD : 1.5.13.13
+# BUGS : 404
+# NOTES : Added support for Viagra's "VS" command to make our vHost
+# system work with it.
+# VTAG : cvs checkout -D "2004-02-15 13:34" anope-dev
+#
+# Revision 1.67 2004/02/14 22:50:32 dane
+# BUILD : 1.5.13.12
+# BUGS : 407
+# NOTES : Completed some DefCon work.
+# VTAG : cvs checkout -D "2004-02-14 17:50" anope-dev
+#
+# Revision 1.66 2004/02/14 21:22:55 dane
+# BUILD : 1.5.13.11
+# BUGS : 441
+# NOTES : Changed all hardcoded "OperServ" to s_OperServ
+# VTAG : cvs checkout -D "2004-02-14 16:22" anope-dev
+#
+# Revision 1.65 2004/02/14 15:37:05 dane
+# BUILD : 1.5.13.10
+# BUGS : none
+# NOTES : Fixed compile error for CMODE_A (Thanx GeniusDex)
+# VTAG : cvs checkout -D "2004-02-14 10:37" anope-dev
+#
+# Revision 1.64 2004/02/14 00:24:18 ribosome
+# BUILD : 1.5.13.9
+# BUGS :
+# NOTES : Fixed errors in en_us.l NICK_HELP_DROP
+# VTAG : cvs checkout -D "2004-02-14 00:25" anope-dev
+#
+# Revision 1.63 2004/02/09 19:05:42 ribosome
+# BUILD : 1.5.13.8
+# BUGS : Fixed a couple of language file bugs
+# NOTES : Changed Services Admin -> Super Admin as required in language files
+# VTAG : cvs checkout -D "2004-02-09 19:07" anope-dev
+#
+# Revision 1.62 2004/02/07 20:48:00 certus
+# BUILD : 1.5.13.7
+# BUGS :
+# NOTES : replaced is_identified with is_founder to make it more effective (covers real founder and superadmin, not only pw identify)
+# VTAG : cvs checkout -D "2004-02-07 15:47" anope-dev
+#
+# Revision 1.61 2004/02/07 20:36:46 certus
+# BUILD : 1.5.13.6
+# BUGS :
+# NOTES : Fixed bug where you could /cs identify infinite times
+# VTAG : cvs checkout -D "2004-02-07 15:36" anope-dev
+#
+# Revision 1.60 2004/02/07 20:11:14 ribosome
+# BUILD : 1.5.13.5
+# BUGS : Fixed Bug 0000400
+# NOTES : Fixed registration via group on nicknames preconfirmation
+# VTAG : cvs checkout -D "2004-02-07 13:10" anope-dev
+#
+# Revision 1.59 2004/02/07 18:53:59 dane
+# BUILD : 1.5.13.4
+# BUGS : 403
+# NOTES : Only Admins are allowed to /OS MODE channels +A
+# VTAG : cvs checkout -D "2004-02-07 13:53" anope-dev
+#
+# Revision 1.58 2004/02/07 18:38:47 certus
+# BUILD : 1.5.13.3
+# BUGS : 0000030
+# NOTES : Channel '#' may no longer be registered due to several problems.
+# VTAG : cvs checkout -D "2004-02-07 13:38" anope-dev
+#
+# Revision 1.57 2004/02/02 21:09:52 certus
+# BUILD : 1.5.13.2
+# BUGS :
+# NOTES : Fixed bug where non-id'ed nicks could do /cs identify
+# VTAG : cvs checkout -D "2004-02-02 16:09" anope-dev
+#
+# Revision 1.56 2004/02/01 00:11:09 dane
+# BUILD : 1.5.13.1
+# BUGS : none
+# NOTES : Prep for 1.5.13.x
+# VTAG : cvs checkout -D "2004-01-31 19:11" anope-dev
+#
+# Revision 1.55 2004/01/31 20:17:00 dane
+# Anope 1.5.13 (Release Candidate 2 for Anope 1.6.0)
+#
+# Revision 1.54 2004/01/31 18:57:18 dane
+# BUILD : 1.5.12.7
+# BUGS : 398
+# NOTES : Improved on Certus fix for this bug. I used a less expensive
+# issp(c) inline function, and changed the name of the func.
+# Also, did some clean up around.
+#
+# VTAG : cvs checkout -D "2004-01-31 13:57" anope-dev
+#
+# Revision 1.53 2004/01/31 17:03:52 dane
+# BUILD : 1.5.12.6
+# BUGS : 396
+# NOTES : Forced a list reorder upon entry deletion for OS news system.
+# VTAG : cvs checkout -D "2004-01-31 12:03" anope-dev
+#
+# Revision 1.52 2004/01/31 12:08:24 certus
+# BUILD : 1.5.12.5
+# BUGS :
+# NOTES : Added notice_lang for chanserv's info so sadmins and users with access will now get something like "type /cs info #chan ALL" for more infos. I used NICK_INFO_FOR_MORE for that so we don't have to add a new string to all lang files with exactly (!!!) the same text: "For more verbose information, type /msg %s INFO %s ALL." I just used s_ChanServ and ci->name as params.
+# VTAG : cvs checkout -D "2004-01-31 07:08" anope-dev
+#
+# Revision 1.51 2004/01/30 16:10:27 certus
+# BUILD : 1.5.12.4
+# BUGS : fixed buffer bug
+# NOTES :
+# VTAG : cvs checkout -D "2004-01-30 11:10" anope-dev
+#
+# Revision 1.50 2004/01/19 19:02:44 ribosome
+# BUILD : 1.5.12.3
+# BUGS : #380 and #381
+# NOTES : Spelling Errors and Typos fixed.
+# VTAG : cvs checkout -D "2004-01-19 12:02" anope-dev
+#
+# Revision 1.49 2004/01/18 20:15:28 ribosome
+# BUILD : 1.5.12.2
+# BUGS : HostServ Set Bug for Non Registered Nicks
+# NOTES : For non registered nicks, would return syntax, now returns correct error
+# VTAG : cvs checkout -D "2004-01-18 13:15" anope-dev
+#
+# Revision 1.48 2004/01/18 05:10:47 dane
+# BUILD : 1.5.12.1
+# BUGS : none
+# NOTES : Framework for development.
+# VTAG : cvs checkout -D "2004-01-18 00:10" anope-dev
+#
+# Revision 1.47 2004/01/18 04:33:25 dane
+# Preparations for 1.5.12
+#
+# Revision 1.46 2004/01/18 00:13:40 ribosome
+# BUILD : 1.5.11.26
+# BUGS : Added SuperAdmin to FAQ
+# NOTES : Added SuperAdmin to FAQ, Read for more details.
+# VTAG : cvs checkout -D "2004-01-17 17:13" anope-dev
+#
+# Revision 1.45 2004/01/18 00:12:22 ribosome
+# BUILD : 1.5.11.25
+# BUGS : Added SuperAdmin to FAQ
+# NOTES : Read FAQ for details
+# VTAG : cvs checkout -D "2004-01-17 17:12" anope-dev
+#
+# Revision 1.44 2004/01/13 21:26:46 ribosome
+# BUILD : 1.5.11.24
+# BUGS : README file tweaking
+# NOTES : Updated Grammar errors, contact details, urls etc
+# VTAG : cvs checkout -D "2004-01-13 14:26" anope-dev
+#
+# Revision 1.43 2004/01/13 15:35:23 ribosome
+# BUILD : 1.5.11.23
+# BUGS : langtool.pl, was only checking en_us and was including bold & underline
+# NOTES : fixed above bug
+# VTAG : cvs checkout -D "2004-01-13 08:34" anope-dev
+#
+# Revision 1.42 2004/01/13 14:21:58 ribosome
+# BUILD : 1.5.11.22
+# BUGS : Added longline description in log
+# NOTES : It nows shows the first 30 characters of a long line in the log
+# VTAG : cvs checkout -D "2004-01-13 07:21" anope-dev
+#
+# Revision 1.41 2004/01/13 13:48:42 ribosome
+# BUILD : 1.5.11.21
+# BUGS : Added Line Length Check
+# NOTES : Added Line Length Check for Lines Longer than 60 characters
+# VTAG : cvs checkout -D "2004-01-13 06:48" anope-dev
+#
+# Revision 1.40 2004/01/12 20:44:54 joris
+# BUILD : 1.5.11.20
+# BUGS :
+# NOTES : 0 is NOT the terminating character of a string. \0 is.
+# Cleanup some sprintf() to snprintf() for safer usage.
+# VTAG : cvs checkout -D "2004-01-12 21:44" anope-dev
+#
+# Revision 1.39 2004/01/12 19:25:28 ribosome
+# BUILD : 1.5.11.19
+# NOTES : Added langtool.pl, all in one language tool.
+# VTAG : cvs checkout -D "2004-01-12 12:25" anope-dev
+#
+# Revision 1.38 2004/01/12 18:40:36 ribosome
+# BUILD : 1.5.11.18
+# BUGS : General spelling/grammar tweaking
+# NOTES : Updated example.conf/chk
+# VTAG : cvs checkout -D "2004-01-12 11:40" anope-dev
+#
+# Revision 1.37 2004/01/11 22:05:27 dane
+# BUILD : 1.5.11.17
+# BUGS : none
+# NOTES : Fixed duplicate entries on /OS STAFF
+# VTAG : cvs checkout -D "2004-01-11 17:05" anope-dev
+#
+# Revision 1.36 2004/01/11 21:37:31 dane
+# BUILD : 1.5.11.16
+# BUGS : none
+# NOTES : Fixed previous MySQL booboo
+# VTAG : cvs checkout -D "2004-01-11 16:37" anope-dev
+#
+# Revision 1.35 2004/01/11 21:03:00 dane
+# BUILD : 1.5.11.15
+# BUGS : 0000368
+# NOTES : Better MySQL init patch by GeniusDex
+# VTAG : cvs checkout -D "2004-01-11 16:03" anope-dev
+#
+# Revision 1.34 2004/01/11 20:38:55 dane
+# BUILD : 1.5.11.14
+# BUGS : 0000346
+# NOTES : Changed notice to notice_lang. Also, did some work on the
+# /OS STAFF command. It looks better, and behaves properly
+# now.
+# VTAG : cvs checkout -D "2004-01-11 15:38" anope-dev
+#
+# Revision 1.33 2004/01/11 20:32:39 ribosome
+# BUILD : 1.5.11.13
+# BUGS : Bug 0000351
+# NOTES : Removed incorrect db conversion information from the INSTALL file
+# VTAG : cvs checkout -D "2004-01-11 13:32" anope-dev
+#
+# Revision 1.32 2004/01/11 20:16:45 ribosome
+# BUILD : 1.5.11.12
+# BUGS : Bug 0000374
+# NOTES : Added void moduleSetHelpHelp(void (*func) (User * u)); to modules.h
+# VTAG : cvs checkout -D "2004-01-11 13:16" anope-dev
+#
+# Revision 1.31 2004/01/11 15:14:43 ribosome
+# BUILD : 1.5.11.11
+# BUGS : Fixed bug 000348
+# NOTES : HostServAlias was left out last time
+# VTAG : cvs checkout -D "2004-01-11 08:14" anope-dev
+#
+# Revision 1.30 2004/01/08 03:39:23 dane
+# BUILD : 1.5.11.10
+# BUGS : 0000333
+# NOTES : Fixed broken /OS CHANKILL expiration.
+# VTAG : cvs checkout -D "2004-01-07 22:39" anope-dev
+#
+# Revision 1.29 2004/01/07 20:24:19 certus
+# BUILD : 1.5.11.9
+# BUGS :
+# NOTES : fixed a few small issues in de.l and en_us.l (botserv set syntax error displayed chan instead of botname)
+# VTAG : cvs checkout -D "2004-01-07 15:24" anope-dev
+#
+# Revision 1.28 2004/01/07 14:54:14 certus
+# BUILD : 1.5.11.8
+# BUGS : 0000370
+# NOTES : bugfix in modules.c
+# VTAG : cvs checkout -D "2004-01-07 09:54" anope-dev
+#
+# Revision 1.27 2004/01/04 18:36:40 joris
+# BUILD : 1.5.11.7
+# BUGS : none
+# NOTES : - Correct dates in Changes (we are 2004),
+# - in misc.c function strscpy() change *d = 0; to *d = '\0'; since '\0' is the end of string delim
+# VTAG : cvs checkout -D "2004-01-04 19:39" anope-dev
+#
+# Revision 1.26 2004/01/04 18:17:00 joris
+# BUILD : 1.5.11.6
+# BUGS : none
+# NOTES : more updates to the nl.l file from GeniusDex
+# VTAG : cvs checkout -D "2004-01-04 19:19" anope-dev
+#
+# Revision 1.25 2004/01/04 15:54:27 joris
+# BUILD : 1.5.11.5
+# BUGS : none
+# NOTES : more updates to the nl.l from GeniusDex, tnx!
+# VTAG : cvs checkout -D "2004-01-04 16:57" anope-dev
+#
+# Revision 1.24 2004/01/02 23:59:21 certus
+# BUILD : 1.5.11.4
+# BUGS : 0000356
+# NOTES : Added a if (text == NULL) check to do_staff
+# VTAG : cvs checkout -D "2004-01-02 18:59" anope-dev
+#
+# Revision 1.23 2004/01/02 23:11:56 certus
+# BUILD : 1.5.11.3
+# BUGS : 0000348
+# NOTES : also changed strcasecmp to stricmp
+# VTAG : cvs checkout -D "2004-01-02 18:11" anope-dev
+#
+# Revision 1.22 2003/12/29 19:14:36 dane
+# BUILD : 1.5.11.2
+# BUGS : none
+# NOTES : Added check on ./compile.sh for unconfigured source.
+# VTAG : cvs checkout -D "2003-12-29 14:14" anope-dev
+#
+# Revision 1.21 2003/12/14 17:44:47 dane
+# BUILD : 1.5.11.1
+# BUGS : none
+# NOTES : Framework for CVS development.
+# VTAG : cvs checkout -D "2003-12-14 12:44" anope-dev
+#
+# Revision 1.20 2003/12/14 16:54:41 dane
+# Anope 1.5.11 Release
+#
+# Revision 1.19 2003/12/12 16:04:57 dane
+# BUILD : 1.5.10.14
+# BUGS : none
+# NOTES : Added ru.l Russian language file.
+# Fixed all languages for proper printf parameters
+# Changed language header comments to standard Anope
+# VTAG : cvs checkout -D "2003-12-12 11:04" anope-dev
+#
+# Revision 1.18 2003/12/10 21:57:49 rob
+# BUILD : 1.5.10.13
+# BUGS : doh's IRC problem
+# NOTES : Chanserv's list decalres a couple of veriables mid-code, it always did, but it seems to care now for dohs compiler... moved to top of function
+#
+# VTAG : cvs checkout -D "2003-12-10 21:58" anope-dev
+#
+# Revision 1.17 2003/12/09 19:15:25 certus
+# BUILD : 1.5.10.12
+# BUGS :
+# NOTES : changed svsnick to kill on hybrid
+# VTAG : cvs checkout -D "2003-12-09 14:15" anope-dev
+#
+# Revision 1.16 2003/12/08 21:33:59 rob
+# BUILD : 1.5.10.11
+# BUGS : 0000340
+# NOTES : HOST_HELP for all languages has been updated for the correct position of LIST
+# VTAG : cvs checkout -D "2003-12-08 21:31" anope-dev
+#
+# Revision 1.15 2003/12/08 20:14:51 rob
+# BUILD : 1.5.10.10
+# BUGS : NS / CS LIST
+# NOTES : List's for NS and CS can now take #X-Y when displaying values
+# VTAG : cvs checkout -D "2003-12-08 20:14" anope-dev
+#
+# Revision 1.14 2003/12/07 18:34:29 rob
+# BUILD : 1.5.10.9
+# BUGS : N/A
+# NOTES : Added debug functions to display the message queue for modules, this means we can see how messages will be executed same as we can for commands - this also means that im happy module message's wont go tits up now :)
+# VTAG : cvs checkout -D "2003-12-07 18:34" anope-dev
+#
+# Revision 1.13 2003/12/07 15:26:34 certus
+# BUILD : 1.5.10.8
+# BUGS :
+# NOTES : Fixed various failures in de.l
+# VTAG : cvs checkout -D "2003-12-07 10:26" anope-dev
+#
+# Revision 1.12 2003/12/07 14:30:49 certus
+# BUILD : 1.5.10.7
+# BUGS :
+# NOTES : Updated de.l (by Stuff)
+# VTAG : cvs checkout -D "2003-12-07 09:30" anope-dev
+#
+# Revision 1.11 2003/12/04 02:42:59 dane
+# BUILD : 1.5.10.6
+# BUGS : none
+# NOTES : Fixed parameter issues on it.l
+# VTAG : cvs checkout -D "2003-12-03 21:42" anope-dev
+#
+# Revision 1.10 2003/12/04 02:23:02 dane
+# BUILD : 1.5.10.5
+# BUGS : none
+# NOTES : Fixed parameter issues on pt.l and a minor typo on us_en.l
+# VTAG : cvs checkout -D "2003-12-03 21:23" anope-dev
+#
+# Revision 1.9 2003/12/03 12:24:26 joris
+# BUILD : 1.5.10.4
+# BUGS : none
+# NOTES : more translating I missed
+# VTAG : cvs checkout -D "2003-12-03 13:25" anope-dev
+#
+# Revision 1.8 2003/12/02 23:02:27 joris
+# BUILD : 1.5.10.3
+# BUGS : none
+# NOTES : updates to the nl.l file, spelling and such. Also ran
+# obs.pl on it, and fixed some format errors.
+# VTAG : cvs checkout -D "2003-12-03 00:03" anope-dev
+#
+# Revision 1.7 2003/12/02 16:41:01 dane
+# BUILD : 1.5.10.2
+# BUGS : none
+# NOTES : Added printf format checking on obs.pl for language files.
+# Note that this has uncovered several Language errors that
+# need fixing. I've fixed a couple of lang files, but I rather
+# wait until we have the updated translations to finish them
+# off. You can check all languages with bin/checklang
+#
+# VTAG : cvs checkout -D "2003-12-02 11:41" anope-dev
+#
+# Revision 1.6 2003/11/25 15:54:57 dane
+# BUILD : 1.5.10.1
+# BUGS : none
+# NOTES : Framework update for CVS development
+# VTAG : cvs checkout -D "2003-11-25 10:54" anope-dev
+#
+# Revision 1.5 2003/11/25 14:56:56 dane
+# Release 1.5.10
+#
+# Revision 1.4 2003/11/24 20:51:36 dane
+# BUILD : 1.5.10.23
+# BUGS : none
+# NOTES : Added indent cleanup to putanope
+# VTAG : cvs checkout -D "2003-11-24 15:51" anope-dev
+#
+# Revision 1.3 2003/11/24 20:49:50 dane
+# BUILD : 1.5.10.22
+# BUGS : none
+# NOTES : Moved all document files to folder "docs". Note that due to
+# CVS limitations, all hostory has been lost.
+# VTAG : cvs checkout -D "2003-11-24 15:49" anope-dev
+#
+# Revision 1.2 2003/11/24 20:29:58 dane
+# BUILD : 1.5.10.21
+# BUGS : none
+# NOTES : Created docs directory
+# VTAG : cvs checkout -D "2003-11-24 15:29" anope-dev
+#
+# Revision 1.1 2003/11/24 20:23:28 dane
+# BUILD : 1.5.10.20
+# BUGS : none
+# NOTES : Changed version schema to major.minor.patch.build. Also
+# worked on the putanope script to handle the change. And
+# version.sh creates #defines for all version tokens.
+# VTAG : cvs checkout -D "2003-11-24 15:23" anope-dev
+#
+# Revision 1.172 2003/11/17 21:34:33 dane
+# Fixed mlock +c on ultimate3 (0000320)
+#
+# Revision 1.171 2003/11/16 21:09:35 dane
+# make clean now cleans version.h as it should
+#
+# Revision 1.170 2003/11/16 19:11:06 dane
+# Fixing merge errors.
+#
+# Revision 1.169 2003/11/16 19:09:25 dane
+# New fix for BotServ +ao on PTLink (0000313)
+#
+# Revision 1.168 2003/11/16 18:43:48 rob
+# Added akill list footer even when viewing the whole list and not just a particualr search
+#
+# Revision 1.167 2003/11/16 18:33:22 certus
+# Fixed bug in de.l
+#
+# Revision 1.166 2003/11/16 18:03:43 dane
+# * All channel modes now supported on PTLink (0000311)
+#
+# * Absolute mode cleaning for /CS CLEAR #chan MODES. It uses the
+# MODESTOREMOVE define instead or removing the modes programaticaly.
+# It seems to be faster and more efficient on resources.
+#
+# * Formatted some perl scripts.
+#
+# Revision 1.165 2003/11/16 17:52:30 certus
+# lol, this is my lucky day :P I forgot a '}'
+#
+# Revision 1.164 2003/11/16 17:32:31 certus
+# fixed a bug with mysqlretries and mysqlretrygap on config reload
+#
+# Revision 1.163 2003/11/16 16:40:30 certus
+# PTLink BotServ fix (+o) in init.c
+#
+# Revision 1.162 2003/11/16 16:15:57 certus
+# Services will now kill users when introducing pseudo clients on hybrid
+#
+# Revision 1.161 2003/11/16 11:41:32 certus
+# Added config warning for too many format-strings
+#
+# Revision 1.160 2003/11/15 19:43:45 rob
+# fixed a bug with module message's - i didnt NULL the value of tail :/
+#
+# Revision 1.159 2003/11/15 16:42:44 certus
+# Added MysqlRetries and MysqlRetryGap to conf
+#
+# Revision 1.158 2003/11/15 14:39:29 rob
+# 2003/11/15 Added a generic footer to list's without (bug 0000222)
+# 2003/11/15 Adding a ./configure script to modules folder (removes compile.sh compatability issues)
+# 2003/11/15 Removed Exterimental status from module support and Viagra support
+#
+# Revision 1.157 2003/11/15 02:39:21 certus
+# Fixed bug in /ms staff: opers in several lists won't get the memo twice from now on
+#
+# Revision 1.156 2003/11/12 16:16:10 certus
+# BotServ bots will now get umode +o on PTLINK to set modes correctly
+#
+# Revision 1.155 2003/11/09 17:07:37 rob
+# compile.sh now works on bsd etc :)
+#
+# Revision 1.154 2003/11/09 16:35:21 rob
+# Fixed a bug in moduleDelCallback reproted by SGR
+#
+# Revision 1.153 2003/11/08 03:42:40 dane
+# Framework towards 1.5.10
+#
+# Revision 1.152 2003/11/08 01:20:15 dane
+# Release 1.5.9
+#
+# Revision 1.151 2003/11/07 03:31:23 dane
+# Added optional MysqlSecure password security directive. Please read
+# the SECURITY section on the MYSQL file for more details.
+#
+# Revision 1.150 2003/11/03 23:18:47 certus
+# lol, forgot to set #ifdef IRC_HYBRID :P
+#
+# Revision 1.149 2003/11/03 23:12:29 certus
+# Global pseudo client will now join logchan (hybrid) to override chmode +n
+#
+# Revision 1.148 2003/11/03 22:34:41 certus
+# Fixed bug in main.c (displaying db names when crashing) - I hope it works, really, I do :p
+#
+# Revision 1.147 2003/11/03 16:22:10 dane
+# Fixed case insensitive password fields on MySQL (0000196)
+# Users must reload tables.sql for this change to take effect.
+#
+# Revision 1.146 2003/11/03 15:50:42 dane
+# Fixed /OS STAFF bug not showing online aliases (0000124)
+#
+# Revision 1.145 2003/11/03 14:47:06 dane
+# Different CHAN_HELP_ULTIMATE and CHAN_HELP_ULTIMATE3 (0000189)
+#
+# Revision 1.144 2003/11/03 02:41:06 dane
+# Fixed empty fields on cs_access MYSQL table (0000197)
+#
+# Revision 1.143 2003/11/02 14:43:12 dane
+# Allow SA's to /NS LOGOUT themselves (0000288)
+# Please the bugnote on Mantis for a caveat.
+#
+# Revision 1.142 2003/11/02 13:57:01 dane
+# Fixed SQLINE help syntax (0000291)
+#
+# Revision 1.141 2003/11/02 12:55:05 rob
+# Another fix to moduleDelCallback - reported by SGR (again) :)
+#
+# Revision 1.140 2003/11/02 12:29:55 rob
+# Fixed a bug with moduleDelCallback reported by SGR (what a shock) :)
+#
+# Revision 1.139 2003/11/01 22:59:48 rob
+# Convereted hs_moo.c and ircd_catserv to use int AnopeInit
+#
+# Added void moduleDelCallback(char *name); - remove a callback for your module by name
+#
+# Revision 1.138 2003/11/01 12:38:20 rob
+# Converted AnopeInit to int AnopeInit(int argc, char **argv); - returning MOD_CONT will load the module, returning MOD_STOP will auto-unload the module - i've updated all the modules on the modules site which are marked as active.
+#
+# Revision 1.137 2003/11/01 11:14:30 rob
+# Applied a patch by GeniusDex - HelpServ has been converted to a "real" service, it now has a command hash and can load/unload modules etc...
+#
+# Revision 1.136 2003/11/01 00:11:45 rob
+# Fixed a segfualt with /msg memoserv help - the lang file had a %s it shouldnt have had in it :)
+#
+# Revision 1.135 2003/10/30 17:08:22 rob
+# Just can putanope to do version's etc, coz i forgot :/
+#
+# Revision 1.134 2003/10/29 17:45:26 rob
+# Fixed -h bug for valid halfop's when the room is empty (# 0000245 )
+#
+# Revision 1.133 2003/10/29 17:27:04 rob
+# Dont log non-existant user when channel is forbidden
+#
+# Revision 1.132 2003/10/24 17:27:56 dane
+# Framework towards 1.5.9
+#
+# Revision 1.131 2003/10/24 00:40:26 dane
+# Release 1.5.8
+#
+# Revision 1.130 2003/10/22 13:58:44 certus
+# CHAN_INFO_TIME_REGGED fix in pt.l
+#
+# Revision 1.129 2003/10/20 20:54:23 certus
+# fixed 0000280 - pt.l tab issue
+#
+# Revision 1.128 2003/10/19 21:42:23 rob
+# Added a very basic thread-safe tokenizer to misc.c - well added the most useful function which was missing from the existing ones.. .:)
+#
+# Revision 1.127 2003/10/17 20:00:39 dane
+# Normalized all language files.
+#
+# Revision 1.126 2003/10/17 19:59:56 dane
+# Fixed putanope script. Fixed double TAB on all languages (0000283)
+#
+# Revision 1.125 2003/10/08 16:23:32 rob
+# Fixed compile errors on PTLink and Ultimate3 (worth another release?)
+# Applied a patch ShadowMaster posted on the forums to support NickIP AKILL match's :)
+# Changed the -r tag to -rc for release candidate, as it appears were now using release candidates instead of revisions :)
+#
+# Revision 1.124 2003/10/07 02:25:50 dane
+# Setup for further cvs commits.
+#
+# Revision 1.123 2003/10/07 01:25:42 dane
+# Release 1.5.7 prep
+#
+# Revision 1.122 2003/10/06 11:48:32 keeper
+# Fixed botserv creation bug when using services-aliases (strcasecmp instead of !strcasecmp)
+#
+# Revision 1.121 2003/10/05 21:34:17 rob
+# Made the change to modules.c that i intended - guess my email wasnt very clear, i didnt have alot of time to write it and only had web cvs to look at the code on :)
+#
+# anyway - i've fix the obvious issue i could see which would make anope just seg after a command which was loaded, was unloaded and then called - i HAVE NOT tested this with keepers change's altho i cant see anything that i think will break.
+#
+# and im going to bed now :)
+#
+# Revision 1.120 2003/10/05 18:57:10 dane
+# Modunload fix asked by Rob.
+#
+# Revision 1.119 2003/10/05 18:41:39 dane
+# Updated es.l file
+#
+# Revision 1.118 2003/10/05 18:26:42 dane
+# Fixed the bug that would not make services use the vident internaly,
+# hence bans and shuch where against the real hostname. A new macro was
+# created, named GetIdent(u), use instead of u->username.
+#
+# Revision 1.117 2003/10/05 15:50:42 dane
+# Fixed bug 0000270 for memo order reset upon deletion.
+# Normalized language files again.
+#
+# Revision 1.116 2003/10/05 14:32:08 certus
+# Added /ns update to replace further identifies, /ns identify will now only work once
+#
+# Revision 1.115 2003/10/05 13:26:01 dane
+# Language file normalization. Minor change to putanope script.
+#
+# Revision 1.114 2003/10/05 13:20:27 dane
+# Cosmetic changes
+#
+# Revision 1.113 2003/10/03 13:47:52 keeper
+# Added check_unload function to modules so that they can unload themselves
+# after AnopeInit. Useful for on-error-unloading, see hs_moo for example.
+#
+# Revision 1.112 2003/10/03 13:29:08 keeper
+# Added MysqlPort directive.
+#
+# Revision 1.111 2003/09/27 15:34:06 rob
+# Corrected a moduleCallBack bug - if a module callback was added while acting on a message, and not a command, the module owner was not set, as such, if a module was unloaded while a callback was in the queue, it would not be deleted from the queue, so when it was time to execute it, it tried to execute a pointer to a function which no longer existed :)
+#
+# Revision 1.110 2003/09/25 19:29:03 rob
+# Some minor tidying up, ensured hs_moo.c and ircd_catserv.c compile witout warnings when using -W and -Wall
+#
+# Revision 1.109 2003/09/24 18:32:04 rob
+# Fixed a nasty bug with mod_tail unloading - and added a nifty if(debug) feature for dealing with modules - go on try it, (un)load a module in debug mode and read those logs, you know you want to.... :)
+#
+# Revision 1.108 2003/09/22 21:46:08 rob
+# Fixed a bug with putanope script, it was cvs-tagging my whole ./Anope/* dir instead of just ./Anope/anope-dev - so i might have attached some incorrect tags to anope-rel - it wont effect anyone tho so its ok... :/
+#
+# Revision 1.107 2003/09/22 21:40:25 rob
+# Added module help system, and updated hs_moo to show it in use! :)
+#
+# Revision 1.106 2003/09/22 17:05:19 rob
+# putanope will now (optional) tag all commits - pressing enter when asked will use the current version number as the tag, entering "NONE" will not tag the commit
+#
+# Revision 1.105 2003/09/21 21:34:46 rob
+# forgot to do version / indent, so i'll just run putanope with no changes :)
+#
+# Revision 1.104 2003/09/21 18:28:04 rob
+# Fixed a bug involving a module attaching to both MOD_HEAD and MOD_TAIL of the same command - added a new module command, " char *moduleGetLastBuffer(void); " this will allow module coders to request a pointer to a copy of the command that was sent to services, as the strtok() buffer will be modifed by strtok() :/
+#
+# Revision 1.103 2003/09/13 20:27:30 certus
+# I have noe idea why this shit isn't working how it should, but I'm gonna roll back to the last file version, so mlock +M won't work until I have found the problem. It's not a smart solution, but better than segfaults and DB crashs.
+#
+# Revision 1.102 2003/09/13 18:57:17 rob
+# Corrected a duplicate entry in fr.l :/
+#
+# Revision 1.101 2003/09/13 18:42:49 certus
+# okay guys, this is my last attempt to fix +M mlock, if it doesn't work, I'm gonna spend a beer :P
+#
+# Revision 1.100 2003/09/13 17:53:56 rob
+# Corrected an error in all lang files (cept en_us.l) which caused the oper help to be displayed twice, once in english, once in given language.
+#
+# Revision 1.99 2003/09/13 17:17:08 certus
+# ups, +R was already added :P
+#
+# Revision 1.98 2003/09/13 17:03:36 certus
+# Added mlockmodes +R and +M for unreal and removed +H
+#
+# Revision 1.97 2003/09/07 20:52:55 certus
+# Fixed a small bug where some parts of the hostserv help were not displayed to hostsetters
+#
+# Revision 1.96 2003/09/07 17:39:50 dane
+# Fixed proxy compile warning
+#
+# Revision 1.95 2003/09/07 17:10:31 dane
+# Fixed bug 121 where clearmodes does not work.
+#
+# Revision 1.94 2003/09/07 17:02:59 dane
+# Propagation of bug fixes for 194 and 217.
+#
+# Revision 1.93 2003/09/04 20:42:58 rob
+# ./configure will now check for the existance of RTLD_LOCAL and only try to enforce it if its present - this should let module support compile on openBSD
+#
+# Revision 1.92 2003/09/04 18:55:34 rob
+# Mirror'ed changes in anope-rel ref: http://www.anope.org/bug/bug_view_advanced_page.php?bug_id=0000170
+#
+# Revision 1.91 2003/09/02 11:32:02 dane
+# putanope test.
+#
+# Revision 1.90 2003/08/31 01:02:00 rob
+# Corrected an issue with moduleCallback's and paramaters - eugh 4 hrs and i was only missing a "=" sign... :)
+#
+# Revision 1.89 2003/08/30 20:48:14 rob
+# akilled client's joining the network now get a user_struct made, and then deleted when the quit is sent. This is to allow for ircd's which have excmpt lines in the .conf, so instead of services just assuiming the gline will be honored, we build a user stuct and dont delete it until we know we can do so.
+#
+# Revision 1.88 2003/08/20 01:36:34 keeper
+# Fixed a little bug in german language file ("registriert and geschützt"
+# instead of "registriert und geschützt")
+#
+# Revision 1.87 2003/08/16 22:13:47 rob
+# Added moduleAddCallback command for module coders.
+#
+# Revision 1.86 2003/08/16 10:46:42 rob
+# Forgot version number :)
+#
+# Revision 1.85 2003/08/15 17:51:52 rob
+# Added module timmer call-back's - see hs_moo.c for a basic example.
+#
+# Revision 1.84 2003/08/04 01:09:43 dane
+# Another stab at the socket nick registration. Still not working properly.
+# Fixed Channel DROP then FORBID crash on MySQL (0000199)
+#
+# Revision 1.83 2003/07/28 20:45:03 dane
+# Expanded the extsocket feature a little. As a prototype it can take:
+# "register nick pass email" to register a nick with full error checking.
+# The reply is preceeded by the string numeric, and for now just sent
+# to the logchan, not back to the socket.
+#
+# Revision 1.82 2003/07/28 14:51:42 dane
+# Fixed HostServ launch on Viagra and PTlink (0000190)
+#
+# Revision 1.81 2003/07/28 00:54:54 dane
+# BotServ bots are now +S on ULTIMATE3 (0000159)
+#
+# Revision 1.80 2003/07/28 00:08:17 dane
+# Fixed NICK_IS_REGISTER dupe on Hybrid (0000184)
+#
+# Revision 1.79 2003/07/27 21:51:08 dane
+# Fixed previous compile error. Note that I added a new field on the user_
+# structure char * vident. I'm not sure where to use it yet...
+#
+# Revision 1.78 2003/07/27 20:45:18 dane
+# Fixed bug 0000187 and added vindent to the user structure.
+#
+# Revision 1.77 2003/07/27 17:08:59 dane
+# Fixed Bug 0000188 for PTlink /newmask support. Also, shuffled some nifty
+# functions from hostserv.c to misc.c so they can be used throughout.
+#
+# Revision 1.76 2003/07/25 19:47:46 atoledo
+# Added (VERY EXPERIMENTAL) external socket support.
+# To compile, enable using configure. To enable, there are 3 configuration entries that need to be set. See Changes.conf for an explanation.
+#
+# Revision 1.75 2003/07/25 08:57:31 rob
+# Moved veriable declares to the top of functions for some #ifdef'ed ircds - hopefully it'll sort out bug ref: http://www.anope.org/bug/bug_view_advanced_page.php?bug_id=0000183
+#
+# Revision 1.74 2003/07/24 02:13:36 dane
+# Fixed the INSERT duplicate key mysql error that flooded the log files.
+#
+# Revision 1.73 2003/07/22 20:10:17 dane
+# Fixed SENDALL from STAFF to SENDALL (0000179)
+#
+# Revision 1.72 2003/07/22 18:40:39 dane
+# Fixed minor badwords things.
+#
+# Revision 1.71 2003/07/22 16:59:59 atoledo
+# Added badwords to MySQL save. Note that a new anope_cs_badwords table is required.
+#
+# Revision 1.70 2003/07/22 04:24:09 dane
+# ChannelServ time. Made ci_id keep it's value across updates.
+# It also required a rtq on /CS DROP. Some performance changes,
+# and optimization of the table schema for anope_cs_info.
+#
+# Revision 1.69 2003/07/22 03:15:08 dane
+# Made nick aliases also preserve their id upon /OS RELOAD. This goes
+# with adding real time queries to /NS GROUP
+#
+# Revision 1.68 2003/07/21 20:49:30 dane
+# Well... another step to preserve the MySQL id. Now MySQL get's updated in
+# real time (part of phase 3) on /NS SET DISPLAY and /NS DROP. Note that on
+# the drop, it goes down to the Channel level to make appropiate changes.
+#
+# Revision 1.67 2003/07/21 15:05:04 dane
+# Better implementation of ns_id preservation. Also, some optimization
+# on the MySQL tables.sql schema (NickServ only, for now).
+#
+# Revision 1.66 2003/07/21 01:23:40 dane
+# Fixed /NS SET DISPLAY MySQL query.
+#
+# Revision 1.65 2003/07/21 00:57:46 dane
+# Made MySQL ns_id more meaningful by preserving its value across
+# updates. This is at a cost of one extra query per new record only.
+#
+# Revision 1.64 2003/07/20 23:55:24 dane
+# Fixed my previous PTlink sbuf fix :)
+#
+# Revision 1.63 2003/07/20 23:38:54 dane
+# Fixed PTlink sbuf compile error
+#
+# Revision 1.62 2003/07/20 14:23:04 dane
+# Added MySQL Optimizations
+#
+# Revision 1.61 2003/07/20 13:51:42 rob
+# Forgot version, now set to 1.5.6-r11
+#
+# Revision 1.60 2003/07/20 01:53:15 dane
+# Setup for development towards 1.5.7
+#
+# Revision 1.59 2003/07/20 01:45:48 dane
+# Release 1.5.6
+#
+# Revision 1.58 2003/07/20 01:45:10 dane
+# Fixed Changes files
+#
+# Revision 1.57 2003/07/20 01:39:05 dane
+# Fixed DEFCON_GLOBAL on all .l that where missing the %d
+#
+# Revision 1.56 2003/07/20 01:15:50 dane
+# Code cleanup, documentation update, things moved around. I also got
+# rid of the TODO files. I'll transfer all those to Mantis.
+#
+# Revision 1.55 2003/07/19 21:24:34 dane
+# Fixed +oa +qa to work on ModeOnId as well as net-joins.
+#
+# Revision 1.54 2003/07/18 00:47:50 keeper
+# Commited again after adding if's for checking if channel is forbidden.
+# (Unable to free if chan was forbidden, fixed now)
+#
+# Revision 1.53 2003/07/17 20:47:26 keeper
+# Fixed mysql.c for older gcc versions (2.95.4 tested).
+#
+# Revision 1.52 2003/07/17 16:08:43 keeper
+# Fixed mysql.c memory leak (db_mysql_quote results were'nt free'ed).
+# (That indent that putanope calls makes the "modified files" list look bigger :o)
+#
+# Revision 1.51 2003/07/16 18:51:56 dane
+# Fixed modules/Makefile.inc ... I'm considering removing this file from
+# CVS and make it local to the compilation, as to avoind unwanted modifications
+# to it.
+#
+# Revision 1.50 2003/07/16 18:49:10 dane
+# Implemented a less intrusive +oa and +qa. Also did a lot of cleanup, updated
+# all .c and .h headers, removed all stale debug blocks (THALES), and fixed
+# a few things here and there. Also, added a new script bin/makepatch
+#
+# Revision 1.49 2003/07/16 04:42:03 dane
+# Removed compression on new utilities.
+#
+# Revision 1.48 2003/07/16 04:33:57 dane
+# Added bin directory with misc tools.
+#
+# Revision 1.47 2003/07/16 03:26:20 dane
+# Added "getmods" target to modules/compile.sh.
+# Test of CVS Log substitution.
+#
+# EOF
diff --git a/version.sh b/version.sh
new file mode 100644
index 000000000..3b6e2d118
--- /dev/null
+++ b/version.sh
@@ -0,0 +1,146 @@
+#!/bin/sh
+#
+# Build version string and increment Services build number.
+#
+
+# Grab the actual version from the control file
+CTRL="version.log"
+if [ -f $CTRL ] ; then
+ . $CTRL
+else
+ echo "Error: Unable to find control file: $CTRL"
+ exit 0
+fi
+
+if [ $VERSION_BUILD -gt 0 ]; then
+ VERSION="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}${VERSION_EXTRA}"
+else
+ VERSION="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_EXTRA}"
+fi
+
+if [ -f version.h ] ; then
+ BUILD=`fgrep '#define BUILD' version.h | sed 's/^#define BUILD.*"\([0-9]*\)".*$/\1/'`
+ BUILD=`expr $BUILD + 1 2>/dev/null`
+else
+ BUILD=1
+fi
+if [ ! "$BUILD" ] ; then
+ BUILD=1
+fi
+cat >version.h <<EOF
+/* Version information for Services.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and CREDITS for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * This file is auto-generated by version.sh
+ *
+ */
+
+#define VERSION_MAJOR "$VERSION_MAJOR"
+#define VERSION_MINOR "$VERSION_MINOR"
+#define VERSION_PATCH "$VERSION_PATCH"
+#define VERSION_BUILD "$VERSION_BUILD"
+#define VERSION_EXTRA "$VERSION_EXTRA"
+
+#define BUILD "$BUILD"
+
+const char version_number[] = "$VERSION";
+const char version_build[] =
+ "build #" BUILD ", compiled " __DATE__ " " __TIME__;
+
+const char version_protocol[] =
+#if defined(IRC_ULTIMATE3)
+ "UltimateIRCd 3.0.0.a26+"
+#define VER_IRCD "UltimateIRCd 3.0.* -"
+#elif defined(IRC_VIAGRA)
+ "ViagraIRCd 1.3.x"
+# define VER_IRCD "ViagraIRCd 1.3.* -"
+#elif defined(IRC_BAHAMUT)
+ "Bahamut 1.4.27+"
+# define VER_IRCD "BahamutIRCd 1.4.* -"
+#elif defined(IRC_ULTIMATE)
+ "UltimateIRCd 2.8.2+"
+# define VER_IRCD "UltimateIRCd 2.8.* -"
+#elif defined(IRC_UNREAL)
+ "UnrealIRCd 3.1.1+"
+# define VER_IRCD "UnrealIRCd -"
+#elif defined(IRC_DREAMFORGE)
+ "DreamForge 4.6.7"
+# define VER_IRCD "DreamForgeIRCd 4.6.7 -"
+#elif defined(IRC_HYBRID)
+ "Hybrid IRCd 7.0"
+# define VER_IRCD "HybridIRCd 7.* -"
+#elif defined(IRC_PTLINK)
+ "PTlink 6.14.5+"
+# define VER_IRCD "PTlinkIRCd 6.14.* -"
+#else
+ "unknown"
+# define VER_IRCD
+#endif
+ ;
+
+#ifdef DEBUG_COMMANDS
+# define VER_DEBUG "D"
+#else
+# define VER_DEBUG
+#endif
+
+#if defined(USE_ENCRYPTION)
+# if defined(ENCRYPT_MD5)
+# define VER_ENCRYPTION "E"
+# else
+# define VER_ENCRYPTION "E"
+# endif
+#else
+# define VER_ENCRYPTION
+#endif
+
+#ifdef USE_THREADS
+# define VER_THREAD "T"
+#else
+# define VER_THREAD
+#endif
+
+#if defined(LINUX20)
+# define VER_OS "l"
+#elif defined(LINUX22)
+# define VER_OS "L"
+#elif defined(JAGUAR)
+# define VER_OS "J"
+#elif defined(MACOSX)
+# define VER_OS "X"
+#else
+# define VER_OS
+#endif
+
+#if defined(HAVE_GETHOSTBYNAME_R6)
+# define VER_GHBNR "6"
+#elif defined(HAVE_GETHOSTBYNAME_R5)
+# define VER_GHBNR "5"
+#elif defined(HAVE_GETHOSTBYNAME_R3)
+# define VER_GHBNR "3"
+#else
+# define VER_GHBNR
+#endif
+
+#if defined(USE_MYSQL)
+# define VER_MYSQL "Q"
+#else
+# define VER_MYSQL
+#endif
+
+#if defined(USE_MODULES)
+# define VER_MODULE "M"
+#else
+# define VER_MODULE
+#endif
+
+const char version_flags[] = VER_IRCD VER_DEBUG VER_ENCRYPTION VER_THREAD VER_OS VER_GHBNR VER_MYSQL VER_MODULE;
+
+EOF
diff --git a/vsnprintf.c b/vsnprintf.c
new file mode 100644
index 000000000..77d8fd0ac
--- /dev/null
+++ b/vsnprintf.c
@@ -0,0 +1,518 @@
+/* An implementation of vsnprintf() for systems that don't have it.
+ *
+ * (C) 2003 Anope Team
+ * Contact us at info@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id: vsnprintf.c,v 1.5 2003/07/20 01:15:50 dane Exp $
+ *
+ */
+
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+
+typedef int (*_pfmt_writefunc_t)
+ (const char *buf, size_t len, void *arg1, void *arg2);
+
+int my_vsnprintf(char *string, size_t size, const char *format,
+ va_list args);
+
+/*************************************************************************/
+
+/* Basic format routine for *printf() interfaces. Takes a writing function
+ * and two (optional) parameters, one pointer and one integer, for that
+ * function which are passed on unmodified. The function should return the
+ * number of bytes written, and 0 (not -1!) on write failure.
+ */
+
+static int _pfmt(const char *format, va_list args,
+ _pfmt_writefunc_t writefunc, void *arg1, void *arg2)
+{
+ int total = 0; /* Total bytes written */
+ const char *startptr; /* Beginning of non-token text in format string.
+ * Used for writing in bulk instead of
+ * character-at-a-time. */
+ int n; /* Bytes written in last writefunc() call */
+ int valid; /* Was this a valid %-token? */
+ int alt_form; /* "Alternate form"? (# flag) */
+ int zero_pad; /* Zero-pad value? */
+ int left_justify; /* Left-justify? (0 means right-justify) */
+ int always_sign; /* Always add sign value? */
+ int width; /* Field width */
+ int precision; /* Precision */
+ int argsize; /* Size of argument: 0=normal, 1=short, 2=long,
+ * 3=long long */
+ int what; /* What are we working on? 0=flags, 1=width,
+ * 2=precision, 3=argsize, 4=argtype */
+ long intval; /* Integer value */
+ char *strval; /* String value */
+ void *ptrval; /* Pointer value */
+ char numbuf[64]; /* Temporary buffer for printing numbers */
+ char *numptr; /* Pointer to start of printed number in numbuf */
+
+
+ intval = 0;
+ strval = NULL;
+ ptrval = NULL;
+
+ startptr = format;
+ while (*format) {
+ if (*format != '%') {
+ format++;
+ continue;
+ }
+ if (startptr != format) {
+ /* Write out accumulated text */
+ n = writefunc(startptr, format - startptr, arg1, arg2);
+ total += n;
+ /* Abort on short write */
+ if (n != format - startptr)
+ break;
+ /* Point to this token, in case it's a bad one */
+ startptr = format;
+ }
+
+ valid = 0; /* 1 if valid, -1 if known not valid (syntax error) */
+ alt_form = 0;
+ left_justify = 0;
+ always_sign = 0;
+ zero_pad = 0;
+ width = -1;
+ precision = -1;
+ argsize = 0;
+ what = 0;
+
+ while (!valid && *++format) { /* Broken out of by terminal chars */
+ switch (*format) {
+
+ /* Flags */
+ case '#':
+ if (what != 0) {
+ valid = -1;
+ break;
+ }
+ alt_form = 1;
+ break;
+ case '-':
+ if (what != 0) {
+ valid = -1;
+ break;
+ }
+ left_justify = 1;
+ break;
+ case '+':
+ if (what != 0) {
+ valid = -1;
+ break;
+ }
+ always_sign = 1;
+ break;
+ case '0':
+ if (what == 0) {
+ zero_pad = 1;
+ break;
+ }
+ /* else fall through */
+
+ /* Field widths */
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (what == 0)
+ what = 1;
+ else if (what > 2) {
+ valid = -1;
+ break;
+ }
+ if (what == 1) {
+ if (width < 0)
+ width = 0;
+ width = width * 10 + (*format) - '0';
+ } else {
+ if (precision < 0)
+ precision = 0;
+ precision = precision * 10 + (*format) - '0';
+ }
+ break;
+ case '*':
+ if (what == 0)
+ what = 1;
+ else if (what >= 2) {
+ valid = -1;
+ break;
+ }
+ if (what == 1) {
+ width = va_arg(args, int);
+ if (width < 0) {
+ width = -width;
+ left_justify = 1;
+ }
+ } else {
+ precision = va_arg(args, int);
+ }
+ break;
+ case '.':
+ if (what >= 2) {
+ valid = -1;
+ break;
+ }
+ what = 2;
+ break;
+
+ /* Argument sizes */
+ case 'h':
+ if (what > 3) {
+ valid = -1;
+ break;
+ }
+ argsize = 1;
+ what = 4;
+ break;
+ case 'l':
+ if (what > 3) {
+ valid = -1;
+ break;
+ }
+ argsize = 2;
+ what = 4;
+ break;
+ case 'L':
+ if (what > 3) {
+ valid = -1;
+ break;
+ }
+ argsize = 3;
+ what = 4;
+ break;
+
+ /* Argument types */
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+ if (argsize == 1)
+ intval = va_arg(args, short);
+ else if (argsize == 2)
+ intval = va_arg(args, long);
+ else if (argsize == 3)
+ /* XXX we don't handle long longs yet */
+ intval = va_arg(args, long);
+ else
+ intval = va_arg(args, int);
+ valid = 1;
+ break;
+ case 'c':
+ intval = va_arg(args, unsigned char);
+ valid = 1;
+ break;
+ case 's':
+ strval = va_arg(args, char *);
+ valid = 1;
+ break;
+ case 'p':
+ ptrval = va_arg(args, void *);
+ valid = 1;
+ break;
+ case 'n':
+ *((int *) va_arg(args, int *)) = total;
+ valid = 1;
+ break;
+
+ /* All other characters--this neatly catches "%%" too */
+ default:
+ valid = -1;
+ break;
+ } /* switch (*format) */
+ }
+ if (valid != 1) {
+ /* Not a valid %-token; start loop over (token will get printed
+ * out next time through). */
+ continue;
+ }
+
+ /* Don't zero-pad if a precision was given or left-justifying */
+ if (precision != -1 || left_justify)
+ zero_pad = 0;
+
+ /* For numbers, limit precision to the size of the print buffer */
+ if ((*format == 'd' || *format == 'i' || *format == 'o'
+ || *format == 'u' || *format == 'x' || *format == 'X')
+ && precision > (signed) sizeof(numbuf)) {
+ precision = sizeof(numbuf);
+ }
+
+ switch (*format++) { /* Do something with this token */
+ case 'p':
+ /* Print the NULL value specially */
+ if (ptrval == NULL) {
+ total += writefunc("(null)", 6, arg1, arg2);
+ break;
+ }
+ /* For all other values, pretend it's really %#.8x */
+ alt_form = 1;
+ zero_pad = 0;
+ precision = 8;
+ intval = (long) ptrval;
+ /* Fall through */
+
+ case 'x':
+ case 'X':{
+ static const char x_chars[] = "0123456789abcdef0x";
+ static const char X_chars[] = "0123456789ABCDEF0X";
+ const char *chars =
+ (format[-1] == 'X') ? X_chars : x_chars;
+ const char *padstr = zero_pad ? "0" : " ";
+ unsigned long uintval;
+ int len;
+
+ uintval = (unsigned long) intval;
+ if (alt_form && uintval != 0) {
+ n = writefunc(chars + 16, 2, arg1, arg2);
+ total += n;
+ if (n != 2)
+ break;
+ width -= 2;
+ }
+ if (precision < 1)
+ precision = 1;
+ numptr = numbuf + sizeof(numbuf);
+ for (len = 0; len < precision || uintval != 0; len++) {
+ *--numptr = chars[uintval % 16];
+ uintval /= 16;
+ }
+ if (left_justify) {
+ n = writefunc(numptr, len, arg1, arg2);
+ total += n;
+ if (n != len)
+ break;
+ }
+ while (len < width) {
+ if (1 != writefunc(padstr, 1, arg1, arg2))
+ break;
+ total++;
+ width--;
+ }
+ if (!left_justify)
+ total += writefunc(numptr, len, arg1, arg2);
+ break;
+ } /* case 'x', 'X' */
+
+ case 'o':{
+ const char *padstr = zero_pad ? "0" : " ";
+ unsigned long uintval;
+ int len;
+
+ uintval = (unsigned long) intval;
+ if (precision < 1)
+ precision = 1;
+ numptr = numbuf + sizeof(numbuf);
+ for (len = 0; len < precision || uintval != 0; len++) {
+ *--numptr = '0' + uintval % 8;
+ uintval /= 8;
+ }
+ if (alt_form && *numptr != '0') {
+ *--numptr = '0';
+ len++;
+ }
+ if (left_justify) {
+ n = writefunc(numptr, len, arg1, arg2);
+ total += n;
+ if (n != len)
+ break;
+ }
+ while (len < width) {
+ if (1 != writefunc(padstr, 1, arg1, arg2))
+ break;
+ total++;
+ width--;
+ }
+ if (!left_justify)
+ total += writefunc(numptr, len, arg1, arg2);
+ break;
+ } /* case 'o' */
+
+ if (alt_form && *numptr != '0')
+ *--numptr = '0';
+ case 'u':{
+ const char *padstr = zero_pad ? "0" : " ";
+ unsigned long uintval;
+ int len;
+
+ uintval = (unsigned long) intval;
+ if (precision < 1)
+ precision = 1;
+ numptr = numbuf + sizeof(numbuf);
+ for (len = 0; len < precision || uintval != 0; len++) {
+ *--numptr = '0' + uintval % 10;
+ uintval /= 10;
+ }
+ if (left_justify) {
+ n = writefunc(numptr, len, arg1, arg2);
+ total += n;
+ if (n != len)
+ break;
+ }
+ while (len < width) {
+ if (1 != writefunc(padstr, 1, arg1, arg2))
+ break;
+ total++;
+ width--;
+ }
+ if (!left_justify)
+ total += writefunc(numptr, len, arg1, arg2);
+ break;
+ } /* case 'u' */
+
+ case 'd':
+ case 'i':{
+ const char *padstr = zero_pad ? "0" : " ";
+ int len;
+
+ numptr = numbuf + sizeof(numbuf);
+ len = 0;
+ if (intval < 0) {
+ if (1 != writefunc("-", 1, arg1, arg2))
+ break;
+ total++;
+ width--;
+ intval = -intval;
+ if (intval < 0) { /* true for 0x800...0 */
+ *numptr-- = '0' - intval % 10;
+ len++;
+ intval /= 10;
+ intval = -intval;
+ }
+ } else if (intval >= 0 && always_sign) {
+ if (1 != writefunc("+", 1, arg1, arg2))
+ break;
+ total++;
+ width--;
+ }
+ if (precision < 1)
+ precision = 1;
+ for (; len < precision || intval != 0; len++) {
+ *--numptr = '0' + intval % 10;
+ intval /= 10;
+ }
+ if (left_justify) {
+ n = writefunc(numptr, len, arg1, arg2);
+ total += n;
+ if (n != len)
+ break;
+ }
+ while (len < width) {
+ if (1 != writefunc(padstr, 1, arg1, arg2))
+ break;
+ total++;
+ width--;
+ }
+ if (!left_justify)
+ total += writefunc(numptr, len, arg1, arg2);
+ break;
+ } /* case 'd', 'i' */
+
+ case 'c':{
+ const char *padstr = zero_pad ? "0" : " ";
+ unsigned char c = (unsigned char) intval;
+
+ if (left_justify) {
+ if (1 != writefunc(&c, 1, arg1, arg2))
+ break;
+ total++;
+ }
+ while (width > 1) {
+ if (1 != writefunc(padstr, 1, arg1, arg2))
+ break;
+ total++;
+ width--;
+ }
+ if (!left_justify)
+ total += writefunc(&c, 1, arg1, arg2);
+ break;
+ } /* case 'c' */
+
+ case 's':{
+ const char *padstr = zero_pad ? "0" : " ";
+ int len;
+
+ /* Catch null strings */
+ if (strval == NULL) {
+ total += writefunc("(null)", 6, arg1, arg2);
+ break;
+ }
+ len = strlen(strval);
+ if (precision < 0 || precision > len)
+ precision = len;
+ if (left_justify && len > 0) {
+ n = writefunc(strval, precision, arg1, arg2);
+ total += n;
+ if (n != precision)
+ break;
+ }
+ while (width > precision) {
+ if (1 != writefunc(padstr, 1, arg1, arg2))
+ break;
+ total++;
+ width--;
+ }
+ if (!left_justify && len > 0)
+ total += writefunc(strval, precision, arg1, arg2);
+ break;
+ } /* case 's' */
+
+ } /* switch (*format++) */
+
+ startptr = format; /* Start again after this %-token */
+ } /* while (*format) */
+
+ /* Write anything left over. */
+ if (startptr != format)
+ total += writefunc(startptr, format - startptr, arg1, arg2);
+
+ /* Return total bytes written. */
+ return total;
+}
+
+/*************************************************************************/
+
+static int writefunc(const char *buf, size_t len, char **string,
+ size_t * size)
+{
+ if (*size <= 0)
+ return 0;
+ if (len > (*size) - 1)
+ len = (*size) - 1;
+ if (len == 0)
+ return 0;
+ memcpy(*string, buf, len);
+ (*string) += len;
+ (*string)[0] = 0;
+ return len;
+}
+
+int my_vsnprintf(char *string, size_t size, const char *format,
+ va_list args)
+{
+ int ret;
+
+ if (size <= 0)
+ return 0;
+ ret =
+ _pfmt(format, args, (_pfmt_writefunc_t) writefunc, &string, &size);
+ return ret;
+}
+
+/*************************************************************************/